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

"H.J. Lu" <[email protected]> Mon, 3 Aug 2026 15:22:04 +0800
Newsgroups gmane.comp.gnu.binutils
Message-ID <CAMe9rOqER9w_o1xah2Th-dkaHSADhhf2SQEkp1cfrhZ0GMwqZg@mail.gmail.com>
On Mon, Aug 3, 2026 at 2:44=E2=80=AFPM Jan Beulich <[email protected]> wrot=
e:
>
> 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 t=
hat
> >>>>> 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 outsi=
de
> >>>>> 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 sh=
ould
> >>> only ever use zero-extending ones; .slong was added such that want fo=
r a
> >>> sign-extending one can be expressed. Without distinct directives, the
> >>> assembler has to guess, and such guessing can only go wrong. I'm pret=
ty
> >>> certain this isn't properly dealt with everywhere, but when adding ne=
w
> >>> 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 dependin=
g
> > 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 correspondi=
ng
> > 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 ver=
y
> 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).
>

Because assembler has been correctly generating R_X86_64_PC32 for
".long foo - .L4", it is perfectly correct to generate R_X86_64_PLT32 for
".long foo@PLT - .L4".


--
H.J.