From c78c999a9cd7a77b9d13c610c9faebac5d560a55 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 3 Jun 2019 05:25:03 +0000 Subject: [PATCH] [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 | 3 +-- lld/test/ELF/dynamic-linker.s | 16 +++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index bc3abf7..ec5be8c 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -138,8 +138,7 @@ StringRef elf::getOutputSectionName(const InputSectionBase *S) { } static bool needsInterpSection() { - return !SharedFiles.empty() && !Config->DynamicLinker.empty() && - Script->needsInterpSection(); + return !Config->DynamicLinker.empty() && Script->needsInterpSection(); } template void elf::writeResult() { Writer().run(); } diff --git a/lld/test/ELF/dynamic-linker.s b/lld/test/ELF/dynamic-linker.s index 3faf8e8..ac7ec6a 100644 --- a/lld/test/ELF/dynamic-linker.s +++ b/lld/test/ELF/dynamic-linker.s @@ -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 -- 2.7.4