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.