xref: /llvm-project/lld/test/MachO/init-offsets.s (revision d64efe42eb98af76ba4ba26f48d079713f513af9)
1# REQUIRES: x86
2# RUN: rm -rf %t; split-file %s %t
3
4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/first.s -o %t/first.o
5# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/second.s -o %t/second.o
6
7# RUN: %lld -lSystem -init_offsets -undefined dynamic_lookup  %t/first.o %t/second.o -o %t/out
8# RUN: llvm-otool -lv %t/out | FileCheck --check-prefix=FLAGS --implicit-check-not=__mod_init_func %s
9# RUN: llvm-otool -l %t/out > %t/dump.txt
10# RUN: llvm-objdump --macho --print-imm-hex --section=__TEXT,__stubs %t/out >> %t/dump.txt
11# RUN: llvm-objdump --macho --syms %t/out >> %t/dump.txt
12# RUN: llvm-objcopy --dump-section=__TEXT,__init_offsets=%t/section.bin %t/out
13# RUN: echo "__TEXT,__init_offsets contents:" >> %t/dump.txt
14# RUN: od -An -txI %t/section.bin >> %t/dump.txt
15# RUN: FileCheck --check-prefix=CONTENT --implicit-check-not=_init_ptr %s < %t/dump.txt
16
17## This test checks that:
18## - __mod_init_func is replaced by __init_offsets.
19## - __mod_init_func has type S_INIT_FUNC_OFFSETS.
20## - initializers show up in the order their parent objects are specified on the
21##   command line, and in the order they show up within __mod_init_func.
22## - for undefined and dylib symbols, stubs are created, and the offsets point to those.
23## - offsets are relative to __TEXT's address, they aren't an absolute virtual address.
24## - symbols defined within __mod_init_func are ignored.
25
26# FLAGS:      sectname __init_offsets
27# FLAGS-NEXT:  segname __TEXT
28# FLAGS-NEXT:     addr
29# FLAGS-NEXT:     size 0x0000000000000010
30# FLAGS-NEXT:   offset
31# FLAGS-NEXT:    align 2^2 (4)
32# FLAGS-NEXT:   reloff 0
33# FLAGS-NEXT:   nreloc 0
34# FLAGS-NEXT:     type S_INIT_FUNC_OFFSETS
35
36# CONTENT:      segname __TEXT
37# CONTENT-NEXT: 0x[[#%x, TEXT:]]
38
39# CONTENT:      Contents of (__TEXT,__stubs) section
40# CONTENT-NEXT: [[#%x, ISNAN:]]: {{.*}} ## literal pool symbol address: ___isnan
41# CONTENT-NEXT: [[#%x, UNDEF:]]: {{.*}} ## literal pool symbol address: _undefined
42
43# CONTENT: SYMBOL TABLE:
44# CONTENT: [[#%x, FIRST:]]  g F __TEXT,__text _first_init
45# CONTENT: [[#%x, SECOND:]] g F __TEXT,__text _second_init
46
47# CONTENT: __TEXT,__init_offsets contents:
48# CONTENT: [[#%.8x, FIRST - TEXT]] [[#%.8x, ISNAN - TEXT]] [[#%.8x, UNDEF - TEXT]] [[#%.8x, SECOND - TEXT]]
49
50#--- first.s
51.globl _first_init, ___isnan, _main
52.globl _init_ptr_1
53.text
54_first_init:
55  ret
56_main:
57  ret
58
59.section __DATA,__mod_init_func,mod_init_funcs
60_init_ptr_1:
61.quad _first_init
62.quad ___isnan
63
64.subsections_via_symbols
65
66#--- second.s
67.globl _second_init, _undefined
68.text
69_second_init:
70  ret
71
72.section __DATA,__mod_init_func,mod_init_funcs
73.quad _undefined
74_init_ptr_2:
75.quad _second_init
76
77.subsections_via_symbols
78