1## Stub dylibs differ from "real" dylibs in that they lack any content in their
2## sections. What they do have are export tries and symbol tables, which means
3## we can still link against them. I (jezng) am unclear how to properly create
4## these stub dylibs; XCode 11.3's `lipo` is able to create stub dylibs, but
5## those lack LC_ID_DYLIB load commands and are considered invalid by most
6## tooling. Newer versions of `lipo` aren't able to create stub dylibs at all.
7## However, recent SDKs in XCode still come with valid stub dylibs, so it still
8## seems worthwhile to support them. The YAML in this test was generated by
9## taking a non-stub dylib and editing the appropriate fields.
10
11# REQUIRES: x86
12# RUN: split-file %s %t
13# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
14# RUN: yaml2obj %t/fat.dylib.yaml > %t/fat.dylib
15# RUN: %lld -lSystem %t/test.o %t/fat.dylib -o %t/test
16# RUN: llvm-objdump --macho --lazy-bind %t/test | FileCheck %s
17# CHECK: __DATA   __la_symbol_ptr    0x100001008 foo  _foo
18
19#--- test.s
20.globl _main
21_main:
22  callq _foo
23  ret
24
25#--- fat.dylib.yaml
26--- !fat-mach-o
27FatHeader:
28  magic:           0xCAFEBABE
29  nfat_arch:       1
30FatArchs:
31  - cputype:         0x01000007
32    cpusubtype:      0x00000003
33    offset:          0x0000000000001000
34    size:            16432
35    align:           12
36Slices:
37  - !mach-o
38    FileHeader:
39      magic:           0xFEEDFACF
40      cputype:         0x01000007
41      cpusubtype:      0x00000003
42      filetype:        0x00000009
43      ncmds:           5
44      sizeofcmds:      568
45      flags:           0x00100085
46      reserved:        0x00000000
47    LoadCommands:
48      - cmd:             LC_SEGMENT_64
49        cmdsize:         232
50        segname:         __TEXT
51        vmaddr:          0
52        vmsize:          16384
53        fileoff:         0
54        filesize:        16384
55        maxprot:         5
56        initprot:        5
57        nsects:          1
58        flags:           0
59        Sections:
60          - sectname:        __text
61            segname:         __TEXT
62            addr:            0x0000000000000000
63            size:            0
64            offset:          0x00003FB7
65            align:           0
66            reloff:          0x00000000
67            nreloc:          0
68            flags:           0x80000400
69            reserved1:       0x00000000
70            reserved2:       0x00000000
71            reserved3:       0x00000000
72            content:         ''
73      - cmd:             LC_SEGMENT_64
74        cmdsize:         72
75        segname:         __LINKEDIT
76        vmaddr:          16384
77        vmsize:          16384
78        fileoff:         16384
79        filesize:        48
80        maxprot:         1
81        initprot:        1
82        nsects:          0
83        flags:           0
84      - cmd:             LC_ID_DYLIB
85        cmdsize:         40
86        dylib:
87          name:            24
88          timestamp:       1
89          current_version: 0
90          compatibility_version: 0
91        PayloadString:   foo.dylib
92        ZeroPadBytes:    7
93      - cmd:             LC_DYLD_INFO_ONLY
94        cmdsize:         48
95        rebase_off:      0
96        rebase_size:     0
97        bind_off:        0
98        bind_size:       0
99        weak_bind_off:   0
100        weak_bind_size:  0
101        lazy_bind_off:   0
102        lazy_bind_size:  0
103        export_off:      16384
104        export_size:     16
105      - cmd:             LC_SYMTAB
106        cmdsize:         24
107        symoff:          16408
108        nsyms:           1
109        stroff:          16424
110        strsize:         8
111    LinkEditData:
112      ExportTrie:
113        TerminalSize:    0
114        NodeOffset:      0
115        Name:            ''
116        Flags:           0x0000000000000000
117        Address:         0x0000000000000000
118        Other:           0x0000000000000000
119        ImportName:      ''
120        Children:
121          - TerminalSize:    3
122            NodeOffset:      8
123            Name:            _foo
124            Flags:           0x0000000000000000
125            Address:         0x0000000000003FB7
126            Other:           0x0000000000000000
127            ImportName:      ''
128      NameList:
129        - n_strx:          2
130          n_type:          0x0F
131          n_sect:          1
132          n_desc:          0
133          n_value:         16311
134      StringTable:
135        - ' '
136        - _foo
137        - ''
138...
139