Only pass -pie when linking executables

Passing -pie globally made the driver link Scrt1.o into shared
libraries, which fails with an undefined reference to main.
This commit is contained in:
2026-06-12 13:58:54 -04:00
parent 19f430d68f
commit f947d883e7
+6 -2
View File
@@ -61,12 +61,16 @@ if(NOT APPLE)
add_compile_options(-g -fno-omit-frame-pointer) add_compile_options(-g -fno-omit-frame-pointer)
endif() endif()
set(full_relro_flags "-pie;LINKER:-z,relro,-z,now,-z,noexecstack") set(relro_flags "LINKER:-z,relro,-z,now,-z,noexecstack")
set(full_relro_flags "-pie;${relro_flags}")
cmake_push_check_state() cmake_push_check_state()
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${full_relro_flags}) list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${full_relro_flags})
check_cxx_source_compiles("int main(){}" HAS_FULL_RELRO FAIL_REGEX "warning:") check_cxx_source_compiles("int main(){}" HAS_FULL_RELRO FAIL_REGEX "warning:")
if(HAS_FULL_RELRO) if(HAS_FULL_RELRO)
add_link_options(${full_relro_flags}) # -pie only applies to executables; passing it when linking a shared library
# makes the driver pull in Scrt1.o, which requires main.
add_link_options("$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:-pie>"
${relro_flags})
endif() endif()
cmake_pop_check_state() cmake_pop_check_state()