Skip to content

Commit 54c5540

Browse files
authored
Apply PIE and ELF compiler option hardening (#2282)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 0113db8 commit 54c5540

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

cmake/common/targets/executable.cmake

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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}")
3474
endfunction()

0 commit comments

Comments
 (0)