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 initial syntax is intentionally narrow to
facilitate backward compatible extensions in the future. Symbol assignments
cannot be used.
OVERWRITE_SECTIONS does not specify a section 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.
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. The 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 and impose an order, so a wrong rule can be more
noticeable. This feature if misused can be less noticeable, just like `INSERT`.