From 84da4cf89efed1df483914d06210daae79ce3eb8 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 22 Jun 2017 12:53:39 -0700 Subject: [PATCH] x86: Resolve local undefined weak symbol to 0 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 | 6 ++++++ bfd/elf32-i386.c | 12 +++++++----- bfd/elf64-x86-64.c | 12 +++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cdd6c3574e..8fa42f7a7d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 + + * 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 * elf32-i386.c (elf_i386_merge_gnu_properties): If info->shstk diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index ee8219cbbe..df16775d54 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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. */ diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 1a9bebe668..957dcd98ce 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -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. */