Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

funchook: add funchook/1.1.3 recipe #22224

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions recipes/funchook/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
sources:
"1.1.3":
url: "https://github.com/kubo/funchook/archive/refs/tags/v1.1.3.tar.gz"
sha256: "4b0195e70524237e222dc34c53ac25e12677bb936e64eefe33189931688444c4"
patches:
"1.1.3":
- patch_file: "patches/1.1.3-0001-cmake-use-cci-capstone.patch"
patch_description: "use cci capstone package on all platforms"
patch_type: "conan"
97 changes: 97 additions & 0 deletions recipes/funchook/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import os

from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get
from conan.tools.microsoft import is_msvc

required_conan_version = ">=1.53.0"


class PackageConan(ConanFile):
name = "funchook"
description = "Hook function calls by inserting jump instructions at runtime"
license = "GPL-2.0-or-later"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://github.com/kubo/funchook"
topics = ("hook", "windows", "linux")
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
}

def export_sources(self):
export_conandata_patches(self)

def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC

def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")

self.settings.rm_safe("compiler.cppstd")
self.settings.rm_safe("compiler.libcxx")

def layout(self):
cmake_layout(self, src_folder="src")

def requirements(self):
self.requires("capstone/4.0.2")

def validate(self):
if self.settings.os not in ["Windows", "Linux"]:
raise ConanInvalidConfiguration(f"{self.ref} can not be built on {self.settings.os}.")

def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
tc = CMakeToolchain(self)
tc.variables["FUNCHOOK_BUILD_STATIC"] = not self.options.shared
tc.variables["FUNCHOOK_BUILD_SHARED"] = self.options.shared
tc.variables["FUNCHOOK_BUILD_TESTS"] = False
tc.variables["FUNCHOOK_INSTALL"] = True
tc.generate()

tc = CMakeDeps(self)
tc.generate()

def build(self):
apply_conandata_patches(self)
cmake = CMake(self)
cmake.configure()
cmake.build()

def package(self):
copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()

def package_info(self):
if is_msvc(self) and self.options.shared:
self.cpp_info.libs = ["funchook_dll"]
else:
self.cpp_info.libs = ["funchook"]

self.cpp_info.set_property("cmake_file_name", "funchook")
self.cpp_info.set_property("cmake_target_name", "funchook::funchook")

if self.settings.os == "Windows":
self.cpp_info.system_libs.append("psapi")
else:
self.cpp_info.system_libs.append("dl")

# TODO: to remove in conan v2 once cmake_find_package_* generators removed
self.cpp_info.filenames["cmake_find_package"] = "funchook"
self.cpp_info.filenames["cmake_find_package_multi"] = "funchook"
self.cpp_info.names["cmake_find_package"] = "funchook"
self.cpp_info.names["cmake_find_package_multi"] = "funchook"
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1c3b2e9..fd31b7f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@ if(NOT FUNCHOOK_CPU)
endif ()
endif ()

-if (FUNCHOOK_CPU MATCHES "arm64")
+if (1)
set(FUNCHOOK_DEFAULT_DISASM "capstone")
else ()
set(FUNCHOOK_DEFAULT_DISASM "distorm")
@@ -53,7 +53,7 @@ endif ()
include(CheckCCompilerFlag)
check_c_compiler_flag(-fvisibility=hidden HAVE_FVISIBILITY_HIDDEN)

-if (FUNCHOOK_DISASM STREQUAL capstone)
+if (1)
set(DISASM_CAPSTONE 1)
elseif (FUNCHOOK_DISASM STREQUAL distorm)
set(DISASM_DISTORM 1)
@@ -85,33 +85,17 @@ endfunction(add_subdirectory_pic)
#
# capstone
#
-if (DISASM_CAPSTONE)
- configure_file(cmake/capstone.cmake.in capstone-download/CMakeLists.txt)
- execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/capstone-download"
- )
- execute_process(COMMAND "${CMAKE_COMMAND}" --build .
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/capstone-download"
- )
-
- string(TOUPPER ${FUNCHOOK_CPU} FUNCHOOK_CPU_UPPER)
-
- set(CAPSTONE_BUILD_SHARED OFF CACHE BOOL "")
- set(CAPSTONE_BUILD_STATIC_RUNTIME OFF CACHE BOOL "")
- set(CAPSTONE_BUILD_TESTS OFF CACHE BOOL "")
- set(CAPSTONE_BUILD_CSTOOL OFF CACHE BOOL "")
- set(CAPSTONE_ARCHITECTURE_DEFAULT OFF CACHE BOOL "")
- set(CAPSTONE_${FUNCHOOK_CPU_UPPER}_SUPPORT ON CACHE BOOL "")
- add_subdirectory_pic(${CMAKE_CURRENT_BINARY_DIR}/capstone-src ${CMAKE_CURRENT_BINARY_DIR}/capstone-build)
+if (1)
+ find_package(capstone CONFIG REQUIRED)

