Check local IFUNC calls

bfd/

2012-12-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/14956
	* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Check local
	IFUNC calls.
	* elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise.

ld/testsuite/

2012-12-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/14956
	* ld-ifunc/ifunc-14-i386.d: Renamed to ...
	* ld-ifunc/ifunc-14a-i386.d: This.

	* ld-ifunc/ifunc-14-x86-64.d: Renamed to ...
	* ld-ifunc/ifunc-14a-x86-64.d: This.

	* ld-ifunc/ifunc-14b-i386.d: New file.
	* ld-ifunc/ifunc-14b-x86-64.d: Likewise.
	* ld-ifunc/ifunc-14c-i386.d: Likewise.
	* ld-ifunc/ifunc-14c-x86-64.d: Likewise.
	* ld-ifunc/ifunc-14d-i386.d: Likewise.
	* ld-ifunc/ifunc-14d-x86-64.d: Likewise.
This commit is contained in:
H.J. Lu 2012-12-13 21:07:16 +00:00
parent e780d813de
commit 5ca5bb3545
12 changed files with 147 additions and 6 deletions

View file

@ -1,3 +1,10 @@
2012-12-13 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14956
* elf32-i386.c (elf_i386_adjust_dynamic_symbol): Check local
IFUNC calls.
* elf64-x86-64.c (elf_x86_64_adjust_dynamic_symbol): Likewise.
2012-12-10 Edgar E. Iglesias <edgar.iglesias@gmail.com>
* reloc.c (MICROBLAZE): Document new relocations

View file

@ -2066,10 +2066,39 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
{
struct elf_i386_link_hash_table *htab;
asection *s;
struct elf_i386_link_hash_entry *eh;
struct elf_dyn_relocs *p;
/* STT_GNU_IFUNC symbol must go through PLT. */
if (h->type == STT_GNU_IFUNC)
{
/* Check local STT_GNU_IFUNC calls. */
if (h->ref_regular
&& SYMBOL_CALLS_LOCAL (info, h))
{
bfd_size_type pc_count = 0;
struct elf_dyn_relocs **pp;
eh = (struct elf_i386_link_hash_entry *) h;
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
{
pc_count += p->pc_count;
p->count -= p->pc_count;
p->pc_count = 0;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
if (pc_count)
{
h->needs_plt = 1;
h->plt.refcount += 1;
h->non_got_ref = 1;
}
}
if (h->plt.refcount <= 0)
{
h->plt.offset = (bfd_vma) -1;
@ -2155,9 +2184,6 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
if (ELIMINATE_COPY_RELOCS
&& !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
{
struct elf_i386_link_hash_entry * eh;
struct elf_dyn_relocs *p;
eh = (struct elf_i386_link_hash_entry *) h;
for (p = eh->dyn_relocs; p != NULL; p = p->next)
{

View file

@ -2134,10 +2134,39 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
{
struct elf_x86_64_link_hash_table *htab;
asection *s;
struct elf_x86_64_link_hash_entry *eh;
struct elf_dyn_relocs *p;
/* STT_GNU_IFUNC symbol must go through PLT. */
if (h->type == STT_GNU_IFUNC)
{
/* Check local STT_GNU_IFUNC calls. */
if (h->ref_regular
&& SYMBOL_CALLS_LOCAL (info, h))
{
bfd_size_type pc_count = 0;
struct elf_dyn_relocs **pp;
eh = (struct elf_x86_64_link_hash_entry *) h;
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
{
pc_count += p->pc_count;
p->count -= p->pc_count;
p->pc_count = 0;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
if (pc_count)
{
h->needs_plt = 1;
h->plt.refcount += 1;
h->non_got_ref = 1;
}
}
if (h->plt.refcount <= 0)
{
h->plt.offset = (bfd_vma) -1;
@ -2214,9 +2243,6 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
if (ELIMINATE_COPY_RELOCS)
{
struct elf_x86_64_link_hash_entry * eh;
struct elf_dyn_relocs *p;
eh = (struct elf_x86_64_link_hash_entry *) h;
for (p = eh->dyn_relocs; p != NULL; p = p->next)
{

View file

@ -1,3 +1,19 @@
2012-12-13 H.J. Lu <hongjiu.lu@intel.com>
PR ld/14956
* ld-ifunc/ifunc-14-i386.d: Renamed to ...
* ld-ifunc/ifunc-14a-i386.d: This.
* ld-ifunc/ifunc-14-x86-64.d: Renamed to ...
* ld-ifunc/ifunc-14a-x86-64.d: This.
* ld-ifunc/ifunc-14b-i386.d: New file.
* ld-ifunc/ifunc-14b-x86-64.d: Likewise.
* ld-ifunc/ifunc-14c-i386.d: Likewise.
* ld-ifunc/ifunc-14c-x86-64.d: Likewise.
* ld-ifunc/ifunc-14d-i386.d: Likewise.
* ld-ifunc/ifunc-14d-x86-64.d: Likewise.
2012-12-07 H.J. Lu <hongjiu.lu@intel.com>
* ld-elf/pr14926.d: Use "readelf -S --wide".

View file

@ -0,0 +1,11 @@
#source: ifunc-14b.s
#source: ifunc-14a.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -d --wide
#target: x86_64-*-* i?86-*-*
#failif
#...
.*\(TEXTREL\).*
#...

View file

@ -0,0 +1,11 @@
#source: ifunc-14b.s
#source: ifunc-14a.s
#ld: -shared -m elf_x86_64 -z nocombreloc
#as: --64
#readelf: -d
#target: x86_64-*-*
#failif
#...
.*\(TEXTREL\).*
#...

View file

@ -0,0 +1,11 @@
#source: ifunc-14a.s
#source: ifunc-14b.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
#failif
#...
.* +R_386_NONE +.*
#...

View file

@ -0,0 +1,11 @@
#source: ifunc-14a.s
#source: ifunc-14b.s
#ld: -shared -m elf_x86_64 -z nocombreloc
#as: --64
#readelf: -r --wide
#target: x86_64-*-*
#failif
#...
.* +R_X86_64_NONE +.*
#...

View file

@ -0,0 +1,11 @@
#source: ifunc-14b.s
#source: ifunc-14a.s
#ld: -shared -m elf_i386 -z nocombreloc
#as: --32
#readelf: -r --wide
#target: x86_64-*-* i?86-*-*
#failif
#...
.* +R_386_NONE +.*
#...

View file

@ -0,0 +1,11 @@
#source: ifunc-14b.s
#source: ifunc-14a.s
#ld: -shared -m elf_x86_64 -z nocombreloc
#as: --64
#readelf: -r --wide
#target: x86_64-*-*
#failif
#...
.* +R_X86_64_NONE +.*
#...