Also check local IFUNC references

bfd/

	PR ld/14968
	* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Also check
	local IFUNC references.
	* elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise.

ld/testsuite/

	PR ld/14968
	* ld-ifunc/ifunc-18a-i386.d: New file.
	* ld-ifunc/ifunc-18a-x86-64.d: Likewise.
	* ld-ifunc/ifunc-18a.s: Likewise.
	* ld-ifunc/ifunc-18b-i386.d: Likewise.
	* ld-ifunc/ifunc-18b-x86-64.d: Likewise.
	* ld-ifunc/ifunc-18b.s: Likewise.
	* ld-ifunc/ifunc-19a-i386.d: Likewise.
	* ld-ifunc/ifunc-19a-x86-64.d: Likewise.
	* ld-ifunc/ifunc-19a.s: Likewise.
	* ld-ifunc/ifunc-19b-i386.d: Likewise.
	* ld-ifunc/ifunc-19b-x86-64.d: Likewise.
	* ld-ifunc/ifunc-19b.s: Likewise.
This commit is contained in:
H.J. Lu 2012-12-16 20:31:08 +00:00
parent 3d745be3fc
commit 73bcf23385
16 changed files with 190 additions and 7 deletions

View File

@ -1,6 +1,13 @@
2012-12-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14968
* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Also check
local IFUNC references.
* elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise.
2012-12-14 Tom Tromey <tromey@redhat.com>
* elf.c (elfcore_grok_note) <NT_FILE>: New case.
* elf.c (elfcore_grok_note) <NT_FILE>: New case.
2012-12-13 H.J. Lu <hongjiu.lu@intel.com>

View File

@ -2072,11 +2072,12 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
/* STT_GNU_IFUNC symbol must go through PLT. */
if (h->type == STT_GNU_IFUNC)
{
/* Check local STT_GNU_IFUNC calls. */
/* All local STT_GNU_IFUNC references must be treate as local
calls via local PLT. */
if (h->ref_regular
&& SYMBOL_CALLS_LOCAL (info, h))
{
bfd_size_type pc_count = 0;
bfd_size_type pc_count = 0, count = 0;
struct elf_dyn_relocs **pp;
eh = (struct elf_i386_link_hash_entry *) h;
@ -2085,13 +2086,14 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
pc_count += p->pc_count;
p->count -= p->pc_count;
p->pc_count = 0;
count += p->count;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
if (pc_count)
if (pc_count || count)
{
h->needs_plt = 1;
h->plt.refcount += 1;

View File

@ -2140,11 +2140,12 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
/* STT_GNU_IFUNC symbol must go through PLT. */
if (h->type == STT_GNU_IFUNC)
{
/* Check local STT_GNU_IFUNC calls. */
/* All local STT_GNU_IFUNC references must be treate as local
calls via local PLT. */
if (h->ref_regular
&& SYMBOL_CALLS_LOCAL (info, h))
{
bfd_size_type pc_count = 0;
bfd_size_type pc_count = 0, count = 0;
struct elf_dyn_relocs **pp;
eh = (struct elf_x86_64_link_hash_entry *) h;
@ -2153,13 +2154,14 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
pc_count += p->pc_count;
p->count -= p->pc_count;
p->pc_count = 0;
count += p->count;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
if (pc_count)
if (pc_count || count)
{
h->needs_plt = 1;
h->plt.refcount += 1;

View File

@ -1,3 +1,19 @@
2012-12-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14968
* ld-ifunc/ifunc-18a-i386.d: New file.
* ld-ifunc/ifunc-18a-x86-64.d: Likewise.
* ld-ifunc/ifunc-18a.s: Likewise.
* ld-ifunc/ifunc-18b-i386.d: Likewise.
* ld-ifunc/ifunc-18b-x86-64.d: Likewise.
* ld-ifunc/ifunc-18b.s: Likewise.
* ld-ifunc/ifunc-19a-i386.d: Likewise.
* ld-ifunc/ifunc-19a-x86-64.d: Likewise.
* ld-ifunc/ifunc-19a.s: Likewise.
* ld-ifunc/ifunc-19b-i386.d: Likewise.
* ld-ifunc/ifunc-19b-x86-64.d: Likewise.
* ld-ifunc/ifunc-19b.s: Likewise.
2012-12-15 Thomas Schwinge <thomas@codesourcery.com>
* ld-elf/elf.exp (stack exec, stack size): Run for any GNU target.

View File

@ -0,0 +1,15 @@
#source: ifunc-18a.s
#source: ifunc-18b.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
Relocation section '.rel.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
Relocation section '.rel.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*

View File

@ -0,0 +1,15 @@
#source: ifunc-18a.s
#source: ifunc-18b.s
#as: --64
#ld: -shared -melf_x86_64 -z nocombreloc
#readelf: -r --wide
#target: x86_64-*-*
Relocation section '.rela.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
Relocation section '.rela.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*

View File

@ -0,0 +1,5 @@
.section .data.rel,"aw",@progbits
.globl foo_ptrt
.type foo_ptr, @object
foo_ptr:
.dc.a foo

View File

@ -0,0 +1,15 @@
#source: ifunc-18b.s
#source: ifunc-18a.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
Relocation section '.rel.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
Relocation section '.rel.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*

View File

@ -0,0 +1,15 @@
#source: ifunc-18b.s
#source: ifunc-18a.s
#as: --64
#ld: -shared -melf_x86_64 -z nocombreloc
#readelf: -r --wide
#target: x86_64-*-*
Relocation section '.rela.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
Relocation section '.rela.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*

View File

@ -0,0 +1,15 @@
.text
.type foo, %gnu_indirect_function
.hidden foo
.globl foo
foo:
ret
.size foo, .-foo
.globl bar
bar:
jmp foo1@PLT
ret
.size bar, .-bar
.hidden foo1
.globl foo1
foo1 = foo

View File

@ -0,0 +1,14 @@
#source: ifunc-19a.s
#source: ifunc-19b.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
Relocation section '.rel.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
Relocation section '.rel.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*

View File

@ -0,0 +1,14 @@
#source: ifunc-19a.s
#source: ifunc-19b.s
#as: --64
#ld: -shared -melf_x86_64 -z nocombreloc
#readelf: -r --wide
#target: x86_64-*-*
Relocation section '.rela.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
Relocation section '.rela.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*

View File

@ -0,0 +1,5 @@
.section .data.rel,"aw",@progbits
.globl foo_ptrt
.type foo_ptr, @object
foo_ptr:
.dc.a foo1

View File

@ -0,0 +1,14 @@
#source: ifunc-19b.s
#source: ifunc-19a.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
Relocation section '.rel.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
Relocation section '.rel.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*

View File

@ -0,0 +1,14 @@
#source: ifunc-19b.s
#source: ifunc-19a.s
#as: --64
#ld: -shared -melf_x86_64 -z nocombreloc
#readelf: -r --wide
#target: x86_64-*-*
Relocation section '.rela.ifunc' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
Relocation section '.rela.plt' at .*
[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*

View File

@ -0,0 +1,15 @@
.text
.type foo, %gnu_indirect_function
.hidden foo
.globl foo
foo:
ret
.size foo, .-foo
.globl bar
bar:
jmp foo1@PLT
ret
.size bar, .-bar
.hidden foo1
.globl foo1
foo1 = foo