[PATCH] D59275: [ELF] Do not emit weak-undef symbols in .dynsym under -pie --no-dynamic-linker.

Siva Chandra via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 14 10:26:43 PDT 2019


sivachandra updated this revision to Diff 190661.
sivachandra added a comment.

Use presense of shared files to know whether a PIE is being dynmically linked or not.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59275/new/

https://reviews.llvm.org/D59275

Files:
  lld/ELF/Symbols.cpp
  lld/test/ELF/Inputs/weak-undef.s
  lld/test/ELF/weak-undef-no-shared-libs.s
  lld/test/ELF/weak-undef.s


Index: lld/test/ELF/weak-undef.s
===================================================================
--- lld/test/ELF/weak-undef.s
+++ lld/test/ELF/weak-undef.s
@@ -1,6 +1,8 @@
 # REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/weak-undef.s -o %t1.o
+# RUN: ld.lld %t1.o -shared -o %t1.so
 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-# RUN: ld.lld %t.o -o %t -pie
+# RUN: ld.lld %t.o -o %t %t1.so -pie
 # RUN: llvm-readobj -dyn-symbols %t | FileCheck %s
 
 # CHECK:      DynamicSymbols [
Index: lld/test/ELF/weak-undef-no-shared-libs.s
===================================================================
--- /dev/null
+++ lld/test/ELF/weak-undef-no-shared-libs.s
@@ -0,0 +1,27 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+// RUN: ld.lld -pie --no-dynamic-linker %t.o -o %t
+// RUN: llvm-readobj -V -dyn-symbols %t | FileCheck %s
+
+        .globl _start
+_start:
+        .type foo, at function
+        .weak foo
+        .long foo at gotpcrel
+
+// Test that an entry for weak undefined symbols is NOT emitted in .dynsym. There
+// are other tests which ensure that the weak undefined symbols do get emitted in .dynsym
+// for non-static PIEs.
+
+
+// CHECK:      DynamicSymbols [
+// CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name:
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Local (0x0)
+// CHECK-NEXT:     Type: None (0x0)
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined (0x0)
+// CHECK-NEXT:   }
+// CHECK-NEXT: ]
Index: lld/test/ELF/Inputs/weak-undef.s
===================================================================
--- /dev/null
+++ lld/test/ELF/Inputs/weak-undef.s
@@ -0,0 +1,2 @@
+.globl bar
+bar:
Index: lld/ELF/Symbols.cpp
===================================================================
--- lld/ELF/Symbols.cpp
+++ lld/ELF/Symbols.cpp
@@ -267,6 +267,10 @@
     return false;
   if (computeBinding() == STB_LOCAL)
     return false;
+  // If a PIE binary was not linked against any shared libraries, then we can
+  // safely drop adding weak undef symbols to .dynsym.
+  if (isUndefWeak() && Config->Pie && SharedFiles.empty())
+    return false;
   if (!isDefined())
     return true;
   return ExportDynamic;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59275.190661.patch
Type: text/x-patch
Size: 2289 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190314/44cbd029/attachment.bin>


More information about the llvm-commits mailing list