POSITION_INDEPENDENT_CODE¶
A target property that specifies whether to create a target that has position-independent code enabled.
The POSITION_INDEPENDENT_CODE
target property determines whether
position-independent executables or libraries will be created. This
property is True
by default for SHARED
and MODULE
library
targets. For other targets, this property is initialized by the value
of the CMAKE_POSITION_INDEPENDENT_CODE
variable if it is set
when the target is created, or False
otherwise.
Note
For executable targets, the link step is controlled by the CMP0083
policy and the CheckPIESupported
module.
Position-independent code (PIC) refers to machine code that executes properly regardless of its absolute memory address. This is particularly important for shared libraries, which are often loaded at different memory addresses by different programs. Generating position-independent code ensures that these libraries can be safely and efficiently shared among multiple processes without causing address conflicts. On some platforms (notably UNIX-like systems), generating PIC is also a requirement for creating shared libraries.
Use of position-independent code is recommended or required in the following cases:
When building shared or module libraries (e.g., with
add_library(... SHARED)
, oradd_library(... MODULE)
), where PIC allows dynamic relocation at runtime.When building executables as position-independent executables (PIE), which can enhance security by enabling Address Space Layout Randomization (ASLR).
On platforms or toolchains that require PIC for certain types of linking or sandboxed environments.
Enabling PIC can result in slightly larger or slower code on some architectures, but this is often outweighed by the benefits of flexibility and security.
Examples¶
Enabling PIC for a static library target:
add_library(foo STATIC foo.c)
set_target_properties(foo PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
Enabling PIC for an executable target:
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()
See Also¶
The
CheckPIESupported
module to pass PIE-related options to the linker for executables.