include(../make/policies.cmake NO_POLICY_SCOPE)
add_definitions(-DDYNAMORIO_INTERNAL)
set(EXECUTABLE_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set_per_config_ouput_to_match_single_config()
include(../make/CMake_events.cmake)
add_custom_target(generate_syslog DEPENDS "${SYSLOG_SRCS}")
if (WIN32)
add_custom_target(generate_events DEPENDS "${EVENTS_SRCS}")
endif (WIN32)
function (add_gen_events_deps target)
add_dependencies(${target} generate_syslog)
if (WIN32)
add_dependencies(${target} generate_events)
endif ()
endfunction (add_gen_events_deps)
if (AARCH64)
include(../make/CMake_aarch64_gen_codec.cmake)
add_custom_target(gen_aarch64_codec DEPENDS "${AARCH64_CODEC_GEN_SRCS}")
include_directories(BEFORE ${PROJECT_BINARY_DIR})
set(aarch64_exported_opcodes ${BUILD_INCLUDE}/dr_ir_opcodes_aarch64.h)
add_custom_target(gen_aarch64_opcodes DEPENDS ${aarch64_exported_opcodes})
add_custom_command(OUTPUT ${aarch64_exported_opcodes}
DEPENDS ${PROJECT_BINARY_DIR}/opcode_api.h
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${PROJECT_BINARY_DIR}/opcode_api.h
${aarch64_exported_opcodes} VERBATIM)
endif ()
if (RISCV64)
include(../make/CMake_riscv64_gen_codec.cmake)
add_custom_target(gen_riscv64_codec DEPENDS "${RISCV64_CODEC_GEN_SRCS}")
include_directories(BEFORE ${PROJECT_BINARY_DIR})
set(riscv64_exported_opcodes ${BUILD_INCLUDE}/dr_ir_opcodes_riscv64.h)
set(riscv64_exported_instr ${BUILD_INCLUDE}/dr_ir_macros_riscv64.h)
add_custom_target(gen_riscv64_headers DEPENDS
${riscv64_exported_opcodes}
${riscv64_exported_instr})
add_custom_command(OUTPUT ${riscv64_exported_opcodes}
DEPENDS ${PROJECT_BINARY_DIR}/opcode_api.h
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${PROJECT_BINARY_DIR}/opcode_api.h
${riscv64_exported_opcodes} VERBATIM)
add_custom_command(OUTPUT ${riscv64_exported_instr}
DEPENDS ${PROJECT_BINARY_DIR}/instr_create_api.h
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${PROJECT_BINARY_DIR}/instr_create_api.h
${riscv64_exported_instr} VERBATIM)
endif ()
set(asm_deps
"${PROJECT_SOURCE_DIR}/core/arch/asm_defines.asm"
"${PROJECT_BINARY_DIR}/configure.h")
add_asm_target(arch/${DR_HOST_ARCH_NAME}/${DR_HOST_ARCH_NAME}.asm
arch_core_asm_src arch_core_asm_tgt "_core" "" "${asm_deps}")
if (NOT "${DR_HOST_ARCH_NAME}" STREQUAL "${DR_HOST_ARCH_NAME_SHARED}")
add_asm_target(arch/${DR_HOST_ARCH_NAME_SHARED}/${DR_HOST_ARCH_NAME_SHARED}.asm
archshared_core_asm_src archshared_core_asm_tgt
"_core" "" "${asm_deps}")
endif ()
add_asm_target(arch/pre_inject_asm.asm preinject_asm_src preinject_asm_tgt ""
"-DNOT_DYNAMORIO_CORE_PROPER" "${asm_deps}")
if (UNIX)
add_asm_target(arch/${DR_HOST_ARCH_NAME}/memfuncs.asm memfuncs_asm_src memfuncs_asm_tgt
"_memfuncs" "" "${asm_deps}")
add_library(drmemfuncs STATIC ${memfuncs_asm_src} lib/memmove.c)
add_gen_events_deps(drmemfuncs)
if (APP_EXPORTS)
add_dependencies(drmemfuncs api_headers)
endif ()
endif ()
add_asm_target(drlibc/drlibc_xarch.asm drlibc_xarch_asm_src drlibc_xarch_asm_tgt
"_core" "" "${asm_deps}")
add_asm_target(drlibc/drlibc_${DR_HOST_ARCH_NAME}.asm drlibc_arch_asm_src
drlibc_arch_asm_tgt
"" "" "${asm_deps}")
set(DRLIBC_SRCS
${drlibc_xarch_asm_src}
${drlibc_arch_asm_src}
drlibc/drlibc.c
drlibc/drlibc_notdr_dcxt.c
drlibc/drlibc_notdr_error.c
drlibc/drlibc_notdr_ignoreassert.c
drlibc/drlibc_notdr_logfile.c
drlibc/drlibc_notdr_printlog.c
drlibc/drlibc_notdr_report.c
drlibc/drlibc_notdr_saferead.c
drlibc/drlibc_notdr_stats.c)
if (UNIX)
set(DRLIBC_SRCS ${DRLIBC_SRCS} drlibc/drlibc_unix.c)
if (APPLE)
set(DRLIBC_SRCS ${DRLIBC_SRCS} drlibc/drlibc_module_macho.c)
else ()
set(DRLIBC_SRCS ${DRLIBC_SRCS} drlibc/drlibc_module_elf.c)
endif ()
endif ()
add_library(drlibc STATIC ${DRLIBC_SRCS})
set_target_properties(drlibc PROPERTIES LINKER_LANGUAGE C)
if (UNIX)
append_property_string(TARGET drlibc COMPILE_FLAGS "-fPIC")
endif ()
add_gen_events_deps(drlibc)
if (AARCH64)
add_dependencies(drlibc gen_aarch64_codec)
elseif (RISCV64)
add_dependencies(drlibc gen_riscv64_codec)
endif (AARCH64)
if (WIN32 AND "${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_dependencies(drlibc ${drlibc_xarch_asm_tgt} ${drlibc_arch_asm_tgt})
endif ()
set(CORE_SRCS
options.c
dynamo.c
fragment.c
fcache.c
link.c
dispatch.c
emit.c
utils.c
config.c
stats.c
heap.c
monitor.c
perfctr.c
vmareas.c
rct.c
hotpatch.c
hashtable.c
module_list.c
moduledb.c
perscache.c
nudge.c
synch.c
buildmark.c
loader_shared.c
io.c
native_exec.c
lib/instrument.c
lib/module_api.c
translate.c
annotations.c
jit_opt.c
)
if (UNIX)
set(CORE_SRCS ${CORE_SRCS} string.c)
endif (UNIX)
if (ARM)
macro (add_libgcc_routines name)
set(TODEFINE "L_${name}")
set(genfile ${CMAKE_CURRENT_BINARY_DIR}/libgcc_${name}.S)
configure_file(../third_party/libgcc/arm/lib1funcs.S ${genfile} @ONLY)
set(CORE_SRCS ${CORE_SRCS} ${genfile})
endmacro ()
add_libgcc_routines(udivsi3)
add_libgcc_routines(umodsi3)
add_libgcc_routines(divsi3)
add_libgcc_routines(modsi3)
include_directories(../third_party/libgcc/arm)
endif (ARM)
if (UNIX)
if (ARM OR (X86 AND NOT X64))
set(CORE_SRCS ${CORE_SRCS} ../third_party/libgcc/udivmoddi4.c)
endif()
endif ()
if (WIN32 AND NOT X64)
set_source_files_properties(io.c COMPILE_FLAGS "/QIfist")
set_source_files_properties(utils.c COMPILE_FLAGS "/QIfist")
endif (WIN32 AND NOT X64)
set(DECODER_SRCS
ir/opnd_shared.c
ir/${ARCH_NAME_SHARED}/opnd.c
ir/instr_shared.c
ir/${ARCH_NAME}/instr.c
ir/instrlist.c
ir/decode_shared.c
ir/${ARCH_NAME}/decode.c
ir/encode_shared.c
ir/${ARCH_NAME}/encode.c
ir/disassemble_shared.c
ir/${ARCH_NAME}/disassemble.c
ir/ir_utils_shared.c
ir/${ARCH_NAME_SHARED}/ir_utils.c
)
if (X86)
set(DECODER_SRCS ${DECODER_SRCS}
ir/${ARCH_NAME}/decode_table.c
ir/${ARCH_NAME}/decode_fast.c)
elseif (ARM)
set(DECODER_SRCS ${DECODER_SRCS}
ir/${ARCH_NAME}/table_a32_pred.c
ir/${ARCH_NAME}/table_a32_unpred.c
ir/${ARCH_NAME}/table_encode.c
ir/${ARCH_NAME}/table_t32_base.c
ir/${ARCH_NAME}/table_t32_coproc.c
ir/${ARCH_NAME}/table_t32_16.c
ir/${ARCH_NAME}/table_t32_16_it.c)
elseif (AARCH64)
set(DECODER_SRCS ${DECODER_SRCS}
ir/${ARCH_NAME}/codec.c
ir/${ARCH_NAME}/build_ldstex.c)
elseif (RISCV64)
set(DECODER_SRCS ${DECODER_SRCS}
ir/${ARCH_NAME}/codec.c)
endif ()
set(ARCH_SRCS
arch/arch.c
arch/emit_utils_shared.c
arch/${ARCH_NAME}/emit_utils.c
arch/${ARCH_NAME_SHARED}/emit_utils.c
${DECODER_SRCS}
arch/interp.c
arch/proc_shared.c
arch/${ARCH_NAME}/proc.c
arch/mangle_shared.c
arch/${ARCH_NAME_SHARED}/mangle.c
arch/clean_call_opt_shared.c
arch/${ARCH_NAME}/clean_call_opt.c
arch/x86_code.c
${arch_core_asm_src}
${archshared_core_asm_src}
arch/${ARCH_NAME}/optimize.c
arch/sideline.c
arch/retcheck.c
)
if (X86 AND X64)
set(ARCH_SRCS ${ARCH_SRCS} arch/${ARCH_NAME}/x86_to_x64.c)
endif (X86 AND X64)
if (WIN32)
if (X64)
set(ntimp_def "${PROJECT_SOURCE_DIR}/core/win32/ntdll_imports_x64.def")
else (X64)
set(ntimp_def "${PROJECT_SOURCE_DIR}/core/win32/ntdll_imports.def")
endif (X64)
add_library(ntdll_imports SHARED win32/ntdll_imports.c ${ntimp_def})
append_property_string(TARGET ntdll_imports LINK_FLAGS "/ignore:4197")
DynamoRIO_get_full_path(ntimp_flags ntdll_imports "${location_suffix}")
string(REPLACE ".dll" ".lib" ntimp_flags ${ntimp_flags})
DR_export_target(ntdll_imports)
install_exported_target(ntdll_imports ${INSTALL_LIB_BASE})
endif (WIN32)
_DR_get_static_libc_list(static_libc_list)
if (WIN32)
if (DEBUG)
set(WIN32_C_LIB libcmtd)
else (DEBUG)
set(WIN32_C_LIB libcmt)
endif (DEBUG)
set(NOLIBC_DLL_ENTRY /entry:DllMain)
endif ()
if (UNIX)
set(OSNAME unix)
set(OS_SRCS
unix/os.c
unix/signal.c
unix/module.c
unix/pcprofile.c
unix/stackdump.c
unix/diagnost.c
unix/loader.c
)
if (LINUX)
if (ANDROID)
set(OS_SRCS ${OS_SRCS} unix/loader_android.c)
else ()
set(OS_SRCS ${OS_SRCS} unix/loader_linux.c)
endif ()
set(OS_SRCS ${OS_SRCS} unix/memquery_linux.c)
set(OS_SRCS ${OS_SRCS} unix/memquery.c)
set(OS_SRCS ${OS_SRCS} unix/memcache.c)
set(OS_SRCS ${OS_SRCS} unix/module_elf.c)
set(OS_SRCS ${OS_SRCS} unix/ksynch_linux.c)
if (ARM OR AARCH64 OR RISCV64)
set(OS_SRCS ${OS_SRCS} unix/tls_linux_risc.c)
else ()
set(OS_SRCS ${OS_SRCS} unix/tls_linux_${ARCH_NAME}.c)
endif ()
set(OS_SRCS ${OS_SRCS} unix/signal_linux.c)
set(OS_SRCS ${OS_SRCS} unix/signal_linux_${ARCH_NAME}.c)
set(OS_SRCS ${OS_SRCS} unix/native_elf.c)
set(OS_SRCS ${OS_SRCS} unix/nudgesig.c)
set(OS_SRCS ${OS_SRCS} unix/rseq_linux.c)
elseif (APPLE)
set(OS_SRCS ${OS_SRCS} unix/loader_macos.c)
set(OS_SRCS ${OS_SRCS} unix/memquery_macos.c)
set(OS_SRCS ${OS_SRCS} unix/memquery.c)
set(OS_SRCS ${OS_SRCS} unix/module_macho.c)
set(OS_SRCS ${OS_SRCS} unix/ksynch_macos.c)
set(OS_SRCS ${OS_SRCS} unix/tls_macos.c)
set(OS_SRCS ${OS_SRCS} unix/signal_macos.c)
set(OS_SRCS ${OS_SRCS} unix/native_macho.c)
elseif (VMKERNEL)
set(VMKUW_DIR ${PROJECT_SOURCE_DIR}/../internal/core/linux)
include_directories(${VMKUW_DIR})
set(OS_SRCS ${OS_SRCS} ${VMKUW_DIR}/vmkuw.c)
set(OS_SRCS ${OS_SRCS} unix/memquery_emulate.c)
set(OS_SRCS ${OS_SRCS} unix/memcache.c)
set(OS_SRCS ${OS_SRCS} unix/module_elf.c)
set(OS_SRCS ${OS_SRCS} unix/ksynch_linux.c)
set(OS_SRCS ${OS_SRCS} unix/signal_linux.c)
endif ()
set(PRELOAD_NAME drpreload)
set(PRELOAD_SRCS
unix/preload.c
config.c
string.c
io.c
)
set(INJECTOR_SRCS
unix/injector.c
config.c
string.c
io.c
)
else (UNIX)
set(OSNAME win32)
set(OS_SRCS
win32/eventlog.c
win32/os.c
win32/syscall.c
win32/callback.c
win32/drmarker.c
win32/ntdll_shared.c
win32/ntdll.c
win32/inject.c
win32/inject_shared.c
win32/module.c
win32/module_shared.c
win32/native_pe.c
win32/diagnost.c
win32/aslr.c
win32/loader.c
win32/drwinapi/drwinapi.c
win32/drwinapi/ntdll_redir.c
win32/drwinapi/kernel32_redir.c
win32/drwinapi/kernel32_proc.c
win32/drwinapi/kernel32_lib.c
win32/drwinapi/kernel32_mem.c
win32/drwinapi/kernel32_file.c
win32/drwinapi/kernel32_sync.c
win32/drwinapi/kernel32_misc.c
win32/drwinapi/rpcrt4_redir.c
win32/drwinapi/advapi32_redir.c
win32/resources.rc
)
set(PRELOAD_SRCS
win32/pre_inject.c
win32/ntdll_shared.c
win32/ntdll.c
win32/inject_shared.c
win32/drmarker.c
${preinject_asm_src}
win32/module_shared.c
win32/resources.rc
config.c
win32/os.c
io.c
)
set(PRELOAD_NAME drpreinject)
set(INJECTOR_SRCS
win32/injector.c
win32/inject.c
win32/inject_shared.c
win32/module_shared.c
win32/ntdll_shared.c
win32/ntdll.c
win32/resources.rc
config.c
win32/os.c
io.c
)
add_library(drearlyhelp1 SHARED
win32/early_inject_helper1.c
win32/resources.rc
)
set_target_properties(drearlyhelp1 PROPERTIES
COMPILE_DEFINITIONS "RC_IS_EARLY1")
set_target_properties(drearlyhelp1 PROPERTIES
LINK_FLAGS "${LD_FLAGS} /dll /NODEFAULTLIB /base:0x70FF0000 ${NOLIBC_DLL_ENTRY}")
target_link_libraries(drearlyhelp1 drearlyhelp2)
add_library(drearlyhelp2 SHARED
win32/early_inject_helper2.c
win32/resources.rc
)
set_target_properties(drearlyhelp2 PROPERTIES
COMPILE_DEFINITIONS "RC_IS_EARLY2")
set_target_properties(drearlyhelp2 PROPERTIES
LINK_FLAGS "${LD_FLAGS} /dll /NODEFAULTLIB /base:0x71110000 ${NOLIBC_DLL_ENTRY}")
endif (UNIX)
function (configure_core_lib target)
set_target_properties(${target} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY${location_suffix} "${DR_LIBRARY_OUTPUT_DIRECTORY}"
RUNTIME_OUTPUT_DIRECTORY${location_suffix} "${DR_LIBRARY_OUTPUT_DIRECTORY}"
ARCHIVE_OUTPUT_DIRECTORY${location_suffix} "${DR_LIBRARY_OUTPUT_DIRECTORY}")
add_gen_events_deps(${target})
if (AARCH64)
add_dependencies(${target} gen_aarch64_codec)
elseif (RISCV64)
add_dependencies(${target} gen_riscv64_codec)
endif()
if (WIN32)
add_dependencies(${target} ntdll_imports)
endif ()
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_dependencies(${target} ${arch_core_asm_tgt} ${archshared_core_asm_tgt})
endif ()
target_link_libraries(${target} drlibc)
copy_target_to_device(${target} "${location_suffix}")
if (APP_EXPORTS)
add_dependencies(${target} api_headers)
endif ()
if (UNIX)
set(dynamorio_link_flags "")
if (APPLE)
set(dynamorio_link_flags "${dynamorio_link_flags} -Xlinker -bind_at_load")
else (APPLE)
set(dynamorio_link_flags "${dynamorio_link_flags} -Xlinker -z -Xlinker now")
endif (APPLE)
if (APPLE AND NOT X64)
set(dynamorio_link_flags "-read_only_relocs suppress")
endif ()
if (APPLE)
else (APPLE)
set(dynamorio_link_flags "${dynamorio_link_flags} -Xlinker -Bsymbolic")
endif (APPLE)
set(dynamorio_link_flags "${dynamorio_link_flags} -nostdlib")
if (APPLE)
set(dynamorio_link_flags "${dynamorio_link_flags} -init __init")
endif (APPLE)
set_target_properties(${target} PROPERTIES
LINK_FLAGS "${dynamorio_link_flags}")
string(REGEX REPLACE
"^([0-9]+\\.[0-9]+).*" "\\1" VERSION_MAJOR_MINOR "${VERSION_NUMBER}")
if (WINDOWS)
set_target_properties(${target} PROPERTIES
VERSION "${VERSION_MAJOR_MINOR}" SOVERSION "${VERSION_MAJOR_MINOR}")
endif ()
else (UNIX)
set_target_properties(${target} PROPERTIES
COMPILE_DEFINITIONS "RC_IS_CORE;INCLUDE_EVENTS"
COMPILE_FLAGS "/Gs65536")
if ("${CMAKE_GENERATOR}" MATCHES "Ninja" AND
"${CMAKE_VERSION}" VERSION_LESS "2.8.9.20120822")
message(FATAL_ERROR "cmake at least version 2.8.9.20120822 is required for Ninja")
endif ()
endif (UNIX)
endfunction (configure_core_lib)
add_library(dynamorio SHARED
${CORE_SRCS} ${ARCH_SRCS} ${OS_SRCS}
${PROJECT_SOURCE_DIR}/make/ldscript.cmake
)
configure_core_lib(dynamorio)
if (UNIX)
target_link_libraries(dynamorio drmemfuncs)
endif ()
if (UNIX)
append_property_string(TARGET dynamorio LINK_FLAGS "-Wl,${ld_entry_flag},_start")
if (NOT HAVE_FVISIBILITY)
message(FATAL_ERROR "-fvisibility is required to build")
endif (NOT HAVE_FVISIBILITY)
set_preferred_base_start_and_end(dynamorio ${preferred_base} ON)
if (APPLE)
target_link_libraries(dynamorio dl)
endif ()
if (LINUX)
get_filename_component(binutils_path ${CMAKE_LINKER} PATH)
if (APPLE)
set(readelf_name "greadelf")
else (APPLE)
set(readelf_name "readelf")
endif (APPLE)
find_program(READELF_EXECUTABLE ${readelf_name} HINTS "${binutils_path}"
DOC "path to readelf")
if (NOT READELF_EXECUTABLE)
message("${readelf_name} not found: not checking SElinux or execstack")
else ()
set(locvar_name dynamorioloc)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}.cmake" CONTENT
"set(${locvar_name} \"$<TARGET_FILE:dynamorio>\")\n")
set(check_deps OFF)
if (NOT APPLE)
set(check_deps ON)
endif ()
if (X64 OR DEBUG OR NOT CLANG)
set(check_textrel ON)
else ()
set(check_textrel OFF)
endif ()
add_custom_command(TARGET dynamorio
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -D lib_fileloc=${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}
-D check_textrel=${check_textrel}
-D check_deps=${check_deps}
-D check_libc=${BUILD_PACKAGE}
-D check_interp=ON
-D READELF_EXECUTABLE=${READELF_EXECUTABLE}
-P ${CMAKE_CURRENT_SOURCE_DIR}/CMake_readelf.cmake
VERBATIM
)
endif ()
endif ()
else (UNIX)
if (X64)
set(DEF_SRC lib/dr_ntdll_x64.def)
else (X64)
set(DEF_SRC lib/dr_ntdll.def)
endif (X64)
set(DEF_BLD ${CMAKE_CURRENT_BINARY_DIR}/dr_ntdll.def)
file(READ ${DEF_SRC} string)
file(WRITE ${DEF_BLD} "${string}")
set(FORWARD_TO_NTDLL "/def:\"${DEF_BLD}\" /ignore:4197")
set(dynamorio_link_flags /NODEFAULTLIB)
if (X64)
set(dynamorio_link_flags "${dynamorio_link_flags} /dynamicbase:no /FIXED")
endif (X64)
if (DEBUG)
set(LD_FLAGS "${LINK_DBG} /release /opt:ref")
else (DEBUG)
set(LD_FLAGS "${LINK_DBG} /release /opt:ref /opt:icf")
endif (DEBUG)
if (SET_PREFERRED_BASE)
set(dynamorio_link_flags "${dynamorio_link_flags} /base:${preferred_base}")
endif (SET_PREFERRED_BASE)
if (X64)
set(LD_FLAGS "${LD_FLAGS} /machine:X64")
else (X64)
set(LD_FLAGS "${LD_FLAGS} /machine:I386")
endif (X64)
set(dynamorio_link_flags
"${LD_FLAGS} ${ntimp_flags} ${dynamorio_link_flags} /dll /incremental:no")
set(dynamorio_link_flags
"${dynamorio_link_flags} ${NOLIBC_DLL_ENTRY} ${FORWARD_TO_NTDLL}")
DynamoRIO_get_full_path(drout dynamorio "${location_suffix}")
get_filename_component(drpath ${drout} PATH)
get_filename_component(drname ${drout} NAME_WE)
set(dynamorio_link_flags
"${dynamorio_link_flags} /map:\"${drpath}/${drname}.map\" /mapinfo:exports")
set(dynamorio_link_flags
"${dynamorio_link_flags} /export:dynamo_auto_start /export:dynamorio_app_take_over")
if (APP_EXPORTS)
set(dynamorio_link_flags
"${dynamorio_link_flags} /export:dr_app_start /export:dr_app_take_over")
set(dynamorio_link_flags
"${dynamorio_link_flags} /export:dr_app_running_under_dynamorio")
endif (APP_EXPORTS)
set(dynamorio_link_flags "${dynamorio_link_flags} /export:dr_try_start")
set(dynamorio_link_flags "${dynamorio_link_flags} /export:dr_call_on_clean_stack")
if (NOT X64)
set(dynamorio_link_flags "${dynamorio_link_flags} /export:dr_invoke_x64_routine")
endif (NOT X64)
if (WINDOWS)
set(dynamorio_link_flags
"${dynamorio_link_flags} /export:dynamorio_earliest_init_takeover")
endif (WINDOWS)
if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0)
set(dynamorio_link_flags "${dynamorio_link_flags} msvcrt.lib")
endif ()
set_target_properties(dynamorio PROPERTIES LINK_FLAGS "${dynamorio_link_flags}")
find_program(DUMPBIN_EXECUTABLE dumpbin.exe HINTS "${cl_path}" DOC "path to dumpbin.exe")
if (DUMPBIN_EXECUTABLE)
add_custom_command(TARGET dynamorio
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -D lib=${drout}
-D DUMPBIN_EXECUTABLE=${DUMPBIN_EXECUTABLE}
-P ${CMAKE_CURRENT_SOURCE_DIR}/CMake_checkdeps.cmake
VERBATIM)
else ()
message(STATUS "Cannot find dumpbin so not performing dependence check")
endif ()
endif (UNIX)
function (configure_static_core_lib name hide_symbols)
add_library(${name} STATIC
${CORE_SRCS} ${ARCH_SRCS} ${OS_SRCS})
configure_core_lib(${name})
append_property_list(TARGET ${name} COMPILE_DEFINITIONS "STATIC_LIBRARY")
if (UNIX)
append_property_string(TARGET ${name} COMPILE_FLAGS "-fPIC")
target_link_libraries(${name} dl)
if (NOT EXISTS ${CMAKE_OBJCOPY})
message( "${name} requires objcopy")
endif ()
set(locvar_name ${name}_loc)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}.cmake" CONTENT
"set(${locvar_name} \"$<TARGET_FILE:${name}>\")\n")
string(REPLACE " " "\;" partial_link_flags "${CMAKE_C_FLAGS}")
set(disable_pie_flag)
CHECK_C_COMPILER_FLAG("-no-pie" no_pie_avail)
if (no_pie_avail)
set(disable_pie_flag "-no-pie")
endif ()
add_custom_command(TARGET ${name}
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -D lib_fileloc=${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}
-D CMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-D partial_link_flags=${partial_link_flags}
-D disable_pie_flag=${disable_pie_flag}
-D localize_hidden=${hide_symbols}
-D CMAKE_OBJCOPY=${CMAKE_OBJCOPY}
-D CMAKE_AR=${CMAKE_AR}
-D CMAKE_RANLIB=${CMAKE_RANLIB}
-P ${CMAKE_CURRENT_SOURCE_DIR}/CMake_finalize_static_lib.cmake
WORKING_DIRECTORY ${DR_LIBRARY_OUTPUT_DIRECTORY}
VERBATIM
)
else (UNIX)
target_link_libraries(${name} ${WIN32_C_LIB} ntdll_imports)
endif (UNIX)
endfunction()
if (NOT APPLE)
configure_static_core_lib(dynamorio_static OFF)
if (LINUX AND READELF_EXECUTABLE)
set(locvar_name dynamorio_static_loc)
add_custom_command(TARGET dynamorio_static
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -D lib_fileloc=${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}
-D READELF_EXECUTABLE=${READELF_EXECUTABLE}
-D CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}
-D X86=${X86}
-D X64=${X64}
-D DEBUG=${DEBUG}
-P ${CMAKE_CURRENT_SOURCE_DIR}/CMake_symbol_check.cmake
VERBATIM
)
endif ()
endif (NOT APPLE)
add_library(${PRELOAD_NAME} SHARED ${PRELOAD_SRCS})
if (UNIX)
set(preload_dest "${DR_LIBRARY_OUTPUT_DIRECTORY}")
else (UNIX)
set(preload_dest "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
endif (UNIX)
set_target_properties(${PRELOAD_NAME} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY${location_suffix} "${preload_dest}"
RUNTIME_OUTPUT_DIRECTORY${location_suffix} "${preload_dest}"
ARCHIVE_OUTPUT_DIRECTORY${location_suffix} "${preload_dest}")
add_gen_events_deps(${PRELOAD_NAME})
if (AARCH64)
add_dependencies(${PRELOAD_NAME} gen_aarch64_codec)
elseif (RISCV64)
add_dependencies(${PRELOAD_NAME} gen_riscv64_codec)
endif()
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_dependencies(${PRELOAD_NAME} ${preinject_asm_tgt})
endif ()
target_link_libraries(${PRELOAD_NAME} drlibc)
if (UNIX)
target_link_libraries(${PRELOAD_NAME} drmemfuncs)
endif ()
copy_target_to_device(${PRELOAD_NAME} "${location_suffix}")
set_target_properties(${PRELOAD_NAME} PROPERTIES
COMPILE_DEFINITIONS "NOT_DYNAMORIO_CORE_PROPER;RC_IS_PRELOAD;DR_NO_FAST_IR")
if (UNIX)
set_target_properties(${PRELOAD_NAME} PROPERTIES
LINK_FLAGS "-nostartfiles")
if (APPLE)
target_link_libraries(${PRELOAD_NAME} dynamorio)
append_property_string(TARGET ${PRELOAD_NAME} LINK_FLAGS "-init __init")
endif (APPLE)
if (LINUX AND READELF_EXECUTABLE)
set(locvar_name drpreloadloc)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}.cmake" CONTENT
"set(${locvar_name} \"$<TARGET_FILE:${PRELOAD_NAME}>\")\n")
add_custom_command(TARGET ${PRELOAD_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -D lib_fileloc=${CMAKE_CURRENT_BINARY_DIR}/${locvar_name}
-D check_textrel=ON
-D check_deps=OFF
-D check_libc=${BUILD_PACKAGE}
-D check_interp=ON
-D READELF_EXECUTABLE=${READELF_EXECUTABLE}
-P ${CMAKE_CURRENT_SOURCE_DIR}/CMake_readelf.cmake
VERBATIM
)
endif ()
else (UNIX)
set(pre_link_flags
"${LD_FLAGS} /dll /incremental:no /base:0x14000000 /NODEFAULTLIB ${NOLIBC_DLL_ENTRY}")
set_target_properties(${PRELOAD_NAME} PROPERTIES LINK_FLAGS "${pre_link_flags}")
target_link_libraries(${PRELOAD_NAME} ${static_libc_list} ntdll_imports
kernel32 dynamorio)
endif (UNIX)
add_library(drdecode STATIC
${DECODER_SRCS}
ir/decodelib.c
string.c
io.c
)
set_target_properties(drdecode PROPERTIES
COMPILE_DEFINITIONS "NOT_DYNAMORIO_CORE_PROPER;STANDALONE_DECODER")
if (UNIX)
append_property_string(TARGET drdecode COMPILE_FLAGS "-fPIC")
endif (UNIX)
add_gen_events_deps(drdecode)
if (AARCH64)
add_dependencies(drdecode gen_aarch64_codec)
elseif (RISCV64)
add_dependencies(drdecode gen_riscv64_codec)
endif()
target_link_libraries(drdecode drlibc)
if (WIN32)
set(inject_lib_type SHARED)
else ()
set(inject_lib_type STATIC)
endif ()
add_library(drinjectlib ${inject_lib_type} ${INJECTOR_SRCS})
add_gen_events_deps(drinjectlib)
target_link_libraries(drinjectlib drdecode drlibc)
if (UNIX)
target_link_libraries(drinjectlib drmemfuncs)
endif ()
set_target_properties(drinjectlib PROPERTIES
COMPILE_DEFINITIONS "NOT_DYNAMORIO_CORE_PROPER;RC_IS_DRINJECTLIB")
if (WIN32)
set(drinjectlib_link_flags
"${LD_FLAGS} /incremental:no /subsystem:console /NODEFAULTLIB")
set_target_properties(drinjectlib PROPERTIES LINK_FLAGS "${drinjectlib_link_flags}")
target_link_libraries(drinjectlib drdecode ${static_libc_list}
ntdll_imports kernel32 advapi32 imagehlp)
add_custom_command(TARGET drinjectlib POST_BUILD COMMAND ${CMAKE_COMMAND}
ARGS -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/drinjectlib.dll"
"${EXECUTABLE_OUTPUT_DIRECTORY}/" VERBATIM)
endif (WIN32)
if (ANNOTATIONS)
set(BUILD_ANNOTATION "${BUILD_INCLUDE}/annotations")
set(BUILD_ANNOTATION "${BUILD_INCLUDE}/annotations" PARENT_SCOPE)
file(MAKE_DIRECTORY ${BUILD_ANNOTATION})
if (NOT WINDOWS OR NOT X64)
configure_file("${PROJECT_SOURCE_DIR}/third_party/valgrind/valgrind.h"
"${BUILD_ANNOTATION}/valgrind.h" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/third_party/valgrind/memcheck.h"
"${BUILD_ANNOTATION}/memcheck.h" COPYONLY)
endif (NOT WINDOWS OR NOT X64)
configure_file("${PROJECT_SOURCE_DIR}/core/lib/dr_annotations_asm.h"
"${BUILD_ANNOTATION}/dr_annotations_asm.h" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/core/lib/dr_annotations.h"
"${BUILD_ANNOTATION}/dr_annotations.h" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/core/lib/dr_annotations.c"
"${BUILD_ANNOTATION}/dr_annotations.c" COPYONLY)
include_directories("${BUILD_ANNOTATION}")
endif ()
if (BUILD_TESTS AND
((CMAKE_CROSSCOMPILING AND DEFINED CMAKE_FIND_ROOT_PATH) OR
(NOT DR_HOST_NOT_TARGET)))
add_executable(unit_tests unit_tests.c
${CORE_SRCS} ${ARCH_SRCS} ${OS_SRCS} arch/x86_code_test.c)
add_gen_events_deps(unit_tests)
if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_dependencies(unit_tests ${arch_core_asm_tgt} ${archshared_core_asm_tgt}
ntdll_imports)
endif ()
set(unit_tests_extra_flags "")
if (UNIX AND NOT DEBUG)
set(unit_tests_extra_flags "${unit_tests_extra_flags} -Wno-array-bounds")
endif ()
if (proc_supports_avx512)
if (UNIX)
set(unit_tests_extra_flags
"${unit_tests_extra_flags} ${CFLAGS_AVX512}")
endif ()
elseif (proc_supports_avx)
if (UNIX)
set(unit_tests_extra_flags
"${unit_tests_extra_flags} ${CFLAGS_AVX}")
endif ()
endif ()
if (proc_supports_avx OR proc_supports_avx512)
if (UNIX)
if (CLANG)
set_source_files_properties(arch/x86_code_test.c PROPERTIES COMPILE_FLAGS
"-mllvm -x86-use-vzeroupper=0")
else ()
set_source_files_properties(arch/x86_code_test.c PROPERTIES COMPILE_FLAGS
"-mno-vzeroupper")
endif ()
endif ()
endif ()
set_target_properties(unit_tests PROPERTIES
COMPILE_DEFINITIONS "RC_IS_TEST;STANDALONE_UNIT_TEST"
COMPILE_FLAGS "${unit_tests_extra_flags}"
RUNTIME_OUTPUT_DIRECTORY${location_suffix} "${EXECUTABLE_OUTPUT_DIRECTORY}")
if (UNIX)
if (NOT APPLE)
append_property_string(TARGET unit_tests LINK_FLAGS "-Wl,${ld_entry_flag},_start")
endif ()
if (NOT ANDROID)
target_link_libraries(unit_tests c dl m pthread)
endif ()
set_preferred_base_start_and_end(unit_tests ${preferred_base} ON)
else (UNIX)
target_link_libraries(unit_tests ${static_libc_list} ntdll_imports)
set_target_properties(unit_tests PROPERTIES
LINK_FLAGS "/base:${preferred_base} ${LD_FLAGS}")
endif (UNIX)
target_link_libraries(unit_tests drlibc)
get_target_path_for_execution(unit_relpath unit_tests "${location_suffix}")
prefix_cmd_if_necessary(unit_relpath OFF ${unit_relpath})
add_test(unit_tests ${unit_relpath})
if (APPLE)
set_tests_properties(unit_tests PROPERTIES LABELS OSX)
endif ()
if (AARCHXX)
set_tests_properties(unit_tests PROPERTIES LABELS RUNS_ON_QEMU)
endif ()
copy_target_to_device(unit_tests "${location_suffix}")
endif ()
include_directories(BEFORE
${CMAKE_CURRENT_SOURCE_DIR}/lib
${CMAKE_CURRENT_SOURCE_DIR}/arch
${CMAKE_CURRENT_SOURCE_DIR}/ir
${CMAKE_CURRENT_SOURCE_DIR}/${OSNAME}
${CMAKE_CURRENT_SOURCE_DIR}/arch/${ARCH_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/ir/${ARCH_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/drlibc
)
set_target_properties(dynamorio PROPERTIES INTERFACE_LINK_LIBRARIES "")
install_exported_target(dynamorio ${INSTALL_LIB}
PERMISSIONS ${owner_access} OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
DR_export_target(dynamorio)
if (NOT APPLE)
install_exported_target(dynamorio_static ${INSTALL_LIB})
DR_export_target(dynamorio_static)
endif ()
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/globals_api.h dr_defines.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/mcxtx_api.h dr_mcxtx.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/dr_events.h dr_events.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/encode_api.h dr_ir_encode.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/decode_api.h dr_ir_decode.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/disassemble_api.h dr_ir_disassemble.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/opnd_api.h dr_ir_opnd.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/instr_api.h dr_ir_instr.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/instr_inline_api.h dr_ir_instr_inline.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/instrlist_api.h dr_ir_instrlist.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/dr_ir_opcodes.h dr_ir_opcodes.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/x86/opcode_api.h dr_ir_opcodes_x86.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/arm/opcode_api.h dr_ir_opcodes_arm.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/instr_create_shared_api.h dr_ir_macros.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/x86/instr_create_api.h dr_ir_macros_x86.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/arm/instr_create_api.h dr_ir_macros_arm.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/ir/aarch64/instr_create_api.h
dr_ir_macros_aarch64.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/dr_ir_utils.h dr_ir_utils.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/dr_tools.h dr_tools.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/annotations_api.h dr_annotation.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/dr_inject.h dr_inject.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/module_api.h dr_modules.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/os_api.h dr_os_utils.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/fragment_api.h dr_tracedump.h)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/arch/proc_api.h dr_proc.h)
if (HOT_PATCHING_INTERFACE)
DR_export_header(${CMAKE_CURRENT_SOURCE_DIR}/lib/dr_probe.h dr_probe.h)
endif ()
install_exported_target(drinjectlib ${INSTALL_LIB_BASE})
DR_export_target(drinjectlib)
if (UNIX)
DR_install(TARGETS ${PRELOAD_NAME} DESTINATION ${INSTALL_LIB})
DR_install(FILES ${COMPAT_SYMLINKS} DESTINATION ${INSTALL_LIB})
else (UNIX)
DR_install(TARGETS drinjectlib DESTINATION ${INSTALL_BIN})
DR_install(TARGETS ${PRELOAD_NAME} RUNTIME DESTINATION ${INSTALL_LIB_BASE})
DR_install(TARGETS drearlyhelp1 RUNTIME DESTINATION ${INSTALL_LIB_BASE})
DR_install(TARGETS drearlyhelp2 RUNTIME DESTINATION ${INSTALL_LIB_BASE})
endif (UNIX)
DR_export_target(drdecode)
install_exported_target(drdecode ${INSTALL_LIB})
DR_export_target(drlibc)
install_exported_target(drlibc ${INSTALL_LIB_BASE})
if (UNIX)
DR_export_target(drmemfuncs)
install_exported_target(drmemfuncs ${INSTALL_LIB_BASE})
endif ()