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