Re: [PATCH v2] x86: Generate PLT32 relocation for ".long foo@PLT - .L4"

Jan Beulich <[email protected]> Mon, 27 Jul 2026 09:46:45 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
On 27.07.2026 05:47, H.J. Lu wrote:
> On Sat, Jul 25, 2026 at 10:35 AM H.J. Lu <[email protected]> wrote:
>>
>> Add BFD_RELOC_X86_64_PLT32 and use it to generate R_X86_64_PLT32 for
>> directives like ".long foo@PLT - .L4" so that PLT entries are used to
>> resolve the PC32 relocation against function symbols for such directives.
>>
>> bfd/
>>
>> PR gas/34423
>> * elf64-x86-64.c (x86_64_reloc_map): Add BFD_RELOC_X86_64_PLT32.
>> * reloc.c (bfd_reloc_code_real): Add BFD_RELOC_X86_64_PLT32.
>> * bfd-in2.h: Regenerated.
>> * libbfd.h: Likewise.
>>
>> gas/
>>
>> PR gas/34423
>> * config/tc-i386.c (x86_cons): Return BFD_RELOC_X86_64_PLT32 for
>> directives like ".long foo@PLT - .L4".
>> (tc_gen_reloc): Generate R_X86_64_PLT32 for BFD_RELOC_X86_64_PLT32
>> with addend computed like R_X86_64_PC32.
>> * testsuite/gas/i386/reloc64.l: Updated.
>> * testsuite/gas/i386/reloc64.s: Replace ".long xtrn@plt - ." with
>> ".long xtrn@plt - _start".
>> * testsuite/gas/i386/ilp32/reloc64.l: Updated.
>> * testsuite/gas/i386/ilp32/reloc64.s: Replace ".long xtrn@plt - ."
>> with ".long xtrn@plt - ptr".
>> * testsuite/gas/i386/x86-64-jump-table.d: New file.
>> * testsuite/gas/i386/x86-64-jump-table.d: Likewise.
>> * testsuite/gas/i386/x86-64-jump-table.s: Likewise.
>> * testsuite/gas/i386/x86-64.exp: Run x86-64-jump-table.
>> * testsuite/gas/i386/ilp32/x86-64-jump-table.d: New file.
>>
>> ld/
>>
>> PR gas/34423
>> * testsuite/ld-x86-64/pr34423.c: New file.
>> * testsuite/ld-x86-64/x86-64-jump-table.s: Likewise.
>> * testsuite/ld-x86-64/x86-64.exp: Run gas/34423 tests.
> 
> Add i386 support like LLVM assembler in the v2 patch.

Why would S_IS_LOCAL() be the criteria? There isn't anything wrong with a
global, at the very least a hidden/protected one, is there? Instead don't
you want to verify that the subtrahend is in the current section (which
of course we may not know until after having parsed all input)?

Surprising code like

+      if (fixp->fx_r_type == BFD_RELOC_X86_64_PC32_TO_PLT32)
+	code = BFD_RELOC_X86_64_PC32_TO_PLT32;
+      else if (fixp->fx_r_type == BFD_RELOC_386_PC32_TO_PLT32)
+	code = BFD_RELOC_386_PLT32;

imo wants at least a brief comment as to the different behavior for i386
vs x86-64.

Jan