* PATCH: PR ld/13302: IRELATIVE relocation should come last
@ 2011-10-21 15:17 H.J. Lu
2011-10-21 19:49 ` H.J. Lu
0 siblings, 1 reply; 4+ messages in thread
From: H.J. Lu @ 2011-10-21 15:17 UTC (permalink / raw)
To: binutils
Hi,
I checked in this patch to put IRELATIVE relocations after JUMP_SLOT.
H.J.
---
bfd/
2011-10-20 H.J. Lu <hongjiu.lu@intel.com>
PR ld/13302
* elf32-i386.c (elf_i386_link_hash_table): Add next_jump_slot_index
and next_irelative_index.
(elf_i386_link_hash_table_create): Initialize next_jump_slot_index
and next_irelative_index.
(elf_i386_allocate_dynrelocs): Increment reloc_count instead of
next_tls_desc_index.
(elf_i386_size_dynamic_sections): Set next_tls_desc_index and
next_irelative_index from reloc_count.
(elf_i386_finish_dynamic_symbol): Put R_386_IRELATIVE after
R_386_JUMP_SLOT.
* elf64-x86-64.c (elf_x86_64_link_hash_table): Add
next_jump_slot_index and next_irelative_index.
(elf_x86_64_link_hash_table_create): Initialize
next_jump_slot_index and next_irelative_index.
(elf_x86_64_size_dynamic_sections): Set next_irelative_index
from reloc_count.
(elf_x86_64_finish_dynamic_symbol): Put R_X86_64_IRELATIVE after
R_X86_64_JUMP_SLOT.
ld/testsuite/
2011-10-20 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/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 7ef1fc1..c3156bd 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -806,6 +806,12 @@ struct elf_i386_link_hash_table
/* The index of the next unused R_386_TLS_DESC slot in .rel.plt. */
bfd_vma next_tls_desc_index;
+
+ /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt. */
+ bfd_vma next_jump_slot_index;
+
+ /* The index of the next unused R_386_IRELATIVE slot in .rel.plt. */
+ bfd_vma next_irelative_index;
};
/* Get the i386 ELF linker hash table from a link_info structure. */
@@ -946,6 +952,8 @@ elf_i386_link_hash_table_create (bfd *abfd)
ret->sym_cache.abfd = NULL;
ret->srelplt2 = NULL;
ret->tls_module_base = NULL;
+ ret->next_jump_slot_index = 0;
+ ret->next_irelative_index = 0;
ret->loc_hash_table = htab_try_create (1024,
elf_i386_local_htab_hash,
@@ -2275,7 +2283,7 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* We also need to make an entry in the .rel.plt section. */
htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
- htab->next_tls_desc_index++;
+ htab->elf.srelplt->reloc_count++;
if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
&& !info->shared)
@@ -2700,9 +2708,19 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
incremented. However, when we reserve space for TLS descriptors,
it's not incremented, so in order to compute the space reserved
for them, it suffices to multiply the reloc count by the jump
- slot size. */
+ slot size.
+
+ PR ld/13302: We start next_irelative_index at the end of .rela.plt
+ so that R_386_IRELATIVE entries come last. */
if (htab->elf.srelplt)
- htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
+ {
+ htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
+ htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
+ htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
+ }
+ else if (htab->elf.irelplt)
+ htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
+
if (htab->elf.sgotplt)
{
@@ -4364,13 +4382,13 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
if (plt == htab->elf.splt)
{
- plt_index = h->plt.offset / plt_entry_size - 1;
- got_offset = (plt_index + 3) * 4;
+ got_offset = h->plt.offset / plt_entry_size - 1;
+ got_offset = (got_offset + 3) * 4;
}
else
{
- plt_index = h->plt.offset / plt_entry_size;
- got_offset = plt_index * 4;
+ got_offset = h->plt.offset / plt_entry_size;
+ got_offset = got_offset * 4;
}
/* Fill in the entry in the procedure linkage table. */
@@ -4431,18 +4449,6 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
+ abed->plt->plt_got_offset);
}
- /* Don't fill PLT entry for static executables. */
- if (plt == htab->elf.splt)
- {
- bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
- plt->contents + h->plt.offset
- + abed->plt->plt_reloc_offset);
- bfd_put_32 (output_bfd, - (h->plt.offset
- + abed->plt->plt_plt_offset + 4),
- plt->contents + h->plt.offset
- + abed->plt->plt_plt_offset);
- }
-
/* Fill in the entry in the global offset table. */
bfd_put_32 (output_bfd,
(plt->output_section->vma
@@ -4470,12 +4476,29 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
+ h->root.u.def.section->output_offset),
gotplt->contents + got_offset);
rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
+ /* R_386_IRELATIVE comes last. */
+ plt_index = htab->next_irelative_index--;
}
else
- rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
+ {
+ rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
+ plt_index = htab->next_jump_slot_index++;
+ }
loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
+ /* Don't fill PLT entry for static executables. */
+ if (plt == htab->elf.splt)
+ {
+ bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
+ plt->contents + h->plt.offset
+ + abed->plt->plt_reloc_offset);
+ bfd_put_32 (output_bfd, - (h->plt.offset
+ + abed->plt->plt_plt_offset + 4),
+ plt->contents + h->plt.offset
+ + abed->plt->plt_plt_offset);
+ }
+
if (!h->def_regular)
{
/* Mark the symbol as undefined, rather than as defined in
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index e4c3946..a850ce7 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -698,6 +698,11 @@ struct elf_x86_64_link_hash_table
/* The offset into sgot of the GOT entry used by the PLT entry
above. */
bfd_vma tlsdesc_got;
+
+ /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
+ bfd_vma next_jump_slot_index;
+ /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
+ bfd_vma next_irelative_index;
};
/* Get the x86-64 ELF linker hash table from a link_info structure. */
@@ -839,6 +844,8 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
ret->tls_ld_got.refcount = 0;
ret->sgotplt_jump_table_size = 0;
ret->tls_module_base = NULL;
+ ret->next_jump_slot_index = 0;
+ ret->next_irelative_index = 0;
if (ABI_64_P (abfd))
{
@@ -2667,10 +2674,18 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd,
incremented. However, when we reserve space for TLS descriptors,
it's not incremented, so in order to compute the space reserved
for them, it suffices to multiply the reloc count by the jump
- slot size. */
+ slot size.
+
+ PR ld/13302: We start next_irelative_index at the end of .rela.plt
+ so that R_X86_64_IRELATIVE entries come last. */
if (htab->elf.srelplt)
- htab->sgotplt_jump_table_size
- = elf_x86_64_compute_jump_table_size (htab);
+ {
+ htab->sgotplt_jump_table_size
+ = elf_x86_64_compute_jump_table_size (htab);
+ htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
+ }
+ else if (htab->elf.irelplt)
+ htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
if (htab->tlsdesc_plt)
{
@@ -4205,13 +4220,13 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
if (plt == htab->elf.splt)
{
- plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
- got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
+ got_offset = h->plt.offset / PLT_ENTRY_SIZE - 1;
+ got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
}
else
{
- plt_index = h->plt.offset / PLT_ENTRY_SIZE;
- got_offset = plt_index * GOT_ENTRY_SIZE;
+ got_offset = h->plt.offset / PLT_ENTRY_SIZE;
+ got_offset = got_offset * GOT_ENTRY_SIZE;
}
/* Fill in the entry in the procedure linkage table. */
@@ -4233,17 +4248,6 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
- 6),
plt->contents + h->plt.offset + 2);
- /* Don't fill PLT entry for static executables. */
- if (plt == htab->elf.splt)
- {
- /* Put relocation index. */
- bfd_put_32 (output_bfd, plt_index,
- plt->contents + h->plt.offset + 7);
- /* Put offset for jmp .PLT0. */
- bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
- plt->contents + h->plt.offset + 12);
- }
-
/* Fill in the entry in the global offset table, initially this
points to the pushq instruction in the PLT which is at offset 6. */
bfd_put_64 (output_bfd, (plt->output_section->vma
@@ -4267,11 +4271,25 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
rela.r_addend = (h->root.u.def.value
+ h->root.u.def.section->output_section->vma
+ h->root.u.def.section->output_offset);
+ /* R_X86_64_IRELATIVE comes last. */
+ plt_index = htab->next_irelative_index--;
}
else
{
rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
rela.r_addend = 0;
+ plt_index = htab->next_jump_slot_index++;
+ }
+
+ /* Don't fill PLT entry for static executables. */
+ if (plt == htab->elf.splt)
+ {
+ /* Put relocation index. */
+ bfd_put_32 (output_bfd, plt_index,
+ plt->contents + h->plt.offset + 7);
+ /* Put offset for jmp .PLT0. */
+ bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
+ plt->contents + h->plt.offset + 12);
}
bed = get_elf_backend_data (output_bfd);
diff --git a/ld/testsuite/ld-ifunc/ifunc-16-i386.d b/ld/testsuite/ld-ifunc/ifunc-16-i386.d
new file mode 100644
index 0000000..8ae3d0a
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/ifunc-16-i386.d
@@ -0,0 +1,10 @@
+#source: ifunc-16-x86.s
+#ld: -shared -m elf_i386
+#as: --32
+#readelf: -r --wide
+#target: x86_64-*-* i?86-*-*
+
+Relocation section '.rel.plt' at .*
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+0+[ ]+ifunc
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
diff --git a/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d
new file mode 100644
index 0000000..d69626d
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d
@@ -0,0 +1,10 @@
+#source: ifunc-16-x86.s
+#as: --64
+#ld: -shared -melf_x86_64
+#readelf: -r --wide
+#target: x86_64-*-*
+
+Relocation section '.rela.plt' at .*
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+0+[ ]+ifunc \+ 0
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-ifunc/ifunc-16-x86.s b/ld/testsuite/ld-ifunc/ifunc-16-x86.s
new file mode 100644
index 0000000..fb38253
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/ifunc-16-x86.s
@@ -0,0 +1,17 @@
+ .text
+ .globl fct
+ .type fct, @gnu_indirect_function
+ .set fct,resolve
+ .hidden int_fct
+ .globl int_fct
+ .set int_fct,fct
+ .p2align 4,,15
+ .type resolve, @function
+resolve:
+ call ifunc@PLT
+ .size resolve, .-resolve
+ .globl g
+ .type g, @function
+g:
+ jmp int_fct@PLT
+ .size g, .-g
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: PATCH: PR ld/13302: IRELATIVE relocation should come last
2011-10-21 15:17 PATCH: PR ld/13302: IRELATIVE relocation should come last H.J. Lu
@ 2011-10-21 19:49 ` H.J. Lu
2012-03-06 9:01 ` Jakub Jelinek
0 siblings, 1 reply; 4+ messages in thread
From: H.J. Lu @ 2011-10-21 19:49 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: binutils
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: PATCH: PR ld/13302: IRELATIVE relocation should come last
2011-10-21 19:49 ` H.J. Lu
@ 2012-03-06 9:01 ` Jakub Jelinek
2012-03-06 19:39 ` H.J. Lu
0 siblings, 1 reply; 4+ messages in thread
From: Jakub Jelinek @ 2012-03-06 9:01 UTC (permalink / raw)
To: H.J. Lu; +Cc: Ulrich Drepper, binutils
Hi!
On Fri, Oct 21, 2011 at 12:49:12PM -0700, H.J. Lu wrote:
> 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.
> --- 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.
This patch apparently broke prelink, which on x86_64 expects that the added
for R_X86_64_RELATIVE is always applied (i.e. the same number is in both
addend and memory and it normally is for all other kinds of
R_X86_64_RELATIVE, just not this spot now).
> --- 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:
The above looks like typo to me, if relocate was intentionally
always false, why add the boolean at all? Here is a fix. Ok for trunk?
2012-03-06 Jakub Jelinek <jakub@redhat.com>
* elf64-x86-64.c (elf_x86_64_relocate_section): For R_X86_64_RELATIVE
set relocate to TRUE.
--- bfd/elf64-x86-64.c.jj 2012-02-08 22:12:43.000000000 +0100
+++ bfd/elf64-x86-64.c 2012-03-06 09:52:16.760752214 +0100
@@ -1,6 +1,6 @@
/* X86-64 specific support for ELF
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
- 2010, 2011
+ 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by Jan Hubicka <jh@suse.cz>.
@@ -3178,7 +3178,7 @@ elf_x86_64_relocate_section (bfd *output
/* This symbol is resolved locally. */
outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
outrel.r_addend = relocation;
- relocate = FALSE;
+ relocate = TRUE;
}
else
{
Jakub
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: PATCH: PR ld/13302: IRELATIVE relocation should come last
2012-03-06 9:01 ` Jakub Jelinek
@ 2012-03-06 19:39 ` H.J. Lu
0 siblings, 0 replies; 4+ messages in thread
From: H.J. Lu @ 2012-03-06 19:39 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Ulrich Drepper, binutils
On Tue, Mar 6, 2012 at 1:00 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> On Fri, Oct 21, 2011 at 12:49:12PM -0700, H.J. Lu wrote:
>> 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.
>
>> --- 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.
>
> This patch apparently broke prelink, which on x86_64 expects that the added
> for R_X86_64_RELATIVE is always applied (i.e. the same number is in both
> addend and memory and it normally is for all other kinds of
> R_X86_64_RELATIVE, just not this spot now).
>
>> --- 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:
>
> The above looks like typo to me, if relocate was intentionally
> always false, why add the boolean at all? Here is a fix. Ok for trunk?
>
> 2012-03-06 Jakub Jelinek <jakub@redhat.com>
>
> * elf64-x86-64.c (elf_x86_64_relocate_section): For R_X86_64_RELATIVE
> set relocate to TRUE.
>
> --- bfd/elf64-x86-64.c.jj 2012-02-08 22:12:43.000000000 +0100
> +++ bfd/elf64-x86-64.c 2012-03-06 09:52:16.760752214 +0100
> @@ -1,6 +1,6 @@
> /* X86-64 specific support for ELF
> Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
> - 2010, 2011
> + 2010, 2011, 2012
> Free Software Foundation, Inc.
> Contributed by Jan Hubicka <jh@suse.cz>.
>
> @@ -3178,7 +3178,7 @@ elf_x86_64_relocate_section (bfd *output
> /* This symbol is resolved locally. */
> outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
> outrel.r_addend = relocation;
> - relocate = FALSE;
> + relocate = TRUE;
> }
> else
> {
>
>
> Jakub
It is a typo. OK for trunk. I think it should also be applied on 2.22 branch.
Thanks.
--
H.J.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-03-06 19:39 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-21 15:17 PATCH: PR ld/13302: IRELATIVE relocation should come last H.J. Lu
2011-10-21 19:49 ` H.J. Lu
2012-03-06 9:01 ` Jakub Jelinek
2012-03-06 19:39 ` H.J. Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).