[all-commits] [llvm/llvm-project] 7a2000: [LLD][ARM] Handle .ARM.exidx sections at non-zero ...

Peter Smith via All-commits all-commits at lists.llvm.org
Fri Apr 14 02:12:38 PDT 2023

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 7a2000ac5301dbdef8c3495fbeb49cab4ac439cb
  Author: Peter Smith <peter.smith at arm.com>
  Date:   2023-04-14 (Fri, 14 Apr 2023)

  Changed paths:
    M lld/ELF/SyntheticSections.cpp
    M lld/ELF/Writer.cpp
    M lld/docs/ReleaseNotes.rst
    A lld/test/ELF/arm-exidx-nonzero-offset.s

  Log Message:
  [LLD][ARM] Handle .ARM.exidx sections at non-zero output sec offset

Embedded systems that do not use an ELF loader locate the
.ARM.exidx exception table via linker defined __exidx_start and
__exidx_end rather than use the PT_ARM_EXIDX program header. This
means that some linker scripts such as the picolibc C library's
linker script, do not have the .ARM.exidx sections at offset 0 in
the OutputSection. For example:

.except_unordered : {
    . = ALIGN(8);
    PROVIDE(__exidx_start = .);
    PROVIDE(__exidx_end = .);
} >flash AT>flash :text

This is within the specification of Arm exception tables, and is
handled correctly by ld.bfd.

This patch has 2 parts. The first updates the writing of the data
of the .ARM.exidx SyntheticSection to account for a non-zero
OutputSection offset. The second part makes the PT_ARM_EXIDX program
header generation a special case so that it covers only the
SyntheticSection and not the parent OutputSection. While not strictly
necessary for programs locating the exception tables via the symbols
it may cause ELF utilities that locate the exception tables via
the PT_ARM_EXIDX program header to fail. This does not seem to be the
case for GNU and LLVM readelf which seems to look for the
SHT_ARM_EXIDX section.

Differential Revision: https://reviews.llvm.org/D148033

More information about the All-commits mailing list