Check if symbol is defined when converting mov to lea
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 16 Oct 2015 11:17:49 +0000 (04:17 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 16 Oct 2015 11:21:03 +0000 (04:21 -0700)
We need to check if symbol is defined when converting mov to lea since
SYMBOL_REFERENCES_LOCAL may return true on hidden undefined symbols.

* elf32-i386.c (elf_i386_convert_mov_to_lea): Check if symbol
is defined.
* elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Likewise.

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

index d26a526d424bed1f6a23766cff6415a5c8a2d92c..d3715949f36b9175be4cee77cba94d33fa1606db 100644 (file)
@@ -1,3 +1,9 @@
+2015-10-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (elf_i386_convert_mov_to_lea): Check if symbol
+       is defined.
+       * elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Likewise.
+
 2015-10-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_convert_mov_to_lea): Don't check
index 2e5c04da6348a095ccd80988a163a9fe9aae87b2..8c1dadb4cf3a1dd1711a3ea53da3f140f418704a 100644 (file)
@@ -2815,7 +2815,9 @@ elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
 
       /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  We also avoid
         optimizing _DYNAMIC since ld.so may use its link-time address.  */
-      if (h->type != STT_GNU_IFUNC
+      if ((h->root.type == bfd_link_hash_defined
+          || h->root.type == bfd_link_hash_defweak)
+         && h->type != STT_GNU_IFUNC
          && h != htab->elf.hdynamic
          && SYMBOL_REFERENCES_LOCAL (link_info, h)
          && irel->r_offset >= 2
index aad324490c994ca271eba2ee02d01f57b5d79d8b..dc5fd0db4309d105114878b9ffee1996d6261dba 100644 (file)
@@ -3074,7 +3074,9 @@ elf_x86_64_convert_mov_to_lea (bfd *abfd, asection *sec,
          /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation.  We also
             avoid optimizing _DYNAMIC since ld.so may use its link-time
             address.  */
-         if (h->type != STT_GNU_IFUNC
+         if ((h->root.type == bfd_link_hash_defined
+              || h->root.type == bfd_link_hash_defweak)
+             && h->type != STT_GNU_IFUNC
              && h != htab->elf.hdynamic
              && SYMBOL_REFERENCES_LOCAL (link_info, h))
            {