HomePhabricator

[ELF] Simplify sh_addr computation and warn if sh_addr is not a multiple of…

Authored by MaskRay on Mar 3 2020, 3:37 PM.

Description

[ELF] Simplify sh_addr computation and warn if sh_addr is not a multiple of sh_addralign

See docs/ELF/linker_script.rst for the new computation for sh_addr and sh_addralign.
ALIGN(section_align) now means: "increase alignment to section_align"
(like yet another input section requirement).

The "start of section .foo changes from 0x11 to 0x20" warning no longer
makes sense. Change it to warn if sh_addr%sh_addralign!=0.

To decrease the alignment from the default max_input_align,
use .output ALIGN(8) : {} instead of .output : ALIGN(8) {}
See linkerscript/section-address-align.test as an example.

When both an output section address and ALIGN are set (can be seen as an
"undefined behavior" https://sourceware.org/ml/binutils/2020-03/msg00115.html),
lld may align more than GNU ld, but it makes a linker script working
with GNU ld hard to break with lld.

This patch can be considered as restoring part of the behavior before D74736.

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