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), or add_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.