172 lines · plain
1# REQUIRES: x862# RUN: rm -rf %t; split-file %s %t3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o5# RUN: %lld -dylib %t/libfoo.o -o %t/libfoo.dylib6# RUN: %lld %t/test.o -L%t -lfoo -o %t/test -lSystem7# RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --rebase --bind --lazy-bind --weak-bind \8# RUN: --full-contents %t/test | FileCheck --check-prefixes=COMMON,CHECK %s9 10# RUN: %lld -fixup_chains %t/test.o -L%t -lfoo -o %t/chained -lSystem11# RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --syms --full-contents %t/chained > %t/chained.objdump12# RUN: llvm-objdump --no-print-imm-hex --macho --dyld-info %t/chained >> %t/chained.objdump13# RUN: FileCheck %s --check-prefixes=COMMON,CHAINED < %t/chained.objdump14 15# CHAINED: SYMBOL TABLE:16# CHAINED: [[#%x,WEAK_INT:]] l F __TEXT,__text _weak_internal{{$}}17 18# COMMON: Contents of section __DATA_CONST,__got:19## Check that this section contains a nonzero pointer. It should point to20## _weak_external_for_gotpcrel.21# COMMON-NEXT: {{[0-9a-f]+}} {{[0-9a-f ]*[1-9a-f]+[0-9a-f ]*}}22 23# CHECK: Contents of section __DATA,__la_symbol_ptr:24## Check that this section contains a nonzero pointer. It should point to25## _weak_external_fn, but we don't have a good way of testing the exact value as26## the bytes here are in little-endian order.27# CHECK-NEXT: {{[0-9a-f]+}} {{[0-9a-f ]*[1-9a-f]+[0-9a-f ]*}}28 29# COMMON-LABEL: <_main>:30# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_DY_GOT_ADDR:]]31# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_EXT_GOT_ADDR:]]32# COMMON-NEXT: leaq [[#]](%rip), %rax ## 0x[[#%X,WEAK_INT_GOT_ADDR:]]33# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_TLV_ADDR:]]34# COMMON-NEXT: movq [[#]](%rip), %rax ## 0x[[#%X,WEAK_DY_TLV_ADDR:]]35# COMMON-NEXT: leaq [[#]](%rip), %rax ## 0x[[#%X,WEAK_INT_TLV_ADDR:]]36# COMMON-NEXT: callq 0x{{[0-9a-f]*}}37# COMMON-NEXT: callq 0x{{[0-9a-f]*}}38# COMMON-NEXT: callq 0x{{[0-9a-f]*}}39 40# CHECK-LABEL: Rebase table:41# CHECK: __DATA __la_symbol_ptr 0x[[#%x,WEAK_EXT_FN:]] pointer42 43# CHECK-LABEL: Bind table:44# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] pointer 0 libfoo _weak_dysym_for_gotpcrel45# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#%x,WEAK_DY_FN:]] pointer 0 libfoo _weak_dysym_fn46# CHECK-DAG: __DATA __data 0x[[#%x,WEAK_DY:]] pointer 0 libfoo _weak_dysym47# CHECK-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} pointer 0 libSystem __tlv_bootstrap48# CHECK-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} pointer 0 libSystem __tlv_bootstrap49# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] pointer 0 libfoo _weak_dysym_tlv50## Check that we don't have any other bindings51# CHECK-EMPTY:52 53# CHECK-LABEL: Lazy bind table:54# CHECK-NEXT: segment section address dylib symbol55## Verify that we have no lazy bindings56# CHECK-EMPTY:57 58# CHECK-LABEL: Weak bind table:59# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] pointer 0 _weak_dysym_for_gotpcrel60# CHECK-DAG: __DATA_CONST __got 0x[[#WEAK_EXT_GOT_ADDR]] pointer 0 _weak_external_for_gotpcrel61# CHECK-DAG: __DATA __data 0x[[#WEAK_DY]] pointer 0 _weak_dysym62# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_TLV_ADDR]] pointer 0 _weak_tlv63# CHECK-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] pointer 0 _weak_dysym_tlv64# CHECK-DAG: __DATA __data 0x{{[0-9a-f]*}} pointer 2 _weak_external65# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#WEAK_DY_FN]] pointer 0 _weak_dysym_fn66# CHECK-DAG: __DATA __la_symbol_ptr 0x[[#WEAK_EXT_FN]] pointer 0 _weak_external_fn67## Check that we don't have any other bindings68# CHECK-EMPTY:69 70## Weak internal symbols don't get bindings71# RUN: llvm-objdump --macho --bind --lazy-bind --weak-bind %t/test | FileCheck %s --check-prefix=WEAK-INTERNAL72# WEAK-INTERNAL-NOT: _weak_internal73# WEAK-INTERNAL-NOT: _weak_internal_fn74# WEAK-INTERNAL-NOT: _weak_internal_tlv75 76# CHAINED-LABEL: dyld information:77# CHAINED-NEXT: segment section address pointer type addend dylib symbol/vm address78# CHAINED-DAG: __DATA_CONST __got 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_external_fn79# CHAINED-DAG: __DATA_CONST __got 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_dysym_fn80# CHAINED-DAG: __DATA_CONST __got 0x[[#WEAK_EXT_GOT_ADDR]] {{.*}} bind 0x0 weak _weak_external_for_gotpcrel81# CHAINED-DAG: __DATA_CONST __got 0x[[#WEAK_DY_GOT_ADDR]] {{.*}} bind 0x0 weak _weak_dysym_for_gotpcrel82# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} bind 0x0 weak _weak_dysym83# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} bind 0x2 weak _weak_external84# CHAINED-DAG: __DATA __data 0x{{[0-9a-f]*}} {{.*}} rebase 0x[[#%X,WEAK_INT]]85# CHAINED-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} {{.*}} bind 0x0 libSystem __tlv_bootstrap86# CHAINED-DAG: __DATA __thread_vars 0x{{[0-9a-f]*}} {{.*}} bind 0x0 libSystem __tlv_bootstrap87# CHAINED-DAG: __DATA __thread_ptrs 0x[[#WEAK_DY_TLV_ADDR]] {{.*}} bind 0x0 weak _weak_dysym_tlv88# CHAINED-DAG: __DATA __thread_ptrs 0x[[#WEAK_TLV_ADDR]] {{.*}} bind 0x0 weak _weak_tlv89# CHAINED-EMPTY:90 91#--- libfoo.s92 93.globl _weak_dysym94.weak_definition _weak_dysym95_weak_dysym:96 .quad 0x123497 98.globl _weak_dysym_for_gotpcrel99.weak_definition _weak_dysym_for_gotpcrel100_weak_dysym_for_gotpcrel:101 .quad 0x1234102 103.globl _weak_dysym_fn104.weak_definition _weak_dysym_fn105_weak_dysym_fn:106 ret107 108.section __DATA,__thread_vars,thread_local_variables109 110.globl _weak_dysym_tlv111.weak_definition _weak_dysym_tlv112_weak_dysym_tlv:113 .quad 0x1234114 115#--- test.s116 117.globl _main, _weak_external, _weak_external_for_gotpcrel, _weak_external_fn118.weak_definition _weak_external, _weak_external_for_gotpcrel, _weak_external_fn, _weak_internal, _weak_internal_for_gotpcrel, _weak_internal_fn119 120_main:121 mov _weak_dysym_for_gotpcrel@GOTPCREL(%rip), %rax122 mov _weak_external_for_gotpcrel@GOTPCREL(%rip), %rax123 mov _weak_internal_for_gotpcrel@GOTPCREL(%rip), %rax124 mov _weak_tlv@TLVP(%rip), %rax125 mov _weak_dysym_tlv@TLVP(%rip), %rax126 mov _weak_internal_tlv@TLVP(%rip), %rax127 callq _weak_dysym_fn128 callq _weak_external_fn129 callq _weak_internal_fn130 mov $0, %rax131 ret132 133_weak_external:134 .quad 0x1234135 136_weak_external_for_gotpcrel:137 .quad 0x1234138 139_weak_external_fn:140 ret141 142_weak_internal:143 .quad 0x1234144 145_weak_internal_for_gotpcrel:146 .quad 0x1234147 148_weak_internal_fn:149 ret150 151.data152 .quad _weak_dysym153 .quad _weak_external + 2154 .quad _weak_internal155 156.tbss _weak_tlv$tlv$init, 4, 2157.tbss _weak_internal_tlv$tlv$init, 4, 2158 159.section __DATA,__thread_vars,thread_local_variables160.globl _weak_tlv161.weak_definition _weak_tlv, _weak_internal_tlv162 163_weak_tlv:164 .quad __tlv_bootstrap165 .quad 0166 .quad _weak_tlv$tlv$init167 168_weak_internal_tlv:169 .quad __tlv_bootstrap170 .quad 0171 .quad _weak_internal_tlv$tlv$init172