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

Jan Beulich <[email protected]> Thu, 30 Jul 2026 09:13:59 +0200
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
On 27.07.2026 10:44, H.J. Lu wrote:
> On Mon, Jul 27, 2026 at 3:58 PM H.J. Lu <[email protected]> wrote:
>> On Mon, Jul 27, 2026 at 3:46 PM Jan Beulich <[email protected]> wrote:
>>> 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
>>
>> I will remove it.
> 
> Removed in v3.
> 
>>> 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)?
>>
>> It will be reverified later :
>>
>> [hjl@gnu-tgl-3 pic-1]$ cat bar.s
>>         .section .rodata
>>         .p2align 2
>> .L4:
>>         .long foo1@PLT - bar
>> [hjl@gnu-tgl-3 pic-1]$ ./as  -o bar.o bar.s
>> bar.s: Assembler messages:
>> bar.s:4: Error: can't resolve foo1 - bar
>> [hjl@gnu-tgl-3 pic-1]$
>>
>>> 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.
>>>
>>
>> I will add some comments.
> 
> Comments are added in v3.  The difference is explicit addend and implicit
> addend.
> 
> Here is the v3 patch.

Thanks, but once again I have to ask: Why did this need rushing in? I asked
before that you please allow at least a week between submission and
committing. Perhaps except when a change is entirely uncontroversial, or
really urgent to fix e.g. recently introduced breakage (neither of which is
the case here).

As to the change itself: We have had support for .slong for a long time.
Imo

	.long foo@PLT - .L4

is a bogus construct on 64-bit, and

	.slong foo@PLT - .L4

should be demanded there.

Then: Why do gas/testsuite/gas/i386/reloc{32,64}.s need fiddling with? .
should be as suitable to use there as _start / ptr.

Jan