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 tooutput sections do not have specify an order.
facilitate backward compatible extensions in the future.Similar to `INSERT [BEFORE|AFTER]`, Symbol assignments`LinkerScript::hasSectionsCommand` is not
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.
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. TheSuch 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 from the
section order. This feature if misused can be less noticeable, so a wrong rule can be morejust like
noticeable. This feature if misused can be less noticeable, just like `INSERT`.