Replace IRELATIVE relocations with RELATIVE in .rel.dyn.
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 21 Oct 2011 19:37:15 +0000 (19:37 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 21 Oct 2011 19:37:15 +0000 (19:37 +0000)
bfd/

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.

ld/testsuite/

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.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr13302.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr13302.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr13082-5b.d
ld/testsuite/ld-x86-64/pr13082-6a.d
ld/testsuite/ld-x86-64/pr13082-6b.d

index a20a75d..39f1a2a 100644 (file)
@@ -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
index 01c0669..d187305 100644 (file)
@@ -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:
index 645e5a2..2206dd4 100644 (file)
@@ -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:
index 8480fee..2b444ac 100644 (file)
@@ -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.
index 68b71fb..1727922 100644 (file)
@@ -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 (file)
index 0000000..3d85d08
--- /dev/null
@@ -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 (file)
index 0000000..cfd2717
--- /dev/null
@@ -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
index 1c5a5e7..48e37c3 100644 (file)
@@ -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
index 9a1a655..de90bb8 100644 (file)
@@ -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
index 792c348..66ff59b 100644 (file)
@@ -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