[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