# PLATFORM: MACOS IOS WATCHOS TVOS # # Test various kinds of weak chained binds, as these require different # codepaths through otool, etc. TESTROOT = ../.. include ${TESTROOT}/include/common.makefile VALID_ARCHS := $(filter-out i386 armv7k,$(VALID_ARCHS)) # test_weak compiles and runs the test with dyldinfo bind opcodes # $1 is the arch # $2 is the src file # $3 is the check prefix test_weak = \ ${CPP} -w -arch $(1) -Wl,-fixup_chains $(2); \ ${OTOOLC} -bind_info a.out | ${CHECK} -p $(3) .PHONY : all clean all: ################################################################################ # # for arch in ${VALID_ARCHS}; \ # do \ # ${CC} -arch $$arch -Wl,-fixup_chains -o verstool \ # ${TESTROOT}/src/verstool.c; \ # ${OTOOLC} -bind_info verstool > output.txt; \ # if [ "$$arch" == "arm64e" ]; then \ # ${CHECK} -p CHECK64E -i output.txt; \ # else \ # ${CHECK} -p CHECK -i output.txt; \ # fi \ # done # # x86_64 ifneq (,$(filter x86_64,$(VALID_ARCHS))) $(call test_weak,x86_64,weak-large-addends.cpp,CHECK) $(call test_weak,x86_64,weak-no-addends.cpp,CHECK) $(call test_weak,x86_64,weak-small-addends.cpp,CHECK) endif # # x86_64h ifneq (,$(filter x86_64h,$(VALID_ARCHS))) $(call test_weak,x86_64h,weak-large-addends.cpp,CHECK) $(call test_weak,x86_64h,weak-no-addends.cpp,CHECK) $(call test_weak,x86_64h,weak-small-addends.cpp,CHECK) endif # # armv7k ifneq (,$(filter armv7k,$(VALID_ARCHS))) $(call test_weak,armv7k,weak-large-addends.cpp,CHECK) $(call test_weak,armv7k,weak-no-addends.cpp,CHECK) $(call test_weak,armv7k,weak-small-addends.cpp,CHECK) endif # # armv64_32 ifneq (,$(filter armv64_32,$(VALID_ARCHS))) $(call test_weak,armv64_32,weak-large-addends.cpp,CHECK) $(call test_weak,armv64_32,weak-no-addends.cpp,CHECK) $(call test_weak,armv64_32,weak-small-addends.cpp,CHECK) endif # # arm64 ifneq (,$(filter arm64,$(VALID_ARCHS))) $(call test_weak,arm64,weak-large-addends.cpp,CHECK) $(call test_weak,arm64,weak-no-addends.cpp,CHECK) $(call test_weak,arm64,weak-small-addends.cpp,CHECK) endif # # arm64e ifneq (,$(filter arm64e,$(VALID_ARCHS))) $(call test_weak,arm64e,weak-large-addends.cpp,CHECK64E) $(call test_weak,arm64e,weak-no-addends.cpp,CHECK64E) $(call test_weak,arm64e,weak-small-addends.cpp,CHECK64E) endif echo PASS clean: rm -f a.out ################################################################################ # # CHECK: a.out: # CHECK-NEXT: bind information: # CHECK-NEXT: segment\s+section address value type \[\[:xdigit:\]\]+nd dylib symbol # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 weak __ZdlPv # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 weak __Znwm # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 libc\+\+ ___cxa_call_unexpected # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 libSystem ___error # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 libc\+\+ ___gxx_personality_v0 # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 weak _a # CHECK-NEXT: __DATA\(_CONST\)?\s+__got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 libSystem _malloc # CHECK-NEXT: __DATA\(_CONST\)?\s+__mod_init_func 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK-NEXT: __DATA\(_CONST\)?\s+__const 0x\[\[:xdigit:\]\]+ bind ptr 0x10 libc\+\+ __ZTVN10__cxxabiv117__class_type_infoE # CHECK-NEXT: __DATA\(_CONST\)?\s+__const 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK-NEXT: __DATA\(_CONST\)?\s+__data 0x\[\[:xdigit:\]\]+ bind ptr 0x\[\[:xdigit:\]\]+\s+weak _b # CHECK-NEXT: __DATA\(_CONST\)?\s+__data 0x\[\[:xdigit:\]\]+ bind ptr 0x\[\[:xdigit:\]\]+\s+weak _b ################################################################################ # # CHECK64E: a.out: # CHECK64E-NEXT: bind information: # CHECK64E-NEXT: segment section address value type \[\[:xdigit:\]\]+nd dylib symbol # CHECK64E-NEXT: __DATA_CONST __auth_got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 weak __ZdlPv (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __auth_got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 weak __Znwm (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __auth_got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 libc\+\+ ___cxa_call_unexpected (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __auth_got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 libSystem ___error (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __auth_got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 libSystem _malloc (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK64E-NEXT: __DATA_CONST __got 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 libc\+\+ ___gxx_personality_v0 (JOP: diversity 0, address true, IA) # CHECK64E-NEXT: __DATA_CONST __got 0x\[\[:xdigit:\]\]+ bind ptr 0x0 weak _a # CHECK64E-NEXT: __DATA_CONST __mod_init_func 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK64E-NEXT: __DATA_CONST __const 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ bind aptr 0x0 libc\+\+ __ZTVN10__cxxabiv117__class_type_infoE (JOP: diversity 0, address false, DA) # CHECK64E-NEXT: __DATA_CONST __const 0x\[\[:xdigit:\]\]+ 0x\[\[:xdigit:\]\]+ rebase ptr 0x0 # CHECK64E-NEXT: __DATA __data 0x\[\[:xdigit:\]\]+ bind ptr 0x\[\[:xdigit:\]\]+\s* weak _b # CHECK64E-NEXT: __DATA __data 0x\[\[:xdigit:\]\]+ bind ptr 0x\[\[:xdigit:\]\]+\s* weak _b