@@ -30,5 +30,45 @@ function(sourcemeta_executable)
3030
3131 add_executable ("${TARGET_NAME} " ${SOURCEMETA_EXECUTABLE_SOURCES} )
3232 sourcemeta_add_default_options(PRIVATE ${TARGET_NAME} )
33+
34+ # See https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html
35+ # Position Independent Executable (PIE) for ASLR support
36+ if (SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC)
37+ target_compile_options (${TARGET_NAME} PRIVATE
38+ $<$<CONFIG:Release>:-fPIE>
39+ $<$<CONFIG:RelWithDebInfo>:-fPIE>
40+ $<$<CONFIG:MinSizeRel>:-fPIE>)
41+ target_link_options (${TARGET_NAME} PRIVATE
42+ $<$<CONFIG:Release>:-pie>
43+ $<$<CONFIG:RelWithDebInfo>:-pie>
44+ $<$<CONFIG:MinSizeRel>:-pie>)
45+ endif ()
46+
47+ # See https://learn.microsoft.com/en-us/cpp/build/reference/guard-enable-control-flow-guard
48+ # See https://learn.microsoft.com/en-us/cpp/build/reference/cetcompat
49+ if (SOURCEMETA_COMPILER_MSVC)
50+ target_compile_options (${TARGET_NAME} PRIVATE /guard:cf)
51+ target_link_options (${TARGET_NAME} PRIVATE /guard:cf /CETCOMPAT)
52+ endif ()
53+
54+ # Linux-specific ELF linker hardening options
55+ if (SOURCEMETA_OS_LINUX AND (SOURCEMETA_COMPILER_LLVM OR SOURCEMETA_COMPILER_GCC))
56+ target_link_options (${TARGET_NAME} PRIVATE
57+ "LINKER:-z,nodlopen"
58+ "LINKER:-z,noexecstack"
59+ "LINKER:-z,relro"
60+ "LINKER:-z,now"
61+ "LINKER:--as-needed" )
62+ if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.18" )
63+ include (CheckLinkerFlag)
64+ check_linker_flag(CXX "LINKER:--no-copy-dt-needed-entries"
65+ SOURCEMETA_LINKER_NO_COPY_DT_NEEDED)
66+ if (SOURCEMETA_LINKER_NO_COPY_DT_NEEDED)
67+ target_link_options (${TARGET_NAME} PRIVATE
68+ "LINKER:--no-copy-dt-needed-entries" )
69+ endif ()
70+ endif ()
71+ endif ()
72+
3373 set_target_properties ("${TARGET_NAME} " PROPERTIES FOLDER "${FOLDER_NAME} " )
3474endfunction ()
0 commit comments