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