[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