diff options
Diffstat (limited to 'ld/scripttempl/elf32cr16.sc')
-rw-r--r-- | ld/scripttempl/elf32cr16.sc | 38 |
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 |