This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PATCH: PR ld/13302: IRELATIVE relocation should come last
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: Ulrich Drepper <drepper at gmail dot com>
- Cc: binutils at sourceware dot org
- Date: Fri, 21 Oct 2011 12:49:12 -0700
- Subject: Re: PATCH: PR ld/13302: IRELATIVE relocation should come last
- References: <20111021151723.GA31013@intel.com>
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
On Fri, Oct 21, 2011 at 08:17:23AM -0700, H.J. Lu wrote:
> Hi,
>
> I checked in this patch to put IRELATIVE relocations after JUMP_SLOT.
>
>
Here is a patch to replace IRELATIVE with RELATIVE in .rel.dyn. We now
use PLT entry, instead of real function, for non-GOT reference to locally
defined IFUNC symbols.
H.J.
---
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a20a75d..39f1a2a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
+ * elf32-i386.c (elf_i386_relocate_section): Replace
+ R_386_IRELATIVE with R_386_RELATIVE.
+
+ * elf64-x86-64.c (elf_x86_64_relocate_section): Replace
+ R_X86_64_IRELATIVE with R_X86_64_RELATIVE.
+
2011-10-21 H.J. Lu <hongjiu.lu@intel.com>.
* elf32-i386.c (elf_i386_relocate_section): Fix a typo in
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 01c0669..d187305 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -3257,6 +3257,7 @@ 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. */
@@ -3277,15 +3278,14 @@ elf_i386_relocate_section (bfd *output_bfd,
|| info->executable)
{
/* This symbol is resolved locally. */
- 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);
+ outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
+ relocate = TRUE;
}
else
- outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+ {
+ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
+ relocate = FALSE;
+ }
sreloc = htab->elf.irelifunc;
loc = sreloc->contents;
@@ -3298,7 +3298,8 @@ 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. */
- continue;
+ if (! relocate)
+ continue;
}
/* FALLTHROUGH */
case R_386_PC32:
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 645e5a2..2206dd4 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3161,6 +3161,7 @@ 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. */
@@ -3180,15 +3181,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_IRELATIVE);
- outrel.r_addend = (h->root.u.def.value
- + h->root.u.def.section->output_section->vma
- + h->root.u.def.section->output_offset);
+ outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
+ outrel.r_addend = relocation;
+ relocate = FALSE;
}
else
{
outrel.r_info = htab->r_info (h->dynindx, r_type);
outrel.r_addend = 0;
+ relocate = FALSE;
}
sreloc = htab->elf.irelifunc;
@@ -3199,7 +3200,8 @@ 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. */
- continue;
+ if (! relocate)
+ continue;
}
/* FALLTHROUGH */
case R_X86_64_PC32:
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 8480fee..2b444ac 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,6 +1,18 @@
2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
PR ld/13302
+ * ld-i386/i386.exp: Run pr13302.
+
+ * ld-i386/pr13302.d: New.
+ * ld-i386/pr13302.s: Likewise.
+
+ * ld-x86-64/pr13082-5b.d: Updated.
+ * ld-x86-64/pr13082-6a.d: Likewise.
+ * ld-x86-64/pr13082-6b.d: Likewise.
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
* ld-ifunc/ifunc-16-i386.d: New.
* ld-ifunc/ifunc-16-x86-64.d: Likewise.
* ld-ifunc/ifunc-16-x86.s: Likewise.
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 68b71fb..1727922 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -210,3 +210,4 @@ if { !([istarget "i?86-*-linux*"]
run_dump_test "compressed1"
run_dump_test "pr12627"
+run_dump_test "pr13302"
diff --git a/ld/testsuite/ld-i386/pr13302.d b/ld/testsuite/ld-i386/pr13302.d
new file mode 100644
index 0000000..3d85d08
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr13302.d
@@ -0,0 +1,12 @@
+#name: PR ld/13302
+#as: --32
+#ld: -pie -melf_i386
+#readelf: -r --wide
+
+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 +
+
+Relocation section '.rel.plt' 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_IRELATIVE +
diff --git a/ld/testsuite/ld-i386/pr13302.s b/ld/testsuite/ld-i386/pr13302.s
new file mode 100644
index 0000000..cfd2717
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr13302.s
@@ -0,0 +1,11 @@
+ .text
+ .globl _start
+ .type ifunc, @gnu_indirect_function
+_start:
+ lea .Ljmp@GOTOFF(%ebx), %eax
+ifunc:
+ jmp *(%eax)
+ .section .data.rel.ro.local,"aw",@progbits
+ .align 4
+.Ljmp:
+ .long ifunc
diff --git a/ld/testsuite/ld-x86-64/pr13082-5b.d b/ld/testsuite/ld-x86-64/pr13082-5b.d
index 1c5a5e7..48e37c3 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_IRELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[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 9a1a655..de90bb8 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_IRELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[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 792c348..66ff59b 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_IRELATIVE +[0-9a-f]+
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[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