aboutsummaryrefslogtreecommitdiff
path: root/ld/scripttempl/elf32cr16.sc
diff options
context:
space:
mode:
Diffstat (limited to 'ld/scripttempl/elf32cr16.sc')
-rw-r--r--ld/scripttempl/elf32cr16.sc38
1 files changed, 24 insertions, 14 deletions
diff --git a/ld/scripttempl/elf32cr16.sc b/ld/scripttempl/elf32cr16.sc
index cdabd9c..936c03a 100644
--- a/ld/scripttempl/elf32cr16.sc
+++ b/ld/scripttempl/elf32cr16.sc
@@ -6,6 +6,10 @@
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.
+# Using an empty script for ld -r is better than mashing together
+# sections. This hack likely leaves ld -Ur broken.
+test -n "${RELOCATING}" || exit 0
+
# The next line should be uncommented if it is desired to link
# without libstart.o and directly enter main.
@@ -23,7 +27,10 @@ cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
-${RELOCATING+ENTRY(${ENTRY})}
+EOF
+
+test -n "${RELOCATING}" && cat <<EOF
+ENTRY(${ENTRY})
/* Define memory regions. */
MEMORY
@@ -32,6 +39,9 @@ MEMORY
ram : ORIGIN = 4M, LENGTH = 10M
}
+EOF
+
+cat <<EOF
/* Many sections come in three flavours. There is the 'real' section,
like ".data". Then there are the per-procedure or per-variable
sections, generated by -ffunction-sections and -fdata-sections in GCC,
@@ -54,33 +64,33 @@ SECTIONS
__INIT_START = .;
KEEP (*(.init))
__INIT_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.fini :
{
__FINI_START = .;
KEEP (*(.fini))
__FINI_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.jcr :
{
KEEP (*(.jcr))
- } > rom
+ }${RELOCATING+ > rom}
.text :
{
__TEXT_START = .;
*(.text) *(.text.*) *(.gnu.linkonce.t.*)
__TEXT_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.rdata :
{
__RDATA_START = .;
*(.rdata_4) *(.rdata_2) *(.rdata_1) *(.rdata.*) *(.gnu.linkonce.r.*) *(.rodata*)
__RDATA_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.ctor ALIGN(4) :
{
@@ -106,7 +116,7 @@ SECTIONS
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.dtor ALIGN(4) :
{
@@ -116,21 +126,21 @@ SECTIONS
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
__DTOR_END = .;
- } > rom
+ }${RELOCATING+ > rom}
.data :
{
__DATA_START = .;
*(.data_4) *(.data_2) *(.data_1) *(.data) *(.data.*) *(.gnu.linkonce.d.*)
__DATA_END = .;
- } > ram AT > rom
+ }${RELOCATING+ > ram AT > rom}
.bss (NOLOAD) :
{
__BSS_START = .;
*(.bss_4) *(.bss_2) *(.bss_1) *(.bss) *(COMMON) *(.bss.*) *(.gnu.linkonce.b.*)
__BSS_END = .;
- } > ram
+ }${RELOCATING+ > ram}
/* You may change the sizes of the following sections to fit the actual
size your program requires.
@@ -143,21 +153,21 @@ SECTIONS
. = ALIGN(4);
__HEAP_START = .;
. += 0x2000; __HEAP_MAX = .;
- } > ram
+ }${RELOCATING+ > ram}
.stack (NOLOAD) :
{
. = ALIGN(4);
. += 0x6000;
__STACK_START = .;
- } > ram
+ }${RELOCATING+ > ram}
.istack (NOLOAD) :
{
. = ALIGN(4);
. += 0x100;
__ISTACK_START = .;
- } > ram
+ }${RELOCATING+ > ram}
.comment 0 : { *(.comment) }
@@ -168,5 +178,5 @@ EOF
cat <<EOF
}
-__DATA_IMAGE_START = LOADADDR(.data);
+${RELOCATING+__DATA_IMAGE_START = LOADADDR(.data);}
EOF