[binutils-gdb] PR27228, .reloc wrong symbol emitted for undefined local symbol

Alan Modra amodra@sourceware.org
Sun Jan 24 05:47:31 GMT 2021


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

commit 68fcee4fa753f6488c9f90610da2f5a5a95d5a1f
Author: Alan Modra <amodra@gmail.com>
Date:   Sun Jan 24 12:39:07 2021 +1030

    PR27228, .reloc wrong symbol emitted for undefined local symbol
    
    Local symbols are of course supposed to be defined by their object
    file, but in other cases a local symbol is promoted to global by gas
    if undefined and referenced.  This patch stops gas wrongly replacing a
    local undefined symbol with the undefined section symbol, resulting in
    a .reloc undefined local symbol being emitted as global.
    
            PR 27228
            * write.c (resolve_reloc_expr_symbols): Don't assume local symbol
            is defined.

Diff:
---
 gas/ChangeLog | 6 ++++++
 gas/write.c   | 4 +++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 74185318b17..4ac29870e63 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2021-01-24  Alan Modra  <amodra@gmail.com>
+
+	PR 27228
+	* write.c (resolve_reloc_expr_symbols): Don't assume local symbol
+	is defined.
+
 2021-01-21  Alan Modra  <amodra@gmail.com>
 
 	PR 27221
diff --git a/gas/write.c b/gas/write.c
index 75ba971eb4b..95922bb25a0 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -737,7 +737,9 @@ resolve_reloc_expr_symbols (void)
 		 prevent the offset from overflowing the relocated field,
 	         unless it has enough bits to cover the whole address
 	         space.  */
-	      if (S_IS_LOCAL (sym) && !symbol_section_p (sym)
+	      if (S_IS_LOCAL (sym)
+		  && S_IS_DEFINED (sym)
+		  && !symbol_section_p (sym)
 		  && (sec->use_rela_p
 		      || (howto->partial_inplace
 			  && (!howto->pc_relative


More information about the Binutils-cvs mailing list