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> 2021-01-21 Alan Modra <amodra@gmail.com>
PR 27221 PR 27221

View File

@ -737,7 +737,9 @@ resolve_reloc_expr_symbols (void)
prevent the offset from overflowing the relocated field, prevent the offset from overflowing the relocated field,
unless it has enough bits to cover the whole address unless it has enough bits to cover the whole address
space. */ 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 && (sec->use_rela_p
|| (howto->partial_inplace || (howto->partial_inplace
&& (!howto->pc_relative && (!howto->pc_relative