blob: c53d7bd6ad1678c3bd7fc523b1e266ce39e6449f [file]
# **********************************************************
# Copyright (c) 2014-2021 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.
# UMBRA: the shadow memory framework
cmake_minimum_required(VERSION 3.7)
include(${PROJECT_SOURCE_DIR}/make/policies.cmake NO_POLICY_SCOPE)
set_output_dirs(${framework_bindir})
set(srcs
umbra.c
../framework/version.c
# add more here
)
# add arch specific src here
if (X64)
set (srcs ${srcs} umbra_64.c)
elseif (X86)
set (srcs ${srcs} umbra_32.c)
elseif (ARM)
set (srcs ${srcs} umbra_32.c)
else (X64)
message(FATAL_ERROR "Umbra does not support this architecture")
endif (X64)
# 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_UMBRA)
endif ()
macro(configure_umbra_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_UMBRA_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} ${ntimp_lib})
endmacro(configure_umbra_target)
macro(export_umbra_target target drmgr)
# 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};drcontainers")
install(TARGETS ${target} EXPORT ${exported_targets_name}
DESTINATION ${DRMF_INSTALL_BIN})
# Top-level installs .debug and .pdb files
endmacro(export_umbra_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(umbra SHARED ${srcs} ../framework/drmf_utils.c)
# Set a preferred base to avoid conflict if we can
set(PREFERRED_BASE 0x77000000)
configure_DynamoRIO_client(umbra)
use_DynamoRIO_extension(umbra drmgr)
use_DynamoRIO_extension(umbra drcontainers)
set_library_version(umbra ${DRMF_VERSION_MAJOR_MINOR})
configure_umbra_target(umbra)
export_umbra_target(umbra "drmgr")
install(FILES umbra.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(umbra_static STATIC ${srcs_static} ../framework/drmf_utils.c)
configure_DynamoRIO_client(umbra_static)
use_DynamoRIO_extension(umbra_static drmgr_static)
use_DynamoRIO_extension(umbra_static drcontainers)
configure_umbra_target(umbra_static)
add_static_lib_debug_info(umbra_static ${DRMF_INSTALL_BIN})
export_umbra_target(umbra_static "drmgr_static")
# We build a separate static target for internal use that has our
# log/assert/notify infrastructure.
add_library(umbra_int STATIC ${srcs_static})
configure_DynamoRIO_client(umbra_int)
use_DynamoRIO_extension(umbra_int drmgr_static)
use_DynamoRIO_extension(umbra_int drcontainers)
if (DEBUG_BUILD)
if (STATIC_DRSYMS)
use_DynamoRIO_extension(umbra_int drsyms_static)
else ()
use_DynamoRIO_extension(umbra_int drsyms)
endif ()
endif (DEBUG_BUILD)
configure_umbra_target(umbra_int)
# Documentation is handled as part of the main tool docs processing.