@@ -63,6 +63,16 @@ if(CMAKE_SYSTEM_NAME STREQUAL Linux)
6363 check_cxx_compiler_flag("-fstack-clash-protection" CXX_HAS_FSTACK_CLASH_PROTECTION)
6464endif ()
6565
66+ if (UR_USE_CFI)
67+ set (SAVED_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} )
68+ set (CMAKE_REQUIRED_FLAGS "-flto -fvisibility=hidden" )
69+ check_cxx_compiler_flag("-fsanitize=cfi" CXX_HAS_CFI_SANITIZE)
70+ set (CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS} )
71+ else ()
72+ # If CFI checking is disabled, pretend we don't support it
73+ set (CXX_HAS_CFI_SANITIZE OFF )
74+ endif ()
75+
6676function (add_ur_target_compile_options name )
6777 if (NOT MSVC )
6878 target_compile_definitions (${name} PRIVATE -D_FORTIFY_SOURCE=2)
@@ -78,11 +88,10 @@ function(add_ur_target_compile_options name)
7888 # Hardening options
7989 -fPIC
8090 -fstack-protector-strong
81- -fvisibility=hidden # Required for -fsanitize=cfi
82- # -fsanitize=cfi requires -flto, which breaks a lot of things
83- # See: https://github.com/oneapi-src/unified-runtime/issues/2120
84- # -flto
85- # $<$<CXX_COMPILER_ID:Clang,AppleClang>:-fsanitize=cfi>
91+ -fvisibility=hidden
92+ # cfi-icall requires called functions in shared libraries to also be built with cfi-icall, which we can't
93+ # guarantee. -fsanitize=cfi depends on -flto
94+ $<$<BOOL :${CXX_HAS_CFI_SANITIZE} >:-flto -fsanitize=cfi -fno-sanitize=cfi-icall>
8695 $<$<BOOL :${CXX_HAS_FCF_PROTECTION_FULL} >:-fcf-protection=full>
8796 $<$<BOOL :${CXX_HAS_FSTACK_CLASH_PROTECTION} >:-fstack-clash-protection>
8897
@@ -119,7 +128,10 @@ endfunction()
119128function (add_ur_target_link_options name )
120129 if (NOT MSVC )
121130 if (NOT APPLE )
122- target_link_options (${name} PRIVATE "LINKER:-z,relro,-z,now,-z,noexecstack" )
131+ target_link_options (${name} PRIVATE
132+ $<$<BOOL :${CXX_HAS_CFI_SANITIZE} >:-flto -fsanitize=cfi -fno-sanitize=cfi-icall>
133+ "LINKER:-z,relro,-z,now,-z,noexecstack"
134+ )
123135 if (UR_DEVELOPER_MODE)
124136 target_link_options (${name} PRIVATE -Werror -Wextra)
125137 endif ()
0 commit comments