[ELF] Allow sections after a non-SHF_ALLOC section to be covered by PT_LOAD
authorFangrui Song <i@maskray.me>
Wed, 5 Aug 2020 16:30:23 +0000 (09:30 -0700)
committerFangrui Song <i@maskray.me>
Wed, 5 Aug 2020 16:30:23 +0000 (09:30 -0700)
commit030ddc0a0bb9e2b25319eb681d520a9cee32b761
treedc394d8491b8ffa8cd85d78130ea6615e88d00ae
parent21b4f8060ab3b313009cf8995140edd5adbf7a4a
[ELF] Allow sections after a non-SHF_ALLOC section to be covered by PT_LOAD

GNU ld allows sections after a non-SHF_ALLOC section to be covered by PT_LOAD
(PR37607) and assigns addresses to non-SHF_ALLOC output sections (similar to
SHF_ALLOC NOBITS sections. The location counter is not advanced).

This patch tries to fix PR37607 (remove a special case in
`Writer<ELFT>::createPhdrs`). To make the created PT_LOAD meaningful, we cannot
reset dot to 0 for a middle non-SHF_ALLOC output section. This results in
removal of two special cases in LinkerScript::assignOffsets. Non-SHF_ALLOC
non-orphan sections can have non-zero addresses like in GNU ld.

The zero address rule for non-SHF_ALLOC sections is weakened to apply to orphan
only. This results in a special case in createSection and findOrphanPos, respectively.

Reviewed By: jhenderson

Differential Revision: https://reviews.llvm.org/D85100
lld/ELF/LinkerScript.cpp
lld/ELF/Writer.cpp
lld/test/ELF/linkerscript/compress-debug-sections-custom.s
lld/test/ELF/linkerscript/sections.s
lld/test/ELF/linkerscript/symbols-non-alloc.test