[PATCH] D62765: [ELF] Simplify the condition to create .interp

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 31 19:20:30 PDT 2019


MaskRay created this revision.
MaskRay added a reviewer: ruiu.
Herald added subscribers: llvm-commits, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.

(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 have some inconsistency:

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

In contrast, `!Config->DynamicLinker.empty() && Script->needsInterpSection()`
is both simple and consistent.

In ld.bfd and gold, the condition to create .interp is ANDed with (not
-shared).  That is because they have default --dynamic-linker.  Since
lld doesn't have default --dynamic-linker, and compiler drivers
(gcc/clang) don't pass --dynamic-linker with -shared, we do not need the
condition Config->Shared. In addition, Direct ld users should not
specify --dynamic-linker for a -shared link.


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D62765

Files:
  ELF/Writer.cpp
  test/ELF/dynamic-linker.s


Index: test/ELF/dynamic-linker.s
===================================================================
--- test/ELF/dynamic-linker.s
+++ 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
 
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -138,8 +138,7 @@
 }
 
 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(); }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62765.202524.patch
Type: text/x-patch
Size: 1760 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190601/7fd2d4a3/attachment.bin>


More information about the llvm-commits mailing list