Defining a section that isn't file-backed
Mike Hearn
mike@theoretic.com
Thu Feb 26 18:11:00 GMT 2004
On Thu, 2004-02-26 at 15:34, Ian Lance Taylor wrote:
> The "a" flag does not imply write access.
>
> To be careful about terminology, it is the segment which mapped rwx.
> objdump -p prints out segments, objdump -h prints out sections. To
> find out why the segment is rwx, you have to look at all the sections
> which are being incorporated into the segment. The linker map file,
> generated by -Map, can show you all the input sections being
> incorporated into the output section. Then you need to examine
> addresses to see which output sections are being incorporated into the
> segment.
I did so, it appears there is only one section being assigned to that
segment which is how I want it. I really cannot see what's going wrong
here, all the output of objdump/readelf looks correct. I've embedded the
mapfile and linker script at the end of this email and here is the
inline asm I'm using:
asm("\t.section .wine.loadarea, \"a\", @nobits\n");
asm("\t.zero 0x10000000\n"); /* 256mb allocation */
Can you see what might be going wrong? The output of objdump -h looks
fine:
Sections:
Idx Name Size VMA LMA File off Algn
0 .wine.loadarea 10000000 00400000 00400000 00001000 2**0
ALLOC, READONLY
... as does objdump -p:
LOAD off 0x00001000 vaddr 0x00400000 paddr 0x00400000 align 2**12
filesz 0x00000000 memsz 0x10000000 flags r--
Here is the script and mapfile:
Many thanks for any insights you can offer
thanks -mike
-------------------------------------------------------------------------
/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib");
MEMORY
{
before (rxai) : ORIGIN = 0x000400, LENGTH = 0x400000 /* 0x400 is room for program headers */
loadarea : ORIGIN = 0x400000, LENGTH = 256M
after (rxai) : ORIGIN = 0x10400000, LENGTH = 0xe0c00000
}
PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
dynamic PT_DYNAMIC ;
loadarea PT_LOAD;
}
SECTIONS
{
/* reserve PE load area */
.wine.loadarea : { KEEP (*(.wine.loadarea)) } >loadarea :loadarea
/* Read-only sections, merged into text segment: */
. = 0x08048000 + SIZEOF_HEADERS;
.interp : { *(.interp) } :interp :text
.hash : { *(.hash) } :text
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.dyn :
{
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
}
.rela.dyn :
{
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
}
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init :
{
KEEP (*(.init))
} :text =0x90909090
.plt : { *(.plt) }
.text :
{
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
} =0x90909090
.fini :
{
KEEP (*(.fini))
} =0x90909090
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.eh_frame_hdr : { *(.eh_frame_hdr) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table) }
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = ALIGN (0x1000) - ((0x1000 - .) & (0x1000 - 1)); . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
/* Ensure the __preinit_array_start label is properly aligned. We
could instead move the label definition inside the section, but
the linker would then create the section even if it turns out to
be empty, which isn't pretty. */
. = ALIGN(32 / 8);
PROVIDE (__preinit_array_start = .);
.preinit_array : { *(.preinit_array) }
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
.init_array : { *(.init_array) }
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
.fini_array : { *(.fini_array) }
PROVIDE (__fini_array_end = .);
.data :
{
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
} :data
.data1 : { *(.data1) }
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table) }
.dynamic : { *(.dynamic) } :data :dynamic
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin*.o(.ctors))
/* We don't want to include the .ctor section from
from the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
} :data
.dtors :
{
KEEP (*crtbegin*.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
.jcr : { KEEP (*(.jcr)) }
.got : { *(.got.plt) *(.got) }
_edata = .;
PROVIDE (edata = .);
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN(32 / 8);
}
. = ALIGN(32 / 8);
_end = .;
PROVIDE (end = .);
. = DATA_SEGMENT_END (.);
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/DISCARD/ : { *(.note.GNU-stack) }
}
-------------------------------------------------------------------------
Archive member included because of file (symbol)
/usr/lib/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o (__libc_csu_init)
Memory Configuration
Name Origin Length Attributes
before 0x00000400 0x00400000 axrl
loadarea 0x00400000 0x10000000
after 0x10400000 0xe0c00000 axrl
*default* 0x00000000 0xffffffff
Linker script and memory map
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
.wine.loadarea 0x00400000 0x10000000
*(.wine.loadarea)
.wine.loadarea
0x00400000 0x10000000 /tmp/cco1wFJN.o
0x080480f4 . = (0x8048000 + SIZEOF_HEADERS)
.interp 0x00000400 0x13
*(.interp)
.interp 0x00000400 0x13 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.note.ABI-tag 0x00000414 0x20
.note.ABI-tag 0x00000414 0x20 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.hash 0x00000434 0x90
*(.hash)
.hash 0x00000434 0x90 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.dynsym 0x000004c4 0x110
*(.dynsym)
.dynsym 0x000004c4 0x110 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.dynstr 0x000005d4 0x131
*(.dynstr)
.dynstr 0x000005d4 0x131 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.gnu.version 0x00000706 0x22
*(.gnu.version)
.gnu.version 0x00000706 0x22 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.gnu.version_d
*(.gnu.version_d)
.gnu.version_r 0x00000728 0x30
*(.gnu.version_r)
.gnu.version_r
0x00000728 0x30 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.rel.dyn 0x00000758 0x8
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
.rel.got 0x00000758 0x8 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
.rela.dyn
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
.rel.plt 0x00000760 0x30
*(.rel.plt)
.rel.plt 0x00000760 0x30 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.rela.plt
*(.rela.plt)
.init 0x00000790 0x17
*(.init)
.init 0x00000790 0xb /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
0x00000790 _init
.init 0x0000079b 0x5 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
.init 0x000007a0 0x5 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.init 0x000007a5 0x2 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
.plt 0x000007a8 0x70
*(.plt)
.plt 0x000007a8 0x70 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x000007b8 fgets@@GLIBC_2.0
0x000007c8 __libc_start_main@@GLIBC_2.0
0x000007d8 printf@@GLIBC_2.0
0x000007e8 sscanf@@GLIBC_2.0
0x000007f8 memset@@GLIBC_2.0
0x00000808 fopen@@GLIBC_2.1
.text 0x00000818 0x31c
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x00000818 0x24 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000818 _start
.text 0x0000083c 0x22 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
*fill* 0x0000085e 0x2 90909090
.text 0x00000860 0x66 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
*fill* 0x000008c6 0x2 90909090
.text 0x000008c8 0x1bc /tmp/cco1wFJN.o
0x000008c8 printmaps
0x0000093e main
.text 0x00000a84 0x8c /usr/lib/libc_nonshared.a(elf-init.oS)
0x00000acc __libc_csu_fini
0x00000a84 __libc_csu_init
.text 0x00000b10 0x24 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
*(.gnu.warning)
.fini 0x00000b34 0x1b
*(.fini)
.fini 0x00000b34 0x11 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
0x00000b34 _fini
.fini 0x00000b45 0x5 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
.fini 0x00000b4a 0x5 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
0x00000b4f PROVIDE (__etext, .)
0x00000b4f PROVIDE (_etext, .)
0x00000b4f PROVIDE (etext, .)
.rodata 0x00000b60 0x9f
*(.rodata .rodata.* .gnu.linkonce.r.*)
.rodata 0x00000b60 0x8 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000b60 _fp_hw
0x00000b64 _IO_stdin_used
*fill* 0x00000b68 0x18 00
.rodata 0x00000b80 0x7f /tmp/cco1wFJN.o
.rodata1
*(.rodata1)
.eh_frame_hdr
*(.eh_frame_hdr)
.eh_frame 0x00000c00 0x4
*(.eh_frame)
.eh_frame 0x00000c00 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.gcc_except_table
*(.gcc_except_table)
0x00000c04 . = (ALIGN (0x1000) - ((0x1000 - .) & 0xfff))
0x00001c04 . = (0x1000 DATA_SEGMENT_ALIGN 0x1000)
0x00001c04 . = ALIGN (0x4)
0x00001c04 PROVIDE (__preinit_array_start, .)
.preinit_array
*(.preinit_array)
0x00001c04 PROVIDE (__preinit_array_end, .)
0x00001c04 PROVIDE (__init_array_start, .)
.init_array
*(.init_array)
0x00001c04 PROVIDE (__init_array_end, .)
0x00001c04 PROVIDE (__fini_array_start, .)
.fini_array
*(.fini_array)
0x00001c04 PROVIDE (__fini_array_end, .)
.data 0x00000c04 0xc
*(.data .data.* .gnu.linkonce.d.*)
.data 0x00000c04 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000c04 data_start
0x00000c04 __data_start
.data 0x00000c08 0x8 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
0x00000c08 __dso_handle
.data1
*(.data1)
.tdata
*(.tdata .tdata.* .gnu.linkonce.td.*)
.tbss
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)
.eh_frame
*(.eh_frame)
.gcc_except_table
*(.gcc_except_table)
.dynamic 0x00000c10 0x108
*(.dynamic)
.dynamic 0x00000c10 0x108 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000c10 _DYNAMIC
.ctors 0x00000d18 0x8
*crtbegin*.o(.ctors)
*(EXCLUDE_FILE(*crtend*.o) .ctors)
.ctors 0x00000d18 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
*(SORT(.ctors.*))
*(.ctors)
.ctors 0x00000d1c 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.dtors 0x00000d20 0x8
*crtbegin*.o(.dtors)
*(EXCLUDE_FILE(*crtend*.o) .dtors)
.dtors 0x00000d20 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
*(SORT(.dtors.*))
*(.dtors)
.dtors 0x00000d24 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.jcr 0x00000d28 0x4
*(.jcr)
.jcr 0x00000d28 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.got 0x00000d2c 0x28
*(.got.plt)
.got.plt 0x00000d2c 0x24 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000d2c _GLOBAL_OFFSET_TABLE_
*(.got)
.got 0x00000d50 0x4 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
0x00000d54 _edata = .
0x00000d54 PROVIDE (edata, .)
0x00000d54 __bss_start = .
.bss 0x00000d54 0x4
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x00000d54 0x1 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
*fill* 0x00000d55 0x3 00
*(COMMON)
0x00000d58 . = ALIGN (0x4)
0x00000d58 . = ALIGN (0x4)
0x00000d58 _end = .
0x00000d58 PROVIDE (end, .)
0x00000d58 . = DATA_SEGMENT_END (.)
.stab
*(.stab)
.stabstr
*(.stabstr)
.stab.excl
*(.stab.excl)
.stab.exclstr
*(.stab.exclstr)
.stab.index
*(.stab.index)
.stab.indexstr
*(.stab.indexstr)
.comment 0x00000000 0x132
*(.comment)
.comment 0x00000000 0x33 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o
.comment 0x00000033 0x33 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o
.comment 0x00000066 0x33 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o
.comment 0x00000099 0x33 /tmp/cco1wFJN.o
.comment 0x000000cc 0x33 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
.comment 0x000000ff 0x33 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
.debug
*(.debug)
.line
*(.line)
.debug_srcinfo
*(.debug_srcinfo)
.debug_sfnames
*(.debug_sfnames)
.debug_aranges
*(.debug_aranges)
.debug_pubnames
*(.debug_pubnames)
.debug_info
*(.debug_info .gnu.linkonce.wi.*)
.debug_abbrev
*(.debug_abbrev)
.debug_line
*(.debug_line)
.debug_frame
*(.debug_frame)
.debug_str
*(.debug_str)
.debug_loc
*(.debug_loc)
.debug_macinfo
*(.debug_macinfo)
.debug_weaknames
*(.debug_weaknames)
.debug_funcnames
*(.debug_funcnames)
.debug_typenames
*(.debug_typenames)
.debug_varnames
*(.debug_varnames)
/DISCARD/
*(.note.GNU-stack)
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libm.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libdl.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libncurses.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libpthread.so
START GROUP
LOAD /lib/libpthread.so.0
LOAD /usr/lib/libpthread_nonshared.a
END GROUP
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libssl.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libpam.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libuuid.so
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libtermcap.so
LOAD /tmp/cco1wFJN.o
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcc.a
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcc_eh.a
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../libc.so
START GROUP
LOAD /lib/libc.so.6
LOAD /usr/lib/libc_nonshared.a
END GROUP
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcc.a
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcc_eh.a
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o
LOAD /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
OUTPUT(lds1 elf32-i386)
More information about the Binutils
mailing list