xref: /llvm-project/lld/test/MachO/implicit-dylibs.s (revision bbe6f51b726f9d4265df4407736772dd68ac6f98)
1# REQUIRES: x86
2## FIXME: We appear to emit LC_LOAD_DYLIBs in a different order on Windows.
3# UNSUPPORTED: system-windows
4# RUN: rm -rf %t; split-file %s %t
5# RUN: mkdir -p %t/usr/lib/system
6# RUN: mkdir -p %t/System/Library/Frameworks/Foo.framework/Versions/A
7# RUN: mkdir -p %t/System/Library/Frameworks/Foo.framework/Frameworks/Bar.framework/Versions/A
8# RUN: mkdir -p %t/Baz.framework/Versions/A
9
10# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o
11# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libtoplevel.s -o %t/libtoplevel.o
12# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libsublevel.s -o %t/libsublevel.o
13# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/framework-foo.s -o %t/framework-foo.o
14# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/framework-bar.s -o %t/framework-bar.o
15# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/framework-baz.s -o %t/framework-baz.o
16## libunused will be used to verify that we load implicit dylibs even if we
17## don't use any symbols they contain.
18# RUN: echo "" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/libunused.o
19# RUN: echo "" | llvm-mc -filetype=obj -triple=x86_64-apple-darwin -o %t/reexporter.o
20
21# RUN: %lld -dylib -lSystem %t/libfoo.o -o %t/libfoo.dylib
22# RUN: %lld -dylib -lSystem %t/libtoplevel.o -o %t/usr/lib/libtoplevel.dylib -install_name /usr/lib/libtoplevel.dylib
23# RUN: %lld -dylib -lSystem %t/libsublevel.o -o %t/usr/lib/system/libsublevel.dylib -install_name /usr/lib/system/libsublevel.dylib
24# RUN: %lld -dylib -lSystem %t/libunused.o -o %t/usr/lib/libunused.dylib -install_name /usr/lib/libunused.dylib
25
26## Bar.framework is nested within Foo.framework.
27# RUN: %lld -dylib -lSystem %t/framework-bar.o -o %t/System/Library/Frameworks/Foo.framework/Frameworks/Bar.framework/Versions/A/Bar \
28# RUN:   -install_name /System/Library/Frameworks/Foo.framework/Frameworks/Bar.framework/Versions/A/Bar
29# RUN: ln -sf Versions/A/Bar \
30# RUN:   %t/System/Library/Frameworks/Foo.framework/Frameworks/Bar.framework/Bar
31
32## Have Foo re-export Bar.
33# RUN: %lld -dylib -F %t/System/Library/Frameworks/Foo.framework/Frameworks \
34# RUN:   -framework Bar -sub_umbrella Bar -lSystem %t/framework-foo.o -o %t/System/Library/Frameworks/Foo.framework/Versions/A/Foo \
35# RUN:   -install_name /System/Library/Frameworks/Foo.framework/Versions/A/Foo
36# RUN: ln -sf Versions/A/Foo %t/System/Library/Frameworks/Foo.framework/Foo
37
38# RUN: %lld -dylib -lSystem %t/framework-baz.o -o %t/Baz.framework/Versions/A/Baz \
39# RUN:   -install_name %t/Baz.framework/Versions/A/Baz
40# RUN: ln -sf Versions/A/Baz %t/Baz.framework/Baz
41
42# RUN: %lld -dylib -syslibroot %t -framework Foo -F %t -framework Baz \
43# RUN:   -lc++ -ltoplevel -lunused %t/usr/lib/system/libsublevel.dylib %t/libfoo.dylib \
44# RUN:   -sub_library libc++ -sub_library libfoo -sub_library libtoplevel \
45# RUN:   -sub_library libsublevel -sub_library libunused \
46# RUN:   -sub_umbrella Baz -sub_umbrella Foo \
47# RUN:   %t/reexporter.o -o %t/libreexporter.dylib
48
49# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %t/test.s -o %t/test.o
50# RUN: %lld -syslibroot %t -o %t/test -lSystem -L%t -lreexporter %t/test.o
51# RUN: llvm-objdump --bind --no-show-raw-insn -d %t/test | FileCheck %s
52# CHECK:     Bind table:
53# CHECK-DAG: __DATA __data {{.*}} pointer 0 libreexporter _foo
54# CHECK-DAG: __DATA __data {{.*}} pointer 0 libtoplevel   _toplevel
55# CHECK-DAG: __DATA __data {{.*}} pointer 0 libreexporter _sublevel
56# CHECK-DAG: __DATA __data {{.*}} pointer 0 Foo           _framework_foo
57# CHECK-DAG: __DATA __data {{.*}} pointer 0 Foo           _framework_bar
58# CHECK-DAG: __DATA __data {{.*}} pointer 0 libreexporter _framework_baz
59# CHECK-DAG: __DATA __data {{.*}} pointer 0 libc++abi     ___gxx_personality_v0
60
61# RUN: llvm-otool -l %t/test | FileCheck %s \
62# RUN:   --check-prefix=LOAD -DDIR=%t --implicit-check-not LC_LOAD_DYLIB
63## Check that we don't create duplicate LC_LOAD_DYLIBs.
64# RUN: %lld -syslibroot %t -o %t/test -lSystem -L%t -lreexporter -ltoplevel %t/test.o
65# RUN: llvm-otool -l %t/test | FileCheck %s \
66# RUN:   --check-prefix=LOAD -DDIR=%t --implicit-check-not LC_LOAD_DYLIB
67
68# LOAD:          cmd LC_LOAD_DYLIB
69# LOAD-NEXT: cmdsize
70# LOAD-NEXT:    name /usr/lib/libSystem.dylib
71# LOAD:          cmd LC_LOAD_DYLIB
72# LOAD-NEXT: cmdsize
73# LOAD-NEXT:    name [[DIR]]/libreexporter.dylib
74# LOAD:          cmd LC_LOAD_DYLIB
75# LOAD-NEXT: cmdsize
76# LOAD-NEXT:    name /System/Library/Frameworks/Foo.framework/Versions/A/Foo
77# LOAD:          cmd LC_LOAD_DYLIB
78# LOAD-NEXT: cmdsize
79# LOAD-NEXT:    name /usr/lib/libc++abi.dylib
80# LOAD:          cmd LC_LOAD_DYLIB
81# LOAD-NEXT: cmdsize
82# LOAD-NEXT:    name /usr/lib/libtoplevel.dylib
83
84# RUN: %lld -no_implicit_dylibs -syslibroot %t -o %t/no-implicit -lSystem -L%t -lreexporter %t/test.o
85# RUN: llvm-objdump --bind --no-show-raw-insn -d %t/no-implicit | FileCheck %s --check-prefix=NO-IMPLICIT
86# NO-IMPLICIT:     Bind table:
87# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _foo
88# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _toplevel
89# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _sublevel
90# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _framework_foo
91# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _framework_bar
92# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter _framework_baz
93# NO-IMPLICIT-DAG: __DATA __data {{.*}} pointer 0 libreexporter ___gxx_personality_v0
94
95#--- libfoo.s
96.data
97.globl _foo
98_foo:
99
100#--- libtoplevel.s
101.data
102.globl _toplevel
103_toplevel:
104
105#--- libsublevel.s
106.data
107.globl _sublevel
108_sublevel:
109
110#--- framework-foo.s
111.data
112.globl _framework_foo
113_framework_foo:
114
115#--- framework-bar.s
116.data
117.globl _framework_bar
118_framework_bar:
119
120#--- framework-baz.s
121.data
122.globl _framework_baz
123_framework_baz:
124
125#--- test.s
126.text
127.globl _main
128
129_main:
130  ret
131
132.data
133  .quad _foo
134  .quad _toplevel
135  .quad _sublevel
136  .quad _framework_foo
137  .quad _framework_bar
138  .quad _framework_baz
139  .quad ___gxx_personality_v0
140