From 9892017203958346ddb7920e8c4678d8c1640775 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 21 Oct 2011 19:37:15 +0000 Subject: [PATCH] Replace IRELATIVE relocations with RELATIVE in .rel.dyn. bfd/ 2011-10-21 H.J. Lu 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. ld/testsuite/ 2011-10-21 H.J. Lu 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-i386.c | 17 +++++++++-------- bfd/elf64-x86-64.c | 12 +++++++----- ld/testsuite/ChangeLog | 12 ++++++++++++ ld/testsuite/ld-i386/i386.exp | 1 + ld/testsuite/ld-i386/pr13302.d | 12 ++++++++++++ ld/testsuite/ld-i386/pr13302.s | 11 +++++++++++ ld/testsuite/ld-x86-64/pr13082-5b.d | 2 +- ld/testsuite/ld-x86-64/pr13082-6a.d | 2 +- ld/testsuite/ld-x86-64/pr13082-6b.d | 2 +- 10 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 ld/testsuite/ld-i386/pr13302.d create mode 100644 ld/testsuite/ld-i386/pr13302.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a20a75db998..39f1a2a98a1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2011-10-21 H.J. Lu + + 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 . * elf32-i386.c (elf_i386_relocate_section): Fix a typo in diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 01c06695956..d1873051b4d 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 645e5a24348..2206dd4754b 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 8480fee4419..2b444ac2a87 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2011-10-21 H.J. Lu + + 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 PR ld/13302 diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 68b71fbcbab..17279224006 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 00000000000..3d85d085d79 --- /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 00000000000..cfd271771e4 --- /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 1c5a5e79b53..48e37c3eedc 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 9a1a6551853..de90bb85e99 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 792c3483eba..66ff59b0149 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 -- 2.30.2