Spec-Zone.ru › CMake

POSITION_INDEPENDENT_CODE

Свойство цели, определяющее, следует ли создавать цель с включённым позиционно-независимым кодом.

Свойство цели POSITION_INDEPENDENT_CODE определяет, будут ли создаваться позиционно-независимые исполняемые файлы или библиотеки. По умолчанию для целей библиотек SHARED и MODULE этому свойству присваивается значение 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, при сборке исполняемых файлов.

© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/POSITION_INDEPENDENT_CODE.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API