|
Kyle McMartin |
422f7b7 |
commit 67428c4aa56d4183d0f531e0d752040745a94423
|
|
Kyle McMartin |
422f7b7 |
Author: Will Newton <will.newton@linaro.org>
|
|
Kyle McMartin |
422f7b7 |
Date: Mon Nov 25 11:07:07 2013 +0000
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
bfd/elfnn-aarch64.c: Fix miscalculation of GOTPLT offset for ifunc syms.
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
The .got.plt header size was not being correctly taken into account
|
|
Kyle McMartin |
422f7b7 |
when calculating the offset for relocations against ifunc symbols.
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
bfd/ChangeLog:
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
2013-11-26 Will Newton <will.newton@linaro.org>
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure
|
|
Kyle McMartin |
422f7b7 |
PLT_INDEX is calculated using correct header size.
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
ld/testsuite/ChangeLog:
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
2013-11-26 Will Newton <will.newton@linaro.org>
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
* ld-aarch64/aarch64-elf.exp: Add ifunc-21 test.
|
|
Kyle McMartin |
422f7b7 |
* ld-aarch64/ifunc-21.d: New file.
|
|
Kyle McMartin |
422f7b7 |
* ld-aarch64/ifunc-21.s: Likewise.
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
|
|
Kyle McMartin |
422f7b7 |
index 6bc414e..3cd3a18 100644
|
|
Kyle McMartin |
422f7b7 |
--- a/bfd/elfnn-aarch64.c
|
|
Kyle McMartin |
422f7b7 |
+++ b/bfd/elfnn-aarch64.c
|
|
Kyle McMartin |
422f7b7 |
@@ -3589,7 +3589,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
|
|
Kyle McMartin |
422f7b7 |
|
|
Kyle McMartin |
422f7b7 |
if (globals->root.splt != NULL)
|
|
Kyle McMartin |
422f7b7 |
{
|
|
Kyle McMartin |
422f7b7 |
- plt_index = h->plt.offset / globals->plt_entry_size - 1;
|
|
Kyle McMartin |
422f7b7 |
+ plt_index = ((h->plt.offset - globals->plt_header_size) /
|
|
Kyle McMartin |
422f7b7 |
+ globals->plt_entry_size);
|
|
Kyle McMartin |
422f7b7 |
off = (plt_index + 3) * GOT_ENTRY_SIZE;
|
|
Kyle McMartin |
422f7b7 |
base_got = globals->root.sgotplt;
|
|
Kyle McMartin |
422f7b7 |
}
|
|
Kyle McMartin |
422f7b7 |
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
|
|
Kyle McMartin |
422f7b7 |
index 5c150dd..a6b3ea2 100644
|
|
Kyle McMartin |
422f7b7 |
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
|
|
Kyle McMartin |
422f7b7 |
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
|
|
Kyle McMartin |
422f7b7 |
@@ -155,3 +155,4 @@ run_dump_test "ifunc-18b"
|
|
Kyle McMartin |
422f7b7 |
run_dump_test "ifunc-19a"
|
|
Kyle McMartin |
422f7b7 |
run_dump_test "ifunc-19b"
|
|
Kyle McMartin |
422f7b7 |
run_dump_test "ifunc-20"
|
|
Kyle McMartin |
422f7b7 |
+run_dump_test "ifunc-21"
|
|
Kyle McMartin |
422f7b7 |
diff --git a/ld/testsuite/ld-aarch64/ifunc-21.d b/ld/testsuite/ld-aarch64/ifunc-21.d
|
|
Kyle McMartin |
422f7b7 |
new file mode 100644
|
|
Kyle McMartin |
422f7b7 |
index 0000000..fa139b2
|
|
Kyle McMartin |
422f7b7 |
--- /dev/null
|
|
Kyle McMartin |
422f7b7 |
+++ b/ld/testsuite/ld-aarch64/ifunc-21.d
|
|
Kyle McMartin |
422f7b7 |
@@ -0,0 +1,31 @@
|
|
Kyle McMartin |
422f7b7 |
+#source: ifunc-21.s
|
|
Kyle McMartin |
422f7b7 |
+#ld: -shared -z nocombreloc
|
|
Kyle McMartin |
422f7b7 |
+#objdump: -d -s -j .got.plt -j .text
|
|
Kyle McMartin |
422f7b7 |
+#target: aarch64*-*-*
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+# Ensure the .got.plt slot used is correct
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+.*: file format elf64-(little|big)aarch64
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+Contents of section .text:
|
|
Kyle McMartin |
422f7b7 |
+ 02a0 .*
|
|
Kyle McMartin |
422f7b7 |
+Contents of section .got.plt:
|
|
Kyle McMartin |
422f7b7 |
+ 103a8 0+ 0+ 0+ 0+ .*
|
|
Kyle McMartin |
422f7b7 |
+ 103b8 0+ 0+ [0-9a-f]+ 0+ .*
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+Disassembly of section .text:
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+0+2a0 <ifunc>:
|
|
Kyle McMartin |
422f7b7 |
+ 2a0: d65f03c0 ret
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+0+2a4 <bar>:
|
|
Kyle McMartin |
422f7b7 |
+ 2a4: 90000080 adrp x0, 10000 <.*>
|
|
Kyle McMartin |
422f7b7 |
+ 2a8: f941e000 ldr x0, \[x0,#960\]
|
|
Kyle McMartin |
422f7b7 |
+ 2ac: d65f03c0 ret
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+Disassembly of section .got.plt:
|
|
Kyle McMartin |
422f7b7 |
+
|
|
Kyle McMartin |
422f7b7 |
+.*:
|
|
Kyle McMartin |
422f7b7 |
+.*
|
|
Kyle McMartin |
422f7b7 |
+.*
|
|
Kyle McMartin |
422f7b7 |
+.*
|
|
Kyle McMartin |
422f7b7 |
diff --git a/ld/testsuite/ld-aarch64/ifunc-21.s b/ld/testsuite/ld-aarch64/ifunc-21.s
|
|
Kyle McMartin |
422f7b7 |
new file mode 100644
|
|
Kyle McMartin |
422f7b7 |
index 0000000..a1563dc
|
|
Kyle McMartin |
422f7b7 |
--- /dev/null
|
|
Kyle McMartin |
422f7b7 |
+++ b/ld/testsuite/ld-aarch64/ifunc-21.s
|
|
Kyle McMartin |
422f7b7 |
@@ -0,0 +1,13 @@
|
|
Kyle McMartin |
422f7b7 |
+ .text
|
|
Kyle McMartin |
422f7b7 |
+ .type ifunc, @gnu_indirect_function
|
|
Kyle McMartin |
422f7b7 |
+ .hidden ifunc
|
|
Kyle McMartin |
422f7b7 |
+ifunc:
|
|
Kyle McMartin |
422f7b7 |
+ ret
|
|
Kyle McMartin |
422f7b7 |
+ .size ifunc, .-ifunc
|
|
Kyle McMartin |
422f7b7 |
+ .type bar, @function
|
|
Kyle McMartin |
422f7b7 |
+ .globl bar
|
|
Kyle McMartin |
422f7b7 |
+bar:
|
|
Kyle McMartin |
422f7b7 |
+ adrp x0, :got:ifunc
|
|
Kyle McMartin |
422f7b7 |
+ ldr x0, [x0, #:got_lo12:ifunc]
|
|
Kyle McMartin |
422f7b7 |
+ ret
|
|
Kyle McMartin |
422f7b7 |
+ .size bar, .-bar
|