This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR ld/13817: Broken IFUNC support
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Fri, 9 Mar 2012 08:32:27 -0800
- Subject: PATCH: PR ld/13817: Broken IFUNC support
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
We have to use real function, not PLT entry for non-GOT reference to
locally defined IFUNC symbols, at least on i386, since the PLT slot
assumes that %ebx of the caller points to the _GLOBAL_OFFSET_TABLE_
symbol of the library containing the PLT slot. I checked in this
patch to revert:
http://sourceware.org/ml/binutils/2011-10/msg00203.html
Although x86-64 doesn't have this problem. I reverted both i386 and
x86-64 changes to keep i386 consistent with x86-64 as much as possible.
H.J.
---
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2140240..66a7339 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2012-03-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13817
+ * bfd/elf32-i386.c (elf_i386_relocate_section): Restore
+ R_386_IRELATIVE.
+
+ * * elf64-x86-64.c (elf_x86_64_relocate_section): Restore
+ R_X86_64_IRELATIVE.
+
2012-03-08 Tristan Gingold <gingold@adacore.com>
* vms-lib.c (_bfd_vms_lib_write_archive_contents): Set maximum
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index d187305..01c0669 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -3257,7 +3257,6 @@ elf_i386_relocate_section (bfd *output_bfd,
bfd_byte *loc;
asection *sreloc;
bfd_vma offset;
- bfd_boolean relocate;
/* Need a dynamic relocation to get the real function
adddress. */
@@ -3278,14 +3277,15 @@ elf_i386_relocate_section (bfd *output_bfd,
|| info->executable)
{
/* This symbol is resolved locally. */
- outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
- relocate = TRUE;
+ outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
+ bfd_put_32 (output_bfd,
+ (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset),
+ contents + offset);
}
else
- {
- outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
- relocate = FALSE;
- }
+ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
sreloc = htab->elf.irelifunc;
loc = sreloc->contents;
@@ -3298,8 +3298,7 @@ elf_i386_relocate_section (bfd *output_bfd,
we need to include the symbol value so that it
becomes an addend for the dynamic reloc. For an
internal symbol, we have updated addend. */
- if (! relocate)
- continue;
+ continue;
}
/* FALLTHROUGH */
case R_386_PC32:
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 81ed866..47f1295 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3156,7 +3156,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
{
Elf_Internal_Rela outrel;
asection *sreloc;
- bfd_boolean relocate;
/* Need a dynamic relocation to get the real function
address. */
@@ -3176,15 +3175,15 @@ elf_x86_64_relocate_section (bfd *output_bfd,
|| info->executable)
{
/* This symbol is resolved locally. */
- outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
- outrel.r_addend = relocation;
- relocate = TRUE;
+ outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
+ outrel.r_addend = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
}
else
{
outrel.r_info = htab->r_info (h->dynindx, r_type);
outrel.r_addend = 0;
- relocate = FALSE;
}
sreloc = htab->elf.irelifunc;
@@ -3195,8 +3194,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
we need to include the symbol value so that it
becomes an addend for the dynamic reloc. For an
internal symbol, we have updated addend. */
- if (! relocate)
- continue;
+ continue;
}
/* FALLTHROUGH */
case R_X86_64_PC32:
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index b49cce5..1e3c5c1 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2012-03-09 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13817
+ * ld-i386/pr13302.d: Updated.
+ * ld-x86-64/pr13082-5b.d: Likewise.
+ * ld-x86-64/pr13082-6a.d: Likewise.
+ * ld-x86-64/pr13082-6b.d: Likewise.
+
2012-03-06 Alan Modra <amodra@gmail.com>
PR ld/13683
diff --git a/ld/testsuite/ld-i386/pr13302.d b/ld/testsuite/ld-i386/pr13302.d
index 3d85d08..35c09ae 100644
--- a/ld/testsuite/ld-i386/pr13302.d
+++ b/ld/testsuite/ld-i386/pr13302.d
@@ -5,7 +5,7 @@
Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name
-[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
+[0-9a-f]+ +[0-9a-f]+ +R_386_IRELATIVE +
Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name
diff --git a/ld/testsuite/ld-x86-64/pr13082-5b.d b/ld/testsuite/ld-x86-64/pr13082-5b.d
index 48e37c3..1c5a5e7 100644
--- a/ld/testsuite/ld-x86-64/pr13082-5b.d
+++ b/ld/testsuite/ld-x86-64/pr13082-5b.d
@@ -6,7 +6,7 @@
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend
-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend
diff --git a/ld/testsuite/ld-x86-64/pr13082-6a.d b/ld/testsuite/ld-x86-64/pr13082-6a.d
index de90bb8..9a1a655 100644
--- a/ld/testsuite/ld-x86-64/pr13082-6a.d
+++ b/ld/testsuite/ld-x86-64/pr13082-6a.d
@@ -6,7 +6,7 @@
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend
-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend
diff --git a/ld/testsuite/ld-x86-64/pr13082-6b.d b/ld/testsuite/ld-x86-64/pr13082-6b.d
index 66ff59b..792c348 100644
--- a/ld/testsuite/ld-x86-64/pr13082-6b.d
+++ b/ld/testsuite/ld-x86-64/pr13082-6b.d
@@ -6,7 +6,7 @@
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend
-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
Offset Info Type Sym. Value Symbol's Name \+ Addend