[ELF] Add -z separate-loadable-segments to complement separate-code and noseparate...
authorFangrui Song <maskray@google.com>
Wed, 25 Sep 2019 03:39:31 +0000 (03:39 +0000)
committerFangrui Song <maskray@google.com>
Wed, 25 Sep 2019 03:39:31 +0000 (03:39 +0000)
commit0264950697e54505e5fd266b364c83e294fc86d9
treeeae7a5a0b26101ec420d8c85a3fae9dfbf9da9a8
parent5e359a9a0efdc0099638dee29523912a7675c7b8
[ELF] Add -z separate-loadable-segments to complement separate-code and noseparate-code

D64906 allows PT_LOAD to have overlapping p_offset ranges. In the
default R RX RW RW layout + -z noseparate-code case, we do not tail pad
segments when transiting to another segment. This can save at most
3*maxPageSize bytes.

a) Before D64906, we tail pad R, RX and the first RW.
b) With -z separate-code, we tail pad R and RX, but not the first RW (RELRO).

In some cases, b) saves one file page. In some cases, b) wastes one
virtual memory page. The waste is a concern on Fuchsia. Because it uses
compressed binaries, it doesn't benefit from the saved file page.

This patch adds -z separate-loadable-segments to restore the behavior before
D64906. It can affect section addresses and can thus be used as a
debugging mechanism (see PR43214 and ld.so partition bug in
crbug.com/998712).

Reviewed By: jakehehrlich, ruiu

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

llvm-svn: 372807
lld/ELF/Config.h
lld/ELF/Driver.cpp
lld/ELF/Writer.cpp
lld/docs/ld.lld.1
lld/test/ELF/fill-trap.s
lld/test/ELF/separate-segments.s [new file with mode: 0644]