diff options
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emultempl/armelf.em | 27 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/arm-elf.exp | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/thumb-entry.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/thumb-entry.s | 8 |
6 files changed, 48 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 81a0e39..2cb4fd0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2006-02-07 Paul Brook <paul@codesourcery.com> + + * emultempl/armelf.em: Include elf/arm.h. + (arm_elf_finish): Set low address bit if enty point is a Thumb + function. + 2006-02-01 Danny Smith <dannysmith@users.sourceforge.net> * deffilep.y (def_image_name): If the image name does not have diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index 71498da..bd74ab5 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -26,6 +26,8 @@ test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel" cat >>e${EMULATION_NAME}.c <<EOF +#include "elf/arm.h" + static char *thumb_entry_symbol = NULL; static bfd *bfd_for_interwork; static int byteswap_code = 0; @@ -150,11 +152,25 @@ arm_elf_finish (void) /* Call the elf32.em routine. */ gld${EMULATION_NAME}_finish (); - if (thumb_entry_symbol == NULL) - return; + if (thumb_entry_symbol) + { + h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, + FALSE, FALSE, TRUE); + } + else + { + struct elf_link_hash_entry * eh; + + if (!entry_symbol.name) + return; + + h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name, + FALSE, FALSE, TRUE); + eh = (struct elf_link_hash_entry *)h; + if (!h || ELF_ST_TYPE(eh->type) != STT_ARM_TFUNC) + return; + } - h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, - FALSE, FALSE, TRUE); if (h != (struct bfd_link_hash_entry *) NULL && (h->type == bfd_link_hash_defined @@ -180,7 +196,8 @@ arm_elf_finish (void) sprintf_vma (buffer + 2, val); - if (entry_symbol.name != NULL && entry_from_cmdline) + if (thumb_entry_symbol != NULL && entry_symbol.name != NULL + && entry_from_cmdline) einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"), thumb_entry_symbol, entry_symbol.name); entry_symbol.name = buffer; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f7e13cd..d1692ed 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-02-07 Paul Brook <paul@codesourcery.com> + + * ld-arm/arm-elf.exp: Add thumb-entry test. + * ld-arm/thumb-entry.d: New test. + * ld-arm/thumb-entry.s: New test. + 2006-02-04 Richard Sandiford <richard@codesourcery.com> * ld-mips-elf/tls-hidden2a.s, ld-mips-elf/tls-hidden2b.s, diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 384b289..76a743e 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -89,6 +89,9 @@ set armelftests { {"TLS dynamic application" "-T arm-dyn.ld tmpdir/tls-lib.so" "" {tls-app.s} {{objdump -fdw tls-app.d} {objdump -Rw tls-app.r}} "tls-app"} + {"Thumb entry point" "-T arm.ld" "" {thumb-entry.s} + {{readelf -h thumb-entry.d}} + "thumb-entry"} } run_ld_link_tests $armelftests diff --git a/ld/testsuite/ld-arm/thumb-entry.d b/ld/testsuite/ld-arm/thumb-entry.d new file mode 100644 index 0000000..602fd6c --- /dev/null +++ b/ld/testsuite/ld-arm/thumb-entry.d @@ -0,0 +1,3 @@ +#... + Entry point address: 0x8001 +#... diff --git a/ld/testsuite/ld-arm/thumb-entry.s b/ld/testsuite/ld-arm/thumb-entry.s new file mode 100644 index 0000000..5b3659d --- /dev/null +++ b/ld/testsuite/ld-arm/thumb-entry.s @@ -0,0 +1,8 @@ + .text + .arch armv4t + .thumb + .global _start + .thumb_func +_start: + bx lr + |