1 | // Runs a sequence of dlopen, dlclose, dlopen, dlclose on a library "inits". |
2 | // This is intended as a standard harness for testing constructor / destructor |
3 | // behavior in the context of a full dlclose and then re-dlopen'ing of the |
4 | // inits library. |
5 | // |
6 | // Compiled from: |
7 | // |
8 | // int main(int argc, char *argv[]) { |
9 | // printf("entering main\n"); |
10 | // void *H = dlopen("inits", 0); |
11 | // if (!H) { |
12 | // printf("failed\n"); |
13 | // return -1; |
14 | // } |
15 | // if (dlclose(H) == -1) { |
16 | // printf("failed\n"); |
17 | // return -1; |
18 | // } |
19 | // H = dlopen("inits", 0); |
20 | // if (!H) { |
21 | // printf("failed\n"); |
22 | // return -1; |
23 | // } |
24 | // if (dlclose(H) == -1) { |
25 | // printf("failed\n"); |
26 | // return -1; |
27 | // } |
28 | // printf("leaving main\n"); |
29 | // return 0; |
30 | //} |
31 | |
32 | .section __TEXT,__text,regular,pure_instructions |
33 | .build_version macos, 13, 0 sdk_version 13, 0 |
34 | .globl _main |
35 | .p2align 4, 0x90 |
36 | _main: |
37 | |
38 | pushq %r14 |
39 | pushq %rbx |
40 | pushq %rax |
41 | leaq L_str(%rip), %rdi |
42 | callq _puts |
43 | leaq L_.str.1(%rip), %rdi |
44 | xorl %esi, %esi |
45 | callq _dlopen |
46 | movl $-1, %ebx |
47 | leaq L_str.8(%rip), %r14 |
48 | testq %rax, %rax |
49 | je LBB0_4 |
50 | |
51 | movq %rax, %rdi |
52 | callq _dlclose |
53 | cmpl $-1, %eax |
54 | je LBB0_4 |
55 | |
56 | leaq L_.str.1(%rip), %rdi |
57 | xorl %esi, %esi |
58 | callq _dlopen |
59 | testq %rax, %rax |
60 | je LBB0_4 |
61 | |
62 | movq %rax, %rdi |
63 | callq _dlclose |
64 | xorl %ebx, %ebx |
65 | cmpl $-1, %eax |
66 | sete %bl |
67 | leaq L_str.8(%rip), %rax |
68 | leaq L_str.6(%rip), %r14 |
69 | cmoveq %rax, %r14 |
70 | negl %ebx |
71 | LBB0_4: |
72 | movq %r14, %rdi |
73 | callq _puts |
74 | movl %ebx, %eax |
75 | addq $8, %rsp |
76 | popq %rbx |
77 | popq %r14 |
78 | retq |
79 | |
80 | .section __TEXT,__cstring,cstring_literals |
81 | L_.str.1: |
82 | .asciz "inits" |
83 | L_str: |
84 | .asciz "entering main" |
85 | L_str.6: |
86 | .asciz "leaving main" |
87 | L_str.8: |
88 | .asciz "failed" |
89 | |
90 | .subsections_via_symbols |
91 | |