HomePhabricator

[ELF] Simplify the condition to create .interp

Description

[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

Details

Committed
MaskRayJun 2 2019, 10:25 PM
Reviewer
ruiu
Differential Revision
D62765: [ELF] Simplify the condition to create .interp
Parents
rLLD362354: Add --sort-common to the man page.
Branches
Unknown
Tags
Unknown