Re: [PATCH] x86: Disallow ".long foo@PLT - .L4" for PLT32 relocation
Jan Beulich <[email protected]> Mon, 3 Aug 2026 08:48:26 +0200
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <[email protected]> |
On 31.07.2026 23:03, H.J. Lu wrote: > On Fri, Jul 31, 2026 at 6:55 PM Jan Beulich <[email protected]> wrote: >> >> On 31.07.2026 12:47, H.J. Lu wrote: >>> On Fri, Jul 31, 2026 at 5:03 PM Jan Beulich <[email protected]> wrote: >>>> >>>> On 31.07.2026 10:55, H.J. Lu wrote: >>>>> On Fri, Jul 31, 2026 at 4:26 PM Jan Beulich <[email protected]> wrote: >>>>>> >>>>>> On 31.07.2026 01:09, H.J. Lu wrote: >>>>>>> Disallow ".long foo@PLT - .L4" and only allow ".slong foo@PLT - .L4" for >>>>>>> PLT32 relocation. >>>>>> >>>>>> Why would you enforce this also for 32-bit, where the difference between >>>>>> .slong and .long is entirely benign? The existing cons_sign should be >>>>>> sufficient to achieve what's needed for 64-bit code. >>>>>> >>>>> >>>>> I compared ".long foo@PLT - .L4": >>>>> >>>>> .section .rodata >>>>> .p2align 2 >>>>> .L4: >>>>> .long foo1@PLT - .L4 >>>>> .long foo2@PLT - .L4 >>>>> .long foo3@PLT - .L4 >>>>> .long foo4@PLT - .L4 >>>>> .long foo1@PLT - .L5 >>>>> .long foo2@PLT - .L5 >>>>> .long foo3@PLT - .L5 >>>>> .long foo4@PLT - .L5 >>>>> .L5: >>>>> >>>>> vs ".slong foo@PLT - .L4": >>>>> .section .rodata >>>>> .p2align 2 >>>>> .L4: >>>>> .slong foo1@PLT - .L4 >>>>> .slong foo2@PLT - .L4 >>>>> .slong foo3@PLT - .L4 >>>>> .slong foo4@PLT - .L4 >>>>> .slong foo1@PLT - .L5 >>>>> .slong foo2@PLT - .L5 >>>>> .slong foo3@PLT - .L5 >>>>> .slong foo4@PLT - .L5 >>>>> .L5: >>>>> >>>>> in 64-bit. The output object files are identical. If we don't allow >>>>> ".long foo@PLT - .L4" in 64-bit, we shouldn't allow it in 32-bit. >>>> >>>> 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. WDYM by "there are no issues"? There is a very obvious issue: It is wrong to assemble without error. Hence "please show me a case" is an impossible thing to ask for. Any possible use is wrong (until such time that a suitable relocation type is added, which very likely is "never"). The very, very farthest I might go to make a compromise would be for the diagnostic to be a warning in place of an error. Yet that would still feel wrong to me. Jan