# ********************************************************** # Copyright (c) 2010-2023 Google, Inc. All rights reserved. # Copyright (c) 2009-2010 VMware, Inc. All rights reserved. # ********************************************************** # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # * Neither the name of VMware, Inc. nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. cmake_minimum_required(VERSION 3.7) include(${PROJECT_SOURCE_DIR}/make/policies.cmake NO_POLICY_SCOPE) ################################################## # drltracelib set(srcs drltrace.cpp drltrace_libcalls.cpp drltrace_options.cpp) if (WIN32) set(srcs ${srcs} ${PROJECT_SOURCE_DIR}/make/resources.rc) endif () set(DynamoRIO_USE_LIBC OFF) add_library(drltracelib SHARED ${srcs}) # We share the framework version # for now set_library_version(drltracelib ${DRMF_VERSION_MAJOR_MINOR}) if (WIN32) _DR_append_property_list(TARGET drltracelib COMPILE_DEFINITIONS "${DEFINES_NO_D};RC_IS_DRLTRACELIB") else () _DR_append_property_list(TARGET drltracelib COMPILE_DEFINITIONS "${DEFINES_NO_D}") endif () set(DynamoRIO_RPATH ON) set_target_properties(drltracelib PROPERTIES RUNTIME_OUTPUT_DIRECTORY${location_suffix} "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") configure_DynamoRIO_client(drltracelib) use_DynamoRIO_extension(drltracelib drmgr_static) use_DynamoRIO_extension(drltracelib drwrap_static) use_DynamoRIO_extension(drltracelib drx_static) use_DynamoRIO_extension(drltracelib drmf_drsyscall_static) use_DynamoRIO_extension(drltracelib drcovlib_static) use_DynamoRIO_extension(drltracelib droption) # XXX i#2429: DR's droption.h includes both and # we should remove and replace the strcmp comparison with # a std::string. Then we can remove special if here and below. if (UNIX) # to avoid conflicts with new declaration with "C" linkage in utils.h append_property_string(TARGET drltracelib COMPILE_FLAGS "-DNOLINK_STRCASESTR") endif() if (WIN32) # i#1805: see comment in drstrace/CMakeLists.txt. For VS2017 avoid _isdigit. append_property_string(TARGET drltracelib LINK_FLAGS "/force:multiple") endif () install(TARGETS drltracelib RUNTIME DESTINATION "${INSTALL_LIB}" # dll LIBRARY DESTINATION "${INSTALL_LIB}" # .so PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) copy_target_to_device(drltracelib) copy_and_adjust_drpaths(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} drltracelib) ################################################## # drltrace frontend set(front_srcs drltrace_frontend.cpp drltrace_options.cpp) if (WIN32) set(front_srcs ${front_srcs} ${PROJECT_SOURCE_DIR}/make/resources.rc) endif () macro(fix_win32_flags srcfile) if (WIN32) if (DEBUG) get_property(cur SOURCE ${srcfile} PROPERTY COMPILE_FLAGS) string(REPLACE "/MT " "" cur "${cur}") # Avoid override warning. set_source_files_properties(${srcfile} PROPERTIES COMPILE_FLAGS "${cur} /EHsc /MTd") append_property_string(SOURCE ${srcfile} LINK_FLAGS "/nodefaultlib:libcmt") else () append_property_string(SOURCE ${srcfile} COMPILE_FLAGS "/EHsc /MT") endif () endif () endmacro () fix_win32_flags(drltrace_frontend.cpp) add_executable(drltrace ${front_srcs}) configure_DynamoRIO_standalone(drltrace) use_DynamoRIO_extension(drltrace droption) target_link_libraries(drltrace drinjectlib drconfiglib drfrontendlib drmf_drsyscall_static) set_library_version(drltrace ${DRMF_VERSION}) if (WIN32) _DR_append_property_list(TARGET drltrace COMPILE_DEFINITIONS "${DEFINES_NO_D};RC_IS_DRLTRACE") else () _DR_append_property_list(TARGET drltrace COMPILE_DEFINITIONS "${DEFINES_NO_D}") endif () # XXX: see DR's i#2429 and comment above. if (UNIX) # to avoid conflicts with new declaration with "C" linkage in utils.h append_property_string(TARGET drltrace COMPILE_FLAGS "-DNOLINK_STRCASESTR") endif() install(TARGETS drltrace DESTINATION "${INSTALL_BIN}" PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) copy_target_to_device(drltrace) copy_and_adjust_drpaths(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} drltrace) ################################################## # drltrace config set(conf_out ${PROJECT_BINARY_DIR}/${BUILD_BIN}/drltrace.config) if (WIN32) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/drltrace_win.config ${conf_out} COPYONLY) else () configure_file(${CMAKE_CURRENT_SOURCE_DIR}/drltrace_linux.config ${conf_out} COPYONLY) endif () install(FILES ${conf_out} DESTINATION "${INSTALL_BIN}" PERMISSIONS ${owner_access} GROUP_READ WORLD_READ) copy_target_to_device(${conf_out}) ################################################## # drltrace tests # XXX i#1960: add more tests for drltrace that check the output contains # expected library calls. # if (BUILD_TOOL_TESTS) get_target_path_for_execution(drltrace_path drltrace) get_target_path_for_execution(app_path drsyscall_app) prefix_cmd_if_necessary(drltrace_path OFF ${drltrace_path}) add_test(drltrace ${drltrace_path} -- ${app_path}) add_test(drltrace_libcalls ${drltrace_path} -logdir - -print_ret_addr -- ${app_path}) add_test(drltrace_symargs ${drltrace_path} -logdir - -num_max_args 4 -- ${app_path}) add_test(drltrace_libargs ${drltrace_path} -logdir - -only_from_app -- ${app_path}) #regex strings for libcalls and arguments printing test set(libcall_ret " and return to module id:([0-9]+), offset:0x([0-9a-f]+)\n") if (WIN32) set(libcall_args1_01 " arg 0: 0x([0-9a-f]+) => 0x([0-9a-f]+) \\(type=void\\*, size=0x([0-9a-f]+)\\)\n") set(libcall_args1_02 " arg 2: 0x([0-9a-f]+) \\(type=size_t, size=0x([0-9a-f]+)\\)\n") set(libcall_args2_0 " arg 0: 0x([0-9a-f]+) \\(type=HANDLE, size=0x([0-9a-f]+)\\)\n") set(libcall_args2_1 " arg 1: 0x([0-9a-f]+) \\(type=int, size=0x([0-9a-f]+)\\)\n") set(libcall_name1 "~~([0-9a-f]+)~~ KERNELBASE.dll!VirtualQuery\n") set(libcall_name2 "~~([0-9a-f]+)~~ ntdll.dll!ZwQueryInformationProcess\n") set(libcall_printf "arg 0: done\n \\(type=char\\*, size=0x([0-9a-f]+)\\)\n") # some machines use WriteFile instead of printf, trying to handle both set(libcall_WriteFile "arg 2: 0x([0-9a-f]+) \\(type=DWORD, size=0x([0-9a-f]+)\\)\n") set(libcall_both_variants "${libcall_printf}\;${libcall_WriteFile}") else () set(libcall_both_variants " arg 0: done \\(type=char\\*, size=0x([0-9a-f]+)\\)\n") set(libcall_args1_01 ${libcall_both_variants}) set(libcall_args2_0 " arg 0: /dev/null \\(type=char\\*, size=0x([0-9a-f]+)\\)\n") set(libcall_args2_1 " arg 1: 0x([0-9a-f]+) \\(type=int, size=0x([0-9a-f]+)\\)\n") set(libcall_name1 "~~([0-9a-f]+)~~ libc.so.6!.*puts\n") set(libcall_name2 "~~([0-9a-f]+)~~ libc.so.6!.*open\n") endif(WIN32) set_tests_properties(drltrace_libcalls PROPERTIES PASS_REGULAR_EXPRESSION ${libcall_name1}${libcall_args1_01}${libcall_args1_02}${libcall_ret}) set_tests_properties(drltrace_symargs PROPERTIES PASS_REGULAR_EXPRESSION ${libcall_name2}${libcall_args2_0}${libcall_args2_1}) set_tests_properties(drltrace_libargs PROPERTIES PASS_REGULAR_EXPRESSION ${libcall_both_variants}) endif (BUILD_TOOL_TESTS)