[ELF] Simplify the condition to create .interp
authorFangrui Song <maskray@google.com>
Mon, 3 Jun 2019 05:25:03 +0000 (05:25 +0000)
committerFangrui Song <maskray@google.com>
Mon, 3 Jun 2019 05:25:03 +0000 (05:25 +0000)
commitc78c999a9cd7a77b9d13c610c9faebac5d560a55
tree97deaf0dd8ac30aafcd74e9ce21236577852e86f
parent471f11805f741b0b22328e0fd111be4329f245a3
[ELF] Simplify the condition to create .interp

(1) {gcc,clang} -fuse-ld=bfd -pie -fPIE -nostdlib a.c => .interp created
(2) {gcc,clang} -fuse-ld=lld -pie -fPIE -nostdlib a.c => .interp not created
(3) {gcc,clang} -fuse-ld=lld -pie -fPIE -nostdlib a.c a.so => .interp created

The inconsistency of (2) is due to the condition `!Config->SharedFiles.empty()`.
To make lld behave more like ld.bfd, we could change the condition to:

    Config->HasDynSymTab && !Config->DynamicLinker.empty() && Script->needsInterpSection();

However, that would bring another inconsistency as can be observed with:

(4) {gcc,clang} -fuse-ld=bfd -no-pie -nostdlib a.c => .interp not created

So instead, use `!Config->DynamicLinker.empty() && Script->needsInterpSection()`,
which is both simple and consistent in these cases.

The inconsistency of (4) likely originated from ld.bfd and gold's choice to have a default --dynamic-linker.
Their condition to create .interp is ANDed with (not -shared).
Since lld doesn't have a default --dynamic-linker,
compiler drivers (gcc/clang) don't pass --dynamic-linker for -shared,
and direct ld users are not supposed to specify --dynamic-linker for -shared,
we do not need the condition !Config->Shared.

Reviewed By: ruiu

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

llvm-svn: 362355
lld/ELF/Writer.cpp
lld/test/ELF/dynamic-linker.s