2009-04-15 Christophe Lyon <christophe.lyon@st.com>
authorChristophe Lyon <christophe.lyon@st.com>
Wed, 15 Apr 2009 13:49:54 +0000 (13:49 +0000)
committerChristophe Lyon <christophe.lyon@st.com>
Wed, 15 Apr 2009 13:49:54 +0000 (13:49 +0000)
bfd/
* elf32-arm.c (elf32_arm_final_link_relocate): Don't convert ARM
branch to an undef weak symbol into a jump to next instruction if
a PLT entry will be created.

testsuite/
* ld-arm/arm-elf.exp: Add 1 more test to check undef weak
reference with PLT in ARM mode.
* ld-arm/thumb2-bl-undefweak1.d, ld-arm/thumb2-bl-undefweak1.s:
New files.

bfd/ChangeLog
bfd/elf32-arm.c
ld/testsuite/ChangeLog
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/thumb2-bl-undefweak1.d [new file with mode: 0644]
ld/testsuite/ld-arm/thumb2-bl-undefweak1.s [new file with mode: 0644]

index bcd21793984c409d6643c453a902b0730e3c7979..6e4b535fb0a1c249b5e07a52c6a7bbaf45a97d03 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-15  Christophe Lyon  <christophe.lyon@st.com>
+
+       * elf32-arm.c (elf32_arm_final_link_relocate): Don't convert ARM
+       branch to an undef weak symbol into a jump to next instruction if
+       a PLT entry will be created.
+
 2009-04-14  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        * coffgen.c (make_a_section_from_file):  Set the backend long
index a47d02c020df4b666669b448dc90a1c351bbc749..99beb9e63cc8c123ff22da7c61ab3ee2fcb728e4 100644 (file)
@@ -6363,8 +6363,9 @@ elf32_arm_final_link_relocate (reloc_howto_type *           howto,
          signed_addend >>= howto->rightshift;
 
          /* A branch to an undefined weak symbol is turned into a jump to
-            the next instruction.  */
-         if (h && h->root.type == bfd_link_hash_undefweak)
+            the next instruction unless a PLT entry will be created.  */
+         if (h && h->root.type == bfd_link_hash_undefweak
+             && !(splt != NULL && h->plt.offset != (bfd_vma) -1))
            {
              value = (bfd_get_32 (input_bfd, hit_data) & 0xf0000000)
                      | 0x0affffff;
index e92a871b19ea707f51f8c995e7ec6ca3aac9fa98..7c79608d9c5ab19f238729807ccc90521ec3d96a 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-15  Christophe Lyon  <christophe.lyon@st.com>
+
+       * ld-arm/arm-elf.exp: Add 1 more test to check undef weak
+       reference with PLT in ARM mode.
+       * ld-arm/thumb2-bl-undefweak1.d, ld-arm/thumb2-bl-undefweak1.s:
+       New files.
+
 2009-04-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-i386/abs.d: Add  --32 for assembler and -melf_i386 for
index 3625ddb55029ca867adc6146d04d34106af3b70b..94002a1aea057fa4470f7455916d6ecfb023a913 100644 (file)
@@ -185,6 +185,7 @@ run_dump_test "group-relocs-ldr-bad"
 run_dump_test "group-relocs-ldrs-bad"
 run_dump_test "group-relocs-ldc-bad"
 run_dump_test "thumb2-bl-undefweak"
+run_dump_test "thumb2-bl-undefweak1"
 run_dump_test "emit-relocs1"
 
 # Exclude non-ARM-EABI targets.
diff --git a/ld/testsuite/ld-arm/thumb2-bl-undefweak1.d b/ld/testsuite/ld-arm/thumb2-bl-undefweak1.d
new file mode 100644 (file)
index 0000000..929d180
--- /dev/null
@@ -0,0 +1,9 @@
+#source: thumb2-bl-undefweak1.s
+#as:
+#ld: -shared
+#objdump: -dr
+#...
+Disassembly of section .text:
+
+.* <foo>:
+ .*:   ........        bl      ... <foo-0x.*>
diff --git a/ld/testsuite/ld-arm/thumb2-bl-undefweak1.s b/ld/testsuite/ld-arm/thumb2-bl-undefweak1.s
new file mode 100644 (file)
index 0000000..a302811
--- /dev/null
@@ -0,0 +1,9 @@
+@ Test that calls to undefined weak functions resolve to call through
+@ the PLT in shared libraries in ARM mode.
+
+       .arch armv6
+       .syntax unified
+       .text
+foo:
+       bl bar
+       .weak bar