CheckPIESupported¶
3.14 版新增。
此模块提供了一个命令,用于检查链接器是否支持可执行文件的地址无关代码(PIE)或非地址无关代码(NO_PIE)。
在 CMake 项目中加载此模块,使用
include(CheckPIESupported)
当设置 POSITION_INDEPENDENT_CODE 目标属性时,无论是否使用此模块,在构建库对象时都会添加与 PIC 相关的编译和链接选项,在构建可执行目标对象时会添加与 PIE 相关的编译选项。使用此模块可以确保可执行文件的 POSITION_INDEPENDENT_CODE 目标属性在链接时也能被遵循。
命令¶
此模块提供以下命令
- check_pie_supported¶
检查 PIE/NO_PIE 支持情况,并准备所有可执行文件以启用链接时 PIE 选项
check_pie_supported([OUTPUT_VARIABLE <output>] [LANGUAGES <langs>...])
选项包括:
OUTPUT_VARIABLE <output>将任何错误详情设置到
<output>变量中。如果由于使用了之前调用的缓存结果而跳过了检查,即使之前的调用中存在错误,输出也将为空。LANGUAGES <langs>...检查指定每种语言所使用的链接器。如果未提供此选项,则该命令会检查所有已启用的语言。
支持
C、CXX和Fortran。3.23 版本新增:支持
OBJC、OBJCXX、CUDA和HIP。
注意
要使用
check_pie_supported(),必须将策略CMP0083设置为NEW;否则将发生致命错误。
变量¶
对于检查的每种语言,check_pie_supported() 命令都会定义两个布尔缓存变量:
CMAKE_<lang>_LINK_PIE_SUPPORTED如果链接器支持
PIE,则设置为 true,否则为 false。CMAKE_<lang>_LINK_NO_PIE_SUPPORTED如果链接器支持
NO_PIE,则设置为 true,否则为 false。
示例¶
要在链接时也为可执行目标启用 PIE,请引入此模块,并在设置 POSITION_INDEPENDENT_CODE 目标属性之前调用 check_pie_supported()。这将确定每种被检查语言的链接器是否支持 PIE 相关的链接选项。例如:
add_executable(foo ...)
include(CheckPIESupported)
check_pie_supported()
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
由于并非所有链接器都需要或支持 PIE 相关的链接选项(例如 MSVC),获取任何错误消息对于日志记录可能很有用。
add_executable(foo ...)
message(CHECK_START "Checking for C linker PIE support")
include(CheckPIESupported)
check_pie_supported(OUTPUT_VARIABLE output LANGUAGES C)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
if(CMAKE_C_LINK_PIE_SUPPORTED)
message(CHECK_PASS "yes")
else()
message(CHECK_FAIL "no")
message(VERBOSE "PIE is not supported at link time:\n${output}"
"PIE link options will not be passed to linker.")
endif()
在不使用此模块的情况下对可执行目标设置 POSITION_INDEPENDENT_CODE 目标属性,将设置 PIE 相关的编译选项,但不会设置 PIE 相关的链接选项,这在某些情况下可能是不够的。
add_executable(foo ...)
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)