From 6b7668dc83121e01fb832fec489d2fb0188394e6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 27 Jun 2020 14:50:59 +0100 Subject: [PATCH] CMake: Add sigaction, sigaltstack, self dbg --- CMakeLists.txt | 3 +++ cmake/FindSelfDbg.cmake | 37 +++++++++++++++++++++++++++++++++++++ cmake/FindSigaction.cmake | 26 ++++++++++++++++++++++++++ cmake/FindSigaltstack.cmake | 21 +++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 cmake/FindSelfDbg.cmake create mode 100644 cmake/FindSigaction.cmake create mode 100644 cmake/FindSigaltstack.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index ac8bb6523f..7d1d9a27fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,9 @@ endif (MSVC) if (UNIX) find_package(DL) find_package(Demangle) + find_package(Sigaction) + find_package(Sigaltstack) + find_package(SelfDbg) endif (UNIX) find_package(SSE) diff --git a/cmake/FindSelfDbg.cmake b/cmake/FindSelfDbg.cmake new file mode 100644 index 0000000000..0f4aec61cb --- /dev/null +++ b/cmake/FindSelfDbg.cmake @@ -0,0 +1,37 @@ +include(CheckCXXSourceCompiles) + +check_cxx_source_compiles(" + #include + #include + #include + #include + #include + #include + int main() { + pid_t tid = syscall(SYS_gettid); + int status; + waitpid((pid_t) 0, &status, 0); + return WIFEXITED(status) && WEXITSTATUS(status); + }" + DBG_GDB_FOUND +) + +if (DBG_GDB_FOUND) + add_compile_options( + -DWITH_DBG_GDB + ) +endif (DBG_GDB_FOUND) + +check_cxx_source_compiles(" + #include + int main() { + return prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); + }" + PRCTL_PT_FOUND +) + +if (PRCTL_PT_FOUND) + add_compile_options( + -DWITH_PRCTL_PT + ) +endif (PRCTL_PT_FOUND) diff --git a/cmake/FindSigaction.cmake b/cmake/FindSigaction.cmake new file mode 100644 index 0000000000..6b49814ac3 --- /dev/null +++ b/cmake/FindSigaction.cmake @@ -0,0 +1,26 @@ +include(CheckCXXSourceCompiles) + +check_cxx_source_compiles(" + #include + void *addr; + int code; + void handler(int sig, siginfo_t *si, void *context) { + addr = si->si_addr; + code = si->si_code; + } + int main() { + struct sigaction sa; + sa.sa_flags = SA_SIGINFO; + sigemptyset(&sa.sa_mask); + sa.sa_sigaction = handler; + sigaction(SIGSEGV, &sa, 0); + return 0; + }" + SIGACTION_FOUND +) + +if (SIGACTION_FOUND) + add_compile_options( + -DWITH_SIGACTION + ) +endif (SIGACTION_FOUND) diff --git a/cmake/FindSigaltstack.cmake b/cmake/FindSigaltstack.cmake new file mode 100644 index 0000000000..5ed7106f0f --- /dev/null +++ b/cmake/FindSigaltstack.cmake @@ -0,0 +1,21 @@ +include(CheckCXXSourceCompiles) + +check_cxx_source_compiles(" + #include + #include + int main() { + stack_t ss; + ss.ss_sp = calloc(SIGSTKSZ, 1); + ss.ss_size = SIGSTKSZ; + ss.ss_flags = 0; + sigaltstack(&ss, nullptr); + return 0; + }" + SIGALTSTACK +) + +if (SIGALTSTACK_FOUND) + add_compile_options( + -DWITH_SIGALTSTACK + ) +endif (SIGALTSTACK_FOUND)