[PATCH v1 0/5] ld: fix segfaults when non-contiguous memory support is enabled
Matthieu Longo
matthieu.longo@arm.com
Thu Sep 18 15:06:01 GMT 2025
When support for non-contiguous memory was added, some corner cases were missed, leading to potential segfaults:
- Stub sections were not consistently tagged. Only AArch32 did this. This caused other backends to skip necessary checks in ld/ldlang.c:size_input_section(). As a result, the linker proceeded into code that assumed that output sections were set, instead of emitting fatal errors.
- The linker did not exit with a fatal error at the end of ld/ldlang.c:lang_process(), before reaching code paths that correctly assumed every input section had a valid output section.
Previously, warn_non_contiguous_discards() would only issue warning on unallocated sections, relying on later unresolved symbol errors to terminate before a crash. This approach was insufficient, and crashes occurred.
This patch fixes these issues by:
- Tagging the stub sections in <arch>_add_stub_section().
- Adding BFD_ASSERTs in code paths that previously segfaulted, but correctly assumed that the output section was non-NULL.
- Promoting discard warnings to errors and ensuring the link process terminates cleanly if any "unallocated section" errors occur.
- Adding AArch64 test cases for all non-contiguous memory scenarios.
- Updating PowerPC and AArch32 test expectations to match the corrected behavior.
Regards,
Matthieu
Matthieu Longo (5):
ld: fix segfault caused by untagged stub sections
explicitly state code assumptions on output section in AArch64 ld handlers
ld: fix segfault on discarded input sections not fitting in memory regions
aarch64: add tests for non-contiguous memory regions
ld: clarify comments on /DISCARD/ output section behavior
bfd/bfd-in2.h | 6 ++
bfd/elfnn-aarch64.c | 2 +
bfd/libbfd.h | 4 +-
bfd/section.c | 10 ++-
ld/emultempl/aarch64elf.em | 2 +
ld/emultempl/armelf.em | 5 +-
ld/emultempl/ppc64elf.em | 2 +
ld/ldlang.c | 59 ++++++++-----
.../aarch64-non-contiguous-mem.exp | 34 +++++++
.../non-contiguous-mem/non-contiguous-mem-1.s | 37 ++++++++
.../non-contiguous-mem/non-contiguous-mem-2.s | 17 ++++
.../non-contiguous-mem-3-ivt.s | 15 ++++
.../non-contiguous-mem/non-contiguous-mem-3.s | 74 ++++++++++++++++
.../non-contiguous-mem/non-contiguous-nok-1.d | 9 ++
.../non-contiguous-nok-1.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-nok-2.d | 8 ++
.../non-contiguous-nok-2.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-nok-3.d | 6 ++
.../non-contiguous-nok-3.err | 4 +
.../non-contiguous-nok-3.ld | 26 ++++++
.../non-contiguous-mem/non-contiguous-nok-4.d | 15 ++++
.../non-contiguous-nok-4.ld | 24 +++++
.../non-contiguous-mem/non-contiguous-nok-5.d | 10 +++
.../non-contiguous-nok-5.err | 7 ++
.../non-contiguous-nok-5.ld | 30 +++++++
.../non-contiguous-mem/non-contiguous-ok-1.d | 80 +++++++++++++++++
.../non-contiguous-mem/non-contiguous-ok-1.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-ok-2.d | 88 +++++++++++++++++++
.../non-contiguous-mem/non-contiguous-ok-2.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-ok-3.d | 80 +++++++++++++++++
.../non-contiguous-mem/non-contiguous-ok-3.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-ok-4.d | 83 +++++++++++++++++
.../non-contiguous-mem/non-contiguous-ok-4.ld | 28 ++++++
.../non-contiguous-mem/non-contiguous-ok-5.d | 87 ++++++++++++++++++
.../non-contiguous-mem/non-contiguous-ok-5.ld | 31 +++++++
.../non-contiguous-ok-5.warn | 10 +++
ld/testsuite/ld-arm/non-contiguous-arm4.d | 2 +-
ld/testsuite/ld-arm/non-contiguous-arm7.err | 9 +-
.../ld-powerpc/non-contiguous-powerpc64.d | 2 +-
39 files changed, 1012 insertions(+), 34 deletions(-)
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/aarch64-non-contiguous-mem.exp
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-mem-1.s
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-mem-2.s
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-mem-3-ivt.s
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-mem-3.s
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-1.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-1.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-2.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-2.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-3.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-3.err
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-3.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-4.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-4.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-5.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-5.err
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-nok-5.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-1.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-1.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-2.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-2.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-3.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-3.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-4.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-4.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-5.d
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-5.ld
create mode 100644 ld/testsuite/ld-aarch64/non-contiguous-mem/non-contiguous-ok-5.warn
--
2.51.0
More information about the Binutils
mailing list