aboutsummaryrefslogtreecommitdiff
path: root/ld/scripttempl
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@bitrange.com>2020-07-19 06:08:07 +0200
committerHans-Peter Nilsson <hp@bitrange.com>2020-07-19 06:08:07 +0200
commit4609ada49f559880e85aecc2f37f377e5bff8696 (patch)
treeba1f1bf3860b622dc0388ec9264be13775c31c32 /ld/scripttempl
parente10a07b32dc1faed25b5bbcbbc47d68e2ff537b9 (diff)
downloadfsf-binutils-gdb-4609ada49f559880e85aecc2f37f377e5bff8696.zip
fsf-binutils-gdb-4609ada49f559880e85aecc2f37f377e5bff8696.tar.gz
fsf-binutils-gdb-4609ada49f559880e85aecc2f37f377e5bff8696.tar.bz2
ld: optionally emit _etext last, before .data
So, here's my suggestion for making _init .. __etext cover .text + .rodata (including things like the read-only exception tables) for elf64mmix. A quick web search gives that __etext (and friends) isn't well defined, so each target can interpret the "end of text segment" to their own liking. It seems likely this change is also a better fit than the default for other ports, at least those with .rodata after .text in the same segment. The presence of a separate rodata-segment is optional (and not true for elf64mmix). This is reflected in the name as SEPARATE_TEXT / SEPARATE_CODE isn't considered, to keep it simple; each target has to make sure their settings of variables make sense. ld: * 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.
Diffstat (limited to 'ld/scripttempl')
-rw-r--r--ld/scripttempl/elf.sc13
1 files changed, 10 insertions, 3 deletions
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}};}}}