POSITION_INDEPENDENT_CODE

一个目标属性,用于指定是否创建启用了位置无关代码的目标。

POSITION_INDEPENDENT_CODE 目标属性决定了是否创建位置无关可执行文件或库。此属性对于 SHAREDMODULE 库目标默认为 True。对于其他目标,如果目标创建时设置了 CMAKE_POSITION_INDEPENDENT_CODE 变量,则此属性将由此变量的值初始化;否则,默认为 False

注意

对于可执行目标,链接步骤由 CMP0083 策略和 CheckPIESupported 模块控制。

位置无关代码 (PIC) 指的是无论其绝对内存地址如何都能正确执行的机器代码。这对于共享库尤其重要,共享库通常在不同程序中加载到不同的内存地址。生成位置无关代码可确保这些库能够安全高效地在多个进程之间共享,而不会引起地址冲突。在某些平台(尤其是类 Unix 系统)上,生成 PIC 也是创建共享库的要求。

在以下情况下建议或需要使用位置无关代码:

  • 构建共享库或模块库时(例如,使用 add_library(... SHARED)add_library(... MODULE)),PIC 允许在运行时进行动态重定位。

  • 将可执行文件构建为位置无关可执行文件 (PIE) 时,通过启用地址空间布局随机化 (ASLR) 来增强安全性。

  • 在某些平台或工具链上,在特定类型的链接或沙箱环境中需要 PIC。

在某些架构上,启用 PIC 可能会导致代码稍微增大或变慢,但这通常被灵活性和安全性的好处所抵消。

示例

为静态库目标启用 PIC

add_library(foo STATIC foo.c)
set_target_properties(foo PROPERTIES POSITION_INDEPENDENT_CODE TRUE)

为可执行目标启用 PIC

add_executable(app app.c)

set_target_properties(app PROPERTIES POSITION_INDEPENDENT_CODE TRUE)

# Additionally, pass PIE-related link-time options to executable(s).
include(CheckPIESupported)
check_pie_supported()

另请参阅

  • CheckPIESupported 模块,用于将与 PIE 相关的选项传递给可执行文件的链接器。