From 4e7b9bd8ab96b9afb02646c0b5b70b2a5ad90fec Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 11 Jun 2025 14:32:34 +0200 Subject: [PATCH] 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. --- ld/pe-dll.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 -- 2.47.2