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 d26a526..d371594 100644 (file)
@@ -1,5 +1,11 @@
 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
        def_regular.
        * elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Likewise.
index 2e5c04d..8c1dadb 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 aad3244..dc5fd0d 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))
            {