aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/emulparams/elf64mmix.sh4
-rw-r--r--ld/scripttempl/elf.sc13
-rw-r--r--ld/testsuite/ld-mmix/sec-1.d2
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