[PATCH v2 1/5] ld: fix segfault caused by untagged stub sections
Christophe Lyon
christophe.lyon@linaro.org
Tue Oct 21 10:51:45 GMT 2025
On Tue, 21 Oct 2025 at 12:48, Christophe Lyon
<christophe.lyon@linaro.org> wrote:
>
> On Tue, 21 Oct 2025 at 12:28, Matthieu Longo <matthieu.longo@arm.com> wrote:
> >
> > On 2025-10-15 12:28, Christophe Lyon wrote:
> > > On Tue, 14 Oct 2025 at 12:47, Matthieu Longo <matthieu.longo@arm.com> wrote:
> > >>
> > >> In the case of non-contiguous memory regions, a far-call stub section
> > >> must be assigned to the memory of the section it was originally emitted
> > >> for. If the stub section does not fit, the section is marked as dropped,
> > >> and removed later. To emit a useful message to the user, however, a stub
> > >> section needs to be discernible from sections originating from input
> > >> objects.
> > >>
> > >> Previously [1], this distinction was made using the SEC_LINKER_CREATED
> > >> flag only in the AArch32 backend handler <arch>_add_stub_section. Other
> > >> backends that didn't set this flag on their stub sections skipped required
> > >> checks in ld/ldlang.c:size_input_section(). On AArch64, this caused the
> > >> linker to proceed into code paths that assumed output sections were set,
> > >> instead of reporting fatal errors, and ultimately led to a segmentation
> > >> fault.
> > >>
> > >> However, the SEC_LINKER_CREATED flag does not solely indicate that a
> > >> section was created by the linker. Its original meaning also meant that
> > >> the section should not be handled by the generic relocation code. Reusing
> > >> this flag to identify stub sections, while it appeared to fix the issue,
> > >> introduced unintended side effects. On PowerPC, for instance, it skipped
> > >> relocations present in the stubs and interpreted them as absolute
> > >> addresses.
> > >>
> > >> This patch proposes a new attribute 'veneer', indicating that a section
> > >> contains branch veneers. The attribute is set on AArch32, AArch64 and
> > >> PowerPC immediately after the creation of the stub section. Others
> > >> architectures are left unchanged, as they do not appear to support
> > >> non-contiguous memory regions (no tests were found to verify the fix).
> > >> Additionally, the diagnostic message was improved when a stub cannot be
> > >> placed in the same memory region as its referencing code.
> > >>
> > >
> > > Hi Matthieu,
> > >
> > > Thanks for this fix, and the time spent on analyzing the problem.
> > >
> > > I clearly missed the other implications of SEC_LINKER_CREATED when I
> > > originally implemented support for non-contiguous memory regions.
> > >
> > > Regarding other targets, I did not write additional tests, but I did
> > > run the testsuite on a long list of targets provided by Alan at that
> > > time:
> > > https://sourceware.org/pipermail/binutils/2020-February/110310.html
> > >
> > > Maybe you did that too? At least that would give confidence that there
> > > is no unexpected side-effect.
> > >
> > > FWIW, the approach LGTM.
> > > Thanks for making the error messages clearer ;-)
> > >
> > > Christophe
> > >
> >
> > Hi Christophe,
> >
> > I finished running the tests.
> >
> > --- ../build-dir-2/ROOT-test-result 2025-10-20 17:34:49.950810702 +0100
> > +++ HEAD-test-result 2025-10-20 18:17:55.031356787 +0100
> > @@ -2,7 +2,7 @@
> > BUILD&TEST of aarch64-elf
> > -------------
> > Nothing to do for aarch64-elf !
> > -# of expected passes 858
> > +# of expected passes 868
> > # of expected failures 5
> > # of untested testcases 26
> > # of unsupported tests 354
> > @@ -10,7 +10,7 @@
> > BUILD&TEST of aarch64-linux
> > -------------
> > Nothing to do for aarch64-linux !
> > -# of expected passes 1151
> > +# of expected passes 1161
> > # of expected failures 5
> > # of untested testcases 26
> > # of unsupported tests 180
> > @@ -18,8 +18,8 @@
> > BUILD&TEST of aarch64_be-linux-gnu_ilp32
> > -------------
> > Nothing to do for aarch64_be-linux-gnu_ilp32 !
> > -# of expected passes 1024
> > -# of unexpected failures 120
> > +# of expected passes 1030
> > +# of unexpected failures 124
> > # of expected failures 5
> > # of untested testcases 26
> > # of unsupported tests 185
> > The difference corresponds to the new tests added on AArch64 in patch 4/5.
> >
> > I found a same regression on 2 different architectures, all related to a
> > section that was silently dropped before whereas now it raises an error.
> > I fixed the failure by adapting the linker script and add those special
> > sections to /DISCARD/ (see below). This fix goes into patch 3/5.
> >
> > --- a/ld/testsuite/ld-elf/non-contiguous.ld
> > +++ b/ld/testsuite/ld-elf/non-contiguous.ld
> > @@ -14,17 +14,19 @@ SECTIONS
> > {
> > /* Ignore this target specific info in output comparison. */
> > /DISCARD/ : {
> > - *(.ARM.attributes)
> > - *(.ARC.attributes)
> > - *(.riscv.attributes)
> > - *(.c6xabi.attributes)
> > - *(.trampolines)
> > - *(.reginfo)
> > - *(.note.renesas)
> > - *(.MIPS.abiflags)
> > - *(.MSP430.attributes)
> > - *(.csky.attributes)
> > - *(.gnu.attributes)
> > + *(.ARM.attributes)
> > + *(.ARC.attributes)
> > + *(.riscv.attributes)
> > + *(.c6xabi.attributes)
> > + *(.trampolines)
> > + *(.reginfo)
> > + *(.note.renesas)
> > + *(.note.spu_name)
> > + *(.MIPS.abiflags)
> > + *(.MIPS.options)
> > + *(.MSP430.attributes)
> > + *(.csky.attributes)
> > + *(.gnu.attributes)
> > }
> >
> So if I see correctly, you had to add *(.MIPS.options) ?
hmm I missed *(.note.spu_name), but that's still OK for me ;-)
>
> > .raml : /*AT ( ADDR (.text) + SIZEOF (.text) )*/
> >
> > Since there was no major issue found and the fixes are minor changes,
> > should I publish a new revision ?
>
> No that's OK for me, but I'm not a maintainer ;-)
>
> Thanks for testing!
>
> Christophe
>
> >
> > Matthieu
More information about the Binutils
mailing list