diff options
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/startup/linkcmds | 35 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/startup/linkcmds | 33 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/ChangeLog | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/startup/linkcmds | 33 |
6 files changed, 87 insertions, 32 deletions
diff --git a/c/src/lib/libbsp/sparc/erc32/ChangeLog b/c/src/lib/libbsp/sparc/erc32/ChangeLog index 38df617543..c784937683 100644 --- a/c/src/lib/libbsp/sparc/erc32/ChangeLog +++ b/c/src/lib/libbsp/sparc/erc32/ChangeLog @@ -1,3 +1,9 @@ +2009-03-02 Daniel Hellstrom <daniel@gaisler.com> + + PR 1390/bsps + * startup/linkcmds: Fix sections so C++ global constructors and + destructors work with late model (>= 4.3) gcc versions. + 2009-02-12 Joel Sherrill <joel.sherrill@oarcorp.com> * startup/setvec.c: Change prototype of IDLE thread to consistently diff --git a/c/src/lib/libbsp/sparc/erc32/startup/linkcmds b/c/src/lib/libbsp/sparc/erc32/startup/linkcmds index 2ea6cd8bbd..65b31a7b6c 100644 --- a/c/src/lib/libbsp/sparc/erc32/startup/linkcmds +++ b/c/src/lib/libbsp/sparc/erc32/startup/linkcmds @@ -94,13 +94,11 @@ SECTIONS .text : { CREATE_OBJECT_SYMBOLS - start = .; text_start = .; _text_start = .; *(.text*) . = ALIGN (16); - /* * Special FreeBSD sysctl sections. */ @@ -119,16 +117,29 @@ SECTIONS /* * C++ constructors */ - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - *(.ctors) - LONG(0) - __CTOR_END__ = .; - __DTOR_LIST__ = .; - LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) - *(.dtors) - LONG(0) - __DTOR_END__ = .; + /* 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)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section 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 *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) _rodata_start = . ; *(.rodata*) diff --git a/c/src/lib/libbsp/sparc/leon2/ChangeLog b/c/src/lib/libbsp/sparc/leon2/ChangeLog index d8d59ba6d3..bd8de672cd 100644 --- a/c/src/lib/libbsp/sparc/leon2/ChangeLog +++ b/c/src/lib/libbsp/sparc/leon2/ChangeLog @@ -1,3 +1,9 @@ +2009-03-02 Daniel Hellstrom <daniel@gaisler.com> + + PR 1390/bsps + * startup/linkcmds: Fix sections so C++ global constructors and + destructors work with late model (>= 4.3) gcc versions. + 2008-12-04 Ralf Corsépius <ralf.corsepius@rtems.org> * bsp_specs: Remove -e start from %link. diff --git a/c/src/lib/libbsp/sparc/leon2/startup/linkcmds b/c/src/lib/libbsp/sparc/leon2/startup/linkcmds index d62014eb3a..0c4aff72ee 100644 --- a/c/src/lib/libbsp/sparc/leon2/startup/linkcmds +++ b/c/src/lib/libbsp/sparc/leon2/startup/linkcmds @@ -117,16 +117,29 @@ SECTIONS /* * C++ constructors */ - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - *(.ctors) - LONG(0) - __CTOR_END__ = .; - __DTOR_LIST__ = .; - LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) - *(.dtors) - LONG(0) - __DTOR_END__ = .; + /* 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)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section 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 *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) _rodata_start = . ; *(.rodata*) diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog index 9174e1433c..8bc61c3b69 100644 --- a/c/src/lib/libbsp/sparc/leon3/ChangeLog +++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog @@ -1,3 +1,9 @@ +2009-03-02 Daniel Hellstrom <daniel@gaisler.com> + + PR 1390/bsps + * startup/linkcmds: Fix sections so C++ global constructors and + destructors work with late model (>= 4.3) gcc versions. + 2008-12-04 Ralf Corsépius <ralf.corsepius@rtems.org> * bsp_specs: Remove -e start from %link. diff --git a/c/src/lib/libbsp/sparc/leon3/startup/linkcmds b/c/src/lib/libbsp/sparc/leon3/startup/linkcmds index d62014eb3a..0c4aff72ee 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/linkcmds +++ b/c/src/lib/libbsp/sparc/leon3/startup/linkcmds @@ -117,16 +117,29 @@ SECTIONS /* * C++ constructors */ - __CTOR_LIST__ = .; - LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) - *(.ctors) - LONG(0) - __CTOR_END__ = .; - __DTOR_LIST__ = .; - LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) - *(.dtors) - LONG(0) - __DTOR_END__ = .; + /* 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)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section 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 *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) _rodata_start = . ; *(.rodata*) |