mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-28 09:59:20 -05:00
PIE link options: Update strategy to fix performance regression
Fixes: #18700
This commit is contained in:
committed by
Craig Scott
parent
3bd8144601
commit
f255280fd9
@@ -134,6 +134,11 @@ default values:
|
||||
If :policy:`CMP0056` is set to ``NEW``, then
|
||||
:variable:`CMAKE_EXE_LINKER_FLAGS` is passed in as well.
|
||||
|
||||
If :policy:`CMP0083` is set to ``NEW``, then in order to obtain correct
|
||||
behavior at link time, the ``check_pie_supported()`` command from the
|
||||
:module:`CheckPIESupported` module must be called before using the
|
||||
:command:`try_compile` command.
|
||||
|
||||
The current settings of :policy:`CMP0065` and :policy:`CMP0083` are set in the
|
||||
generated project.
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ These modules are loaded using the :command:`include` command.
|
||||
/module/CheckIncludeFiles
|
||||
/module/CheckLanguage
|
||||
/module/CheckLibraryExists
|
||||
/module/CheckPIESupported
|
||||
/module/CheckPrototypeDefinition
|
||||
/module/CheckStructHasMember
|
||||
/module/CheckSymbolExists
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.. cmake-module:: ../../Modules/CheckPIESupported.cmake
|
||||
@@ -17,8 +17,46 @@ is set:
|
||||
passed to the linker step. For example ``-no-pie`` for ``GCC``.
|
||||
* Not set: no flags are passed to the linker step.
|
||||
|
||||
Since a given linker may not support ``PIE`` flags in all environments in
|
||||
which it is used, it is the project's responsibility to use the
|
||||
:module:`CheckPIESupported` module to check for support to ensure that the
|
||||
:prop_tgt:`POSITION_INDEPENDENT_CODE` target property for executables will be
|
||||
honored at link time.
|
||||
|
||||
This policy was introduced in CMake version 3.14. CMake version
|
||||
|release| warns when the policy is not set and uses ``OLD`` behavior. Use
|
||||
the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
|
||||
|
||||
.. include:: DEPRECATED.txt
|
||||
|
||||
Examples
|
||||
^^^^^^^^
|
||||
|
||||
Behave like CMake 3.13 and do not apply any ``PIE`` flags at link stage.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(foo)
|
||||
|
||||
# ...
|
||||
|
||||
add_executable(foo ...)
|
||||
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
|
||||
|
||||
Use the :module:`CheckPIESupported` module to detect whether ``PIE`` is
|
||||
supported by the current linker and environment. Apply ``PIE`` flags only
|
||||
if the linker supports them.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
cmake_minimum_required(VERSION 3.14) # CMP0083 NEW
|
||||
project(foo)
|
||||
|
||||
include(CheckPIESupported)
|
||||
check_pie_supported()
|
||||
|
||||
# ...
|
||||
|
||||
add_executable(foo ...)
|
||||
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE TRUE)
|
||||
|
||||
@@ -9,3 +9,8 @@ property is ``True`` by default for ``SHARED`` and ``MODULE`` library
|
||||
targets and ``False`` otherwise. This property is initialized by the value
|
||||
of the :variable:`CMAKE_POSITION_INDEPENDENT_CODE` variable if it is set
|
||||
when a target is created.
|
||||
|
||||
.. note::
|
||||
|
||||
For executable targets, the link step is controlled by the :policy:`CMP0083`
|
||||
policy and the :module:`CheckPIESupported` module.
|
||||
|
||||
@@ -2,5 +2,8 @@ link-option-PIE
|
||||
---------------
|
||||
|
||||
* Required link options to manage Position Independent Executable are now
|
||||
added when :prop_tgt:`POSITION_INDEPENDENT_CODE` is set. These flags are
|
||||
controlled by policy :policy:`CMP0083`.
|
||||
added when :prop_tgt:`POSITION_INDEPENDENT_CODE` is set. The project is
|
||||
responsible for using the :module:`CheckPIESupported` module to check for
|
||||
``PIE`` support to ensure that the :prop_tgt:`POSITION_INDEPENDENT_CODE`
|
||||
target property will be honored at link time for executables. This behavior
|
||||
is controlled by policy :policy:`CMP0083`.
|
||||
|
||||
Reference in New Issue
Block a user