Call _bfd_elf_create_ifunc_sections only for ifunc
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 20 Apr 2016 12:34:02 +0000 (05:34 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 20 Apr 2016 12:34:15 +0000 (05:34 -0700)
Since x86 check_relocs is called after opening all input files, we
need to call _bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC
symbols.

* elf32-i386.c (elf_i386_check_relocs): Call
_bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC symbol.
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c

index a0304b6..46ee8fd 100644 (file)
@@ -1,5 +1,11 @@
 2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
 
+       * elf32-i386.c (elf_i386_check_relocs): Call
+       _bfd_elf_create_ifunc_sections only for STT_GNU_IFUNC symbol.
+       * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
+
+2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
+
        * elf-bfd.h (_bfd_elf_link_check_relocs): New.
        * elflink.c (_bfd_elf_link_check_relocs): New function.
        (elf_link_add_object_symbols): Call _bfd_elf_link_check_relocs
index 470fcd1..0a2ac9d 100644 (file)
@@ -1603,10 +1603,6 @@ elf_i386_check_relocs (bfd *abfd,
       eh = (struct elf_i386_link_hash_entry *) h;
       if (h != NULL)
        {
-         /* Create the ifunc sections for static executables.  If we
-            never see an indirect function symbol nor we are building
-            a static executable, those sections will be empty and
-            won't appear in output.  */
          switch (r_type)
            {
            default:
@@ -1621,7 +1617,10 @@ elf_i386_check_relocs (bfd *abfd,
            case R_386_GOT32X:
              if (htab->elf.dynobj == NULL)
                htab->elf.dynobj = abfd;
-             if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
+             /* Create the ifunc sections for static executables.  */
+             if (h->type == STT_GNU_IFUNC
+                 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
+                                                     info))
                return FALSE;
              break;
            }
index 5533b4a..197a1b8 100644 (file)
@@ -1712,10 +1712,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
       if (h != NULL)
        {
-         /* Create the ifunc sections for static executables.  If we
-            never see an indirect function symbol nor we are building
-            a static executable, those sections will be empty and
-            won't appear in output.  */
          switch (r_type)
            {
            default:
@@ -1774,7 +1770,10 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
            case R_X86_64_GOTPCREL64:
              if (htab->elf.dynobj == NULL)
                htab->elf.dynobj = abfd;
-             if (!_bfd_elf_create_ifunc_sections (htab->elf.dynobj, info))
+             /* Create the ifunc sections for static executables.  */
+             if (h->type == STT_GNU_IFUNC
+                 && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
+                                                     info))
                return FALSE;
              break;
            }