[all-commits] [llvm/llvm-project] 899fdf: [ELF] Add OVERWRITE_SECTIONS command

Fangrui Song via All-commits all-commits at lists.llvm.org
Sun Jun 13 12:41:25 PDT 2021


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 899fdf548eee427fe08e462955e6f817ca949730
      https://github.com/llvm/llvm-project/commit/899fdf548eee427fe08e462955e6f817ca949730
  Author: Fangrui Song <i at maskray.me>
  Date:   2021-06-13 (Sun, 13 Jun 2021)

  Changed paths:
    M lld/ELF/LinkerScript.cpp
    M lld/ELF/LinkerScript.h
    M lld/ELF/ScriptParser.cpp
    M lld/docs/ELF/linker_script.rst
    M lld/docs/ReleaseNotes.rst
    M lld/test/ELF/linkerscript/insert-duplicate.test
    A lld/test/ELF/linkerscript/overwrite-sections-discard.test
    A lld/test/ELF/linkerscript/overwrite-sections.test

  Log Message:
  -----------
  [ELF] Add OVERWRITE_SECTIONS command

This implements https://sourceware.org/bugzilla/show_bug.cgi?id=26404

An `OVERWRITE_SECTIONS` command is a `SECTIONS` variant which contains several
output section descriptions. The output sections do not have specify an order.
Similar to `INSERT [BEFORE|AFTER]`, `LinkerScript::hasSectionsCommand` is not
set, so the built-in rules (see `docs/ELF/linker_script.rst`) still apply.
`OVERWRITE_SECTIONS` can be more convenient than `INSERT` because it does not
need an anchor section.

The initial syntax is intentionally narrow to facilitate backward compatible
extensions in the future. Symbol assignments cannot be used.

This feature is versatile. To list a few usage:

* Use `section : { KEEP(...) }` to retain input sections under GC
* Define encapsulation symbols (start/end) for an output section
* Use `section : ALIGN(...) : { ... }` to overalign an output section (similar to ld64 `-sectalign`)

When an output section is specified by both `OVERWRITE_SECTIONS` and
`INSERT`, `INSERT` is processed after overwrite sections. To make this work,
this patch changes `InsertCommand` to use name based matching instead of pointer
based matching. (This may cause a difference when `INSERT` moves one output
section more than once. Such duplicate commands should not be used in practice
(seems that in GNU ld the output sections may just disappear).)

A linker script can be used without -T/--script. The traditional `SECTIONS`
commands are concatenated, so a wrong rule can be more noticeable from the
section order. This feature if misused can be less noticeable, just like
`INSERT`.

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




More information about the All-commits mailing list