Re: [PATCH] x86: Disallow ".long foo@PLT - .L4" for PLT32 relocation
Jan Beulich <[email protected]> Mon, 3 Aug 2026 08:44:29 +0200
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <[email protected]> |
On 01.08.2026 15:47, Maciej W. Rozycki wrote: > On Sat, 1 Aug 2026, H.J. Lu wrote: > >>>>> Why? .slong was introduced because of a peculiarity of x86-64. If that >>>>> was straightforward to achieve, it may better not have been exposed to >>>>> 16- and 32-bit code in the first place. While that ship has sailed, >>>>> suddenly making its use mandatory for certain constructs even outside >>>>> of 64-bit code feels outright wrong. >>>> >>>> What is wrong with using " .long foo4@PLT - .L4" in 64-bit? >>>> The possible reason could be wrong code. You don't like it >>>> doesn't count. >>> >>> It's not a matter of liking it (or not). The distinction between both is >>> what relocation is (supposed to be) used when one is needed. .long should >>> only ever use zero-extending ones; .slong was added such that want for a >>> sign-extending one can be expressed. Without distinct directives, the >>> assembler has to guess, and such guessing can only go wrong. I'm pretty >>> certain this isn't properly dealt with everywhere, but when adding new >>> functionality we shouldn't extend existing flaws. >> >> Given that there are no issues with ".long foo - .L4", >> ".long foo1@PLT - .L4" should have no issues at all. >> If you believe that it isn't true, please show me a case. > > I gather this is about the overflow case, handled differently depending > on the signedness or the lack of, of the datum relocated by the static > linker or dynamic loader as appropriate. > > Jan, please correct me if I'm wrong since commit d182319b0955 has no > change description and there's no documentation for `.slong' in the GAS > manual either. What are the x86 psABI ELF relocation types corresponding > to `.long' and `.slong' respectively in this context? For .long there simply is no correct relocation type to use for PLT (and, fwiw, simple PC-relative) expressions. The correct type to use is R_X86_64_PLT32 (and R_X86_64_PC32 for the simple PC-rel case). For the simple PC-rel case we simply cannot require use of .slong, as we've been accepting .long (then guessing that .slong was meant). Else we'd very likely break existing code. Since @PLT was rejected so far when used with .long and .slong, doing better here is imo very desirable (if not imperative). Jan