[lld] 97e39f9 - [ELF] Add -Bsymbolic-non-weak

Shoaib Meenai via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 21 09:12:36 PDT 2023


Author: Shoaib Meenai
Date: 2023-08-21T09:11:51-07:00
New Revision: 97e39f96c83f73d44c9b34d93d1249b5936a3be5

URL: https://github.com/llvm/llvm-project/commit/97e39f96c83f73d44c9b34d93d1249b5936a3be5
DIFF: https://github.com/llvm/llvm-project/commit/97e39f96c83f73d44c9b34d93d1249b5936a3be5.diff

LOG: [ELF] Add -Bsymbolic-non-weak

This adds a new -Bsymbolic option that directly binds all non-weak
symbols. There's a couple of reasons motivating this:
* The new flag will match the default behavior on Mach-O, so you can get
  consistent behavior across platforms.
* We have use cases for which making weak data preemptible is useful,
  but we don't want to pessimize access to non-weak data. (For a large
  internal app, we measured 2000+ data symbols whose accesses would be
  unnecessarily pessimized by `-Bsymbolic-functions`.)

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D158322

Added: 
    

Modified: 
    lld/ELF/Config.h
    lld/ELF/Driver.cpp
    lld/ELF/Options.td
    lld/ELF/Symbols.cpp
    lld/docs/ld.lld.1
    lld/test/ELF/bsymbolic.s

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index 6395befad53b87..679a39805ab431 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -53,8 +53,8 @@ enum ELFKind : uint8_t {
 };
 
 // For -Bno-symbolic, -Bsymbolic-non-weak-functions, -Bsymbolic-functions,
-// -Bsymbolic.
-enum class BsymbolicKind { None, NonWeakFunctions, Functions, All };
+// -Bsymbolic-non-weak, -Bsymbolic.
+enum class BsymbolicKind { None, NonWeakFunctions, Functions, NonWeak, All };
 
 // For --build-id.
 enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid };

diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index ce35f993971cd5..0975a6540099f7 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1155,13 +1155,15 @@ static void readConfigs(opt::InputArgList &args) {
   config->androidMemtagMode = getMemtagMode(args);
   config->auxiliaryList = args::getStrings(args, OPT_auxiliary);
   config->armBe8 = args.hasArg(OPT_be8);
-  if (opt::Arg *arg =
-          args.getLastArg(OPT_Bno_symbolic, OPT_Bsymbolic_non_weak_functions,
-                          OPT_Bsymbolic_functions, OPT_Bsymbolic)) {
+  if (opt::Arg *arg = args.getLastArg(
+          OPT_Bno_symbolic, OPT_Bsymbolic_non_weak_functions,
+          OPT_Bsymbolic_functions, OPT_Bsymbolic_non_weak, OPT_Bsymbolic)) {
     if (arg->getOption().matches(OPT_Bsymbolic_non_weak_functions))
       config->bsymbolic = BsymbolicKind::NonWeakFunctions;
     else if (arg->getOption().matches(OPT_Bsymbolic_functions))
       config->bsymbolic = BsymbolicKind::Functions;
+    else if (arg->getOption().matches(OPT_Bsymbolic_non_weak))
+      config->bsymbolic = BsymbolicKind::NonWeak;
     else if (arg->getOption().matches(OPT_Bsymbolic))
       config->bsymbolic = BsymbolicKind::All;
   }

diff  --git a/lld/ELF/Options.td b/lld/ELF/Options.td
index e91e08989853c7..7c7664924d8289 100644
--- a/lld/ELF/Options.td
+++ b/lld/ELF/Options.td
@@ -42,6 +42,9 @@ def Bno_symbolic: F<"Bno-symbolic">, HelpText<"Don't bind default visibility def
 
 def Bsymbolic: F<"Bsymbolic">, HelpText<"Bind default visibility defined symbols locally for -shared">;
 
+def Bsymbolic_non_weak: F<"Bsymbolic-non-weak">,
+  HelpText<"Bind default visibility defined STB_GLOBAL symbols locally for -shared">;
+
 def Bsymbolic_functions: F<"Bsymbolic-functions">,
   HelpText<"Bind default visibility defined function symbols locally for -shared">;
 

diff  --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 840385aabea35c..07061d3a1223e9 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -365,6 +365,8 @@ bool elf::computeIsPreemptible(const Symbol &sym) {
   // in the dynamic list. -Bsymbolic-non-weak-functions is a non-weak subset of
   // -Bsymbolic-functions.
   if (config->symbolic ||
+      (config->bsymbolic == BsymbolicKind::NonWeak &&
+       sym.binding != STB_WEAK) ||
       (config->bsymbolic == BsymbolicKind::Functions && sym.isFunc()) ||
       (config->bsymbolic == BsymbolicKind::NonWeakFunctions && sym.isFunc() &&
        sym.binding != STB_WEAK))

diff  --git a/lld/docs/ld.lld.1 b/lld/docs/ld.lld.1
index 97ba66abd3eba8..5c49765fb65b44 100644
--- a/lld/docs/ld.lld.1
+++ b/lld/docs/ld.lld.1
@@ -82,6 +82,9 @@ Bind default visibility defined symbols locally for
 Also set the
 .Dv DF_SYMBOLIC
 flag.
+.It Fl Bsymbolic-non-weak
+Bind default visibility defined STB_GLOBAL symbols locally for
+.Fl shared.
 .It Fl Bsymbolic-functions
 Bind default visibility defined function symbols locally for
 .Fl shared.

diff  --git a/lld/test/ELF/bsymbolic.s b/lld/test/ELF/bsymbolic.s
index 6a69a4ad1a2f4d..5e434a14953e31 100644
--- a/lld/test/ELF/bsymbolic.s
+++ b/lld/test/ELF/bsymbolic.s
@@ -6,7 +6,7 @@
 # RUN: llvm-readobj -r %t0.so | FileCheck %s --check-prefix=REL_DEF
 # RUN: llvm-objdump -d %t0.so | FileCheck %s --check-prefix=ASM_DEF
 
-## -Bsymbolic-functions makes all STB_GLOBAL STT_FUNC definitions non-preemptible.
+## -Bsymbolic-non-weak-functions makes all STB_GLOBAL STT_FUNC definitions non-preemptible.
 # RUN: ld.lld -shared -Bsymbolic-non-weak-functions %t/a.o %t/b.o -o %t1.so
 # RUN: llvm-readobj -r %t1.so | FileCheck %s --check-prefix=REL_GFUN
 # RUN: llvm-objdump -d %t1.so | FileCheck %s --check-prefix=ASM_GFUN
@@ -21,6 +21,11 @@
 # RUN: llvm-readobj -r %t3.so | FileCheck %s --check-prefix=REL_ALL
 # RUN: llvm-objdump -d %t3.so | FileCheck %s --check-prefix=ASM_ALL
 
+## -Bsymbolic-non-weak makes all STB_GLOBAL definitions non-preemptible.
+# RUN: ld.lld -shared -Bsymbolic-non-weak %t/a.o %t/b.o -o %t4.so
+# RUN: llvm-readobj -r %t4.so | FileCheck %s --check-prefix=REL_GALL
+# RUN: llvm-objdump -d %t4.so | FileCheck %s --check-prefix=ASM_GALL
+
 # RUN: ld.lld -shared -Bsymbolic-functions -Bsymbolic %t/a.o %t/b.o -o %t.so
 # RUN: cmp %t.so %t3.so
 # RUN: ld.lld -shared -Bsymbolic -Bsymbolic-functions %t/a.o %t/b.o -o %t.so
@@ -37,6 +42,7 @@
 # REL_DEF:      .rela.dyn {
 # REL_DEF-NEXT:   R_X86_64_RELATIVE -
 # REL_DEF-NEXT:   R_X86_64_RELATIVE -
+# REL_DEF-NEXT:   R_X86_64_64 data_weak_default
 # REL_DEF-NEXT:   R_X86_64_64 data_default
 # REL_DEF-NEXT: }
 # REL_DEF-NEXT: .rela.plt {
@@ -59,6 +65,7 @@
 # REL_GFUN:      .rela.dyn {
 # REL_GFUN-NEXT:   R_X86_64_RELATIVE -
 # REL_GFUN-NEXT:   R_X86_64_RELATIVE -
+# REL_GFUN-NEXT:   R_X86_64_64 data_weak_default
 # REL_GFUN-NEXT:   R_X86_64_64 data_default
 # REL_GFUN-NEXT: }
 # REL_GFUN-NEXT: .rela.plt {
@@ -79,6 +86,7 @@
 # REL_FUN:      .rela.dyn {
 # REL_FUN-NEXT:   R_X86_64_RELATIVE -
 # REL_FUN-NEXT:   R_X86_64_RELATIVE -
+# REL_FUN-NEXT:   R_X86_64_64 data_weak_default
 # REL_FUN-NEXT:   R_X86_64_64 data_default
 # REL_FUN-NEXT: }
 # REL_FUN-NEXT: .rela.plt {
@@ -99,6 +107,7 @@
 # REL_ALL-NEXT:   R_X86_64_RELATIVE -
 # REL_ALL-NEXT:   R_X86_64_RELATIVE -
 # REL_ALL-NEXT:   R_X86_64_RELATIVE -
+# REL_ALL-NEXT:   R_X86_64_RELATIVE -
 # REL_ALL-NEXT: }
 # REL_ALL-NEXT: .rela.plt {
 # REL_ALL-NEXT:   R_X86_64_JUMP_SLOT undef
@@ -113,6 +122,26 @@
 # ASM_ALL-NEXT:   callq {{.*}} <notype_default>
 # ASM_ALL-NEXT:   callq {{.*}} <undef at plt>
 
+# REL_GALL:      .rela.dyn {
+# REL_GALL-NEXT:   R_X86_64_RELATIVE -
+# REL_GALL-NEXT:   R_X86_64_RELATIVE -
+# REL_GALL-NEXT:   R_X86_64_RELATIVE -
+# REL_GALL-NEXT:   R_X86_64_64 data_weak_default
+# REL_GALL-NEXT: }
+# REL_GALL-NEXT: .rela.plt {
+# REL_GALL-NEXT:   R_X86_64_JUMP_SLOT weak_default
+# REL_GALL-NEXT:   R_X86_64_JUMP_SLOT undef
+# REL_GALL-NEXT: }
+
+# ASM_GALL:      <_start>:
+# ASM_GALL-NEXT:   callq {{.*}} <default>
+# ASM_GALL-NEXT:   callq {{.*}} <protected>
+# ASM_GALL-NEXT:   callq {{.*}} <hidden>
+# ASM_GALL-NEXT:   callq {{.*}} <weak_default at plt>
+# ASM_GALL-NEXT:   callq {{.*}} <ext_default>
+# ASM_GALL-NEXT:   callq {{.*}} <notype_default>
+# ASM_GALL-NEXT:   callq {{.*}} <undef at plt>
+
 #--- a.s
 .globl default, protected, hidden, notype_default
 .weak weak_default
@@ -144,16 +173,20 @@ _start:
 
 .data
   .quad data_default
+  .quad data_weak_default
   .quad data_protected
   .quad data_hidden
 
-.globl data_default, data_protected, data_hidden
+.globl data_default, data_weak_default, data_protected, data_hidden
+.weak data_weak_default
 .protected data_protected
 .hidden data_hidden
 .type data_default, @object
+.type data_weak_default, @object
 .type data_protected, @object
 .type data_hidden, @object
 data_default: .byte 0
+data_weak_default: .byte 0
 data_protected: .byte 0
 data_hidden: .byte 0
 


        


More information about the llvm-commits mailing list