Phenomenal: In 32 bit and 64 bit mixed code, ld can't do relocation for 32 bit code. It is caused by commit 17c6c3b99156fe82c1e637e1a5fd9f163ac788c8. /* src_mask selects the part of the instruction (or data) to be used in the relocation sum. If the target relocations don't have an addend in the reloc, eg. ELF USE_REL, src_mask will normally equal dst_mask to extract the addend from the section contents. If relocations do have an addend in the reloc, eg. ELF USE_RELA, this field should normally be zero. Non-zero values for ELF USE_RELA targets should be viewed with suspicion as normally the value in the dst_mask part of the section contents should be ignored. */ bfd_vma src_mask; Author: Jan Beulich 2021-05-07 18:05:12 Committer: Jan Beulich 2021-05-07 18:05:12 Parent: 98da05bf2698b55b73453480a3fbb92f163d2c7b (x86: don't mix disp and imm processing) Child: 4cf88725da1cb503be04d3237354105ec170bc86 ([gdb/symtab] Fix infinite recursion in dwarf2_cu::get_builder()) Branches: master, test0558-01 and many more (41) Follows: gdb-10-branchpoint Precedes: binutils-2_37, gdb-11-branchpoint x86-64/ELF: clear src_mask for all reloc types x86-64 uses rela relocations. The comment next to the field's declaration says "Non-zero values for ELF USE_RELA targets should be viewed with suspicion ..." And indeed the fields being non-zero causes section contents to be accumulated into the final relocated values in addition to the relocations' addends, which is contrary to the ELF spec.