- list(APPEND FUNCHOOK_DEPS capstone-static)
+ list(APPEND FUNCHOOK_DEPS capstone::capstone)
set(DISASM capstone)
endif ()

#
# distorm
#
-if (DISASM_DISTORM)
+if (0)
set(DISTORM_PATH distorm/)
set(DISTORM_SRC_DIR ${DISTORM_PATH}/src/)
set(DISTORM_SOURCES ${DISTORM_SRC_DIR}/decoder.c ${DISTORM_SRC_DIR}/distorm.c ${DISTORM_SRC_DIR}/instructions.c
@@ -139,7 +123,7 @@ endif ()
#
# zydis
#
-if (DISASM_ZYDIS)
+if (0)
include(ExternalProject)
ExternalProject_Add(Zydis_src
GIT_REPOSITORY https://github.com/zyantific/zydis.git
56 changes: 56 additions & 0 deletions recipes/funchook/all/test_package/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
cmake_minimum_required(VERSION 3.15)

project(test_package LANGUAGES C ASM)

find_package(funchook REQUIRED CONFIG)

set(FUNCHOOK_CPU ${CMAKE_SYSTEM_PROCESSOR})

if (FUNCHOOK_CPU STREQUAL AMD64)
set(FUNCHOOK_CPU "x86_64")
endif ()

if (FUNCHOOK_CPU STREQUAL x86_64)
if (CMAKE_SIZEOF_VOID_P EQUAL "4")
set(FUNCHOOK_CPU "x86")
endif ()
endif ()

if (FUNCHOOK_CPU MATCHES "i.86")
set(FUNCHOOK_CPU "x86")
endif ()

set(TEST_EXE_SOURCES test_main.c)
if (FUNCHOOK_CPU STREQUAL x86)
set(TEST_EXE_SOURCES ${TEST_EXE_SOURCES} ${FUNCHOOK_CPU}_test.S)
endif ()


if (NOT MSVC)
set(FUNCHOOK_ASM_SUFFIX _gas.S)
elseif (FUNCHOOK_CPU MATCHES "^x86")
enable_language(ASM_MASM)
set(FUNCHOOK_ASM_SUFFIX _masm.asm)
else ()
set(FUNCHOOK_CPU noasm)
set(FUNCHOOK_ASM_SUFFIX .c)
endif ()

add_library(funchook_test SHARED libfunchook_test.c "libfunchook_test_${FUNCHOOK_CPU}${FUNCHOOK_ASM_SUFFIX}")
if (MSVC)
set_target_properties(funchook_test PROPERTIES OUTPUT_NAME funchook_test_dll)
if (CMAKE_SIZEOF_VOID_P MATCHES "4")
set_source_files_properties(libfunchook_test_x86_masm.asm PROPERTIES COMPILE_FLAGS /safeseh)
endif ()
else ()
set_target_properties(funchook_test PROPERTIES SUFFIX ".so")
endif ()

set(FUNCHOOK_TEST_LIBS funchook_test)
if (UNIX)
set(FUNCHOOK_TEST_LIBS ${FUNCHOOK_TEST_LIBS} dl)
endif ()


add_executable(${PROJECT_NAME} ${TEST_EXE_SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE funchook::funchook ${FUNCHOOK_TEST_LIBS})
27 changes: 27 additions & 0 deletions recipes/funchook/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import os

from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import cmake_layout, CMake


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "CMakeToolchain", "VirtualRunEnv"
test_type = "explicit"

def requirements(self):
self.requires(self.tested_reference_str)

def layout(self):
cmake_layout(self)

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()

def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")
21 changes: 21 additions & 0 deletions recipes/funchook/all/test_package/libfunchook_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifdef _WIN32
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif

static int val_in_dll;

DLLEXPORT void set_val_in_dll(int val)
{
val_in_dll = val;
}

DLLEXPORT int get_val_in_dll()
{
return val_in_dll;
}

#define S(suffix) DLLEXPORT int dllfunc_##suffix(int a, int b) { return a * b + suffix; }
#include "suffix.list"
#undef S
Loading