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.
This commit is contained in:
Alan Modra 2021-01-24 12:39:07 +10:30
parent b10bae1875
commit 68fcee4fa7
2 changed files with 9 additions and 1 deletions

View File

@ -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

View File

@ -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