Skip to content

Commit a01cb6e

Browse files
committed
cmake: Add HARDENING option
1 parent a8a2e36 commit a01cb6e

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

CMakeLists.txt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ if(WITH_BDB)
104104
endif()
105105
cmake_dependent_option(BUILD_WALLET_TOOL "Build bitcoin-wallet tool." ${BUILD_TESTS} "ENABLE_WALLET" OFF)
106106

107+
option(ENABLE_HARDENING "Attempt to harden the resulting executables." ON)
107108
option(WITH_CCACHE "Attempt to use ccache for compiling." ON)
108109

109110
option(WITH_NATPMP "Enable NAT-PMP." OFF)
@@ -351,6 +352,59 @@ try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK
351352
# -fstack-reuse=none for all gcc builds. (Only gcc understands this flag).
352353
try_append_cxx_flags("-fstack-reuse=none" TARGET core_interface)
353354

355+
if(ENABLE_HARDENING)
356+
add_library(hardening_interface INTERFACE)
357+
target_link_libraries(core_interface INTERFACE hardening_interface)
358+
if(MSVC)
359+
try_append_linker_flag("/DYNAMICBASE" TARGET hardening_interface)
360+
try_append_linker_flag("/HIGHENTROPYVA" TARGET hardening_interface)
361+
try_append_linker_flag("/NXCOMPAT" TARGET hardening_interface)
362+
else()
363+
try_append_cxx_flags("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3"
364+
RESULT_VAR cxx_supports_fortify_source
365+
)
366+
if(cxx_supports_fortify_source)
367+
# When the build configuration is Debug, all optimizations are disabled.
368+
# However, _FORTIFY_SOURCE requires that there is some level of optimization,
369+
# otherwise it does nothing and just creates a compiler warning.
370+
# Since _FORTIFY_SOURCE is a no-op without optimizations, do not enable it
371+
# when the build configuration is Debug.
372+
target_compile_options(hardening_interface INTERFACE
373+
$<$<NOT:$<CONFIG:Debug>>:-U_FORTIFY_SOURCE>
374+
$<$<NOT:$<CONFIG:Debug>>:-D_FORTIFY_SOURCE=3>
375+
)
376+
endif()
377+
unset(cxx_supports_fortify_source)
378+
379+
try_append_cxx_flags("-Wstack-protector" TARGET hardening_interface SKIP_LINK)
380+
try_append_cxx_flags("-fstack-protector-all" TARGET hardening_interface)
381+
try_append_cxx_flags("-fcf-protection=full" TARGET hardening_interface)
382+
383+
if(MINGW)
384+
# stack-clash-protection doesn't compile with GCC 10 and earlier.
385+
# In any case, it is a no-op for Windows.
386+
# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90458 for more details.
387+
else()
388+
try_append_cxx_flags("-fstack-clash-protection" TARGET hardening_interface)
389+
endif()
390+
391+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
392+
try_append_cxx_flags("-mbranch-protection=bti" TARGET hardening_interface SKIP_LINK)
393+
endif()
394+
395+
try_append_linker_flag("-Wl,--enable-reloc-section" TARGET hardening_interface)
396+
try_append_linker_flag("-Wl,--dynamicbase" TARGET hardening_interface)
397+
try_append_linker_flag("-Wl,--nxcompat" TARGET hardening_interface)
398+
try_append_linker_flag("-Wl,--high-entropy-va" TARGET hardening_interface)
399+
try_append_linker_flag("-Wl,-z,relro" TARGET hardening_interface)
400+
try_append_linker_flag("-Wl,-z,now" TARGET hardening_interface)
401+
try_append_linker_flag("-Wl,-z,separate-code" TARGET hardening_interface)
402+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
403+
try_append_linker_flag("-Wl,-fixup_chains" TARGET hardening_interface)
404+
endif()
405+
endif()
406+
endif()
407+
354408
find_package(Python3 3.9 COMPONENTS Interpreter)
355409
if(Python3_EXECUTABLE)
356410
set(PYTHON_COMMAND ${Python3_EXECUTABLE})
@@ -409,6 +463,7 @@ message("")
409463
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
410464
include(FlagsSummary)
411465
flags_summary()
466+
message("Attempt to harden executables ......... ${ENABLE_HARDENING}")
412467
message("Use ccache for compiling .............. ${WITH_CCACHE}")
413468
message("\n")
414469
if(configure_warnings)

0 commit comments

Comments
 (0)