aboutsummaryrefslogtreecommitdiff
path: root/gas/write.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-01-24 12:39:07 +1030
committerAlan Modra <amodra@gmail.com>2021-01-24 16:16:45 +1030
commit68fcee4fa753f6488c9f90610da2f5a5a95d5a1f (patch)
treedde0d2abe5b60a28107eb4935c56b5af03b6c394 /gas/write.c
parentb10bae18753862874628f902796eb1cd3925f95d (diff)
downloadgdb-68fcee4fa753f6488c9f90610da2f5a5a95d5a1f.zip
gdb-68fcee4fa753f6488c9f90610da2f5a5a95d5a1f.tar.gz
gdb-68fcee4fa753f6488c9f90610da2f5a5a95d5a1f.tar.bz2
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.
Diffstat (limited to 'gas/write.c')
-rw-r--r--gas/write.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gas/write.c b/gas/write.c
index 75ba971..95922bb 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