forked from OSchip/llvm-project
54 lines
2.0 KiB
ReStructuredText
54 lines
2.0 KiB
ReStructuredText
Linker Script implementation notes and policy
|
|
=============================================
|
|
|
|
LLD implements a large subset of the GNU ld linker script notation. The LLD
|
|
implementation policy is to implement linker script features as they are
|
|
documented in the ld `manual <https://sourceware.org/binutils/docs/ld/Scripts.html>`_
|
|
We consider it a bug if the lld implementation does not agree with the manual
|
|
and it is not mentioned in the exceptions below.
|
|
|
|
The ld manual is not a complete specification, and is not sufficient to build
|
|
an implementation. In particular some features are only defined by the
|
|
implementation and have changed over time.
|
|
|
|
The lld implementation policy for properties of linker scripts that are not
|
|
defined by the documentation is to follow the GNU ld implementation wherever
|
|
possible. We reserve the right to make different implementation choices where
|
|
it is appropriate for LLD. Intentional deviations will be documented in this
|
|
file.
|
|
|
|
Output section description
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The description of an output section looks like:
|
|
|
|
::
|
|
|
|
section [address] [(type)] : [AT(lma)] [ALIGN(section_align)] [SUBALIGN](subsection_align)] {
|
|
output-section-command
|
|
...
|
|
} [>region] [AT>lma_region] [:phdr ...] [=fillexp] [,]
|
|
|
|
Output section address
|
|
----------------------
|
|
|
|
When an *OutputSection* *S* has ``address``, LLD will set sh_addr to ``address``.
|
|
|
|
The ELF specification says:
|
|
|
|
> The value of sh_addr must be congruent to 0, modulo the value of sh_addralign.
|
|
|
|
The presence of ``address`` can cause the condition unsatisfied. LLD will warn.
|
|
GNU ld from Binutils 2.35 onwards will reduce sh_addralign so that
|
|
sh_addr=0 (modulo sh_addralign).
|
|
|
|
Output section alignment
|
|
------------------------
|
|
|
|
sh_addralign of an *OutputSection* *S* is the maximum of
|
|
``ALIGN(section_align)`` and the maximum alignment of the input sections in
|
|
*S*.
|
|
|
|
When an *OutputSection* *S* has both ``address`` and ``ALIGN(section_align)``,
|
|
GNU ld will set sh_addralign to ``ALIGN(section_align)``.
|