bfd/elfnn-aarch64.c: Handle static links with ifunc correctly.

The code for handling GOT references to ifunc symbols in static links
was missing.

bfd/ChangeLog:

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

	* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol):
	Handle STT_GNU_IFUNC symbols correctly in static links.

ld/testsuite/ChangeLog:

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

	* ld-aarch64/aarch64-elf.exp: Add ifunc-22.
	* ld-aarch64/ifunc-22.d: New file.
	* ld-aarch64/ifunc-22.s: Likewise.
This commit is contained in:
Will Newton 2013-11-25 14:44:59 +00:00
parent b1ee0cc489
commit 4920638856
6 changed files with 66 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2013-11-26 Will Newton <will.newton@linaro.org>
* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol):
Handle STT_GNU_IFUNC symbols correctly in static links.
2013-11-26 Will Newton <will.newton@linaro.org> 2013-11-26 Will Newton <will.newton@linaro.org>
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure

View File

@ -6824,7 +6824,34 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
+ htab->root.sgot->output_offset + htab->root.sgot->output_offset
+ (h->got.offset & ~(bfd_vma) 1)); + (h->got.offset & ~(bfd_vma) 1));
if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h)) if (h->def_regular
&& h->type == STT_GNU_IFUNC)
{
if (info->shared)
{
/* Generate R_AARCH64_GLOB_DAT. */
goto do_glob_dat;
}
else
{
asection *plt;
if (!h->pointer_equality_needed)
abort ();
/* For non-shared object, we can't use .got.plt, which
contains the real function address if we need pointer
equality. We load the GOT entry with the PLT entry. */
plt = htab->root.splt ? htab->root.splt : htab->root.iplt;
bfd_put_NN (output_bfd, (plt->output_section->vma
+ plt->output_offset
+ h->plt.offset),
htab->root.sgot->contents
+ (h->got.offset & ~(bfd_vma) 1));
return TRUE;
}
}
else if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
{ {
if (!h->def_regular) if (!h->def_regular)
return FALSE; return FALSE;
@ -6837,6 +6864,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
} }
else else
{ {
do_glob_dat:
BFD_ASSERT ((h->got.offset & 1) == 0); BFD_ASSERT ((h->got.offset & 1) == 0);
bfd_put_NN (output_bfd, (bfd_vma) 0, bfd_put_NN (output_bfd, (bfd_vma) 0,
htab->root.sgot->contents + h->got.offset); htab->root.sgot->contents + h->got.offset);

View File

@ -1,3 +1,9 @@
2013-11-26 Will Newton <will.newton@linaro.org>
* ld-aarch64/aarch64-elf.exp: Add ifunc-22.
* ld-aarch64/ifunc-22.d: New file.
* ld-aarch64/ifunc-22.s: Likewise.
2013-11-26 Will Newton <will.newton@linaro.org> 2013-11-26 Will Newton <will.newton@linaro.org>
* ld-aarch64/aarch64-elf.exp: Add ifunc-21 test. * ld-aarch64/aarch64-elf.exp: Add ifunc-21 test.

View File

@ -156,3 +156,4 @@ run_dump_test "ifunc-19a"
run_dump_test "ifunc-19b" run_dump_test "ifunc-19b"
run_dump_test "ifunc-20" run_dump_test "ifunc-20"
run_dump_test "ifunc-21" run_dump_test "ifunc-21"
run_dump_test "ifunc-22"

View File

@ -0,0 +1,11 @@
#source: ifunc-22.s
#objdump: -s -j .got
#ld: -static
#target: aarch64*-*-*
# Ensure GOT is populated correctly in static link
.*: file format elf64-(little|big)aarch64
Contents of section \.got:
4100f0 00000000 00000000 d0004000 00000000 ..........@.....

View File

@ -0,0 +1,14 @@
.text
.type ifunc, @gnu_indirect_function
.global ifunc
ifunc:
ret
.size ifunc, .-ifunc
.type _start, @function
.globl _start
_start:
adrp x0, :got:ifunc
ldr x0, [x0, #:got_lo12:ifunc]
.size _start, .-_start
.data
.xword ifunc