BFD: Use `bfd_is_abs_symbol' to determine whether a symbol is absolute

Use `bfd_is_abs_symbol' to determine whether a symbol is absolute,
avoiding a problem with ordinary symbols defined in a linker script
outside an output section definition.  Such symbols have its owning
section set to the absolute section up to the final link phase.  A flag
has been added to the link hash to identify such symbols.  Rather than
checking the flag by hand, use the macro that does it uniformly for all
users.

	bfd/
	* elf32-nds32.c (nds32_elf_relax_loadstore): Use
	`bfd_is_abs_symbol' rather than `bfd_is_abs_section' in checking
	whether the symbol is absolute.
	(nds32_elf_relax_lo12): Likewise.
	* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Likewise.
	(elfNN_aarch64_check_relocs): Likewise.
	* xcofflink.c (xcoff_need_ldrel_p): Likewise.
	(bfd_xcoff_import_symbol): Likewise.
	(xcoff_write_global_symbol): Likewise.
This commit is contained in:
Maciej W. Rozycki 2018-07-17 20:04:53 +01:00
parent d5c928c053
commit c691de6a16
4 changed files with 19 additions and 12 deletions

View File

@ -1,3 +1,15 @@
2018-07-17 Maciej W. Rozycki <macro@mips.com>
* elf32-nds32.c (nds32_elf_relax_loadstore): Use
`bfd_is_abs_symbol' rather than `bfd_is_abs_section' in checking
whether the symbol is absolute.
(nds32_elf_relax_lo12): Likewise.
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Likewise.
(elfNN_aarch64_check_relocs): Likewise.
* xcofflink.c (xcoff_need_ldrel_p): Likewise.
(bfd_xcoff_import_symbol): Likewise.
(xcoff_write_global_symbol): Likewise.
2018-07-17 Maciej W. Rozycki <macro@mips.com>
* linker.c (bfd_is_abs_symbol): New macro.

View File

@ -10567,7 +10567,7 @@ nds32_elf_relax_loadstore (struct bfd_link_info *link_info, bfd *abfd,
/* This is avoid to relax symbol address which is fixed
relocations. Ex: _stack. */
if (h && bfd_is_abs_section (h->root.u.def.section))
if (h && bfd_is_abs_symbol (&h->root))
return FALSE;
}
@ -10707,7 +10707,7 @@ nds32_elf_relax_lo12 (struct bfd_link_info *link_info, bfd *abfd,
/* This is avoid to relax symbol address which is fixed
relocations. Ex: _stack. */
else if (N32_OP6 (insn) == N32_OP6_ORI
&& h && bfd_is_abs_section (h->root.u.def.section))
&& h && bfd_is_abs_symbol (&h->root))
return;
else
{

View File

@ -5224,8 +5224,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
: bfd_is_und_section (sym_sec));
abs_symbol_p = (h !=NULL && h->root.type == bfd_link_hash_defined
&& bfd_is_abs_section (h->root.u.def.section));
abs_symbol_p = h != NULL && bfd_is_abs_symbol (&h->root);
/* Since STT_GNU_IFUNC symbol must go through PLT, we handle
@ -7363,8 +7362,7 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (h != NULL
/* This is an absolute symbol. It represents a value instead
of an address. */
&& ((h->root.type == bfd_link_hash_defined
&& bfd_is_abs_section (h->root.u.def.section))
&& (bfd_is_abs_symbol (&h->root)
/* This is an undefined symbol. */
|| h->root.type == bfd_link_hash_undefined))
break;

View File

@ -2687,10 +2687,7 @@ xcoff_need_ldrel_p (struct bfd_link_info *info, struct internal_reloc *rel,
case R_RLA:
/* Absolute relocations against absolute symbols can be
resolved statically. */
if (h != NULL
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& bfd_is_abs_section (h->root.u.def.section))
if (h != NULL && bfd_is_abs_symbol (&h->root))
return FALSE;
return TRUE;
@ -3125,7 +3122,7 @@ bfd_xcoff_import_symbol (bfd *output_bfd,
if (val != (bfd_vma) -1)
{
if (h->root.type == bfd_link_hash_defined
&& (! bfd_is_abs_section (h->root.u.def.section)
&& (!bfd_is_abs_symbol (&h->root)
|| h->root.u.def.value != val))
(*info->callbacks->multiple_definition) (info, &h->root, output_bfd,
bfd_abs_section_ptr, val);
@ -5589,7 +5586,7 @@ xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
|| h->root.type == bfd_link_hash_defweak)
&& h->smclas == XMC_XO)
{
BFD_ASSERT (bfd_is_abs_section (h->root.u.def.section));
BFD_ASSERT (bfd_is_abs_symbol (&h->root));
isym.n_value = h->root.u.def.value;
isym.n_scnum = N_UNDEF;
if (h->root.type == bfd_link_hash_undefweak