[PATCH] D38647: ELF: Export preempted symbols even if there is a dynamic list.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 6 14:00:32 PDT 2017


pcc created this revision.
Herald added a subscriber: emaste.

Dynamic lists in an executable are additive, not restrictive, so we
must continue to export preempted symbols even with a dynamic list.

This fixes sanitizer interception of libc symbols (and should also fix
symbol preemption by users of sanitizers).


https://reviews.llvm.org/D38647

Files:
  lld/ELF/Driver.cpp
  lld/ELF/SymbolTable.cpp
  lld/test/ELF/gc-sections-shared.s


Index: lld/test/ELF/gc-sections-shared.s
===================================================================
--- lld/test/ELF/gc-sections-shared.s
+++ lld/test/ELF/gc-sections-shared.s
@@ -19,6 +19,15 @@
 # CHECK-NEXT:     Section: Undefined (0x0)
 # CHECK-NEXT:   }
 # CHECK-NEXT:   Symbol {
+# CHECK-NEXT:     Name: bar
+# CHECK-NEXT:     Value:
+# CHECK-NEXT:     Size:
+# CHECK-NEXT:     Binding: Global
+# CHECK-NEXT:     Type:
+# CHECK-NEXT:     Other:
+# CHECK-NEXT:     Section: .text
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Symbol {
 # CHECK-NEXT:     Name: bar2
 # CHECK-NEXT:     Value:
 # CHECK-NEXT:     Size:
Index: lld/ELF/SymbolTable.cpp
===================================================================
--- lld/ELF/SymbolTable.cpp
+++ lld/ELF/SymbolTable.cpp
@@ -699,7 +699,7 @@
 
     for (SymbolBody *B : Syms) {
       if (!Config->Shared)
-        B->symbol()->VersionId = VER_NDX_GLOBAL;
+        B->symbol()->ExportDynamic = true;
       else if (B->symbol()->includeInDynsym())
         B->IsPreemptible = true;
     }
Index: lld/ELF/Driver.cpp
===================================================================
--- lld/ELF/Driver.cpp
+++ lld/ELF/Driver.cpp
@@ -781,18 +781,8 @@
         readDynamicList(*Buffer);
 
     for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol))
-      Config->VersionScriptGlobals.push_back(
+      Config->DynamicList.push_back(
           {Arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/ false});
-
-    // Dynamic lists are a simplified linker script that doesn't need the
-    // "global:" and implicitly ends with a "local:*". Set the variables
-    // needed to simulate that.
-    if (Args.hasArg(OPT_dynamic_list) ||
-        Args.hasArg(OPT_export_dynamic_symbol)) {
-      Config->ExportDynamic = true;
-      if (!Config->Shared)
-        Config->DefaultSymbolVersion = VER_NDX_LOCAL;
-    }
   }
 
   if (auto *Arg = Args.getLastArg(OPT_version_script))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38647.118078.patch
Type: text/x-patch
Size: 1932 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171006/ba605a63/attachment.bin>


More information about the llvm-commits mailing list