@@ -104,6 +104,7 @@ if(WITH_BDB)
104
104
endif ()
105
105
cmake_dependent_option (BUILD_WALLET_TOOL "Build bitcoin-wallet tool." ${BUILD_TESTS} "ENABLE_WALLET" OFF )
106
106
107
+ option (ENABLE_HARDENING "Attempt to harden the resulting executables." ON )
107
108
option (WITH_CCACHE "Attempt to use ccache for compiling." ON )
108
109
109
110
option (WITH_NATPMP "Enable NAT-PMP." OFF )
@@ -351,6 +352,59 @@ try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK
351
352
# -fstack-reuse=none for all gcc builds. (Only gcc understands this flag).
352
353
try_append_cxx_flags ("-fstack-reuse=none" TARGET core_interface )
353
354
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
+
354
408
find_package (Python3 3.9 COMPONENTS Interpreter )
355
409
if (Python3_EXECUTABLE )
356
410
set (PYTHON_COMMAND ${Python3_EXECUTABLE} )
@@ -409,6 +463,7 @@ message("")
409
463
message ("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} , ${CMAKE_CXX_COMPILER} " )
410
464
include (FlagsSummary )
411
465
flags_summary ()
466
+ message ("Attempt to harden executables ......... ${ENABLE_HARDENING} " )
412
467
message ("Use ccache for compiling .............. ${WITH_CCACHE} " )
413
468
message ("\n " )
414
469
if (configure_warnings )
0 commit comments