Add a test for R_386_GOT32/R_386_GOT32X IFUNC reloc error
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Feb 2017 18:55:51 +0000 (10:55 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Feb 2017 19:11:40 +0000 (11:11 -0800)
bfd/

PR ld/20244
* elf32-i386.c (elf_i386_relocate_section): Properly get IFUNC
symbol name when reporting R_386_GOT32/R_386_GOT32X relocation
error against local IFUNC symbol without a base register for
PIC.

ld/

PR ld/20244
* testsuite/ld-i386/i386.exp: Run pr20244-4a, pr20244-4b and
pr20244-4c.
* testsuite/ld-i386/pr20244-4.s: New file.
* testsuite/ld-i386/pr20244-4a.d: Likewise.
* testsuite/ld-i386/pr20244-4b.d: Likewise.
* testsuite/ld-i386/pr20244-4c.d: Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr20244-4.s [new file with mode: 0644]
ld/testsuite/ld-i386/pr20244-4a.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20244-4b.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20244-4c.d [new file with mode: 0644]

index edd763335225642fb3970f5e9c5cc453d8bbc8e6..cbea9a9fcbbe1a4eca9c56c6e21e2993e3c97706 100644 (file)
@@ -1,3 +1,11 @@
+2017-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/20244
+       * elf32-i386.c (elf_i386_relocate_section): Properly get IFUNC
+       symbol name when reporting R_386_GOT32/R_386_GOT32X relocation
+       error against local IFUNC symbol without a base register for
+       PIC.
+
 2017-02-15  Maciej W. Rozycki  <macro@imgtec.com>
 
        * elf32-ppc.c (ppc_elf_check_relocs): Use `%H:' rather than
index 0860ada37ef205336133c123e566f49004850b2b..3bee4ca88db4d548b514dfc5c83606f5afb7fe1e 100644 (file)
@@ -4355,7 +4355,7 @@ r_386_got32:
                  const char *name;
 
 disallow_got32:
-                 if (h == NULL)
+                 if (h == NULL || h->root.root.string == NULL)
                    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
                                             NULL);
                  else
index 1fc23dc896ffadddfceef826e0a674933981f90e..3f88091913f0c41d2868a46f53d05431d3d4d4e4 100644 (file)
@@ -1,3 +1,13 @@
+2017-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/20244
+       * testsuite/ld-i386/i386.exp: Run pr20244-4a, pr20244-4b and
+       pr20244-4c.
+       * testsuite/ld-i386/pr20244-4.s: New file.
+       * testsuite/ld-i386/pr20244-4a.d: Likewise.
+       * testsuite/ld-i386/pr20244-4b.d: Likewise.
+       * testsuite/ld-i386/pr20244-4c.d: Likewise.
+
 2017-02-15  Maciej W. Rozycki  <macro@imgtec.com>
 
        * ldmisc.c (vfinfo): Don't print the function name again either
index 43cb3c56fb4c671f789bada06f312b85ce10ea03..7680ff5bc9f4a3ea1d95037cde4ec3ba41211220 100644 (file)
@@ -408,6 +408,9 @@ run_dump_test "pr20244-2a"
 run_dump_test "pr20244-2b"
 run_dump_test "pr20244-2c"
 run_dump_test "pr20244-2d"
+run_dump_test "pr20244-4a"
+run_dump_test "pr20244-4b"
+run_dump_test "pr20244-4c"
 run_dump_test "pr20253-3"
 run_dump_test "pr20253-4a"
 run_dump_test "pr20253-4b"
diff --git a/ld/testsuite/ld-i386/pr20244-4.s b/ld/testsuite/ld-i386/pr20244-4.s
new file mode 100644 (file)
index 0000000..0197256
--- /dev/null
@@ -0,0 +1,10 @@
+       .text
+       .globl  _start
+       .type   _start, @function
+_start:
+       mov     ifunc@GOT, %eax
+       ret
+       .type ifunc, @gnu_indirect_function
+ifunc:
+       mov     $0xbadbeef, %eax
+       ret
diff --git a/ld/testsuite/ld-i386/pr20244-4a.d b/ld/testsuite/ld-i386/pr20244-4a.d
new file mode 100644 (file)
index 0000000..420d179
--- /dev/null
@@ -0,0 +1,18 @@
+#source: pr20244-4.s
+#as: --32
+#ld: -m elf_i386
+#objdump: -dw
+#notarget: i?86-*-nacl* x86_64-*-nacl*
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+804807c <_start>:
+ +[a-f0-9]+:   8b 05 8c 90 04 08       mov    0x804908c,%eax
+ +[a-f0-9]+:   c3                      ret    
+
+0+8048083 <ifunc>:
+ +[a-f0-9]+:   b8 ef be ad 0b          mov    \$0xbadbeef,%eax
+ +[a-f0-9]+:   c3                      ret    
+#pass
diff --git a/ld/testsuite/ld-i386/pr20244-4b.d b/ld/testsuite/ld-i386/pr20244-4b.d
new file mode 100644 (file)
index 0000000..16e5243
--- /dev/null
@@ -0,0 +1,11 @@
+#source: pr20244-4.s
+#as: --32
+#ld: -m elf_i386
+#objdump: -s -j .got
+#notarget: i?86-*-nacl* x86_64-*-nacl*
+
+.*: +file format .*
+
+Contents of section .got:
+ 804908c 83800408 +.... +
+#pass
diff --git a/ld/testsuite/ld-i386/pr20244-4c.d b/ld/testsuite/ld-i386/pr20244-4c.d
new file mode 100644 (file)
index 0000000..07b2b19
--- /dev/null
@@ -0,0 +1,4 @@
+#source: pr20244-4.s
+#as: --32
+#ld: -pie -m elf_i386
+#error: direct GOT relocation R_386_GOT32X against `ifunc' without base register can not be used when making a shared object