Use .got.plt for IFUNC symbols if there are no GOT relocations.
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 12 Sep 2011 18:17:36 +0000 (18:17 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 12 Sep 2011 18:17:36 +0000 (18:17 +0000)
bfd/

2011-09-12  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13178
* elf-ifunc.c (_bfd_elf_allocate_ifunc_dyn_relocs): Use .got.plt
if there are no GOT relocations.

ld/testsuite/

2011-09-12  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13178
* ld-ifunc/ifunc-13-i386.d: Updated.
* ld-ifunc/ifunc-13-x86-64.d: Likewise.
* ld-ifunc/ifunc-3a-x86.d: Likewise.
* ld-x86-64/pr13082-5a.d: Likewise.

* ld-ifunc/ifunc-15-i386.d: New.
* ld-ifunc/ifunc-15-i386.s: Likewise.
* ld-ifunc/ifunc-15-x86-64.d: Likewise.
* ld-ifunc/ifunc-15-x86-64.s: Likewise.

bfd/ChangeLog
bfd/elf-ifunc.c
ld/testsuite/ChangeLog
ld/testsuite/ld-ifunc/ifunc-13-i386.d
ld/testsuite/ld-ifunc/ifunc-13-x86-64.d
ld/testsuite/ld-ifunc/ifunc-15-i386.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-15-i386.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-15-x86-64.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-15-x86-64.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-3a-x86.d
ld/testsuite/ld-x86-64/pr13082-5a.d

index 5339ad0f4c5c7832fe47a95dee94e0fe93a03b47..9d63ff6f80ca5688d322748c85589f79576b907f 100644 (file)
@@ -1,3 +1,9 @@
+2011-09-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13178
+       * elf-ifunc.c (_bfd_elf_allocate_ifunc_dyn_relocs): Use .got.plt
+       if there are no GOT relocations.
+
 2011-09-09  Kai Tietz  <ktietz@redhat.com>
 
        * peicode.h (pe_ILF_build_a_bfd): Don't remove leading underscore
index 81429b84334ca067439f3942e1cfdd1e8b335a08..3ba96c7961705cb9249dab21353e78631596afb3 100644 (file)
@@ -299,9 +299,10 @@ keep:
      5. Otherwise use .got so that it can be shared among different
      objects at run-time.
      We only need to relocate .got entry in shared object.  */
-  if ((info->shared
-       && (h->dynindx == -1
-          || h->forced_local))
+  if (h->got.refcount <= 0
+      || (info->shared
+         && (h->dynindx == -1
+             || h->forced_local))
       || (!info->shared
          && !h->pointer_equality_needed)
       || (info->executable && info->shared)
index 2de526822cfceab3441f008a7811cf33faf804e3..3c00fe4a57c795de4765c06477e2b0667d97e983 100644 (file)
@@ -1,3 +1,16 @@
+2011-09-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13178
+       * ld-ifunc/ifunc-13-i386.d: Updated.
+       * ld-ifunc/ifunc-13-x86-64.d: Likewise.
+       * ld-ifunc/ifunc-3a-x86.d: Likewise.
+       * ld-x86-64/pr13082-5a.d: Likewise.
+
+       * ld-ifunc/ifunc-15-i386.d: New.
+       * ld-ifunc/ifunc-15-i386.s: Likewise.
+       * ld-ifunc/ifunc-15-x86-64.d: Likewise.
+       * ld-ifunc/ifunc-15-x86-64.s: Likewise.
+
 2011-09-01  Christophe Lyon  <christophe.lyon@st.com>
 
        * ld-arm/arm-elf.exp: Add new rodata-merge-map test.
index 162c3e40f979f9f09c99f78ab70851bd3e25d21e..55cca222a25f2e73d8650f0ce83c9913592ef36a 100644 (file)
@@ -5,15 +5,14 @@
 #readelf: -r --wide
 #target: x86_64-*-* i?86-*-*
 
-Relocation section '.rel.got' at .*
+Relocation section '.rel.got' at offset 0x[0-9a-f]+ contains 1 entries:
 [ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-#...
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc
-#...
-Relocation section '.rel.ifunc' at .*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_RELATIVE[ ]+
+
+Relocation section '.rel.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
 [ ]+Offset[ ]+Info[ ]+Type[ ]+.*
 [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_32[ ]+ifunc\(\)[ ]+ifunc
-#...
-Relocation section '.rel.plt' at .*
+
+Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
 [ ]+Offset[ ]+Info[ ]+Type[ ]+.*
 [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc
index d0c064773a4120b0662dd9aaaa2bd889e4c4c18b..b01c735679578afea910931ba84d71341289de02 100644 (file)
@@ -5,14 +5,10 @@
 #readelf: -r --wide
 #target: x86_64-*-*
 
-Relocation section '.rela.got' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0
-#...
-Relocation section '.rela.ifunc' at .*
+Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
 [ ]+Offset[ ]+Info[ ]+Type[ ]+.*
 [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_64[ ]+ifunc\(\)[ ]+ifunc \+ 0
-#...
-Relocation section '.rela.plt' at .*
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
 [ ]+Offset[ ]+Info[ ]+Type[ ]+.*
 [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
diff --git a/ld/testsuite/ld-ifunc/ifunc-15-i386.d b/ld/testsuite/ld-ifunc/ifunc-15-i386.d
new file mode 100644 (file)
index 0000000..c37dd51
--- /dev/null
@@ -0,0 +1,13 @@
+#source: ifunc-15-i386.s
+#ld: -shared -m elf_i386 -z nocombreloc
+#as: --32
+#readelf: -r --wide
+#target: x86_64-*-* i?86-*-*
+
+Relocation section '.rel.got' at offset 0x[0-9a-f]+ contains 1 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc
+
+Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc
diff --git a/ld/testsuite/ld-ifunc/ifunc-15-i386.s b/ld/testsuite/ld-ifunc/ifunc-15-i386.s
new file mode 100644 (file)
index 0000000..5ee4fab
--- /dev/null
@@ -0,0 +1,10 @@
+       .text
+        .type foo, @function
+       .global
+foo:
+       movl ifunc@GOT(%ebx), %eax
+        ret
+        .type ifunc, @gnu_indirect_function
+       .globl ifunc
+ifunc:
+        ret
diff --git a/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d
new file mode 100644 (file)
index 0000000..a4a5cb1
--- /dev/null
@@ -0,0 +1,13 @@
+#source: ifunc-15-x86-64.s
+#ld: -shared -m elf_x86_64 -z nocombreloc
+#as: --64
+#readelf: -r --wide
+#target: x86_64-*-*
+
+Relocation section '.rela.got' at offset 0x[0-9a-f]+ contains 1 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
diff --git a/ld/testsuite/ld-ifunc/ifunc-15-x86-64.s b/ld/testsuite/ld-ifunc/ifunc-15-x86-64.s
new file mode 100644 (file)
index 0000000..ee336de
--- /dev/null
@@ -0,0 +1,10 @@
+       .text
+        .type foo, @function
+       .global
+foo:
+        movl ifunc@GOTPCREL(%rip), %eax
+        ret
+        .type ifunc, @gnu_indirect_function
+       .globl ifunc
+ifunc:
+        ret
index 174999d6d1349d6c2743063c75783a127fee16b8..24be6391aa0e9b4f1b0bb484cb2f5e355778a5bb 100644 (file)
@@ -4,5 +4,5 @@
 #target: x86_64-*-* i?86-*-*
 
 #...
-[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x1b0|\+0x260|)@plt>
+[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x1b0|\+0x240|)@plt>
 #pass
index e5b0c113e70a57c557bee06b1f7f31d861c9acca..191c29e9af72a0ab6da5408cfff955878aabe08f 100644 (file)
@@ -4,10 +4,9 @@
 #ld: -shared -melf32_x86_64
 #readelf: -r --wide
 
-Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+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_32 +ifunc\(\)+ +ifunc \+ 0
-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +ifunc\(\)+ +ifunc \+ 0
 
 Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
  Offset     Info    Type                Sym. Value  Symbol's Name \+ Addend