diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 2 | ||||
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/emulparams/armsymbian.sh | 10 | ||||
-rw-r--r-- | ld/scripttempl/armbpabi.sc | 55 |
5 files changed, 60 insertions, 21 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b03f981..3e84f8a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2005-01-25 Mark Mitchell <mark@codesourcery.com> + + * elf32-arm.c (elf_backend_default_use_rela_p): Define to zero for + SymbianOS. + 2005-01-25 Alexandre Oliva <aoliva@redhat.com> 2004-12-10 Alexandre Oliva <aoliva@redhat.com> diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 6e24153..09b47d3 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -5917,7 +5917,7 @@ elf32_arm_symbian_modify_segment_map (bfd *abfd, #undef elf_backend_may_use_rela_p #define elf_backend_may_use_rela_p 0 #undef elf_backend_default_use_rela_p -#define elf_backend_default_use_rela_p 1 +#define elf_backend_default_use_rela_p 0 #undef elf_backend_rela_normal #define elf_backend_rela_normal 0 diff --git a/ld/ChangeLog b/ld/ChangeLog index a178b24..2180c9d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2005-01-25 Mark Mitchell <mark@codesourcery.com> + + * emulparams/armsymbian.sh (OTHER_READONLY_SECTIONS): Define, so + as to include .ARM.exidx$${Base,Limit}. + * ld/scripttempl/armbpabi.sc: Move .plt to end of text segment. + Define IMAGE$$ER_RO$${Base,Limit} and SHT$$INIT_ARRAY$${Base,Limit}. + Put .init_array, .fini_array, etc. into the read-only data + segment. + 2005-01-25 Alan Modra <amodra@bigpond.net.au> * emultempl/elf32.em (gld${EMULATION_NAME}_try_needed): Formatting. diff --git a/ld/emulparams/armsymbian.sh b/ld/emulparams/armsymbian.sh index a5c3eb5..a52d05b 100644 --- a/ld/emulparams/armsymbian.sh +++ b/ld/emulparams/armsymbian.sh @@ -9,6 +9,16 @@ TARGET2_TYPE=abs # On BPABI systems, program headers should not be mapped. EMBEDDED=yes +# As for armelf.sh, but add the SymbianOS-specific +# .ARM.exidx$${Base,Limit} symbols. +OTHER_READONLY_SECTIONS=" + .ARM.extab ${RELOCATING-0} : { *(.ARM.extab${RELOCATING+* .gnu.linkonce.armextab.*}) } + ${RELOCATING+ .ARM.exidx\$\$Base = . ; } + ${RELOCATING+ __exidx_start = .; } + .ARM.exidx ${RELOCATING-0} : { *(.ARM.exidx${RELOCATING+* .gnu.linkonce.armexidx.*}) } + ${RELOCATING+ __exidx_end = .; } + ${RELOCATING+ .ARM.exidx\$\$Limit = . ; }" + # This value should match ELF_MAXPAGESIZE in BFD. Otherwise, elf.c # will not place read-write sections in a separate ELF segment from # the read-only sections. diff --git a/ld/scripttempl/armbpabi.sc b/ld/scripttempl/armbpabi.sc index 33fae97..b98f077 100644 --- a/ld/scripttempl/armbpabi.sc +++ b/ld/scripttempl/armbpabi.sc @@ -137,7 +137,10 @@ ${RELOCATING- /* For some reason, the Solaris linker makes bad executables SECTIONS { /* Read-only sections, merged into text segment: */ - ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}} + ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR});}}} + /* SymbianOS uses this symbol. */ + ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Base = ${TEXT_START_ADDR});}}} + ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+ . = ${TEXT_BASE_ADDRESS};}}} ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}} ${CREATE_PIE+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}} ${INITIAL_READONLY_SECTIONS} @@ -150,8 +153,6 @@ cat <<EOF KEEP (*(.init)) ${RELOCATING+${INIT_END}} } =${NOP-0} - - ${DATA_PLT-${BSS_PLT-${PLT}}} .text ${RELOCATING-0} : { ${RELOCATING+${TEXT_START_SYMBOLS}} @@ -167,31 +168,22 @@ cat <<EOF KEEP (*(.fini)) ${RELOCATING+${FINI_END}} } =${NOP-0} + /* The SymbianOS kernel requires that the PLT go at the end of the + text section. */ + ${DATA_PLT-${BSS_PLT-${PLT}}} ${RELOCATING+PROVIDE (__etext = .);} ${RELOCATING+PROVIDE (_etext = .);} ${RELOCATING+PROVIDE (etext = .);} + /* SymbianOS uses this symbol. */ + ${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Limit = .);} ${WRITABLE_RODATA-${RODATA}} .rodata1 ${RELOCATING-0} : { *(.rodata1) } ${CREATE_SHLIB-${SDATA2}} ${CREATE_SHLIB-${SBSS2}} - ${OTHER_READONLY_SECTIONS} - .eh_frame_hdr : { *(.eh_frame_hdr) } - .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) } - .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } - - /* 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};}}} - ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} - ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} - - /* Exception handling */ - .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) } - .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } - /* Thread Local Storage sections */ - .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } - .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } + /* On SymbianOS, put .init_array and friends in the read-only + segment; there is no runtime relocation applied to these + arrays. */ /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but @@ -203,13 +195,36 @@ cat <<EOF ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}} ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}} + /* SymbianOS uses this symbol. */ + ${RELOCATING+${CREATE_SHLIB-PROVIDE (SHT\$\$INIT_ARRAY\$\$Base = .);}} .init_array ${RELOCATING-0} : { *(.init_array) } + /* SymbianOS uses this symbol. */ + ${RELOCATING+${CREATE_SHLIB-PROVIDE (SHT\$\$INIT_ARRAY\$\$Limit = .);}} ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}} ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}} .fini_array ${RELOCATING-0} : { *(.fini_array) } ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}} + ${OTHER_READONLY_SECTIONS} + .eh_frame_hdr : { *(.eh_frame_hdr) } + .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) } + .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } + + /* 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};}}} + ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} + ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}} + + /* Exception handling */ + .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) } + .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } + + /* Thread Local Storage sections */ + .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } + .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } + ${RELOCATING+${CTOR}} ${RELOCATING+${DTOR}} .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) } |