mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
ld/PE: don't emit relocations for weak absolute symbols
First we should check the flag alone, not the entire flags value matching BSF_WEAK. And then using "else if()" is inappropriate here: A weak symbol can very well also be absolute, and hence wouldn't want a relocation emitted despite being defined.
This commit is contained in:
13
ld/pe-dll.c
13
ld/pe-dll.c
@@ -1630,9 +1630,8 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
|
|||||||
const struct bfd_link_hash_entry *blhe
|
const struct bfd_link_hash_entry *blhe
|
||||||
= bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
|
= bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
|
||||||
false, false, false);
|
false, false, false);
|
||||||
|
|
||||||
/* Don't create relocs for undefined weak symbols. */
|
/* Don't create relocs for undefined weak symbols. */
|
||||||
if (sym->flags == BSF_WEAK)
|
if (sym->flags & BSF_WEAK)
|
||||||
{
|
{
|
||||||
if (blhe && blhe->type == bfd_link_hash_undefweak)
|
if (blhe && blhe->type == bfd_link_hash_undefweak)
|
||||||
{
|
{
|
||||||
@@ -1657,7 +1656,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Nor for Dwarf FDE references to discarded sections. */
|
/* Nor for Dwarf FDE references to discarded sections. */
|
||||||
else if (bfd_is_abs_section (sym->section->output_section))
|
if (bfd_is_abs_section (sym->section->output_section))
|
||||||
{
|
{
|
||||||
/* We only ignore relocs from .eh_frame sections, as
|
/* We only ignore relocs from .eh_frame sections, as
|
||||||
they are discarded by the final link rather than
|
they are discarded by the final link rather than
|
||||||
@@ -1666,10 +1665,10 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Nor for absolute symbols. */
|
/* Nor for absolute symbols. */
|
||||||
else if (blhe && ldexp_is_final_sym_absolute (blhe)
|
if (blhe && ldexp_is_final_sym_absolute (blhe)
|
||||||
&& (!blhe->linker_def
|
&& (!blhe->linker_def
|
||||||
|| (strcmp (sym->name, "__image_base__")
|
|| (strcmp (sym->name, "__image_base__")
|
||||||
&& strcmp (sym->name, U ("__ImageBase")))))
|
&& strcmp (sym->name, U ("__ImageBase")))))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
|
reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;
|
||||||
|
|||||||
Reference in New Issue
Block a user