From f0a8b6946de1e30596df13c1ee3b17ea1cfd2ad0 Mon Sep 17 00:00:00 2001 From: rumblehhh <40687079+rumblehhh@users.noreply.github.com> Date: Tue, 24 Nov 2020 17:00:56 +0000 Subject: [PATCH 1/8] Avoid polluting global include and link dirs The use of include_directories and link_directories pollutes global include and link directories. This change adds IMPORTED targets using the external projects and then links the funchook targets against them. This also avoids issues seen where captone fails to be found at link time "error: ld returned 1 exit status cannot find -lcapstone" when making use of certain toolchain files. --- CMakeLists.txt | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eea4bdb..28f68a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,25 @@ else () set(TOOLCHAIN_FILE "") endif () +if(WIN32) + set(prefix "") + set(suffix ".lib") +elseif(APPLE) + set(prefix "lib") + set(suffix ".a") +else() + set(prefix "lib") + set(suffix ".a") +endif() + +if (WIN32) + set(FUNCHOOK_OS windows) + set(FUNCHOOK_DEPS psapi) +else () + set(FUNCHOOK_OS unix) + set(FUNCHOOK_DEPS dl) +endif () + # # capstone # @@ -104,9 +123,11 @@ if (DISASM_CAPSTONE) INSTALL_COMMAND "" ) ExternalProject_Get_Property(capstone_src SOURCE_DIR) - include_directories(${SOURCE_DIR}/include) ExternalProject_Get_Property(capstone_src BINARY_DIR) - link_directories(${BINARY_DIR}) + add_library(capstone STATIC IMPORTED) + set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/${prefix}capstone${suffix}) + set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include) + list(APPEND FUNCHOOK_DEPS capstone) set(DISASM capstone) endif () @@ -135,6 +156,7 @@ if (DISASM_DISTORM) target_compile_options(distorm PRIVATE -fvisibility=hidden) endif () set(DISASM distorm) + list(APPEND FUNCHOOK_DEPS distorm) endif () # @@ -157,8 +179,10 @@ if (DISASM_ZYDIS) -DZYDIS_BUILD_TOOLS=OFF INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install && ${CMAKE_COMMAND} --build zycore --target install ) - include_directories(${CMAKE_BINARY_DIR}/include) - link_directories(${CMAKE_BINARY_DIR}/lib) + add_library(Zydis STATIC IMPORTED) + set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${prefix}Zydis${suffix}) + set_property(TARGET Zydis PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) + list(APPEND FUNCHOOK_DEPS Zydis) set(DISASM Zydis) endif () @@ -166,14 +190,6 @@ endif () # funchook # -if (WIN32) - set(FUNCHOOK_OS windows) - set(FUNCHOOK_DEPS psapi) -else () - set(FUNCHOOK_OS unix) - set(FUNCHOOK_DEPS dl) -endif () - set(FUNCHOOK_SOURCES src/funchook.c src/funchook_${FUNCHOOK_CPU}.c src/funchook_${FUNCHOOK_OS}.c src/disasm_${DISASM}.c) set(FUNCHOOK_PROPERTIES @@ -192,7 +208,7 @@ function (add_funchook_library target_name target_type) set_target_properties(${target_name} PROPERTIES ${FUNCHOOK_PROPERTIES}) target_include_directories(${target_name} PUBLIC include) target_include_directories(${target_name} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # to include config.h - target_link_libraries(${target_name} PRIVATE ${DISASM} ${FUNCHOOK_DEPS}) + target_link_libraries(${target_name} PRIVATE ${FUNCHOOK_DEPS}) if (HAVE_FVISIBILITY_HIDDEN) target_compile_options(${target_name} PRIVATE -fvisibility=hidden) endif () From 97297e2d2bcaefc071d747f3f2890991f873b814 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Wed, 25 Nov 2020 19:46:09 +0000 Subject: [PATCH 2/8] Fix travis-ci builds. INTERFACE_INCLUDE_DIRECTORIES does not allow non-existent directories so ensure the directory is valid using file(MAKE_DIRECTORY). See https://gitlab.kitware.com/cmake/cmake/-/issues/15052 for details. --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28f68a6..eeb4749 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,7 @@ if (DISASM_CAPSTONE) ) ExternalProject_Get_Property(capstone_src SOURCE_DIR) ExternalProject_Get_Property(capstone_src BINARY_DIR) + file(MAKE_DIRECTORY ${SOURCE_DIR}/include) add_library(capstone STATIC IMPORTED) set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/${prefix}capstone${suffix}) set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include) @@ -179,6 +180,7 @@ if (DISASM_ZYDIS) -DZYDIS_BUILD_TOOLS=OFF INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install && ${CMAKE_COMMAND} --build zycore --target install ) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(Zydis STATIC IMPORTED) set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${prefix}Zydis${suffix}) set_property(TARGET Zydis PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) From 1b85b39939ce11c831fbd3c11a522fed856da4d6 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 10:32:20 +0000 Subject: [PATCH 3/8] Use CMAKE_STATIC_LIBRARY_PREFIX/CMAKE_STATIC_LIBRARY_SUFFIX --- CMakeLists.txt | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eeb4749..6dd8cb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,17 +66,6 @@ else () set(TOOLCHAIN_FILE "") endif () -if(WIN32) - set(prefix "") - set(suffix ".lib") -elseif(APPLE) - set(prefix "lib") - set(suffix ".a") -else() - set(prefix "lib") - set(suffix ".a") -endif() - if (WIN32) set(FUNCHOOK_OS windows) set(FUNCHOOK_DEPS psapi) @@ -126,7 +115,7 @@ if (DISASM_CAPSTONE) ExternalProject_Get_Property(capstone_src BINARY_DIR) file(MAKE_DIRECTORY ${SOURCE_DIR}/include) add_library(capstone STATIC IMPORTED) - set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/${prefix}capstone${suffix}) + set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}capstone${CMAKE_STATIC_LIBRARY_SUFFIX}) set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include) list(APPEND FUNCHOOK_DEPS capstone) set(DISASM capstone) @@ -182,7 +171,7 @@ if (DISASM_ZYDIS) ) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(Zydis STATIC IMPORTED) - set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${prefix}Zydis${suffix}) + set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}Zydis${CMAKE_STATIC_LIBRARY_SUFFIX}) set_property(TARGET Zydis PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) list(APPEND FUNCHOOK_DEPS Zydis) set(DISASM Zydis) From 8ecd7f9e52b51f2419981f6884a26fa0eeef50c5 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 13:00:51 +0000 Subject: [PATCH 4/8] Install captone to match zydis behaviour The capstone target was previously being setup using ExternalProject_Get_Property however installing the external project and using the generic include/lib directories solves issues with config based generators. --- CMakeLists.txt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dd8cb1..7005394 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,14 +109,12 @@ if (DISASM_CAPSTONE) -DCAPSTONE_TMS320C64X_SUPPORT=OFF -DCAPSTONE_XCORE_SUPPORT=OFF -DCAPSTONE_X86_SUPPORT=${CAPSTONE_x86_SUPPORT} - INSTALL_COMMAND "" + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install ) - ExternalProject_Get_Property(capstone_src SOURCE_DIR) - ExternalProject_Get_Property(capstone_src BINARY_DIR) - file(MAKE_DIRECTORY ${SOURCE_DIR}/include) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(capstone STATIC IMPORTED) - set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}capstone${CMAKE_STATIC_LIBRARY_SUFFIX}) - set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include) + set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}capstone${CMAKE_STATIC_LIBRARY_SUFFIX}) + set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) list(APPEND FUNCHOOK_DEPS capstone) set(DISASM capstone) endif () From d047338860b6558a1a73f6e3747701b7bde9ac19 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 14:39:27 +0000 Subject: [PATCH 5/8] Use ${CMAKE_INSTALL_LIBDIR} instead of hardcoded lib directory GNUInstallDirs may not always output to lib and may instead output to lib or lib64 or lib/ on Debian. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7005394..5eddd6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ if (DISASM_CAPSTONE) ) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(capstone STATIC IMPORTED) - set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}capstone${CMAKE_STATIC_LIBRARY_SUFFIX}) + set_property(TARGET capstone PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}capstone${CMAKE_STATIC_LIBRARY_SUFFIX}) set_property(TARGET capstone PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) list(APPEND FUNCHOOK_DEPS capstone) set(DISASM capstone) @@ -169,7 +169,7 @@ if (DISASM_ZYDIS) ) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(Zydis STATIC IMPORTED) - set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}Zydis${CMAKE_STATIC_LIBRARY_SUFFIX}) + set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}Zydis${CMAKE_STATIC_LIBRARY_SUFFIX}) set_property(TARGET Zydis PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) list(APPEND FUNCHOOK_DEPS Zydis) set(DISASM Zydis) From 8fa55a387041e92f700370db222e40d2cfbab804 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 14:49:15 +0000 Subject: [PATCH 6/8] Move inclusion of GNUInstallDirs earlier --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5eddd6a..1af8cb2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ # GIT_SHALLOW requires cmake 3.6. cmake_minimum_required(VERSION 3.6) +include("GNUInstallDirs") project(funchook LANGUAGES C ASM) set(PROJECT_VERSION 1.1.0) @@ -230,8 +231,6 @@ endif () # install # -include("GNUInstallDirs") - install(FILES include/funchook.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) if (FUNCHOOK_BUILD_SHARED) From 8c3786f3d9f07a206f41f795b0797cc637f75f8a Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 17:43:33 +0000 Subject: [PATCH 7/8] Include GNUInstallDirs after project definition. Avoid "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. Please enable at least one language before including GNUInstallDirs." --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1af8cb2..be4dcad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,12 @@ # GIT_SHALLOW requires cmake 3.6. cmake_minimum_required(VERSION 3.6) -include("GNUInstallDirs") project(funchook LANGUAGES C ASM) set(PROJECT_VERSION 1.1.0) set(PROJECT_VERSION_MAJOR 1) +include("GNUInstallDirs") + set(FUNCHOOK_CPU ${CMAKE_SYSTEM_PROCESSOR}) if (FUNCHOOK_CPU STREQUAL x86_64 OR FUNCHOOK_CPU MATCHES "i.86" OR FUNCHOOK_CPU STREQUAL AMD64) set(FUNCHOOK_CPU x86) From 23f97d345bd8512cdeba1e7089faee39aa08e3e3 Mon Sep 17 00:00:00 2001 From: James Rumble Date: Thu, 26 Nov 2020 20:46:20 +0000 Subject: [PATCH 8/8] Zydis includes GNUInstallDirs prior to language being enabled Tag 3.1.0 of Zydis includes GNUInstallDirs prior to a language being enabled meaning its CMAKE_INSTALL_LIBDIR will always result in lib rather than its correct lib/lib64 variant. Note that Zydis master branch has fixed this issue. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41c101a..5c93b8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,7 +172,7 @@ if (DISASM_ZYDIS) ) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include) add_library(Zydis STATIC IMPORTED) - set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}Zydis${CMAKE_STATIC_LIBRARY_SUFFIX}) + set_property(TARGET Zydis PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}Zydis${CMAKE_STATIC_LIBRARY_SUFFIX}) set_property(TARGET Zydis PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include) list(APPEND FUNCHOOK_DEPS Zydis) set(DISASM Zydis)