diff options
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 17 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 12 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr13302.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr13082-5b.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr13082-6a.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr13082-6b.d | 2 |
8 files changed, 34 insertions, 20 deletions
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 |