Skip to content

Commit a4a8d36

Browse files
authoredJul 10, 2024··
[InstallAPI] Don't look for linker directive symbols in reexports (#98171)
`$ld$previous` symbols need to be exported for them to be seen by clients. TAPI cannot omit them in tbd files, so account for this in installapi verification when handling reexport verification. Reviewed internally by Zixu Wang resolves: rdar://131317591
1 parent 884a07f commit a4a8d36

File tree

2 files changed

+310
-2
lines changed

2 files changed

+310
-2
lines changed
 

‎clang/lib/InstallAPI/DylibVerifier.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,18 @@ bool DylibVerifier::shouldIgnoreObsolete(const Record *R, SymbolContext &SymCtx,
187187

188188
bool DylibVerifier::shouldIgnoreReexport(const Record *R,
189189
SymbolContext &SymCtx) const {
190+
StringRef SymName = SymCtx.SymbolName;
191+
// Linker directive symbols can never be ignored.
192+
if (SymName.starts_with("$ld$"))
193+
return false;
194+
190195
if (Reexports.empty())
191196
return false;
192197

193198
for (const InterfaceFile &Lib : Reexports) {
194199
if (!Lib.hasTarget(Ctx.Target))
195200
continue;
196-
if (auto Sym =
197-
Lib.getSymbol(SymCtx.Kind, SymCtx.SymbolName, SymCtx.ObjCIFKind))
201+
if (auto Sym = Lib.getSymbol(SymCtx.Kind, SymName, SymCtx.ObjCIFKind))
198202
if ((*Sym)->hasTarget(Ctx.Target))
199203
return true;
200204
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
; RUN: rm -rf %t
2+
; RUN: split-file %s %t
3+
4+
; RUN: yaml2obj %t/umbrella.yaml -o %t/System/Library/Frameworks/Umbrella.framework/Umbrella
5+
6+
; RUN: clang-installapi -target arm64-apple-macosx14 -install_name \
7+
; RUN: /System/Library/Frameworks/Umbrella.framework/Versions/A/Umbrella \
8+
; RUN: --verify-against=%t/System/Library/Frameworks/Umbrella.framework/Umbrella \
9+
; RUN: -L%t/usr/lib -F%t/System/Library/Frameworks \
10+
; RUN: %t/System/Library/Frameworks/Umbrella.framework --verify-mode=Pedantic -reexport-lBar \
11+
; RUN: -o %t/Umbrella.tbd 2>&1 | FileCheck -allow-empty %s
12+
; RUN: llvm-readtapi -compare %t/Umbrella.tbd %t/expected.tbd 2>&1 | FileCheck -allow-empty %s
13+
14+
; CHECK-NOT: error
15+
; CHECK-NOT: warning
16+
17+
;--- System/Library/Frameworks/Umbrella.framework/Headers/Umbrella.h
18+
extern const char ld_previous __asm("$ld$previous$/usr/lib/libLdPreviousBindPrevious.1.dylib$$1$11.0$16.0$_function$");
19+
extern void function();
20+
21+
;--- umbrella.yaml
22+
--- !mach-o
23+
FileHeader:
24+
magic: 0xFEEDFACF
25+
cputype: 0x100000C
26+
cpusubtype: 0x0
27+
filetype: 0x6
28+
ncmds: 16
29+
sizeofcmds: 856
30+
flags: 0x85
31+
reserved: 0x0
32+
LoadCommands:
33+
- cmd: LC_SEGMENT_64
34+
cmdsize: 312
35+
segname: __TEXT
36+
vmaddr: 0
37+
vmsize: 16384
38+
fileoff: 0
39+
filesize: 16384
40+
maxprot: 5
41+
initprot: 5
42+
nsects: 3
43+
flags: 0
44+
Sections:
45+
- sectname: __text
46+
segname: __TEXT
47+
addr: 0x3FB0
48+
size: 4
49+
offset: 0x3FB0
50+
align: 2
51+
reloff: 0x0
52+
nreloc: 0
53+
flags: 0x80000400
54+
reserved1: 0x0
55+
reserved2: 0x0
56+
reserved3: 0x0
57+
content: C0035FD6
58+
- sectname: __const
59+
segname: __TEXT
60+
addr: 0x3FB4
61+
size: 1
62+
offset: 0x3FB4
63+
align: 0
64+
reloff: 0x0
65+
nreloc: 0
66+
flags: 0x0
67+
reserved1: 0x0
68+
reserved2: 0x0
69+
reserved3: 0x0
70+
content: '00'
71+
- sectname: __unwind_info
72+
segname: __TEXT
73+
addr: 0x3FB8
74+
size: 72
75+
offset: 0x3FB8
76+
align: 2
77+
reloff: 0x0
78+
nreloc: 0
79+
flags: 0x0
80+
reserved1: 0x0
81+
reserved2: 0x0
82+
reserved3: 0x0
83+
content: 010000001C000000000000001C000000000000001C00000002000000B03F00003400000034000000B53F00000000000034000000030000000C000100100001000000000000000002
84+
- cmd: LC_SEGMENT_64
85+
cmdsize: 72
86+
segname: __LINKEDIT
87+
vmaddr: 16384
88+
vmsize: 16384
89+
fileoff: 16384
90+
filesize: 584
91+
maxprot: 1
92+
initprot: 1
93+
nsects: 0
94+
flags: 0
95+
- cmd: LC_ID_DYLIB
96+
cmdsize: 96
97+
dylib:
98+
name: 24
99+
timestamp: 1
100+
current_version: 0
101+
compatibility_version: 0
102+
Content: '/System/Library/Frameworks/Umbrella.framework/Versions/A/Umbrella'
103+
ZeroPadBytes: 7
104+
- cmd: LC_DYLD_CHAINED_FIXUPS
105+
cmdsize: 16
106+
dataoff: 16384
107+
datasize: 48
108+
- cmd: LC_DYLD_EXPORTS_TRIE
109+
cmdsize: 16
110+
dataoff: 16432
111+
datasize: 104
112+
- cmd: LC_SYMTAB
113+
cmdsize: 24
114+
symoff: 16560
115+
nsyms: 2
116+
stroff: 16592
117+
strsize: 96
118+
- cmd: LC_DYSYMTAB
119+
cmdsize: 80
120+
ilocalsym: 0
121+
nlocalsym: 0
122+
iextdefsym: 0
123+
nextdefsym: 2
124+
iundefsym: 2
125+
nundefsym: 0
126+
tocoff: 0
127+
ntoc: 0
128+
modtaboff: 0
129+
nmodtab: 0
130+
extrefsymoff: 0
131+
nextrefsyms: 0
132+
indirectsymoff: 0
133+
nindirectsyms: 0
134+
extreloff: 0
135+
nextrel: 0
136+
locreloff: 0
137+
nlocrel: 0
138+
- cmd: LC_UUID
139+
cmdsize: 24
140+
uuid: CCD7F304-D97B-3521-A980-CC936CCD34E8
141+
- cmd: LC_BUILD_VERSION
142+
cmdsize: 32
143+
platform: 1
144+
minos: 917504
145+
sdk: 983040
146+
ntools: 1
147+
Tools:
148+
- tool: 3
149+
version: 62525440
150+
- cmd: LC_SOURCE_VERSION
151+
cmdsize: 16
152+
version: 0
153+
- cmd: LC_SEGMENT_SPLIT_INFO
154+
cmdsize: 16
155+
dataoff: 16536
156+
datasize: 16
157+
- cmd: LC_REEXPORT_DYLIB
158+
cmdsize: 48
159+
dylib:
160+
name: 24
161+
timestamp: 2
162+
current_version: 65536
163+
compatibility_version: 65536
164+
Content: '/usr/lib/libBar.dylib'
165+
ZeroPadBytes: 3
166+
- cmd: LC_LOAD_DYLIB
167+
cmdsize: 56
168+
dylib:
169+
name: 24
170+
timestamp: 2
171+
current_version: 88539136
172+
compatibility_version: 65536
173+
Content: '/usr/lib/libSystem.B.dylib'
174+
ZeroPadBytes: 6
175+
- cmd: LC_FUNCTION_STARTS
176+
cmdsize: 16
177+
dataoff: 16552
178+
datasize: 8
179+
- cmd: LC_DATA_IN_CODE
180+
cmdsize: 16
181+
dataoff: 16560
182+
datasize: 0
183+
- cmd: LC_CODE_SIGNATURE
184+
cmdsize: 16
185+
dataoff: 16688
186+
datasize: 280
187+
LinkEditData:
188+
ExportTrie:
189+
TerminalSize: 0
190+
NodeOffset: 0
191+
Name: ''
192+
Flags: 0x0
193+
Address: 0x0
194+
Other: 0x0
195+
ImportName: ''
196+
Children:
197+
- TerminalSize: 3
198+
NodeOffset: 94
199+
Name: '$ld$previous$/usr/lib/libLdPreviousBindPrevious.1.dylib$$1$11.0$16.0$_function$'
200+
Flags: 0x0
201+
Address: 0x3FB4
202+
Other: 0x0
203+
ImportName: ''
204+
- TerminalSize: 3
205+
NodeOffset: 99
206+
Name: _function
207+
Flags: 0x0
208+
Address: 0x3FB0
209+
Other: 0x0
210+
ImportName: ''
211+
NameList:
212+
- n_strx: 2
213+
n_type: 0xF
214+
n_sect: 2
215+
n_desc: 0
216+
n_value: 16308
217+
- n_strx: 82
218+
n_type: 0xF
219+
n_sect: 1
220+
n_desc: 0
221+
n_value: 16304
222+
StringTable:
223+
- ' '
224+
- '$ld$previous$/usr/lib/libLdPreviousBindPrevious.1.dylib$$1$11.0$16.0$_function$'
225+
- _function
226+
- ''
227+
- ''
228+
- ''
229+
- ''
230+
FunctionStarts: [ 0x3FB0 ]
231+
ChainedFixups: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x2C, 0x0,
232+
0x0, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
233+
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
234+
0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
235+
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
236+
...
237+
238+
;--- /usr/lib/libBar.dylib
239+
{
240+
"main_library": {
241+
"exported_symbols": [
242+
{
243+
"text": {
244+
"global": [
245+
"$ld$previous$/usr/lib/libLdPreviousBindPrevious.1.dylib$$1$11.0$16.0$_function$"
246+
]
247+
}
248+
}
249+
],
250+
"flags": [
251+
{
252+
"attributes": [
253+
"not_app_extension_safe"
254+
]
255+
}
256+
],
257+
"install_names": [
258+
{
259+
"name": "/usr/lib/libBar.dylib"
260+
}
261+
],
262+
"target_info": [
263+
{
264+
"min_deployment": "13",
265+
"target": "arm64-macos"
266+
}
267+
]
268+
},
269+
"tapi_tbd_version": 5
270+
}
271+
272+
;--- expected.tbd
273+
{
274+
"main_library": {
275+
"compatibility_versions": [ { "version": "0" } ],
276+
"current_versions": [ { "version": "0" } ],
277+
"exported_symbols": [
278+
{
279+
"data": {
280+
"global": [
281+
"$ld$previous$/usr/lib/libLdPreviousBindPrevious.1.dylib$$1$11.0$16.0$_function$"
282+
]
283+
},
284+
"text": { "global": [ "_function" ] }
285+
}
286+
],
287+
"flags": [
288+
{ "attributes": [ "not_app_extension_safe" ] }
289+
],
290+
"install_names": [
291+
{ "name": "/System/Library/Frameworks/Umbrella.framework/Versions/A/Umbrella" }
292+
],
293+
"reexported_libraries": [
294+
{ "names": [ "/usr/lib/libBar.dylib" ] }
295+
],
296+
"target_info": [
297+
{
298+
"min_deployment": "14",
299+
"target": "arm64-macos"
300+
}
301+
]
302+
},
303+
"tapi_tbd_version": 5
304+
}

0 commit comments

Comments
 (0)
Please sign in to comment.