diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,8 +298,12 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SEC_COMP_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SEC_COMP_FLAGS}") SET(SEC_LINK_FLAGS "") + + include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/CheckNodump.cmake") + check_nodump(NODUMP_FLAGS) + IF (NOT APPLE) - SET(SEC_LINK_FLAGS "${SEC_LINK_FLAGS} -Wl,-z,nodump -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") + SET(SEC_LINK_FLAGS "${SEC_LINK_FLAGS} ${NODUMP_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") ENDIF () IF (NOT ANDROID AND NOT APPLE) SET(SEC_LINK_FLAGS "${SEC_LINK_FLAGS} -pie") diff --git a/cmake/modules/CheckNodump.cmake b/cmake/modules/CheckNodump.cmake new file mode 100644 --- /dev/null +++ b/cmake/modules/CheckNodump.cmake @@ -0,0 +1,23 @@ +# Check if the linker supports -Wl,z,nodump + +function(check_nodump result) + set(NODUMP_FLAGS "-Wl,-z,nodump") + cmake_policy(SET CMP0056 NEW) + set(CMAKE_EXE_LINKER_FLAGS "${NODUMP_FLAGS}") + set(TEST_PROGRAM "int main() { return 0 ; }") + set(TEST_FILE "${CMAKE_CURRENT_BINARY_DIR}/test_nodump.cc") + file(WRITE "${TEST_FILE}" "${TEST_PROGRAM}") + + message(STATUS "Checking whether the linker supports ${NODUMP_FLAGS} ...") + try_compile(SUPPORT_NODUMP + "${CMAKE_CURRENT_BINARY_DIR}/try_has_nodump" + "${TEST_FILE}" + ) + message(STATUS " supports ${NODUMP_FLAGS}: ${SUPPORT_NODUMP}") + + if(SUPPORT_NODUMP) + set(${result} "${NODUMP_FLAGS}") + else() + set(${result} "") + endif() +endfunction()