You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

602 lines
37 KiB

##############################################################
#
# This file includes all the test targets as well as all the
# non-default build rules and test recipes.
#
##############################################################
###### Special configuration ######
# This file is different than all the rest of the makefiles because it tests
# cross architecture explicitly. So we need to define some useful variables.
XOBJDIR := obj-ia32/
XTARGET := ia32
ifeq ($(TARGET_OS),windows)
ifeq ($(ICC),1)
MAKE_PREFIX_ia32 := cmd /c compiler-env.bat icl_x86
MAKE_PREFIX_intel64 := cmd /c compiler-env.bat icl_amd64
else
MAKE_PREFIX_ia32 := cmd /c compiler-env.bat x86
MAKE_PREFIX_intel64 := cmd /c compiler-env.bat amd64
endif
endif
##############################################################
#
# Test targets
#
##############################################################
###### Place all generic definitions here ######
# This defines tests which run tools of the same name. This is simply for convenience to avoid
# defining the test name twice (once in TOOL_ROOTS and again in TEST_ROOTS).
# Tests defined here should not be defined in TOOL_ROOTS and TEST_ROOTS.
TEST_TOOL_ROOTS :=
# This defines the tests to be run that were not already defined in TEST_TOOL_ROOTS.
TEST_ROOTS :=
# This defines the tools which will be run during the the tests, and were not already defined in
# TEST_TOOL_ROOTS.
TOOL_ROOTS :=
# This defines the static analysis tools which will be run during the the tests. They should not
# be defined in TEST_TOOL_ROOTS. If a test with the same name exists, it should be defined in
# TEST_ROOTS.
# Note: Static analysis tools are in fact executables linked with the Pin Static Analysis Library.
# This library provides a subset of the Pin APIs which allows the tool to perform static analysis
# of an application or dll. Pin itself is not used when this tool runs.
SA_TOOL_ROOTS :=
# This defines all the applications that will be run during the tests.
APP_ROOTS :=
# This defines any additional object files that need to be compiled.
OBJECT_ROOTS :=
# This defines any additional dlls (shared objects), other than the pintools, that need to be compiled.
DLL_ROOTS :=
# This defines any static libraries (archives), that need to be built.
LIB_ROOTS :=
###### Place OS-specific definitions here ######
# Linux
ifeq ($(TARGET_OS),linux)
ifeq ($(TARGET),intel64)
TEST_TOOL_ROOTS +=
TEST_ROOTS += cross_32_64_32 cross_64_32_64 environment space_$(TARGET_OS) sigchld_cross child_process_injection \
child_process_injection1 cross_32_64_32_probe space_probe_$(TARGET_OS)
TOOL_ROOTS += follow_child_tool_dummy child_process_injection_dummy
SA_TOOL_ROOTS +=
APP_ROOTS += parent_process_$(TARGET_OS)_dummy child_process_$(TARGET_OS)_dummy \
grand_child_process_$(TARGET_OS)_dummy child_process_injection_app_dummy sigchld_app_dummy \
child_process_injection_app1_dummy
OBJECT_ROOTS +=
DLL_ROOTS +=
LIB_ROOTS +=
endif
endif
# macOS*
# Starting from macOS 10.14 clang doesn't support building 32 bits.
# Starting from macOS 10.15 32 bit binaries won't be able to run.
# Starting from clang 11 we build Pin only in 64 bit (since clang 11 don't support 32 bit), therefore it can't run 32 bit
# applications. (Therefore we don't run any tests here)
# Windows
ifeq ($(TARGET_OS),windows)
ifeq ($(TARGET),intel64)
TEST_TOOL_ROOTS +=
TEST_ROOTS += cross_32_64_32 cross_64_32_64 cross_32_64_32_probe cross_64_64_32_log cross_32_32_64_probe_log \
cross_32_64_32_sym cross_64_32_64_sym cross_32_64_32_probe_sym cross_64_32_64_probe_sym \
space_$(TARGET_OS) cross_64_32_early_termination cross_64_32_early_termination_probed \
cross_32_64_early_termination cross_32_64_early_termination_probed \
cross_64_32_early_termination_debugged cross_64_32_early_termination_probed_debugged \
cross_32_64_early_termination_debugged cross_32_64_early_termination_probed_debugged \
win_app32_tool_arch_mismatch win_app64_tool_arch_mismatch
TOOL_ROOTS += follow_child_tool_dummy follow_child_tool_sym_dummy
SA_TOOL_ROOTS +=
APP_ROOTS += parent_process_$(TARGET_OS)_dummy child_process_$(TARGET_OS)_dummy \
grand_child_process_$(TARGET_OS)_dummy early_termination_dummy \
win_launcher_process_dummy win_launcher_debugged_process_dummy
OBJECT_ROOTS +=
DLL_ROOTS += w_terminate_process_dll_dummy
LIB_ROOTS +=
endif
endif
###### Handle exceptions here ######
DONT_RUN :=
# The tests are supported only in the kit environment.
ifneq ($(KIT),1)
DONT_RUN := 1
endif
ifeq ($(DONT_RUN),1)
TEST_TOOL_ROOTS :=
TEST_ROOTS :=
TOOL_ROOTS :=
SA_TOOL_ROOTS :=
APP_ROOTS :=
OBJECT_ROOTS :=
DLL_ROOTS :=
LIB_ROOTS :=
endif
# Check whether child_process_injection1 can be tested on this system.
ifeq ($(TARGET_OS),linux)
# See if there is a help message and chfn can be used for the test.
CHFN_USABLE := $(shell if ( /usr/bin/chfn --help > /dev/null 2>&1 ); then echo yes; else echo no; fi)
ifeq (yes,$(CHFN_USABLE))
# See if Pin fails to inject, otherwise chfn can't be used for the test.
CHFN_USABLE := $(shell if [ `$(PIN) -- /usr/bin/chfn --help > /dev/null 2>&1; echo $$?` -ne "0" ]; then echo yes; else echo no; fi)
endif
ifneq (yes,$(CHFN_USABLE))
TEST_ROOTS := $(filter-out child_process_injection1, $(TEST_ROOTS))
endif
endif
# See Mantis 3197
ifeq ($(TARGET_OS),windows)
TEST_ROOTS := $(filter-out cross_32_64_early_termination_debugged cross_32_64_early_termination_probed_debugged \
cross_64_32_early_termination_debugged cross_64_32_early_termination_probed_debugged, \
$(TEST_ROOTS))
endif
# See Mantis #4211
ifeq ($(TARGET_OS),windows)
ifeq ($(TARGET),intel64)
ifeq ($(MSVCVER_GE_15), 1)
TEST_ROOTS := $(filter-out cross_32_64_32 cross_64_32_64 cross_32_64_32_probe cross_64_64_32_log cross_32_32_64_probe_log \
cross_32_64_32_sym cross_64_32_64_sym cross_32_64_32_probe_sym cross_64_32_64_probe_sym \
cross_64_32_early_termination cross_64_32_early_termination_probed \
cross_32_64_early_termination cross_32_64_early_termination_probed \
win_app32_tool_arch_mismatch win_app64_tool_arch_mismatch, $(TEST_ROOTS))
endif
endif
endif
###### Define the sanity subset ######
# This defines the list of tests that should run in sanity. It should include all the tests listed in
# TEST_TOOL_ROOTS and TEST_ROOTS excluding only unstable tests.
SANITY_SUBSET := $(TEST_TOOL_ROOTS) $(TEST_ROOTS)
# Disable child_process_injection1 on rhel6 (or lower) - see mantis 4781
ifeq ($(DIST_NAME_RHEL),1)
DIST_VER_LE_6 := $(shell $(TOOLS_ROOT)/Utils/testLinuxDistVersion lt 7.0)
ifeq ($(DIST_VER_LE_6),1)
SANITY_SUBSET := $(filter-out child_process_injection1, $(SANITY_SUBSET))
endif
endif
##############################################################
#
# Test recipes
#
##############################################################
# This section contains recipes for tests other than the default.
# See makefile.default.rules for the default test rules.
# All tests in this section should adhere to the naming convention: <testname>.test
ifeq ($(TARGET_OS),windows)
PINFLAGS += -cc_memory_size 0x2000000
endif
child_process_injection.test: $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) $(XOBJDIR)child_process_injection$(PINTOOL_SUFFIX) $(OBJDIR)child_process_injection_app$(EXE_SUFFIX) $(HELLO_APP)
$(PIN) -follow_execv 1 -t64 $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)child_process_injection$(PINTOOL_SUFFIX) \
-- $(OBJDIR)child_process_injection_app$(EXE_SUFFIX) $(HELLO_APP) > $(OBJDIR)$(@:%.test=%).out
$(QGREP) "Parent report: Child process exited successfully" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "End of tool" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "Hello world" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
# The xml error file is created by a grandchild child of the original Pin process, therefore the makefile recipe will not
# wait for it to be created. In order for the test to continue correctly, we allow a 60 second timeout for the file to be
# created. If the error file was not created after this time, the test will fail, indicating a potential problem. If this
# happens look for a runaway instance of $(OBJDIR)child_process_injection_app1$(EXE_SUFFIX).
child_process_injection1.test: $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) $(XOBJDIR)child_process_injection$(PINTOOL_SUFFIX) $(OBJDIR)child_process_injection_app1$(EXE_SUFFIX)
$(PIN) -follow_execv 1 -error_file $(OBJDIR)$(@:%.test=%).xml -t64 $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)child_process_injection$(PINTOOL_SUFFIX) -- $(OBJDIR)child_process_injection_app1$(EXE_SUFFIX) /usr/bin/chfn --help \
> $(OBJDIR)$(@:%.test=%).out
count=0; \
until $(BASHTEST) -e $(OBJDIR)$(@:%.test=%).xml || $(BASHTEST) $$count -gt 60; \
do sleep 1; count=`expr $$count + 1`; done
$(BASHTEST) -e $(OBJDIR)$(@:%.test=%).xml
$(QGREP) "Usage\:" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "chfn" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "Parent report: Child process exited successfully" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "End of tool" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "ERROR" $(OBJDIR)$(@:%.test=%).xml
$(QGREP) "/usr/bin/chfn" $(OBJDIR)$(@:%.test=%).xml
$(QGREP) "Pin can&apos;t be injected to the application" $(OBJDIR)$(@:%.test=%).xml
$(QGREP) "since it does not have read and execv access" $(OBJDIR)$(@:%.test=%).xml
$(QGREP) "need execute and read access to /proc" $(OBJDIR)$(@:%.test=%).xml
$(RM) $(OBJDIR)$(@:%.test=%).out $(OBJDIR)$(@:%.test=%).xml
# This test checks that if an app execvs to an application which pin cannot instrument due to permissions, while followExecv is on, it will run anyways.
# To do so we change the owner and permissions of an app so it is owned by root and runs setuid, pin cannot instrument it.
# We make sure the child exits successfully and prints its message.
# (4711 == -rws--x--x)
# Note: This test is not a Cross test, but kept here for consistency with child_process_injection1.
# Note: The roots are defined with '_dummy' as this file overrides the default build rules.
child_process_injection1_mac.test: $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) $(OBJDIR)child_process_injection_app1$(EXE_SUFFIX)
$(SUDO) $(CHOWN) root $(OBJDIR)setuid_utility$(EXE_SUFFIX)
$(SUDO) $(CHMOD) 4711 $(OBJDIR)setuid_utility$(EXE_SUFFIX)
$(PIN) -follow_execv 1 -t $(OBJDIR)child_process_injection$(PINTOOL_SUFFIX) -- $(OBJDIR)child_process_injection_app1$(EXE_SUFFIX) $(OBJDIR)setuid_utility$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(QGREP) "UtilityOK" $(OBJDIR)$(@:%.test=%).out
$(QGREP) "Parent report: Child process exited successfully" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_32.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_64.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_32_probe.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_64_32_log.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -xyzzy -log_server 1 -logfile $(OBJDIR)$(@:%.test=%).log -follow_execv \
-t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(BASHTEST) `$(RM) -vf $(OBJDIR)$(@:%.test=%).log* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_32_64_probe_log.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -xyzzy -log_server 1 -logfile "pin probe.log" -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(SYNC)
$(BASHTEST) `$(RM) -vf "pin probe.log"* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
sigchld_cross.test: $(XOBJDIR)sigchld_app$(EXE_SUFFIX) $(OBJDIR)sigchld_app$(EXE_SUFFIX)
$(PIN) -follow_execv -- $(XOBJDIR)sigchld_app$(EXE_SUFFIX) $(OBJDIR)sigchld_app$(EXE_SUFFIX)
$(DIFF) sigchld_app.out sigchld_app.reference
$(RM) sigchld_app.out
cross_32_64_32_sym.test: $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -xyzzy -log_server 1 -logfile $(OBJDIR)cross_32_64_32_sym.log -follow_execv \
-t64 $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(SYNC)
$(BASHTEST) `$(RM) -vf $(OBJDIR)cross_32_64_32_sym.log* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_64_sym.test: $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -xyzzy -log_server 1 -logfile $(OBJDIR)cross_64_32_64_sym.log -follow_execv \
-t64 $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(SYNC)
$(BASHTEST) `$(RM) -vf $(OBJDIR)cross_64_32_64_sym.log* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_32_probe_sym.test: $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -probe -xyzzy -log_server 1 -logfile $(OBJDIR)cross_32_64_32_probe_sym.log -follow_execv \
-t64 $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(XOBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(SYNC)
$(BASHTEST) `$(RM) -vf $(OBJDIR)cross_32_64_32_probe_sym.log* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_64_probe_sym.test: $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
$(PIN) -probe -xyzzy -log_server 1 -logfile $(OBJDIR)cross_64_32_64_probe_sym.log -follow_execv \
-t64 $(OBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool_sym$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
#verify 3 files are created (for 3 servers)
$(SYNC)
$(BASHTEST) `$(RM) -vf $(OBJDIR)cross_64_32_64_probe_sym.log* | $(LINECOUNT)` -eq "3"
$(RM) $(OBJDIR)$(@:%.test=%).out
environment.test: $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
export LD_LIBRARY_PATH="APP_PATH:"$(LD_LIBRARY_PATH); $(PIN) -follow_execv -xyzzy -mesgon log_injector \
-logfile $(OBJDIR)$(@:%.test=%).log \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(GREP) "LD_LIBRARY_PATH for injector" $(OBJDIR)$(@:%.test=%).log | $(GREP) $(TARGET)/runtime >> $(OBJDIR)$(@:%.test=%).out
$(GREP) "LD_LIBRARY_PATH for pin vm" $(OBJDIR)$(@:%.test=%).log | $(GREP) $(TARGET)/runtime/pincrt >> $(OBJDIR)$(@:%.test=%).out
$(GREP) "LD_LIBRARY_PATH for the application" $(OBJDIR)$(@:%.test=%).log | $(GREP) APP_PATH >> $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out $(OBJDIR)$(@:%.test=%).log
space_linux.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
mkdir -p "Dir with space 1"
$(PIN) -follow_execv -t64 "Dir with space 1"/../$(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t "Dir with space 1"/../$(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) -r $(OBJDIR)$(@:%.test=%).out "Dir with space 1"
space_mac.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
mkdir -p "Dir with space 1"
$(PIN) -follow_execv -t64 "Dir with space 1"/../$(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t "Dir with space 1"/../$(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) -r $(OBJDIR)$(@:%.test=%).out "Dir with space 1"
## space_probe fails if LD_LIBRARY_PATH is set incorrectly
space_probe_linux.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) $(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX)
mkdir -p "Dir with space 2"
$(PIN) -probe -follow_execv -t64 "Dir with space 2"/../$(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t "Dir with space 2"/../$(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) -r $(OBJDIR)$(@:%.test=%).out "Dir with space 2"
space_windows.test:
mkdir -p "bin ia 32"
mkdir -p "bin intel 64"
cp -r $(dir $(PIN32))/* "bin ia 32"
cp -r $(dir $(PIN64))/* "bin intel 64"
"bin ia 32/pin.exe" -p32 "bin ia 32/pin.exe" -p64 "bin intel 64/pin.exe" -follow_execv \
-t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)parent_process_$(TARGET_OS)$(EXE_SUFFIX) $(XOBJDIR)child_process_$(TARGET_OS)$(EXE_SUFFIX) \
$(OBJDIR)grand_child_process_$(TARGET_OS)$(EXE_SUFFIX) "param1 param2" param3 > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(RM) $(OBJDIR)$(@:%.test=%).out
-$(RM) -rf "bin ia 32" "bin intel 64"
cross_64_32_early_termination.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)win_launcher_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)win_launcher_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(OBJDIR)win_launcher_process $(XOBJDIR)early_termination$(EXE_SUFFIX) > $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_early_termination_probed.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)win_launcher_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)win_launcher_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(OBJDIR)win_launcher_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_early_termination.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_early_termination_probed.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(CGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_early_termination_debugged.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_64_32_early_termination_probed_debugged.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -probe -follow_execv \
-t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(OBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(XOBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_early_termination_debugged.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 0" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
cross_32_64_early_termination_probed_debugged.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX)
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
$(PIN) -probe -follow_execv -t64 $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) -load_system_dlls 1 \
-- $(XOBJDIR)win_launcher_debugged_process$(EXE_SUFFIX) $(OBJDIR)early_termination$(EXE_SUFFIX) \
> $(OBJDIR)$(@:%.test=%).out
$(BASHTEST) `$(CGREP) "In tool's main, probed = 1" $(OBJDIR)$(@:%.test=%).out` -eq "2"
$(BASHTEST) `$(CGREP) "At follow child callback" $(OBJDIR)$(@:%.test=%).out` -eq "1"
$(QGREP) "Terminating process in DllMain(PROCESS_ATTACH)" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
# Check pin fails when 64-bit tool applied to 32-bit application
win_app32_tool_arch_mismatch.test: $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(XOBJDIR)win_launcher_process$(EXE_SUFFIX)
-$(PIN) -t $(OBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(XOBJDIR)win_launcher_process$(EXE_SUFFIX) > $(OBJDIR)$(@:%.test=%).out 2>&1
@# Check tool load fails due to incompatible architecture
$(GREP) "System error 216" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
# Check pin fails when 32-bit tool applied to 64-bit application
win_app64_tool_arch_mismatch.test: $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) $(OBJDIR)win_launcher_process$(EXE_SUFFIX)
-$(PIN) -t $(XOBJDIR)follow_child_tool$(PINTOOL_SUFFIX) \
-- $(OBJDIR)win_launcher_process$(EXE_SUFFIX) > $(OBJDIR)$(@:%.test=%).out 2>&1
@# Check tool load fails due to incompatible architecture
$(GREP) "System error 216" $(OBJDIR)$(@:%.test=%).out
$(RM) $(OBJDIR)$(@:%.test=%).out
##############################################################
#
# Build rules
#
##############################################################
# This section contains the build rules for all binaries that have special build rules.
# See makefile.default.rules for the default build rules.
# Declare all the "dummy" targets as PHONY since they are simply used as wrappers
# and are never actually generated.
# Each dummy build rule invokes two real build rules - one for each architecture.
DUMMY_TOOLS := $(TOOL_ROOTS:%=$(OBJDIR)%$(PINTOOL_SUFFIX))
DUMMY_APPS := $(APP_ROOTS:%=$(OBJDIR)%$(EXE_SUFFIX))
DUMMY_DLLS := $(DLL_ROOTS:%=$(OBJDIR)$(DLL_PREFIX)%$(DLL_SUFFIX))
.PHONY: $(DUMMY_TOOLS) $(DUMMY_APPS) $(DUMMY_DLLS)
ifeq ($(OS_TYPE),win)
TARGET32 := TARGET ia32
TARGET64 := TARGET intel64
else
TARGET32 := TARGET=ia32
TARGET64 := TARGET=intel64
endif
###### Special tools' build rules ######
$(DUMMY_TOOLS): %: $(XOBJDIR) $(OBJDIR)
$(MAKE_PREFIX_ia32) make $(TARGET32) $(@:$(OBJDIR)%_dummy$(PINTOOL_SUFFIX)=$(XOBJDIR)%$(PINTOOL_SUFFIX))
$(MAKE_PREFIX_intel64) make $(TARGET64) $(@:$(OBJDIR)%_dummy$(PINTOOL_SUFFIX)=$(OBJDIR)%$(PINTOOL_SUFFIX))
###### Special applications' build rules ######
$(DUMMY_APPS): %: $(XOBJDIR) $(OBJDIR)
$(MAKE_PREFIX_ia32) make $(TARGET32) $(@:$(OBJDIR)%_dummy$(EXE_SUFFIX)=$(XOBJDIR)%$(EXE_SUFFIX))
$(MAKE_PREFIX_intel64) make $(TARGET64) $(@:$(OBJDIR)%_dummy$(EXE_SUFFIX)=$(OBJDIR)%$(EXE_SUFFIX))
$(OBJDIR)early_termination$(EXE_SUFFIX): early_termination.cpp $(OBJDIR)$(DLL_PREFIX)w_terminate_process_dll$(DLL_SUFFIX)
$(APP_CXX) $(APP_CXXFLAGS) $(COMP_EXE)$@ $< $(APP_LDFLAGS) $(OBJDIR)w_terminate_process_dll$(LIB_SUFFIX) $(APP_LIBS)
###### Special dlls' build rules ######
$(DUMMY_DLLS): %: $(XOBJDIR) $(OBJDIR)
$(MAKE_PREFIX_ia32) make $(TARGET32) $(@:$(OBJDIR)%_dummy$(DLL_SUFFIX)=$(XOBJDIR)%$(DLL_SUFFIX))
$(MAKE_PREFIX_intel64) make $(TARGET64) $(@:$(OBJDIR)%_dummy$(DLL_SUFFIX)=$(OBJDIR)%$(DLL_SUFFIX))
$(OBJDIR)$(DLL_PREFIX)w_terminate_process_dll$(DLL_SUFFIX): w_terminate_process_dll.cpp
$(APP_CXX) $(APP_CXXFLAGS) $(DLL_CXXFLAGS) $(COMP_EXE)$@ $< $(APP_LDFLAGS) $(DLL_LDFLAGS) $(APP_LIBS)