2012-03-09 H.J. Lu 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. * 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. --- bfd/elf32-i386.c 21 Oct 2011 19:37:14 -0000 1.265 +++ bfd/elf32-i386.c 9 Mar 2012 16:28:36 -0000 1.266 @@ -3257,7 +3257,6 @@ elf_i386_relocate_section (bfd *output_b 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_b || 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_b 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: --- bfd/elf64-x86-64.c 6 Mar 2012 20:15:56 -0000 1.248 +++ bfd/elf64-x86-64.c 9 Mar 2012 16:28:36 -0000 1.249 @@ -3156,7 +3156,6 @@ elf_x86_64_relocate_section (bfd *output { 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 || 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 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: --- ld/testsuite/ld-i386/pr13302.d 21 Oct 2011 19:37:15 -0000 1.1 +++ ld/testsuite/ld-i386/pr13302.d 9 Mar 2012 16:28:37 -0000 1.2 @@ -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 --- ld/testsuite/ld-x86-64/pr13082-5b.d 21 Oct 2011 19:37:15 -0000 1.2 +++ ld/testsuite/ld-x86-64/pr13082-5b.d 9 Mar 2012 16:28:38 -0000 1.3 @@ -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 --- ld/testsuite/ld-x86-64/pr13082-6a.d 21 Oct 2011 19:37:15 -0000 1.2 +++ ld/testsuite/ld-x86-64/pr13082-6a.d 9 Mar 2012 16:28:38 -0000 1.3 @@ -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 --- ld/testsuite/ld-x86-64/pr13082-6b.d 21 Oct 2011 19:37:15 -0000 1.2 +++ ld/testsuite/ld-x86-64/pr13082-6b.d 9 Mar 2012 16:28:38 -0000 1.3 @@ -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