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