diff options
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emulparams/elf64mmix.sh | 4 | ||||
-rw-r--r-- | ld/scripttempl/elf.sc | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-mmix/sec-1.d | 2 |
4 files changed, 21 insertions, 4 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 51a4e9c..37a94aa 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2020-07-19 Hans-Peter Nilsson <hp@bitrange.com> + + * scripttempl/elf.sc (ETEXT_LAST_IN_RODATA_SEGMENT): New variable. + * emulparams/elf64mmix.sh (ETEXT_LAST_IN_RODATA_SEGMENT): Define. + * testsuite/ld-mmix/sec-1.d: Adjust. + 2020-07-19 Alan Modra <amodra@gmail.com> * emultempl/ppc64elf.em (power10-stubs): Accept optional "auto" arg. diff --git a/ld/emulparams/elf64mmix.sh b/ld/emulparams/elf64mmix.sh index dffc6cc..75e24be 100644 --- a/ld/emulparams/elf64mmix.sh +++ b/ld/emulparams/elf64mmix.sh @@ -44,6 +44,10 @@ ${RELOCATING+ PROVIDE (Main = DEFINED (Main) ? Main : (DEFINED (_start) ? _start : _start.)); }" +# We need a symbol at the end of the read-only data, which is +# colocated with the code. We make __etext fit. +ETEXT_LAST_IN_RODATA_SEGMENT=" " + OTHER_SECTIONS=' .MMIX.reg_contents : { diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc index 0b8b32a..eb74743 100644 --- a/ld/scripttempl/elf.sc +++ b/ld/scripttempl/elf.sc @@ -62,6 +62,9 @@ # OTHER_SYMBOLS - symbols to place right at the end of the script. # ETEXT_NAME - name of a symbol for the end of the text section, # normally etext. +# ETEXT_LAST_IN_RODATA_SEGMENT - emit ETEXT_NAME after all sections in +# the read-only data segment (which may or may not be equal to +# the code segment), instead of after just the code parts. # SEPARATE_CODE - if set, .text and similar sections containing # actual machine instructions must be in wholly disjoint # pages from any other data, including headers @@ -526,9 +529,9 @@ cat <<EOF KEEP (*(SORT_NONE(.fini))) ${RELOCATING+${FINI_END}} } ${FILL} - ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);} - ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);} - ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT-PROVIDE (__${ETEXT_NAME} = .);}} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT-PROVIDE (_${ETEXT_NAME} = .);}} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT-PROVIDE (${ETEXT_NAME} = .);}} ${RELOCATING+${TEXT_SEGMENT_ALIGN}} EOF @@ -574,6 +577,10 @@ cat <<EOF .exception_ranges ${RELOCATING-0} : ONLY_IF_RO { *(.exception_ranges${RELOCATING+*}) } ${TEXT_PLT+${PLT_NEXT_DATA+${PLT} ${OTHER_PLT_SECTIONS}}} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT+PROVIDE (__${ETEXT_NAME} = .);}} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT+PROVIDE (_${ETEXT_NAME} = .);}} + ${RELOCATING+${ETEXT_LAST_IN_RODATA_SEGMENT+PROVIDE (${ETEXT_NAME} = .);}} + ${RELOCATING+/* Adjust the address for the data segment. We want to adjust up to the same address within the page on the next page up. */} ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}} diff --git a/ld/testsuite/ld-mmix/sec-1.d b/ld/testsuite/ld-mmix/sec-1.d index 5e31b3f..6f82c8e 100644 --- a/ld/testsuite/ld-mmix/sec-1.d +++ b/ld/testsuite/ld-mmix/sec-1.d @@ -24,7 +24,7 @@ Idx Name Size VMA LMA File off Algn SYMBOL TABLE: #... -0+1d g +\*ABS\* _etext +0+30 g +\*ABS\* _etext #... 2000000000000013 g +\*ABS\* __bss_start 2000000000000013 g +\*ABS\* _edata |