diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-10-26 18:41:52 +0000 |
---|---|---|
committer | Mark Mitchell <mark@codesourcery.com> | 2004-10-26 18:41:52 +0000 |
commit | ba916c8af2642aebace1778a707e90a6a4f9095f (patch) | |
tree | cb164ef2f690eeb1dda279b88015e5e9aa59073d /ld/scripttempl | |
parent | 1ec5cd372135a64c39eeaa32103cad2913e1754a (diff) | |
download | binutils-ba916c8af2642aebace1778a707e90a6a4f9095f.tar.gz binutils-ba916c8af2642aebace1778a707e90a6a4f9095f.tar.bz2 binutils-ba916c8af2642aebace1778a707e90a6a4f9095f.zip |
* Makefile.in (earmsymbian.c): Depend on armbpabi.sc, not elf.sc.
* ldexp.h (segment_type): New type.
(segments): New variable.
* ldexp.c (segments): New variable.
(exp_print_token): Handle SEGMENT_START.
(fold_binary): Likewise.
* ldgram.y (SEGMENT_START): Declare it as a token.
(exp): Handle SEGMENT_START.
* ldlang.h (lang_address_statement_type): Add segment field.
(lang_section_start): Change prototype.
* ldlang.c (map_input_to_output_sections): Do not process section
assignments if a corresponding SEGMENT_START has already been
seen.
(lang_section_start): Add segment parameter.
* ldlex.l (SEGMENT_START): Add it.
* lexsup.c (seg_segment_start): New function.
(parse_args): Use it for -Tbss, -Tdata, and -Ttext.
* ld.texinfo (SEGMENT_START): Document it.
* emulparams/armsymbian.sh (EMBEDDED): Set it.
* scripttempl/armbpabi.sc: Use SEGMENT_START to control segment
base addresses. Do not map relocations.
* NEWS: Mention SEGMENT_START.
Diffstat (limited to 'ld/scripttempl')
-rw-r--r-- | ld/scripttempl/armbpabi.sc | 205 | ||||
-rw-r--r-- | ld/scripttempl/elf.sc | 3 |
2 files changed, 76 insertions, 132 deletions
diff --git a/ld/scripttempl/armbpabi.sc b/ld/scripttempl/armbpabi.sc index 6904ca9513e..33fae978a3a 100644 --- a/ld/scripttempl/armbpabi.sc +++ b/ld/scripttempl/armbpabi.sc @@ -1,78 +1,7 @@ # This variant of elf.sc is used for ARM BPABI platforms, like Symbian # OS, where a separate postlinker will operated on the generated -# executable or shared object. - -# -# Unusual variables checked by this code: -# NOP - four byte opcode for no-op (defaults to 0) -# NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not -# empty. -# DATA_ADDR - if end-of-text-plus-one-page isn't right for data start -# INITIAL_READONLY_SECTIONS - at start of text segment -# OTHER_READONLY_SECTIONS - other than .text .init .rodata ... -# (e.g., .PARISC.milli) -# OTHER_TEXT_SECTIONS - these get put in .text when relocating -# OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ... -# (e.g., .PARISC.global) -# OTHER_RELRO_SECTIONS - other than .data.rel.ro ... -# (e.g. PPC32 .fixup, .got[12]) -# OTHER_BSS_SECTIONS - other than .bss .sbss ... -# OTHER_SECTIONS - at the end -# EXECUTABLE_SYMBOLS - symbols that must be defined for an -# executable (e.g., _DYNAMIC_LINK) -# TEXT_START_SYMBOLS - symbols that appear at the start of the -# .text section. -# DATA_START_SYMBOLS - symbols that appear at the start of the -# .data section. -# OTHER_SDATA_SECTIONS - sections just after .sdata. -# OTHER_BSS_SYMBOLS - symbols that appear at the start of the -# .bss section besides __bss_start. -# DATA_PLT - .plt should be in data segment, not text segment. -# PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement. -# BSS_PLT - .plt should be in bss segment -# TEXT_DYNAMIC - .dynamic in text segment, not data segment. -# EMBEDDED - whether this is for an embedded system. -# SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set -# start address of shared library. -# INPUT_FILES - INPUT command of files to always include -# WRITABLE_RODATA - if set, the .rodata section should be writable -# INIT_START, INIT_END - statements just before and just after -# combination of .init sections. -# FINI_START, FINI_END - statements just before and just after -# combination of .fini sections. -# STACK_ADDR - start of a .stack section. -# OTHER_END_SYMBOLS - symbols to place right at the end of the script. -# SEPARATE_GOTPLT - if set, .got.plt should be separate output section, -# so that .got can be in the RELRO area. It should be set to -# the number of bytes in the beginning of .got.plt which can be -# in the RELRO area as well. -# -# When adding sections, do note that the names of some sections are used -# when specifying the start address of the next. -# - -# 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, -# and useful for --gc-sections, which for a variable "foo" might be -# ".data.foo". Then there are the linkonce sections, for which the linker -# eliminates duplicates, which are named like ".gnu.linkonce.d.foo". -# The exact correspondences are: -# -# Section Linkonce section -# .text .gnu.linkonce.t.foo -# .rodata .gnu.linkonce.r.foo -# .data .gnu.linkonce.d.foo -# .bss .gnu.linkonce.b.foo -# .sdata .gnu.linkonce.s.foo -# .sbss .gnu.linkonce.sb.foo -# .sdata2 .gnu.linkonce.s2.foo -# .sbss2 .gnu.linkonce.sb2.foo -# .debug_info .gnu.linkonce.wi.foo -# .tdata .gnu.linkonce.td.foo -# .tbss .gnu.linkonce.tb.foo -# -# Each of these can also have corresponding .rel.* and .rela.* sections. +# executable or shared object. See elf.sc for configuration variables +# that apply; only BPABI-specific variables will be noted here. test -z "$ENTRY" && ENTRY=_start test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT} @@ -175,11 +104,18 @@ STACK=" .stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} : *(.stack) }" +TEXT_START_ADDR="SEGMENT_START(\"text\", ${TEXT_START_ADDR})" +SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text\", ${SHLIB_TEXT_START_ADDR:-0})" +DATA_ADDR="SEGMENT_START(\"data\", ${DATA_ADDR-${DATA_SEGMENT_ALIGN}})" +SHLIB_DATA_ADDR="SEGMENT_START(\"data\", ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}})" + # if this is for an embedded system, don't add SIZEOF_HEADERS. if [ -z "$EMBEDDED" ]; then test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS" + SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS" else test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}" + SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR}" fi cat <<EOF @@ -202,66 +138,12 @@ SECTIONS { /* Read-only sections, merged into text segment: */ ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}} - ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}} - ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}} + ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}} + ${CREATE_PIE+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}} ${INITIAL_READONLY_SECTIONS} EOF -if [ "x$COMBRELOC" = x ]; then - COMBRELOCCAT=cat -else - COMBRELOCCAT="cat > $COMBRELOC" -fi -eval $COMBRELOCCAT <<EOF - .rel.init ${RELOCATING-0} : { *(.rel.init) } - .rela.init ${RELOCATING-0} : { *(.rela.init) } - .rel.text ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) } - .rela.text ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) } - .rel.fini ${RELOCATING-0} : { *(.rel.fini) } - .rela.fini ${RELOCATING-0} : { *(.rela.fini) } - .rel.rodata ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) } - .rela.rodata ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) } - ${OTHER_READONLY_RELOC_SECTIONS} - .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+*}) } - .rela.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+*}) } - .rel.data ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) } - .rela.data ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) } - .rel.tdata ${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) } - .rela.tdata ${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) } - .rel.tbss ${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) } - .rela.tbss ${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) } - .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) } - .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) } - .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) } - .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) } - ${REL_SDATA} - ${REL_SBSS} - ${REL_SDATA2} - ${REL_SBSS2} - .rel.bss ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) } - .rela.bss ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) } -EOF -if [ -n "$COMBRELOC" ]; then -cat <<EOF - .rel.dyn ${RELOCATING-0} : - { -EOF -sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/ \1/' $COMBRELOC -cat <<EOF - } - .rela.dyn ${RELOCATING-0} : - { -EOF -sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/ \1/' $COMBRELOC cat <<EOF - } -EOF -fi -cat <<EOF - .rel.plt ${RELOCATING-0} : { *(.rel.plt) } - .rela.plt ${RELOCATING-0} : { *(.rela.plt) } - ${OTHER_PLT_RELOC_SECTIONS} - .init ${RELOCATING-0} : { ${RELOCATING+${INIT_START}} @@ -299,9 +181,9 @@ cat <<EOF /* 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}};}}} - ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}} - ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}} + ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR};}}} + ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} + ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} /* Exception handling */ .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) } @@ -355,6 +237,7 @@ cat <<EOF ${OTHER_SDATA_SECTIONS} ${RELOCATING+_edata = .;} ${RELOCATING+PROVIDE (edata = .);} + ${RELOCATING+. = DEFINED(__bss_segment_start) ? __bss_segment_start : .;} ${RELOCATING+__bss_start = .;} ${RELOCATING+${OTHER_BSS_SYMBOLS}} ${SBSS} @@ -431,5 +314,63 @@ cat <<EOF ${OTHER_SECTIONS} ${RELOCATING+${OTHER_END_SYMBOLS}} ${RELOCATING+${STACKNOTE}} +EOF + +# These relocations sections are part of the read-only segment in SVR4 +# executables, but are not mapped in BPABI executables. +if [ "x$COMBRELOC" = x ]; then + COMBRELOCCAT=cat +else + COMBRELOCCAT="cat > $COMBRELOC" +fi +eval $COMBRELOCCAT <<EOF + .rel.init 0 : { *(.rel.init) } + .rela.init 0 : { *(.rela.init) } + .rel.text 0 : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) } + .rela.text 0 : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) } + .rel.fini 0 : { *(.rel.fini) } + .rela.fini 0 : { *(.rela.fini) } + .rel.rodata 0 : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) } + .rela.rodata 0 : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) } + ${OTHER_READONLY_RELOC_SECTIONS} + .rel.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+*}) } + .rela.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+*}) } + .rel.data 0 : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) } + .rela.data 0 : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) } + .rel.tdata 0 : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) } + .rela.tdata 0 : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) } + .rel.tbss 0 : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) } + .rela.tbss 0 : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) } + .rel.ctors 0 : { *(.rel.ctors) } + .rela.ctors 0 : { *(.rela.ctors) } + .rel.dtors 0 : { *(.rel.dtors) } + .rela.dtors 0 : { *(.rela.dtors) } + ${REL_SDATA} + ${REL_SBSS} + ${REL_SDATA2} + ${REL_SBSS2} + .rel.bss 0 : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) } + .rela.bss 0 : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) } +EOF +if [ -n "$COMBRELOC" ]; then +cat <<EOF + .rel.dyn 0 : + { +EOF +sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/ \1/' $COMBRELOC +cat <<EOF + } + .rela.dyn 0 : + { +EOF +sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/ \1/' $COMBRELOC +cat <<EOF + } +EOF +fi +cat <<EOF + .rel.plt 0 : { *(.rel.plt) } + .rela.plt 0 : { *(.rela.plt) } + ${OTHER_PLT_RELOC_SECTIONS} } EOF diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc index c7311b1f327..e92bd6c5471 100644 --- a/ld/scripttempl/elf.sc +++ b/ld/scripttempl/elf.sc @@ -18,6 +18,9 @@ # OTHER_SECTIONS - at the end # EXECUTABLE_SYMBOLS - symbols that must be defined for an # executable (e.g., _DYNAMIC_LINK) +# TEXT_START_ADDR - the first byte of the text segment, after any +# headers. +# TEXT_BASE_ADDRESS - the first byte of the text segment. # TEXT_START_SYMBOLS - symbols that appear at the start of the # .text section. # DATA_START_SYMBOLS - symbols that appear at the start of the |