[uClinux-dev] Does ucfront work with libstdc++.a?
Erwin Authried
eauth at softsys.co.at
Sun Oct 21 21:18:07 EDT 2007
Hello Wolfgang,
for now, I have built a gcc-3.4.6 toolchain only. I have used the
OpenWrt Kamikaze distribution to build the toolchain, made several
modifications for uClinux, and added elf2flt. I have attached my elf2flt
ld script.
Regards,
Erwin
Am Sonntag, den 21.10.2007, 23:17 +0200 schrieb Wolfgang Mües:
> Erwin,
>
> On Sonntag, 21. Oktober 2007, Erwin Authried wrote:
> > in elf2flt.ld, the ctor table starts with the nr. of entries in the
> > table "LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)", and ends with
> > 0.
> Yes.
>
> > The newer compilers just have the ctor entries, and 0xffffffff as
> > the end marker (if I remember correctly). The end marker isn't
> > required in the ld script because it comes from the library.
>
> OK.
> > Because of the elf2flt.ld entries, you will see multiple definitions
> > of the __CTOR_LIST__, __DTOR_LIST__ entries. It's possible that this
> > doesn't cause any harm, but it's rather confusing, at least. The main
> > problem with the 3.4 was the fact that the library for calling the
> > ctors/dtors is compiled without -msingle-pic-base, causing a crash.
>
> This is my linker script:
>
> > . = ALIGN(4) ;
> > __CTOR_LIST__ = .;
> > LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
> > SINGLE_LINK: /* gcc uses crtbegin.o to find the start of
> > SINGLE_LINK: the constructors, so we make sure it is
> > SINGLE_LINK: first. Because this is a wildcard, it
> > SINGLE_LINK: doesn't matter if the user does not
> > SINGLE_LINK: actually link against crtbegin.o; the
> > SINGLE_LINK: linker won't look for a file to match a
> > SINGLE_LINK: wildcard. The wildcard also means that it
> > SINGLE_LINK: doesn't matter which directory crtbegin.o
> > SINGLE_LINK: is in. */
> > SINGLE_LINK: KEEP (*crtbegin*.o(.ctors))
> > SINGLE_LINK: /* We don't want to include the .ctor section from
> > SINGLE_LINK: from the crtend.o file until after the sorted ctors.
> > SINGLE_LINK: The .ctor section from the crtend file contains the
> > SINGLE_LINK: end of ctors marker and it must be last */
> > SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
> > SINGLE_LINK: KEEP (*(SORT(.ctors.*)))
> > KEEP (*(.ctors))
> > LONG(0)
> > __CTOR_END__ = .;
> > __DTOR_LIST__ = .;
> > LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
> > SINGLE_LINK: KEEP (*crtbegin*.o(.dtors))
> > SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
> > SINGLE_LINK: KEEP (*(SORT(.dtors.*)))
> > KEEP (*(.dtors))
> > LONG(0)
> > __DTOR_END__ = .;
>
> Can you show me how to modify this for gcc 4.0.x?
>
> And many thanks for your explanations!
>
> regards
> Wolfgang
-------------- next part --------------
ENTRY (_start)
MEMORY {
flatmem : ORIGIN = 0x0, LENGTH = 0xfffffff
}
SECTIONS {
.text 0x0 : {
. = . + 4;
. = ALIGN(0x4) ;
_stext = . ;
*(.text)
*(.text.*)
*(.gnu.warning)
*(.stub)
*(.gnu.linkonce.t*)
*(.glue_7t)
*(.glue_7)
*(.jcr)
*(.init)
*(.fini)
W_RODAT *(.rodata)
W_RODAT *(.rodata1)
W_RODAT *(.rodata.*)
W_RODAT *(.gnu.linkonce.r*)
/* This is special code area at the end of the normal
text section. It contains a small lookup table at
the start followed by the code pointed to by entries
in the lookup table. */
. = ALIGN (4) ;
PROVIDE(__ctbp = .);
*(.call_table_data)
*(.call_table_text)
. = ALIGN(0x20) ;
_etext = . ;
} > flatmem
.data : {
. = ALIGN(0x4) ;
_sdata = . ;
__data_start = . ;
data_start = . ;
*(.got.plt)
*(.got)
FILL(0) ;
. = ALIGN(0x20) ;
LONG(-1)
. = ALIGN(0x20) ;
R_RODAT *(.rodata)
R_RODAT *(.rodata1)
R_RODAT *(.rodata.*)
R_RODAT *(.gnu.linkonce.r*)
*(.data)
*(.data1)
*(.data.*)
*(.gnu.linkonce.d*)
*(.data1)
*(.eh_frame)
*(.gcc_except_table)
/* Microblaze has .sdata and .sbss (small bss). They must
be contiguous, so please don't move any of this. JW */
_ssrw = . ;
*(.sdata)
*(.sdata.*)
*(.sbss) /* Don't move this! */
_essrw = . ;
_ssrw_size = _essrw - _ssrw;
PROVIDE(_SDA_BASE_ = _ssrw + (_ssrw_size / 2));
*(.gnu.linkonce.s.*)
*(__libc_atexit)
*(__libc_subinit)
*(__libc_subfreeres)
*(.note.ABI-tag)
/* microblaze-specific read-only small data area
and associated locating symbols */
_ssro = . ;
*(.sdata2)
_essro = . ;
_ssro_size = _essro - _ssro;
PROVIDE(_SDA2_BASE_ = _ssro + (_ssro_size / 2));
PROVIDE (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE (__fini_array_end = .);
. = ALIGN(0x10) ;
_edata = . ;
} > flatmem
.ctors : {
SINGLE_LINK: /* gcc uses crtbegin.o to find the start of
SINGLE_LINK: the constructors, so we make sure it is
SINGLE_LINK: first. Because this is a wildcard, it
SINGLE_LINK: doesn't matter if the user does not
SINGLE_LINK: actually link against crtbegin.o; the
SINGLE_LINK: linker won't look for a file to match a
SINGLE_LINK: wildcard. The wildcard also means that it
SINGLE_LINK: doesn't matter which directory crtbegin.o
SINGLE_LINK: is in. */
SINGLE_LINK: KEEP (*crtbegin*.o(.ctors))
SINGLE_LINK: /* We don't want to include the .ctor section from
SINGLE_LINK: from the crtend.o file until after the sorted ctors.
SINGLE_LINK: The .ctor section from the crtend file contains the
SINGLE_LINK: end of ctors marker and it must be last */
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
SINGLE_LINK: KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
} > flatmem
.dtors : {
SINGLE_LINK: KEEP (*crtbegin*.o(.dtors))
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
SINGLE_LINK: KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
} > flatmem
.bss : {
. = ALIGN(0x4) ;
_sbss = ALIGN(0x4) ;
__bss_start = . ;
*(.dynsbss)
*(.sbss)
*(.sbss.*)
*(.scommon)
*(.dynbss)
*(.bss)
*(.bss.*)
*(.bss*)
*(.gnu.linkonce.b*)
*(COMMON)
. = ALIGN(0x10) ;
_ebss = . ;
_end = . ;
end = . ;
} > flatmem
.stack : {
. = ALIGN(0x4);
__stack_start = .;
}
.junk 0 : { *(.rel*) *(.rela*) }
/* 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) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}
More information about the uClinux-dev
mailing list