Skip to content

Commit 51ced5c

Browse files
sbc100yamt
andcommitted
[lld][WebAssembly] Allow linker-synthetic symbols to be undefine when building shared libraries
Fixes: #103592 Co-authored-by: YAMAMOTO Takashi <[email protected]>
1 parent 928e7fb commit 51ced5c

File tree

2 files changed

+94
-7
lines changed

2 files changed

+94
-7
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
## Check that synthetic data-layout symbols such as __heap_base and __heap_end
2+
## can be referenced from shared libraries and pie executables without
3+
## generating undefined symbols.
4+
5+
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
6+
# RUN: wasm-ld --experimental-pic -pie --import-memory -o %t.wasm %t.o
7+
# RUN: obj2yaml %t.wasm | FileCheck %s
8+
# RUN: wasm-ld --experimental-pic -shared -o %t.so %t.o
9+
# RUN: obj2yaml %t.so | FileCheck %s
10+
11+
.globl _start
12+
13+
_start:
14+
.functype _start () -> ()
15+
i32.const __heap_base@GOT
16+
drop
17+
i32.const __heap_end@GOT
18+
drop
19+
i32.const __stack_low@GOT
20+
drop
21+
i32.const __stack_high@GOT
22+
drop
23+
i32.const __global_base@GOT
24+
drop
25+
i32.const __data_end@GOT
26+
drop
27+
end_function
28+
29+
# CHECK: - Type: IMPORT
30+
# CHECK-NEXT: Imports:
31+
# CHECK-NEXT: - Module: env
32+
# CHECK-NEXT: Field: memory
33+
# CHECK-NEXT: Kind: MEMORY
34+
# CHECK-NEXT: Memory:
35+
# CHECK-NEXT: Minimum: 0x0
36+
# CHECK-NEXT: - Module: env
37+
# CHECK-NEXT: Field: __memory_base
38+
# CHECK-NEXT: Kind: GLOBAL
39+
# CHECK-NEXT: GlobalType: I32
40+
# CHECK-NEXT: GlobalMutable: false
41+
# CHECK-NEXT: - Module: env
42+
# CHECK-NEXT: Field: __table_base
43+
# CHECK-NEXT: Kind: GLOBAL
44+
# CHECK-NEXT: GlobalType: I32
45+
# CHECK-NEXT: GlobalMutable: false
46+
# CHECK-NEXT: - Module: GOT.mem
47+
# CHECK-NEXT: Field: __heap_base
48+
# CHECK-NEXT: Kind: GLOBAL
49+
# CHECK-NEXT: GlobalType: I32
50+
# CHECK-NEXT: GlobalMutable: true
51+
# CHECK-NEXT: - Module: GOT.mem
52+
# CHECK-NEXT: Field: __heap_end
53+
# CHECK-NEXT: Kind: GLOBAL
54+
# CHECK-NEXT: GlobalType: I32
55+
# CHECK-NEXT: GlobalMutable: true
56+
# CHECK-NEXT: - Module: GOT.mem
57+
# CHECK-NEXT: Field: __stack_low
58+
# CHECK-NEXT: Kind: GLOBAL
59+
# CHECK-NEXT: GlobalType: I32
60+
# CHECK-NEXT: GlobalMutable: true
61+
# CHECK-NEXT: - Module: GOT.mem
62+
# CHECK-NEXT: Field: __stack_high
63+
# CHECK-NEXT: Kind: GLOBAL
64+
# CHECK-NEXT: GlobalType: I32
65+
# CHECK-NEXT: GlobalMutable: true
66+
# CHECK-NEXT: - Module: GOT.mem
67+
# CHECK-NEXT: Field: __global_base
68+
# CHECK-NEXT: Kind: GLOBAL
69+
# CHECK-NEXT: GlobalType: I32
70+
# CHECK-NEXT: GlobalMutable: true
71+
# CHECK-NEXT: - Module: GOT.mem
72+
# CHECK-NEXT: Field: __data_end
73+
# CHECK-NEXT: Kind: GLOBAL
74+
# CHECK-NEXT: GlobalType: I32
75+
# CHECK-NEXT: GlobalMutable: true

lld/wasm/Driver.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -985,15 +985,27 @@ static void createOptionalSymbols() {
985985

986986
ctx.sym.dsoHandle = symtab->addOptionalDataSymbol("__dso_handle");
987987

988-
if (!ctx.arg.shared)
989-
ctx.sym.dataEnd = symtab->addOptionalDataSymbol("__data_end");
988+
auto addDataLayoutSymbol = [&](StringRef s) -> DefinedData * {
989+
// Data layout symbols are either defined by lld, or (in the case
990+
// of PIC code) defined by the dynamic linker / embedder.
991+
if (ctx.isPic) {
992+
ctx.arg.allowUndefinedSymbols.insert(s);
993+
return nullptr;
994+
} else {
995+
return symtab->addOptionalDataSymbol(s);
996+
}
997+
};
998+
999+
ctx.sym.dataEnd = addDataLayoutSymbol("__data_end");
1000+
ctx.sym.stackLow = addDataLayoutSymbol("__stack_low");
1001+
ctx.sym.stackHigh = addDataLayoutSymbol("__stack_high");
1002+
ctx.sym.globalBase = addDataLayoutSymbol("__global_base");
1003+
ctx.sym.heapBase = addDataLayoutSymbol("__heap_base");
1004+
ctx.sym.heapEnd = addDataLayoutSymbol("__heap_end");
9901005

1006+
// for pic, __memory_base and __table_base are handled in
1007+
// createSyntheticSymbols.
9911008
if (!ctx.isPic) {
992-
ctx.sym.stackLow = symtab->addOptionalDataSymbol("__stack_low");
993-
ctx.sym.stackHigh = symtab->addOptionalDataSymbol("__stack_high");
994-
ctx.sym.globalBase = symtab->addOptionalDataSymbol("__global_base");
995-
ctx.sym.heapBase = symtab->addOptionalDataSymbol("__heap_base");
996-
ctx.sym.heapEnd = symtab->addOptionalDataSymbol("__heap_end");
9971009
ctx.sym.definedMemoryBase = symtab->addOptionalDataSymbol("__memory_base");
9981010
ctx.sym.definedTableBase = symtab->addOptionalDataSymbol("__table_base");
9991011
}

0 commit comments

Comments
 (0)