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

"H.J. Lu" <[email protected]> Wed, 29 Jul 2026 10:30:35 +0800
Newsgroups gmane.comp.gnu.binutils
Message-ID <CAMe9rOpksJFKzyKiH4A-2jP97UBC_vNJ_9PQm+uOq8_v5cwjsQ@mail.gmail.com>
On Mon, Jul 27, 2026 at 4:44 PM H.J. Lu <[email protected]> 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.

I will check it in this week.


> --
> H.J.
> ---
> LLVM assembler supports directives like ".long foo@PLT - .L4" for i386
> and x86-64.  Implement the same feature to generate PLT32 relocation
> for directives like ".long foo@PLT - .L4" so that PLT entries are used
> to resolve the PC32 relocation against function symbols.
>
> bfd/
>
> PR gas/34423
> * elf32-i386.c (elf_i386_reloc_type_lookup): Handle
> BFD_RELOC_386_PC32_TO_PLT32.
> * elf64-x86-64.c (x86_64_reloc_map): Add
> BFD_RELOC_X86_64_PC32_TO_PLT32.
> * reloc.c (bfd_reloc_code_real): Add BFD_RELOC_386_PC32_TO_PLT32
> and BFD_RELOC_X86_64_PC32_TO_PLT32.
> * bfd-in2.h: Regenerated.
> * libbfd.h: Likewise.
>
> gas/
>
> PR gas/34423
> * config/tc-i386.c (x86_cons): Return
> BFD_RELOC_X86_64_PC32_TO_PLT32 or BFD_RELOC_386_PC32_TO_PLT32
> for directives like ".long foo@PLT - .L4".
> (md_apply_fix): Compute addend for BFD_RELOC_386_PC32_TO_PLT32.
> (tc_gen_reloc): Handle BFD_RELOC_X86_64_PC32_TO_PLT32 and
> BFD_RELOC_386_PC32_TO_PLT32.  Compute addend like
> BFD_RELOC_32_PCREL for BFD_RELOC_X86_64_PC32_TO_PLT32.
> * testsuite/gas/i386/i386.exp: Run plt test.
> * testsuite/gas/i386/ilp32/reloc64.l: Updated.
> * testsuite/gas/i386/ilp32/reloc64.s: Replace ".long xtrn@plt - ."
> with ".long xtrn@plt - _start".
> * testsuite/gas/i386/ilp32/x86-64-jump-table.d: New file.
> * testsuite/gas/i386/plt.d: Likewise.
> * testsuite/gas/i386/plt.s: Likewise.
> * testsuite/gas/i386/reloc32.l: Updated.
> * testsuite/gas/i386/reloc32.s: Replace ".long xtrn@plt - ."
> with ".long xtrn@plt - _start".
> * testsuite/gas/i386/reloc64.l: Updated.
> * testsuite/gas/i386/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.
>
> 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.



--
H.J.