This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] ELF/LD: Always consider STB_LOCAL symbols local


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0fad29560ee055f1253a8e40bfc09b413117480d

commit 0fad29560ee055f1253a8e40bfc09b413117480d
Author: Maciej W. Rozycki <macro@imgtec.com>
Date:   Thu Apr 13 10:26:05 2017 +0100

    ELF/LD: Always consider STB_LOCAL symbols local
    
    Do not require forced local (STB_LOCAL) symbols to have a definition in
    a regular file to be considered to resolve local to the current module,
    matching `elf_link_renumber_local_hash_table_dynsyms'.  In the absence
    of a regular definition any reference to a STB_LOCAL symbol will have to
    be garbage collected along with the undefined symbol itself, or the link
    will eventually fail.  Either way the symbol concerned is not going to
    be external.
    
    	bfd/
    	* elflink.c (_bfd_elf_symbol_refs_local_p): Always return TRUE
    	if forced local.

Diff:
---
 bfd/ChangeLog |  5 +++++
 bfd/elflink.c | 18 +++++++++---------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ae6cbf0..ac80a44 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
 2017-04-20  Maciej W. Rozycki  <macro@imgtec.com>
 
+	* elflink.c (_bfd_elf_symbol_refs_local_p): Always return TRUE
+	if forced local.
+
+2017-04-20  Maciej W. Rozycki  <macro@imgtec.com>
+
 	* elfxx-mips.c (_bfd_mips_elf_final_link): Reorder comment about
 	dynamic symbol sorting.
 
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 972b6f8..330fad7 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3063,10 +3063,10 @@ _bfd_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
    to resolve local to the current module, and false otherwise.  Differs
    from (the inverse of) _bfd_elf_dynamic_symbol_p in the treatment of
    undefined symbols.  The two functions are virtually identical except
-   for the place where forced_local and dynindx == -1 are tested.  If
-   either of those tests are true, _bfd_elf_dynamic_symbol_p will say
-   the symbol is local, while _bfd_elf_symbol_refs_local_p will say
-   the symbol is local only for defined symbols.
+   for the place where dynindx == -1 is tested.  If that test is true,
+   _bfd_elf_dynamic_symbol_p will say the symbol is local, while
+   _bfd_elf_symbol_refs_local_p will say the symbol is local only for
+   defined symbols.
    It might seem that _bfd_elf_dynamic_symbol_p could be rewritten as
    !_bfd_elf_symbol_refs_local_p, except that targets differ in their
    treatment of undefined weak symbols.  For those that do not make
@@ -3089,6 +3089,10 @@ _bfd_elf_symbol_refs_local_p (struct elf_link_hash_entry *h,
       || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL)
     return TRUE;
 
+  /* Forced local symbols resolve locally.  */
+  if (h->forced_local)
+    return TRUE;
+
   /* Common symbols that become definitions don't get the DEF_REGULAR
      flag set, so test it first, and don't bail out.  */
   if (ELF_COMMON_DEF_P (h))
@@ -3098,11 +3102,7 @@ _bfd_elf_symbol_refs_local_p (struct elf_link_hash_entry *h,
   else if (!h->def_regular)
     return FALSE;
 
-  /* Forced local symbols resolve locally.  */
-  if (h->forced_local)
-    return TRUE;
-
-  /* As do non-dynamic symbols.  */
+  /* Non-dynamic symbols resolve locally.  */
   if (h->dynindx == -1)
     return TRUE;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]