Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 97e39f9

Browse files
committed
[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
1 parent d8e9c5d commit 97e39f9

6 files changed

Lines changed: 50 additions & 7 deletions

File tree

lld/ELF/Config.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ enum ELFKind : uint8_t {
5353
};
5454

5555
// For -Bno-symbolic, -Bsymbolic-non-weak-functions, -Bsymbolic-functions,
56-
// -Bsymbolic.
57-
enum class BsymbolicKind { None, NonWeakFunctions, Functions, All };
56+
// -Bsymbolic-non-weak, -Bsymbolic.
57+
enum class BsymbolicKind { None, NonWeakFunctions, Functions, NonWeak, All };
5858

5959
// For --build-id.
6060
enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid };

lld/ELF/Driver.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,13 +1155,15 @@ static void readConfigs(opt::InputArgList &args) {
11551155
config->androidMemtagMode = getMemtagMode(args);
11561156
config->auxiliaryList = args::getStrings(args, OPT_auxiliary);
11571157
config->armBe8 = args.hasArg(OPT_be8);
1158-
if (opt::Arg *arg =
1159-
args.getLastArg(OPT_Bno_symbolic, OPT_Bsymbolic_non_weak_functions,
1160-
OPT_Bsymbolic_functions, OPT_Bsymbolic)) {
1158+
if (opt::Arg *arg = args.getLastArg(
1159+
OPT_Bno_symbolic, OPT_Bsymbolic_non_weak_functions,
1160+
OPT_Bsymbolic_functions, OPT_Bsymbolic_non_weak, OPT_Bsymbolic)) {
11611161
if (arg->getOption().matches(OPT_Bsymbolic_non_weak_functions))
11621162
config->bsymbolic = BsymbolicKind::NonWeakFunctions;
11631163
else if (arg->getOption().matches(OPT_Bsymbolic_functions))
11641164
config->bsymbolic = BsymbolicKind::Functions;
1165+
else if (arg->getOption().matches(OPT_Bsymbolic_non_weak))
1166+
config->bsymbolic = BsymbolicKind::NonWeak;
11651167
else if (arg->getOption().matches(OPT_Bsymbolic))
11661168
config->bsymbolic = BsymbolicKind::All;
11671169
}

lld/ELF/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def Bno_symbolic: F<"Bno-symbolic">, HelpText<"Don't bind default visibility def
4242

4343
def Bsymbolic: F<"Bsymbolic">, HelpText<"Bind default visibility defined symbols locally for -shared">;
4444

45+
def Bsymbolic_non_weak: F<"Bsymbolic-non-weak">,
46+
HelpText<"Bind default visibility defined STB_GLOBAL symbols locally for -shared">;
47+
4548
def Bsymbolic_functions: F<"Bsymbolic-functions">,
4649
HelpText<"Bind default visibility defined function symbols locally for -shared">;
4750

lld/ELF/Symbols.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ bool elf::computeIsPreemptible(const Symbol &sym) {
365365
// in the dynamic list. -Bsymbolic-non-weak-functions is a non-weak subset of
366366
// -Bsymbolic-functions.
367367
if (config->symbolic ||
368+
(config->bsymbolic == BsymbolicKind::NonWeak &&
369+
sym.binding != STB_WEAK) ||
368370
(config->bsymbolic == BsymbolicKind::Functions && sym.isFunc()) ||
369371
(config->bsymbolic == BsymbolicKind::NonWeakFunctions && sym.isFunc() &&
370372
sym.binding != STB_WEAK))

lld/docs/ld.lld.1

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ Bind default visibility defined symbols locally for
8282
Also set the
8383
.Dv DF_SYMBOLIC
8484
flag.
85+
.It Fl Bsymbolic-non-weak
86+
Bind default visibility defined STB_GLOBAL symbols locally for
87+
.Fl shared.
8588
.It Fl Bsymbolic-functions
8689
Bind default visibility defined function symbols locally for
8790
.Fl shared.

lld/test/ELF/bsymbolic.s

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
# RUN: llvm-readobj -r %t0.so | FileCheck %s --check-prefix=REL_DEF
77
# RUN: llvm-objdump -d %t0.so | FileCheck %s --check-prefix=ASM_DEF
88

9-
## -Bsymbolic-functions makes all STB_GLOBAL STT_FUNC definitions non-preemptible.
9+
## -Bsymbolic-non-weak-functions makes all STB_GLOBAL STT_FUNC definitions non-preemptible.
1010
# RUN: ld.lld -shared -Bsymbolic-non-weak-functions %t/a.o %t/b.o -o %t1.so
1111
# RUN: llvm-readobj -r %t1.so | FileCheck %s --check-prefix=REL_GFUN
1212
# RUN: llvm-objdump -d %t1.so | FileCheck %s --check-prefix=ASM_GFUN
@@ -21,6 +21,11 @@
2121
# RUN: llvm-readobj -r %t3.so | FileCheck %s --check-prefix=REL_ALL
2222
# RUN: llvm-objdump -d %t3.so | FileCheck %s --check-prefix=ASM_ALL
2323

24+
## -Bsymbolic-non-weak makes all STB_GLOBAL definitions non-preemptible.
25+
# RUN: ld.lld -shared -Bsymbolic-non-weak %t/a.o %t/b.o -o %t4.so
26+
# RUN: llvm-readobj -r %t4.so | FileCheck %s --check-prefix=REL_GALL
27+
# RUN: llvm-objdump -d %t4.so | FileCheck %s --check-prefix=ASM_GALL
28+
2429
# RUN: ld.lld -shared -Bsymbolic-functions -Bsymbolic %t/a.o %t/b.o -o %t.so
2530
# RUN: cmp %t.so %t3.so
2631
# RUN: ld.lld -shared -Bsymbolic -Bsymbolic-functions %t/a.o %t/b.o -o %t.so
@@ -37,6 +42,7 @@
3742
# REL_DEF: .rela.dyn {
3843
# REL_DEF-NEXT: R_X86_64_RELATIVE -
3944
# REL_DEF-NEXT: R_X86_64_RELATIVE -
45+
# REL_DEF-NEXT: R_X86_64_64 data_weak_default
4046
# REL_DEF-NEXT: R_X86_64_64 data_default
4147
# REL_DEF-NEXT: }
4248
# REL_DEF-NEXT: .rela.plt {
@@ -59,6 +65,7 @@
5965
# REL_GFUN: .rela.dyn {
6066
# REL_GFUN-NEXT: R_X86_64_RELATIVE -
6167
# REL_GFUN-NEXT: R_X86_64_RELATIVE -
68+
# REL_GFUN-NEXT: R_X86_64_64 data_weak_default
6269
# REL_GFUN-NEXT: R_X86_64_64 data_default
6370
# REL_GFUN-NEXT: }
6471
# REL_GFUN-NEXT: .rela.plt {
@@ -79,6 +86,7 @@
7986
# REL_FUN: .rela.dyn {
8087
# REL_FUN-NEXT: R_X86_64_RELATIVE -
8188
# REL_FUN-NEXT: R_X86_64_RELATIVE -
89+
# REL_FUN-NEXT: R_X86_64_64 data_weak_default
8290
# REL_FUN-NEXT: R_X86_64_64 data_default
8391
# REL_FUN-NEXT: }
8492
# REL_FUN-NEXT: .rela.plt {
@@ -99,6 +107,7 @@
99107
# REL_ALL-NEXT: R_X86_64_RELATIVE -
100108
# REL_ALL-NEXT: R_X86_64_RELATIVE -
101109
# REL_ALL-NEXT: R_X86_64_RELATIVE -
110+
# REL_ALL-NEXT: R_X86_64_RELATIVE -
102111
# REL_ALL-NEXT: }
103112
# REL_ALL-NEXT: .rela.plt {
104113
# REL_ALL-NEXT: R_X86_64_JUMP_SLOT undef
@@ -113,6 +122,26 @@
113122
# ASM_ALL-NEXT: callq {{.*}} <notype_default>
114123
# ASM_ALL-NEXT: callq {{.*}} <undef@plt>
115124

125+
# REL_GALL: .rela.dyn {
126+
# REL_GALL-NEXT: R_X86_64_RELATIVE -
127+
# REL_GALL-NEXT: R_X86_64_RELATIVE -
128+
# REL_GALL-NEXT: R_X86_64_RELATIVE -
129+
# REL_GALL-NEXT: R_X86_64_64 data_weak_default
130+
# REL_GALL-NEXT: }
131+
# REL_GALL-NEXT: .rela.plt {
132+
# REL_GALL-NEXT: R_X86_64_JUMP_SLOT weak_default
133+
# REL_GALL-NEXT: R_X86_64_JUMP_SLOT undef
134+
# REL_GALL-NEXT: }
135+
136+
# ASM_GALL: <_start>:
137+
# ASM_GALL-NEXT: callq {{.*}} <default>
138+
# ASM_GALL-NEXT: callq {{.*}} <protected>
139+
# ASM_GALL-NEXT: callq {{.*}} <hidden>
140+
# ASM_GALL-NEXT: callq {{.*}} <weak_default@plt>
141+
# ASM_GALL-NEXT: callq {{.*}} <ext_default>
142+
# ASM_GALL-NEXT: callq {{.*}} <notype_default>
143+
# ASM_GALL-NEXT: callq {{.*}} <undef@plt>
144+
116145
#--- a.s
117146
.globl default, protected, hidden, notype_default
118147
.weak weak_default
@@ -144,16 +173,20 @@ _start:
144173

145174
.data
146175
.quad data_default
176+
.quad data_weak_default
147177
.quad data_protected
148178
.quad data_hidden
149179

150-
.globl data_default, data_protected, data_hidden
180+
.globl data_default, data_weak_default, data_protected, data_hidden
181+
.weak data_weak_default
151182
.protected data_protected
152183
.hidden data_hidden
153184
.type data_default, @object
185+
.type data_weak_default, @object
154186
.type data_protected, @object
155187
.type data_hidden, @object
156188
data_default: .byte 0
189+
data_weak_default: .byte 0
157190
data_protected: .byte 0
158191
data_hidden: .byte 0
159192

0 commit comments

Comments
 (0)