[lld] r362355 - [ELF] Simplify the condition to create .interp
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 2 22:25:03 PDT 2019
Author: maskray
Date: Sun Jun 2 22:25:03 2019
New Revision: 362355
URL: http://llvm.org/viewvc/llvm-project?rev=362355&view=rev
Log:
[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
Modified:
lld/trunk/ELF/Writer.cpp
lld/trunk/test/ELF/dynamic-linker.s
Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=362355&r1=362354&r2=362355&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Sun Jun 2 22:25:03 2019
@@ -138,8 +138,7 @@ StringRef elf::getOutputSectionName(cons
}
static bool needsInterpSection() {
- return !SharedFiles.empty() && !Config->DynamicLinker.empty() &&
- Script->needsInterpSection();
+ return !Config->DynamicLinker.empty() && Script->needsInterpSection();
}
template <class ELFT> void elf::writeResult() { Writer<ELFT>().run(); }
Modified: lld/trunk/test/ELF/dynamic-linker.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/dynamic-linker.s?rev=362355&r1=362354&r2=362355&view=diff
==============================================================================
--- lld/trunk/test/ELF/dynamic-linker.s (original)
+++ lld/trunk/test/ELF/dynamic-linker.s Sun Jun 2 22:25:03 2019
@@ -1,21 +1,19 @@
# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/shared.s -o %t1.o
-# RUN: ld.lld -shared %t1.o -o %t.so
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-# RUN: ld.lld --dynamic-linker foo %t.o %t.so -o %t
-# RUN: llvm-readelf -program-headers %t | FileCheck %s
+# RUN: ld.lld --dynamic-linker foo %t.o -o %t
+# RUN: llvm-readelf --program-headers %t | FileCheck %s
-# RUN: ld.lld --dynamic-linker=foo %t.o %t.so -o %t
-# RUN: llvm-readelf -program-headers %t | FileCheck %s
+# RUN: ld.lld --dynamic-linker=foo %t.o -o %t
+# RUN: llvm-readelf --program-headers %t | FileCheck %s
# CHECK: [Requesting program interpreter: foo]
-# RUN: ld.lld %t.o %t.so -o %t
+# RUN: ld.lld %t.o -o %t
# RUN: llvm-readelf -program-headers %t | FileCheck --check-prefix=NO %s
-# RUN: ld.lld --dynamic-linker foo --no-dynamic-linker %t.o %t.so -o %t
-# RUN: llvm-readelf -program-headers %t | FileCheck --check-prefix=NO %s
+# RUN: ld.lld --dynamic-linker foo --no-dynamic-linker %t.o -o %t
+# RUN: llvm-readelf --program-headers %t | FileCheck --check-prefix=NO %s
# NO-NOT: PT_INTERP
More information about the llvm-commits
mailing list