x86: Dump local IFUNC functions in the map file
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 8 Jun 2017 04:18:01 +0000 (21:18 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 8 Jun 2017 10:53:43 +0000 (03:53 -0700)
Dump local IFUNC functions in the map file when generating IRELATIVE
relocations if -Map is used.

bfd/

* elf32-i386.c (elf_i386_check_relocs): Set local IFUNC symbol
name.  Use local IFUNC symbol name string to report unsupported
non-PIC call to IFUNC function.
(elf_i386_relocate_section): Dump local IFUNC name with minfo
when generating R_386_IRELATIVE relocation.
(elf_i386_finish_dynamic_symbol): Likewise.
* elf_x86_64_check_relocs (elf_x86_64_check_relocs): Set local
IFUNC symbol name.
(elf_x86_64_relocate_section): Dump local IFUNC name with minfo
when generating R_X86_64_IRELATIVE relocation.
(elf_x86_64_finish_dynamic_symbol): Likewise.

ld/

* testsuite/ld-ifunc/ifunc-1-local-x86.d: Pass
"-Map tmpdir/ifunc-1-local-x86.map" to ld and check
ifunc-1-local-x86.map.
* testsuite/ld-ifunc/ifunc-1-x86.d: Pass
"-Map tmpdir/ifunc-1-x86.map" to ld and check ifunc-1-x86.map.
* testsuite/ld-ifunc/ifunc-1-local-x86.map: New file.
* testsuite/ld-ifunc/ifunc-1-x86.map: Likewise.

bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ld-ifunc/ifunc-1-local-x86.d
ld/testsuite/ld-ifunc/ifunc-1-local-x86.map [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-1-x86.d
ld/testsuite/ld-ifunc/ifunc-1-x86.map [new file with mode: 0644]

index 1fdc06c3ce71b991cd3ffd7df32a4055db5bd435..e447e3d256a24a25b6b8a490f9e89b5d0a4cfef4 100644 (file)
@@ -1945,6 +1945,8 @@ elf_i386_check_relocs (bfd *abfd,
                goto error_return;
 
              /* Fake a STT_GNU_IFUNC symbol.  */
+             h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
+                                                     isym, NULL);
              h->type = STT_GNU_IFUNC;
              h->def_regular = 1;
              h->ref_regular = 1;
@@ -2181,15 +2183,10 @@ do_relocation:
                  else if (h->type == STT_GNU_IFUNC
                           && bfd_link_pic (info))
                    {
-                   if (isym == NULL)
-                     name = h->root.root.string;
-                   else
-                     name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
-                                              NULL);
-                   _bfd_error_handler
-                     /* xgettext:c-format */
-                     (_("%B: unsupported non-PIC call to IFUNC `%s'"),
-                      abfd, name);
+                     _bfd_error_handler
+                       /* xgettext:c-format */
+                       (_("%B: unsupported non-PIC call to IFUNC `%s'"),
+                        abfd, h->root.root.string);
                      bfd_set_error (bfd_error_bad_value);
                      goto error_return;
                    }
@@ -4081,6 +4078,10 @@ do_ifunc_pointer:
                      || h->forced_local
                      || bfd_link_executable (info))
                    {
+                     info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                             h->root.root.string,
+                                             h->root.u.def.section->owner);
+
                      /* This symbol is resolved locally.  */
                      outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
                      bfd_put_32 (output_bfd,
@@ -5413,6 +5414,10 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
                  && h->def_regular
                  && h->type == STT_GNU_IFUNC))
            {
+             info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                     h->root.root.string,
+                                     h->root.u.def.section->owner);
+
              /* If an STT_GNU_IFUNC symbol is locally defined, generate
                 R_386_IRELATIVE instead of R_386_JUMP_SLOT.  Store addend
                 in the .got.plt section.  */
@@ -5548,6 +5553,10 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
                }
              if (SYMBOL_REFERENCES_LOCAL (info, h))
                {
+                 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                         h->root.root.string,
+                                         h->root.u.def.section->owner);
+
                  bfd_put_32 (output_bfd,
                              (h->root.u.def.value
                               + h->root.u.def.section->output_section->vma
index 7beb78e0ab69a38783ad842b16b869d07f5afabd..c94d7ff69308287d1512fb66eed9da0a36fea98e 100644 (file)
@@ -2281,6 +2281,8 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
                goto error_return;
 
              /* Fake a STT_GNU_IFUNC symbol.  */
+             h->root.root.string = bfd_elf_sym_name (abfd, symtab_hdr,
+                                                     isym, NULL);
              h->type = STT_GNU_IFUNC;
              h->def_regular = 1;
              h->ref_regular = 1;
@@ -4422,6 +4424,10 @@ do_ifunc_pointer:
                      || h->forced_local
                      || bfd_link_executable (info))
                    {
+                     info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                             h->root.root.string,
+                                             h->root.u.def.section->owner);
+
                      /* This symbol is resolved locally.  */
                      outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
                      outrel.r_addend = (h->root.u.def.value
@@ -5791,6 +5797,10 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                  && h->def_regular
                  && h->type == STT_GNU_IFUNC))
            {
+             info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                     h->root.root.string,
+                                     h->root.u.def.section->owner);
+
              /* If an STT_GNU_IFUNC symbol is locally defined, generate
                 R_X86_64_IRELATIVE instead of R_X86_64_JUMP_SLOT.  */
              rela.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
@@ -5941,6 +5951,11 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
                }
              if (SYMBOL_REFERENCES_LOCAL (info, h))
                {
+                 info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
+                                         output_bfd,
+                                         h->root.root.string,
+                                         h->root.u.def.section->owner);
+
                  rela.r_info = htab->r_info (0,
                                              R_X86_64_IRELATIVE);
                  rela.r_addend = (h->root.u.def.value
index 00bc474618ceb1a86255cb63adbca524a3966923..c14cd28469596e787710a7abcf4084f59fdd5197 100644 (file)
@@ -1,6 +1,7 @@
-#ld: -shared
+#ld: -shared -Map tmpdir/ifunc-1-local-x86.map
 #objdump: -dw
 #target: x86_64-*-* i?86-*-*
+#map: ifunc-1-local-x86.map
 
 #...
 [ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x160|\+0x170|\+0x1e0|)@plt>
diff --git a/ld/testsuite/ld-ifunc/ifunc-1-local-x86.map b/ld/testsuite/ld-ifunc/ifunc-1-local-x86.map
new file mode 100644 (file)
index 0000000..557a446
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+Local IFUNC function `__GI_foo' in tmpdir/ifunc-1-local-x86.o
+#pass
index f9dee1bdd691d79998a64f8e39410ddf68a0be44..c245758e3e2e09bb73bee22483e85d6d620516d4 100644 (file)
@@ -1,6 +1,7 @@
-#ld: -shared
+#ld: -shared -Map tmpdir/ifunc-1-x86.map
 #objdump: -dw
 #target: x86_64-*-* i?86-*-*
+#map: ifunc-1-x86.map
 
 #...
 [ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x170|\+0x190|\+0x210|)@plt>
diff --git a/ld/testsuite/ld-ifunc/ifunc-1-x86.map b/ld/testsuite/ld-ifunc/ifunc-1-x86.map
new file mode 100644 (file)
index 0000000..98bbb7a
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+Local IFUNC function `__GI_foo' in tmpdir/ifunc-1-x86.o
+#pass
This page took 0.031498 seconds and 4 git commands to generate.