blob: 2e735d83448081c6eb9f85b5fee06baceb2bfd7e [file]
# **********************************************************
# Copyright (c) 2012-2020 Google, Inc. All rights reserved.
# **********************************************************
# Dr. Memory: the memory debugger
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation;
# version 2.1 of the License, and no later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
cmake_minimum_required(VERSION 3.7)
include(${PROJECT_SOURCE_DIR}/make/policies.cmake NO_POLICY_SCOPE)
set_output_dirs(${framework_bindir})
# We do not need libc, and we avoid a 10x size increase in both our
# dll and pdb (plus we avoid stressing private library isolation) by
# not using it (i#714).
set(DynamoRIO_USE_LIBC OFF)
option(SYSCALL_DRIVER "use a kernel driver to identify system call writes")
option(SYSCALL_DRIVER_SRCDIR "source dir of kernel driver")
if (SYSCALL_DRIVER)
set(DEFINES ${DEFINES} -DSYSCALL_DRIVER)
include_directories(${SYSCALL_DRIVER_SRCDIR})
endif (SYSCALL_DRIVER)
set(external_srcs ../framework/drmf_utils.c ../common/utils_shared.c)
set(srcs
drsyscall.c
../framework/version.c
# add more here
)
if (UNIX)
if (APPLE)
set(srcs ${srcs}
drsyscall_macos.c
table_macos_bsd.c
../${asm_utils_src})
else (APPLE)
set(srcs ${srcs}
drsyscall_linux.c
table_linux.c
table_linux_ioctl.c
../${asm_utils_src})
endif (APPLE)
else (UNIX)
set(srcs ${srcs}
drsyscall_windows.c
table_windows_ntoskrnl.c
table_windows_ntoskrnl_infoclass.c
table_windows_ntuser.c
table_windows_ntusercall.c
table_windows_ntgdi.c
table_windows_kernel32.c
drsyscall_wingdi.c
drsyscall_fileparse.c
pdb2sysfile.cpp)
if (SYSCALL_DRIVER)
set(srcs ${srcs}
drmemory/syscall_driver.c)
endif (SYSCALL_DRIVER)
endif (UNIX)
# i#1594c#3: VS generators fail if static lib has resources
set(srcs_static ${srcs})
if (WIN32)
set(srcs ${srcs} ${PROJECT_SOURCE_DIR}/make/resources.rc)
set(DEFINES_NO_D ${DEFINES_NO_D} RC_IS_DRSYSCALL)
endif ()
macro(configure_drsyscall_target target)
if (UNIX)
# Avoid relocations which tend to violate security policies
append_property_string(TARGET ${target} COMPILE_FLAGS "-fPIC")
endif (UNIX)
# We do not prevent duplicate builds of the same files as that would require
# building a static library that is then linked with drmf_utils.c to
# create a final static library, for DR_EXT_DRSYSCALL_STATIC: and that's
# a pain to export w/ the proper link rules. But we at least use the
# same flags and avoid compiling the same file differently.
_DR_append_property_list(TARGET ${target} COMPILE_DEFINITIONS "${DEFINES_NO_D}")
target_link_libraries(${target} drfrontendlib ${ntimp_lib})
if (NOT USER_SPECIFIED_DynamoRIO_DIR AND "${CMAKE_GENERATOR}" MATCHES "Visual Studio")
add_dependencies(${target} ntdll_imports)
endif ()
copy_target_to_device(${target})
endmacro(configure_drsyscall_target)
macro(export_drsyscall_target target drmgr drsyms)
# We need to clear the dependents that come from DR to avoid the prefix
# from affecting them too.
set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "")
export_target(${target})
# Now put in our imports (w/o any namespace)
set_target_properties(${target} PROPERTIES
INTERFACE_LINK_LIBRARIES "dynamorio;${drmgr};${drsyms};drcontainers;drfrontendlib")
install(TARGETS ${target} EXPORT ${exported_targets_name}
DESTINATION ${DRMF_INSTALL_BIN})
# Top-level installs .debug and .pdb files
endmacro(export_drsyscall_target)
# For the exported version, we don't want to print to stderr or raise
# msgboxes, so we link in globals to suppress notification in drmf_utils.c.
add_library(drmf_drsyscall SHARED ${srcs} ${external_srcs})
# Set a preferred base to avoid conflict if we can
set(PREFERRED_BASE 0x77000000)
configure_DynamoRIO_client(drmf_drsyscall)
use_DynamoRIO_extension(drmf_drsyscall drmgr)
use_DynamoRIO_extension(drmf_drsyscall drcontainers)
use_DynamoRIO_extension(drmf_drsyscall drsyms)
set_library_version(drmf_drsyscall ${DRMF_VERSION_MAJOR_MINOR})
configure_drsyscall_target(drmf_drsyscall)
export_drsyscall_target(drmf_drsyscall "drmgr" "drsyms")
# Make a build-dir copy for the drmf_proj test.
configure_file(drsyscall.h "${framework_incdir}/drsyscall.h" @ONLY)
install(FILES drsyscall.h DESTINATION ${DRMF_INSTALL_INC})
# Since the license is LGPL, SHARED and not STATIC by default.
# SHARED is also required if multiple separate components all want to
# use this same extension.
# But, we also provide a static version with a different name for those
# who want it, in the style of DR's side-by-side static extensions.
add_library(drmf_drsyscall_static STATIC ${srcs_static} ${external_srcs})
configure_DynamoRIO_client(drmf_drsyscall_static)
use_DynamoRIO_extension(drmf_drsyscall_static drmgr_static)
use_DynamoRIO_extension(drmf_drsyscall_static drcontainers)
use_DynamoRIO_extension(drmf_drsyscall_static drsyms_static)
configure_drsyscall_target(drmf_drsyscall_static)
add_static_lib_debug_info(drmf_drsyscall_static ${DRMF_INSTALL_BIN})
export_drsyscall_target(drmf_drsyscall_static "drmgr_static" "drsyms_static")
# We build a separate static target for internal use that has our
# log/assert/notify infrastructure.
add_library(drmf_drsyscall_int STATIC ${srcs_static})
configure_DynamoRIO_client(drmf_drsyscall_int)
use_DynamoRIO_extension(drmf_drsyscall_int drmgr_static)
use_DynamoRIO_extension(drmf_drsyscall_int drcontainers)
if (STATIC_DRSYMS)
use_DynamoRIO_extension(drmf_drsyscall_int drsyms_static)
else ()
use_DynamoRIO_extension(drmf_drsyscall_int drsyms)
endif ()
configure_drsyscall_target(drmf_drsyscall_int)
# Documentation is handled as part of the main tool docs processing.