bfd/elfnn-aarch64.c: Fix miscalculation of GOTPLT offset for ifunc syms.
authorWill Newton <will.newton@linaro.org>
Mon, 25 Nov 2013 11:07:07 +0000 (11:07 +0000)
committerWill Newton <will.newton@linaro.org>
Tue, 26 Nov 2013 15:24:54 +0000 (15:24 +0000)
The .got.plt header size was not being correctly taken into account
when calculating the offset for relocations against ifunc symbols.

bfd/ChangeLog:

2013-11-26  Will Newton  <will.newton@linaro.org>

* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure
PLT_INDEX is calculated using correct header size.

ld/testsuite/ChangeLog:

2013-11-26  Will Newton  <will.newton@linaro.org>

* ld-aarch64/aarch64-elf.exp: Add ifunc-21 test.
* ld-aarch64/ifunc-21.d: New file.
* ld-aarch64/ifunc-21.s: Likewise.

bfd/ChangeLog
bfd/elfnn-aarch64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-aarch64/aarch64-elf.exp
ld/testsuite/ld-aarch64/ifunc-21.d [new file with mode: 0644]
ld/testsuite/ld-aarch64/ifunc-21.s [new file with mode: 0644]

index d76b1b4..4bcbba8 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-26  Will Newton  <will.newton@linaro.org>
+
+       * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure
+       PLT_INDEX is calculated using correct header size.
+
 2013-11-22  Cory Fields  <cory@coryfields.com>
 
        * libcoff-in.h: Add insert_timestamp flag to the pe_data struct.
index 48fa3d2..7cce6f4 100644 (file)
@@ -3589,7 +3589,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
 
              if (globals->root.splt != NULL)
                {
-                 plt_index = h->plt.offset / globals->plt_entry_size - 1;
+                 plt_index = ((h->plt.offset - globals->plt_header_size) /
+                              globals->plt_entry_size);
                  off = (plt_index + 3) * GOT_ENTRY_SIZE;
                  base_got = globals->root.sgotplt;
                }
index 2200866..22a062d 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-26  Will Newton  <will.newton@linaro.org>
+
+       * ld-aarch64/aarch64-elf.exp: Add ifunc-21 test.
+       * ld-aarch64/ifunc-21.d: New file.
+       * ld-aarch64/ifunc-21.s: Likewise.
+
 2013-11-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-x86-64/mpx.exp: Run bnd-branch-1.
index 5c150dd..a6b3ea2 100644 (file)
@@ -155,3 +155,4 @@ run_dump_test "ifunc-18b"
 run_dump_test "ifunc-19a"
 run_dump_test "ifunc-19b"
 run_dump_test "ifunc-20"
+run_dump_test "ifunc-21"
diff --git a/ld/testsuite/ld-aarch64/ifunc-21.d b/ld/testsuite/ld-aarch64/ifunc-21.d
new file mode 100644 (file)
index 0000000..fa139b2
--- /dev/null
@@ -0,0 +1,31 @@
+#source: ifunc-21.s
+#ld: -shared -z nocombreloc
+#objdump: -d -s -j .got.plt -j .text
+#target: aarch64*-*-*
+
+# Ensure the .got.plt slot used is correct
+
+.*:     file format elf64-(little|big)aarch64
+
+Contents of section .text:
+ 02a0 .*
+Contents of section .got.plt:
+ 103a8 0+ 0+ 0+ 0+  .*
+ 103b8 0+ 0+ [0-9a-f]+ 0+  .*
+
+Disassembly of section .text:
+
+0+2a0 <ifunc>:
+ 2a0:  d65f03c0        ret
+
+0+2a4 <bar>:
+ 2a4:  90000080        adrp    x0, 10000 <.*>
+ 2a8:  f941e000        ldr     x0, \[x0,#960\]
+ 2ac:  d65f03c0        ret
+
+Disassembly of section .got.plt:
+
+.*:
+.*
+.*
+.*
diff --git a/ld/testsuite/ld-aarch64/ifunc-21.s b/ld/testsuite/ld-aarch64/ifunc-21.s
new file mode 100644 (file)
index 0000000..a1563dc
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+       .type ifunc, @gnu_indirect_function
+       .hidden ifunc
+ifunc:
+       ret
+       .size   ifunc, .-ifunc
+       .type bar, @function
+       .globl bar
+bar:
+        adrp    x0, :got:ifunc
+        ldr     x0, [x0, #:got_lo12:ifunc]
+       ret
+       .size   bar, .-bar