1# RUN: ld64.lld.darwinold -arch arm64 -r -print_atoms %s -o %t | FileCheck %s
2# RUN: ld64.lld.darwinold -arch arm64 -r -print_atoms %t -o %t2 | FileCheck %s
3# RUN: llvm-objdump -r -s --section="__eh_frame" --macho %t | FileCheck --check-prefix=CODE %s
4# RUN: llvm-objdump -r -s --section="__eh_frame" --macho %t2 | FileCheck --check-prefix=CODE %s
5
6
7--- !mach-o
8arch:            arm64
9file-type:       MH_OBJECT
10flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
11compat-version:  0.0
12current-version: 0.0
13has-UUID:        false
14OS:              unknown
15sections:
16  - segment:         __TEXT
17    section:         __text
18    type:            S_REGULAR
19    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
20    alignment:       4
21    address:         0x0000000000000000
22    content:         [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23                       0xC0, 0x03, 0x5F, 0xD6, 0xC0, 0x03, 0x5F, 0xD6,
24                       0xC0, 0x03, 0x5F, 0xD6 ]
25  - segment:         __TEXT
26    section:         __gcc_except_tab
27    type:            S_REGULAR
28    attributes:      [  ]
29    address:         0x0000000000000014
30    content:         [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
31  - segment:         __DATA
32    section:         __data
33    type:            S_REGULAR
34    attributes:      [  ]
35    address:         0x000000000000001C
36    content:         [ 0x00, 0x00, 0x00, 0x00 ]
37  - segment:         __LD
38    section:         __compact_unwind
39    type:            S_REGULAR
40    attributes:      [  ]
41    alignment:       8
42    address:         0x0000000000000020
43    content:         [ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44                       0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
45                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47                       0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48                       0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
49                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
51    relocations:
52      - offset:          0x00000020
53        type:            ARM64_RELOC_UNSIGNED
54        length:          3
55        pc-rel:          false
56        extern:          false
57        symbol:          1
58      - offset:          0x00000000
59        type:            ARM64_RELOC_UNSIGNED
60        length:          3
61        pc-rel:          false
62        extern:          false
63        symbol:          1
64  - segment:         __TEXT
65    section:         __eh_frame
66    type:            S_COALESCED
67    attributes:      [  ]
68    alignment:       8
69    address:         0x0000000000000060
70    content:         [ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71                       0x03, 0x7A, 0x50, 0x4C, 0x52, 0x00, 0x01, 0x78,
72                       0x1E, 0x07, 0x9B, 0xED, 0xFF, 0xFF, 0xFF, 0x10,
73                       0x10, 0x0C, 0x1F, 0x00, 0x28, 0x00, 0x00, 0x00,
74                       0x20, 0x00, 0x00, 0x00, 0xDC, 0xFF, 0xFF, 0xFF,
75                       0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
76                       0x00, 0x00, 0x00, 0x00, 0x08, 0xCB, 0xFF, 0xFF,
77                       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x10, 0x9E,
78                       0x01, 0x9D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
79                       0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80                       0x03, 0x7A, 0x50, 0x4C, 0x52, 0x00, 0x01, 0x78,
81                       0x1E, 0x07, 0x9B, 0xA9, 0xFF, 0xFF, 0xFF, 0x10,
82                       0x10, 0x0C, 0x1F, 0x00, 0x28, 0x00, 0x00, 0x00,
83                       0x20, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0xFF,
84                       0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
85                       0x00, 0x00, 0x00, 0x00, 0x08, 0x83, 0xFF, 0xFF,
86                       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x10, 0x9E,
87                       0x01, 0x9D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 ]
88    relocations:
89      - offset:          0x0000007D
90        type:            ARM64_RELOC_SUBTRACTOR
91        length:          3
92        pc-rel:          false
93        extern:          true
94        symbol:          6
95      - offset:          0x0000007D
96        type:            ARM64_RELOC_UNSIGNED
97        length:          3
98        pc-rel:          false
99        extern:          true
100        symbol:          3
101      - offset:          0x0000006C
102        type:            ARM64_RELOC_SUBTRACTOR
103        length:          3
104        pc-rel:          false
105        extern:          true
106        symbol:          6
107      - offset:          0x0000006C
108        type:            ARM64_RELOC_UNSIGNED
109        length:          3
110        pc-rel:          false
111        extern:          true
112        symbol:          8
113      - offset:          0x0000005B
114        type:            ARM64_RELOC_POINTER_TO_GOT
115        length:          2
116        pc-rel:          true
117        extern:          true
118        symbol:          10
119      - offset:          0x00000035
120        type:            ARM64_RELOC_SUBTRACTOR
121        length:          3
122        pc-rel:          false
123        extern:          true
124        symbol:          6
125      - offset:          0x00000035
126        type:            ARM64_RELOC_UNSIGNED
127        length:          3
128        pc-rel:          false
129        extern:          true
130        symbol:          2
131      - offset:          0x00000024
132        type:            ARM64_RELOC_SUBTRACTOR
133        length:          3
134        pc-rel:          false
135        extern:          true
136        symbol:          6
137      - offset:          0x00000024
138        type:            ARM64_RELOC_UNSIGNED
139        length:          3
140        pc-rel:          false
141        extern:          true
142        symbol:          7
143      - offset:          0x00000013
144        type:            ARM64_RELOC_POINTER_TO_GOT
145        length:          2
146        pc-rel:          true
147        extern:          true
148        symbol:          9
149local-symbols:
150  - name:            ltmp0
151    type:            N_SECT
152    sect:            1
153    value:           0x0000000000000000
154  - name:            ltmp1
155    type:            N_SECT
156    sect:            2
157    value:           0x0000000000000014
158  - name:            _bar1
159    type:            N_SECT
160    sect:            2
161    value:           0x0000000000000014
162  - name:            _bar2
163    type:            N_SECT
164    sect:            2
165    value:           0x0000000000000018
166  - name:            ltmp12
167    type:            N_SECT
168    sect:            3
169    value:           0x000000000000001C
170  - name:            ltmp13
171    type:            N_SECT
172    sect:            4
173    value:           0x0000000000000020
174  - name:            ltmp16
175    type:            N_SECT
176    sect:            5
177    value:           0x0000000000000060
178global-symbols:
179  - name:            __Z3fooi
180    type:            N_SECT
181    scope:           [ N_EXT ]
182    sect:            1
183    value:           0x0000000000000008
184  - name:            __Z4foo2i
185    type:            N_SECT
186    scope:           [ N_EXT ]
187    sect:            1
188    value:           0x000000000000000C
189  - name:            __gxx_personality_v0
190    type:            N_SECT
191    scope:           [ N_EXT ]
192    sect:            1
193    value:           0x0000000000000000
194  - name:            __gxx_personality_v1
195    type:            N_SECT
196    scope:           [ N_EXT ]
197    sect:            1
198    value:           0x0000000000000004
199  - name:            _main
200    type:            N_SECT
201    scope:           [ N_EXT ]
202    sect:            1
203    value:           0x0000000000000010
204  - name:            _someData
205    type:            N_SECT
206    scope:           [ N_EXT ]
207    sect:            3
208    value:           0x000000000000001C
209page-size:       0x00000000
210...
211
212# CHECK: --- !native
213# CHECK: path:            '<linker-internal>'
214# CHECK: defined-atoms:
215# CHECK:   - ref-name:        L000
216# CHECK:     type:            unwind-cfi
217# CHECK:     content:         [ 18, 00, 00, 00, 00, 00, 00, 00, 03, 7A, 50, 4C,
218# CHECK:                        52, 00, 01, 78, 1E, 07, 9B, {{..}}, {{..}}, {{..}}, {{..}}, 10,
219# CHECK:                        10, 0C, 1F, 00 ]
220# CHECK:     alignment:       8
221# CHECK:     references:
222# CHECK:       - kind:            unwindCIEToPersonalityFunction
223# CHECK:         offset:          19
224# CHECK:         target:          __gxx_personality_v0
225# CHECK:   - type:            unwind-cfi
226# CHECK:     content:         [ 28, 00, 00, 00, 20, 00, 00, 00, {{..}}, {{..}}, {{..}}, {{..}},
227# CHECK:                        {{..}}, {{..}}, {{..}}, {{..}}, 04, 00, 00, 00, 00, 00, 00, 00,
228# CHECK:                        08, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, 0E, 10, 9E,
229# CHECK:                        01, 9D, 02, 00, 00, 00, 00, 00 ]
230# CHECK:     alignment:       4 mod 8
231# CHECK:     references:
232# CHECK:       - kind:            negDelta32
233# CHECK:         offset:          4
234# CHECK:         target:          L000
235# CHECK:       - kind:            unwindFDEToFunction
236# CHECK:         offset:          8
237# CHECK:         target:          __Z3fooi
238# CHECK:       - kind:            unwindFDEToFunction
239# CHECK:         offset:          25
240# CHECK:         target:          _bar1
241# CHECK:   - ref-name:        L001
242# CHECK:     type:            unwind-cfi
243# CHECK:     content:         [ 18, 00, 00, 00, 00, 00, 00, 00, 03, 7A, 50, 4C,
244# CHECK:                        52, 00, 01, 78, 1E, 07, 9B, {{..}}, {{..}}, {{..}}, {{..}}, 10,
245# CHECK:                        10, 0C, 1F, 00 ]
246# CHECK:     alignment:       8
247# CHECK:     references:
248# CHECK:       - kind:            unwindCIEToPersonalityFunction
249# CHECK:         offset:          19
250# CHECK:         target:          __gxx_personality_v1
251# CHECK:   - type:            unwind-cfi
252# CHECK:     content:         [ 28, 00, 00, 00, 20, 00, 00, 00, {{..}}, {{..}}, {{..}}, {{..}},
253# CHECK:                        {{..}}, {{..}}, {{..}}, {{..}}, 04, 00, 00, 00, 00, 00, 00, 00,
254# CHECK:                        08, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, 0E, 10, 9E,
255# CHECK:                        01, 9D, 02, 00, 00, 00, 00, 00 ]
256# CHECK:     alignment:       4 mod 8
257# CHECK:     references:
258# CHECK:       - kind:            negDelta32
259# CHECK:         offset:          4
260# CHECK:         target:          L001
261# CHECK:       - kind:            unwindFDEToFunction
262# CHECK:         offset:          8
263# CHECK:         target:          __Z4foo2i
264# CHECK:       - kind:            unwindFDEToFunction
265# CHECK:         offset:          25
266# CHECK:         target:          _bar2
267# CHECK:   - name:            _bar1
268# CHECK:     type:            unwind-lsda
269# CHECK:     content:         [ 00, 00, 00, 00 ]
270# CHECK:   - name:            _bar2
271# CHECK:     type:            unwind-lsda
272# CHECK:     content:         [ 00, 00, 00, 00 ]
273# CHECK:   - name:            _someData
274# CHECK:     scope:           global
275# CHECK:     type:            data
276# CHECK:     content:         [ 00, 00, 00, 00 ]
277# CHECK:   - name:            __gxx_personality_v0
278# CHECK:     scope:           global
279# CHECK:     content:         [ 00, 00, 00, 00 ]
280# CHECK:     alignment:       4
281# CHECK:   - name:            __gxx_personality_v1
282# CHECK:     scope:           global
283# CHECK:     content:         [ 00, 00, 00, 00 ]
284# CHECK:     alignment:       4
285# CHECK:   - name:            __Z3fooi
286# CHECK:     scope:           global
287# CHECK:     content:         [ C0, 03, 5F, D6 ]
288# CHECK:     alignment:       4
289# CHECK:   - name:            __Z4foo2i
290# CHECK:     scope:           global
291# CHECK:     content:         [ C0, 03, 5F, D6 ]
292# CHECK:     alignment:       4
293# CHECK:   - name:            _main
294# CHECK:     scope:           global
295# CHECK:     content:         [ C0, 03, 5F, D6 ]
296# CHECK:     alignment:       4
297# CHECK: ...
298
299# # Make sure we don't have any relocations in the __eh_frame section
300# CODE-NOT: RELOCATION RECORDS FOR [__eh_frame]
301
302# Also make sure the reloc for the CIE->personality function is the
303# correct offset
304# It should be the offset from the fixup location back to the address
305# of the function we are referencing
306# CODE: Contents of section __TEXT,__eh_frame:
307# This is the CIE:
308# CODE-NEXT: {{[0-9abcdef]*}} 18000000 00000000 037a504c 52000178
309# CODE-NEXT: {{[0-9abcdef]*}} 1e079bd1 ffffff10 100c1f00 28000000
310# This is the important offset for CIE->pfunc
311#                                   ^~~~~~~~~
312# Then we have an FDE starting from 28000000 above
313# CODE-NEXT: {{[0-9abcdef]*}} 20000000 c8ffffff ffffffff 04000000
314# CODE-NEXT: {{[0-9abcdef]*}} 00000000 08c3ffff ffffffff ff0e109e
315# And a new CIE starts at this 00000018 right below here
316# CODE-NEXT: {{[0-9abcdef]*}} 019d0200 00000000 18000000 00000000
317# CODE-NEXT: {{[0-9abcdef]*}} 037a504c 52000178 1e079b8d ffffff10
318# This is the important offset for its CIE->pfunc     ^~~~~~~~~
319