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>

将 `` 变量设置为包含任何错误的详细信息。如果因为使用了先前调用的缓存结果而绕过了检查,则即使先前调用中存在错误,输出也将为空。

LANGUAGES <langs>...

检查指定语言的链接器。如果未提供此选项,则该命令将检查所有启用的语言。

CCXXFortran 是受支持的。

版本 3.23 中添加: OBJCOBJCXXCUDAHIP 是受支持的。

注意

要使用 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)