From: Jan Beulich Date: Wed, 11 Jun 2025 12:32:34 +0000 (+0200) Subject: ld/PE: special-case relocation types only for COFF inputs X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4e7b9bd8ab96b9afb02646c0b5b70b2a5ad90fec;p=thirdparty%2Fbinutils-gdb.git ld/PE: special-case relocation types only for COFF inputs In 72cd2c709779 ("ld/PE: no base relocs for section (relative) ones") I made a pre-existing problem quite a bit worse: When looking at a relocation's (numerical) howto->type, that value is meaningful only if the object was of corresponding COFF type. ELF objects in particular have their own enumeration. As it stands, specifically the not entirely unusual R_X86_64_32 and R_X86_64_32S did no longer have relocations emitted for them, due to matching R_AMD64_SECTION and R_AMD64_SECREL in value respectively. --- diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 4a2ea036518..210b77ea374 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -1620,10 +1620,11 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info) printf ("rel: %s\n", sym->name); } if (!relocs[i]->howto->pc_relative - && relocs[i]->howto->type != pe_details->imagebase_reloc - && (relocs[i]->howto->type < pe_details->secrel_reloc_lo - || relocs[i]->howto->type > pe_details->secrel_reloc_hi) - && relocs[i]->howto->type != pe_details->section_reloc) + && (bfd_get_flavour (b) != bfd_target_coff_flavour + || (relocs[i]->howto->type != pe_details->imagebase_reloc + && (relocs[i]->howto->type < pe_details->secrel_reloc_lo + || relocs[i]->howto->type > pe_details->secrel_reloc_hi) + && relocs[i]->howto->type != pe_details->section_reloc))) { struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr; const struct bfd_link_hash_entry *blhe