x86: Resolve local undefined weak symbol to 0
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 19:53:39 +0000 (12:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Jun 2017 19:53:39 +0000 (12:53 -0700)
Local undefined weak symbol should always be resolved to 0.

* elf32-i386.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): Resolve
local undefined weak symbol to 0.
* elf64-x86-64.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): Likewise.

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

index cdd6c3574ec9508266851046935d788305e3b60d..8fa42f7a7d0f8dd297885cd009885b05f9c8e005 100644 (file)
@@ -3,6 +3,12 @@
        * elf32-arm.c (elf32_arm_final_link_relocate): Use labs rather than
        abs to fix a truncation warning.
 
+2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): Resolve
+       local undefined weak symbol to 0.
+       * elf64-x86-64.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): Likewise.
+
 2017-06-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_merge_gnu_properties): If info->shstk
index ee8219cbbe402982e42d2ebfe20195830e4348ea..df16775d54aba83aeb3df279c18e989f3055d1ec 100644 (file)
@@ -945,14 +945,16 @@ static const struct elf_i386_backend_data elf_i386_arch_bed =
    it isn't dynamic and
    1. Has non-GOT/non-PLT relocations in text section.  Or
    2. Has no GOT/PLT relocation.
+   Local undefined weak symbol is always resolved to 0.
  */
 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH)   \
   ((EH)->elf.root.type == bfd_link_hash_undefweak              \
-   && bfd_link_executable (INFO)                               \
-   && (elf_i386_hash_table (INFO)->interp == NULL              \
-       || !(GOT_RELOC)                                         \
-       || (EH)->has_non_got_reloc                              \
-       || !(INFO)->dynamic_undefined_weak))
+   && ((EH)->elf.forced_local                                  \
+       || (bfd_link_executable (INFO)                          \
+          && (elf_i386_hash_table (INFO)->interp == NULL       \
+              || !(GOT_RELOC)                                  \
+              || (EH)->has_non_got_reloc                       \
+              || !(INFO)->dynamic_undefined_weak))))
 
 /* i386 ELF linker hash entry.  */
 
index 1a9bebe668f930b6518a9a418498d8ee14f5957c..957dcd98ce6f3dcf11694d858d26b8129c9c9a9e 100644 (file)
@@ -1050,14 +1050,16 @@ static const struct elf_x86_64_backend_data elf_x86_64_arch_bed =
    it isn't dynamic and
    1. Has non-GOT/non-PLT relocations in text section.  Or
    2. Has no GOT/PLT relocation.
+   Local undefined weak symbol is always resolved to 0.
  */
 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH)   \
   ((EH)->elf.root.type == bfd_link_hash_undefweak              \
-   && bfd_link_executable (INFO)                               \
-   && (elf_x86_64_hash_table (INFO)->interp == NULL            \
-       || !(GOT_RELOC)                                         \
-       || (EH)->has_non_got_reloc                              \
-       || !(INFO)->dynamic_undefined_weak))
+   && ((EH)->elf.forced_local                                  \
+       || (bfd_link_executable (INFO)                          \
+          && (elf_x86_64_hash_table (INFO)->interp == NULL     \
+              || !(GOT_RELOC)                                  \
+              || (EH)->has_non_got_reloc                       \
+              || !(INFO)->dynamic_undefined_weak))))
 
 /* x86-64 ELF linker hash entry.  */