summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-03-02 17:27:54 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-03-02 17:27:54 +0000
commit27d29e18b838b53eaab9fb6f6c9cab20bd52950e (patch)
tree05ebf4d4ba44cc582b161b0df444621e2915af23
parent2009-03-02 Ray Xu <rayx.cn@gmail.com> (diff)
downloadrtems-27d29e18b838b53eaab9fb6f6c9cab20bd52950e.tar.bz2
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.
-rw-r--r--c/src/lib/libbsp/sparc/erc32/ChangeLog6
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/linkcmds35
-rw-r--r--c/src/lib/libbsp/sparc/leon2/ChangeLog6
-rw-r--r--c/src/lib/libbsp/sparc/leon2/startup/linkcmds33
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog6
-rw-r--r--c/src/lib/libbsp/sparc/leon3/startup/linkcmds33
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*)