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