| 
							- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 - <html>
 - <!-- This file documents the GNU linker LD
 - (GNU Arm Embedded Toolchain 10-2020-q4-major)
 - version 2.35.1.
 - 
 - Copyright (C) 1991-2020 Free Software Foundation, Inc.
 - 
 - Permission is granted to copy, distribute and/or modify this document
 - under the terms of the GNU Free Documentation License, Version 1.3
 - or any later version published by the Free Software Foundation;
 - with no Invariant Sections, with no Front-Cover Texts, and with no
 - Back-Cover Texts.  A copy of the license is included in the
 - section entitled "GNU Free Documentation License". -->
 - <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
 - <head>
 - <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 - <title>ARM (LD)</title>
 - 
 - <meta name="description" content="ARM (LD)">
 - <meta name="keywords" content="ARM (LD)">
 - <meta name="resource-type" content="document">
 - <meta name="distribution" content="global">
 - <meta name="Generator" content="makeinfo">
 - <link href="index.html#Top" rel="start" title="Top">
 - <link href="LD-Index.html#LD-Index" rel="index" title="LD Index">
 - <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
 - <link href="Machine-Dependent.html#Machine-Dependent" rel="up" title="Machine Dependent">
 - <link href="HPPA-ELF32.html#HPPA-ELF32" rel="next" title="HPPA ELF32">
 - <link href="M68HC11_002f68HC12.html#M68HC11_002f68HC12" rel="prev" title="M68HC11/68HC12">
 - <style type="text/css">
 - <!--
 - a.summary-letter {text-decoration: none}
 - blockquote.indentedblock {margin-right: 0em}
 - blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
 - blockquote.smallquotation {font-size: smaller}
 - div.display {margin-left: 3.2em}
 - div.example {margin-left: 3.2em}
 - div.lisp {margin-left: 3.2em}
 - div.smalldisplay {margin-left: 3.2em}
 - div.smallexample {margin-left: 3.2em}
 - div.smalllisp {margin-left: 3.2em}
 - kbd {font-style: oblique}
 - pre.display {font-family: inherit}
 - pre.format {font-family: inherit}
 - pre.menu-comment {font-family: serif}
 - pre.menu-preformatted {font-family: serif}
 - pre.smalldisplay {font-family: inherit; font-size: smaller}
 - pre.smallexample {font-size: smaller}
 - pre.smallformat {font-family: inherit; font-size: smaller}
 - pre.smalllisp {font-size: smaller}
 - span.nolinebreak {white-space: nowrap}
 - span.roman {font-family: initial; font-weight: normal}
 - span.sansserif {font-family: sans-serif; font-weight: normal}
 - ul.no-bullet {list-style: none}
 - -->
 - </style>
 - 
 - 
 - </head>
 - 
 - <body lang="en">
 - <a name="ARM"></a>
 - <div class="header">
 - <p>
 - Next: <a href="HPPA-ELF32.html#HPPA-ELF32" accesskey="n" rel="next">HPPA ELF32</a>, Previous: <a href="M68HC11_002f68HC12.html#M68HC11_002f68HC12" accesskey="p" rel="prev">M68HC11/68HC12</a>, Up: <a href="Machine-Dependent.html#Machine-Dependent" accesskey="u" rel="up">Machine Dependent</a>   [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
 - </div>
 - <hr>
 - <a name="ld-and-the-ARM-family"></a>
 - <h3 class="section">4.3 <code>ld</code> and the ARM family</h3>
 - 
 - <a name="index-ARM-interworking-support"></a>
 - <a name="index-_002d_002dsupport_002dold_002dcode"></a>
 - <p>For the ARM, <code>ld</code> will generate code stubs to allow functions calls
 - between ARM and Thumb code.  These stubs only work with code that has
 - been compiled and assembled with the ‘<samp>-mthumb-interwork</samp>’ command
 - line option.  If it is necessary to link with old ARM object files or
 - libraries, which have not been compiled with the -mthumb-interwork
 - option then the ‘<samp>--support-old-code</samp>’ command-line switch should be
 - given to the linker.  This will make it generate larger stub functions
 - which will work with non-interworking aware ARM code.  Note, however,
 - the linker does not support generating stubs for function calls to
 - non-interworking aware Thumb code.
 - </p>
 - <a name="index-thumb-entry-point"></a>
 - <a name="index-entry-point_002c-thumb"></a>
 - <a name="index-_002d_002dthumb_002dentry_003dentry"></a>
 - <p>The ‘<samp>--thumb-entry</samp>’ switch is a duplicate of the generic
 - ‘<samp>--entry</samp>’ switch, in that it sets the program’s starting address.
 - But it also sets the bottom bit of the address, so that it can be
 - branched to using a BX instruction, and the program will start
 - executing in Thumb mode straight away.
 - </p>
 - <a name="index-PE-import-table-prefixing"></a>
 - <a name="index-_002d_002duse_002dnul_002dprefixed_002dimport_002dtables"></a>
 - <p>The ‘<samp>--use-nul-prefixed-import-tables</samp>’ switch is specifying, that
 - the import tables idata4 and idata5 have to be generated with a zero
 - element prefix for import libraries. This is the old style to generate
 - import tables. By default this option is turned off.
 - </p>
 - <a name="index-BE8"></a>
 - <a name="index-_002d_002dbe8"></a>
 - <p>The ‘<samp>--be8</samp>’ switch instructs <code>ld</code> to generate BE8 format
 - executables.  This option is only valid when linking big-endian
 - objects - ie ones which have been assembled with the <samp>-EB</samp>
 - option.  The resulting image will contain big-endian data and
 - little-endian code.
 - </p>
 - <a name="index-TARGET1"></a>
 - <a name="index-_002d_002dtarget1_002drel"></a>
 - <a name="index-_002d_002dtarget1_002dabs"></a>
 - <p>The ‘<samp>R_ARM_TARGET1</samp>’ relocation is typically used for entries in the
 - ‘<samp>.init_array</samp>’ section.  It is interpreted as either ‘<samp>R_ARM_REL32</samp>’
 - or ‘<samp>R_ARM_ABS32</samp>’, depending on the target.  The ‘<samp>--target1-rel</samp>’
 - and ‘<samp>--target1-abs</samp>’ switches override the default.
 - </p>
 - <a name="index-TARGET2"></a>
 - <a name="index-_002d_002dtarget2_003dtype"></a>
 - <p>The ‘<samp>--target2=type</samp>’ switch overrides the default definition of the
 - ‘<samp>R_ARM_TARGET2</samp>’ relocation.  Valid values for ‘<samp>type</samp>’, their
 - meanings, and target defaults are as follows:
 - </p><dl compact="compact">
 - <dt>‘<samp>rel</samp>’</dt>
 - <dd><p>‘<samp>R_ARM_REL32</samp>’ (arm*-*-elf, arm*-*-eabi)
 - </p></dd>
 - <dt>‘<samp>abs</samp>’</dt>
 - <dd><p>‘<samp>R_ARM_ABS32</samp>’ (arm*-*-symbianelf)
 - </p></dd>
 - <dt>‘<samp>got-rel</samp>’</dt>
 - <dd><p>‘<samp>R_ARM_GOT_PREL</samp>’ (arm*-*-linux, arm*-*-*bsd)
 - </p></dd>
 - </dl>
 - 
 - <a name="index-FIX_005fV4BX"></a>
 - <a name="index-_002d_002dfix_002dv4bx"></a>
 - <p>The ‘<samp>R_ARM_V4BX</samp>’ relocation (defined by the ARM AAELF
 - specification) enables objects compiled for the ARMv4 architecture to be
 - interworking-safe when linked with other objects compiled for ARMv4t, but
 - also allows pure ARMv4 binaries to be built from the same ARMv4 objects.
 - </p>
 - <p>In the latter case, the switch <samp>--fix-v4bx</samp> must be passed to the
 - linker, which causes v4t <code>BX rM</code> instructions to be rewritten as
 - <code>MOV PC,rM</code>, since v4 processors do not have a <code>BX</code> instruction.
 - </p>
 - <p>In the former case, the switch should not be used, and ‘<samp>R_ARM_V4BX</samp>’
 - relocations are ignored.
 - </p>
 - <a name="index-FIX_005fV4BX_005fINTERWORKING"></a>
 - <a name="index-_002d_002dfix_002dv4bx_002dinterworking"></a>
 - <p>Replace <code>BX rM</code> instructions identified by ‘<samp>R_ARM_V4BX</samp>’
 - relocations with a branch to the following veneer:
 - </p>
 - <div class="smallexample">
 - <pre class="smallexample">TST rM, #1
 - MOVEQ PC, rM
 - BX Rn
 - </pre></div>
 - 
 - <p>This allows generation of libraries/applications that work on ARMv4 cores
 - and are still interworking safe.  Note that the above veneer clobbers the
 - condition flags, so may cause incorrect program behavior in rare cases.
 - </p>
 - <a name="index-USE_005fBLX"></a>
 - <a name="index-_002d_002duse_002dblx"></a>
 - <p>The ‘<samp>--use-blx</samp>’ switch enables the linker to use ARM/Thumb
 - BLX instructions (available on ARMv5t and above) in various
 - situations. Currently it is used to perform calls via the PLT from Thumb
 - code using BLX rather than using BX and a mode-switching stub before
 - each PLT entry. This should lead to such calls executing slightly faster.
 - </p>
 - <p>This option is enabled implicitly for SymbianOS, so there is no need to
 - specify it if you are using that target.
 - </p>
 - <a name="index-VFP11_005fDENORM_005fFIX"></a>
 - <a name="index-_002d_002dvfp11_002ddenorm_002dfix"></a>
 - <p>The ‘<samp>--vfp11-denorm-fix</samp>’ switch enables a link-time workaround for a
 - bug in certain VFP11 coprocessor hardware, which sometimes allows
 - instructions with denorm operands (which must be handled by support code)
 - to have those operands overwritten by subsequent instructions before
 - the support code can read the intended values.
 - </p>
 - <p>The bug may be avoided in scalar mode if you allow at least one
 - intervening instruction between a VFP11 instruction which uses a register
 - and another instruction which writes to the same register, or at least two
 - intervening instructions if vector mode is in use. The bug only affects
 - full-compliance floating-point mode: you do not need this workaround if
 - you are using "runfast" mode. Please contact ARM for further details.
 - </p>
 - <p>If you know you are using buggy VFP11 hardware, you can
 - enable this workaround by specifying the linker option
 - ‘<samp>--vfp-denorm-fix=scalar</samp>’ if you are using the VFP11 scalar
 - mode only, or ‘<samp>--vfp-denorm-fix=vector</samp>’ if you are using
 - vector mode (the latter also works for scalar code). The default is
 - ‘<samp>--vfp-denorm-fix=none</samp>’.
 - </p>
 - <p>If the workaround is enabled, instructions are scanned for
 - potentially-troublesome sequences, and a veneer is created for each
 - such sequence which may trigger the erratum. The veneer consists of the
 - first instruction of the sequence and a branch back to the subsequent
 - instruction. The original instruction is then replaced with a branch to
 - the veneer. The extra cycles required to call and return from the veneer
 - are sufficient to avoid the erratum in both the scalar and vector cases.
 - </p>
 - <a name="index-ARM1176-erratum-workaround"></a>
 - <a name="index-_002d_002dfix_002darm1176"></a>
 - <a name="index-_002d_002dno_002dfix_002darm1176"></a>
 - <p>The ‘<samp>--fix-arm1176</samp>’ switch enables a link-time workaround for an erratum
 - in certain ARM1176 processors.  The workaround is enabled by default if you
 - are targeting ARM v6 (excluding ARM v6T2) or earlier.  It can be disabled
 - unconditionally by specifying ‘<samp>--no-fix-arm1176</samp>’.
 - </p>
 - <p>Further information is available in the “ARM1176JZ-S and ARM1176JZF-S
 - Programmer Advice Notice” available on the ARM documentation website at:
 - http://infocenter.arm.com/.
 - </p>
 - <a name="index-STM32L4xx-erratum-workaround"></a>
 - <a name="index-_002d_002dfix_002dstm32l4xx_002d629360"></a>
 - 
 - <p>The ‘<samp>--fix-stm32l4xx-629360</samp>’ switch enables a link-time
 - workaround for a bug in the bus matrix / memory controller for some of
 - the STM32 Cortex-M4 based products (STM32L4xx).  When accessing
 - off-chip memory via the affected bus for bus reads of 9 words or more,
 - the bus can generate corrupt data and/or abort.  These are only
 - core-initiated accesses (not DMA), and might affect any access:
 - integer loads such as LDM, POP and floating-point loads such as VLDM,
 - VPOP.  Stores are not affected.
 - </p>
 - <p>The bug can be avoided by splitting memory accesses into the
 - necessary chunks to keep bus reads below 8 words.
 - </p>
 - <p>The workaround is not enabled by default, this is equivalent to use
 - ‘<samp>--fix-stm32l4xx-629360=none</samp>’.  If you know you are using buggy
 - STM32L4xx hardware, you can enable the workaround by specifying the
 - linker option ‘<samp>--fix-stm32l4xx-629360</samp>’, or the equivalent
 - ‘<samp>--fix-stm32l4xx-629360=default</samp>’.
 - </p>
 - <p>If the workaround is enabled, instructions are scanned for
 - potentially-troublesome sequences, and a veneer is created for each
 - such sequence which may trigger the erratum.  The veneer consists in a
 - replacement sequence emulating the behaviour of the original one and a
 - branch back to the subsequent instruction.  The original instruction is
 - then replaced with a branch to the veneer.
 - </p>
 - <p>The workaround does not always preserve the memory access order for
 - the LDMDB instruction, when the instruction loads the PC.
 - </p>
 - <p>The workaround is not able to handle problematic instructions when
 - they are in the middle of an IT block, since a branch is not allowed
 - there.  In that case, the linker reports a warning and no replacement
 - occurs.
 - </p>
 - <p>The workaround is not able to replace problematic instructions with a
 - PC-relative branch instruction if the ‘<samp>.text</samp>’ section is too
 - large.  In that case, when the branch that replaces the original code
 - cannot be encoded, the linker reports a warning and no replacement
 - occurs.
 - </p>
 - <a name="index-NO_005fENUM_005fSIZE_005fWARNING"></a>
 - <a name="index-_002d_002dno_002denum_002dsize_002dwarning"></a>
 - <p>The <samp>--no-enum-size-warning</samp> switch prevents the linker from
 - warning when linking object files that specify incompatible EABI
 - enumeration size attributes.  For example, with this switch enabled,
 - linking of an object file using 32-bit enumeration values with another
 - using enumeration values fitted into the smallest possible space will
 - not be diagnosed.
 - </p>
 - <a name="index-NO_005fWCHAR_005fSIZE_005fWARNING"></a>
 - <a name="index-_002d_002dno_002dwchar_002dsize_002dwarning"></a>
 - <p>The <samp>--no-wchar-size-warning</samp> switch prevents the linker from
 - warning when linking object files that specify incompatible EABI
 - <code>wchar_t</code> size attributes.  For example, with this switch enabled,
 - linking of an object file using 32-bit <code>wchar_t</code> values with another
 - using 16-bit <code>wchar_t</code> values will not be diagnosed.
 - </p>
 - <a name="index-PIC_005fVENEER"></a>
 - <a name="index-_002d_002dpic_002dveneer"></a>
 - <p>The ‘<samp>--pic-veneer</samp>’ switch makes the linker use PIC sequences for
 - ARM/Thumb interworking veneers, even if the rest of the binary
 - is not PIC.  This avoids problems on uClinux targets where
 - ‘<samp>--emit-relocs</samp>’ is used to generate relocatable binaries.
 - </p>
 - <a name="index-STUB_005fGROUP_005fSIZE"></a>
 - <a name="index-_002d_002dstub_002dgroup_002dsize_003dN"></a>
 - <p>The linker will automatically generate and insert small sequences of
 - code into a linked ARM ELF executable whenever an attempt is made to
 - perform a function call to a symbol that is too far away.  The
 - placement of these sequences of instructions - called stubs - is
 - controlled by the command-line option <samp>--stub-group-size=N</samp>.
 - The placement is important because a poor choice can create a need for
 - duplicate stubs, increasing the code size.  The linker will try to
 - group stubs together in order to reduce interruptions to the flow of
 - code, but it needs guidance as to how big these groups should be and
 - where they should be placed.
 - </p>
 - <p>The value of ‘<samp>N</samp>’, the parameter to the
 - <samp>--stub-group-size=</samp> option controls where the stub groups are
 - placed.  If it is negative then all stubs are placed after the first
 - branch that needs them.  If it is positive then the stubs can be
 - placed either before or after the branches that need them.  If the
 - value of ‘<samp>N</samp>’ is 1 (either +1 or -1) then the linker will choose
 - exactly where to place groups of stubs, using its built in heuristics.
 - A value of ‘<samp>N</samp>’ greater than 1 (or smaller than -1) tells the
 - linker that a single group of stubs can service at most ‘<samp>N</samp>’ bytes
 - from the input sections.
 - </p>
 - <p>The default, if <samp>--stub-group-size=</samp> is not specified, is
 - ‘<samp>N = +1</samp>’.
 - </p>
 - <p>Farcalls stubs insertion is fully supported for the ARM-EABI target
 - only, because it relies on object files properties not present
 - otherwise.
 - </p>
 - <a name="index-Cortex_002dA8-erratum-workaround"></a>
 - <a name="index-_002d_002dfix_002dcortex_002da8"></a>
 - <a name="index-_002d_002dno_002dfix_002dcortex_002da8"></a>
 - <p>The ‘<samp>--fix-cortex-a8</samp>’ switch enables a link-time workaround for an erratum in certain Cortex-A8 processors.  The workaround is enabled by default if you are targeting the ARM v7-A architecture profile.  It can be enabled otherwise by specifying ‘<samp>--fix-cortex-a8</samp>’, or disabled unconditionally by specifying ‘<samp>--no-fix-cortex-a8</samp>’.
 - </p>
 - <p>The erratum only affects Thumb-2 code.  Please contact ARM for further details.
 - </p>
 - <a name="index-Cortex_002dA53-erratum-835769-workaround"></a>
 - <a name="index-_002d_002dfix_002dcortex_002da53_002d835769"></a>
 - <a name="index-_002d_002dno_002dfix_002dcortex_002da53_002d835769"></a>
 - <p>The ‘<samp>--fix-cortex-a53-835769</samp>’ switch enables a link-time workaround for erratum 835769 present on certain early revisions of Cortex-A53 processors.  The workaround is disabled by default.  It can be enabled by specifying ‘<samp>--fix-cortex-a53-835769</samp>’, or disabled unconditionally by specifying ‘<samp>--no-fix-cortex-a53-835769</samp>’.
 - </p>
 - <p>Please contact ARM for further details.
 - </p>
 - <a name="index-_002d_002dmerge_002dexidx_002dentries"></a>
 - <a name="index-_002d_002dno_002dmerge_002dexidx_002dentries-1"></a>
 - <a name="index-Merging-exidx-entries"></a>
 - <p>The ‘<samp>--no-merge-exidx-entries</samp>’ switch disables the merging of adjacent exidx entries in debuginfo.
 - </p>
 - <a name="index-_002d_002dlong_002dplt"></a>
 - <a name="index-32_002dbit-PLT-entries"></a>
 - <p>The ‘<samp>--long-plt</samp>’ option enables the use of 16 byte PLT entries
 - which support up to 4Gb of code.  The default is to use 12 byte PLT
 - entries which only support 512Mb of code.
 - </p>
 - <a name="index-_002d_002dno_002dapply_002ddynamic_002drelocs"></a>
 - <a name="index-AArch64-rela-addend"></a>
 - <p>The ‘<samp>--no-apply-dynamic-relocs</samp>’ option makes AArch64 linker do not apply
 - link-time values for dynamic relocations.
 - </p>
 - <a name="index-Placement-of-SG-veneers"></a>
 - <p>All SG veneers are placed in the special output section <code>.gnu.sgstubs</code>.
 - Its start address must be set, either with the command-line option
 - ‘<samp>--section-start</samp>’ or in a linker script, to indicate where to place these
 - veneers in memory.
 - </p>
 - <a name="index-_002d_002dcmse_002dimplib"></a>
 - <a name="index-Secure-gateway-import-library"></a>
 - <p>The ‘<samp>--cmse-implib</samp>’ option requests that the import libraries
 - specified by the ‘<samp>--out-implib</samp>’ and ‘<samp>--in-implib</samp>’ options are
 - secure gateway import libraries, suitable for linking a non-secure
 - executable against secure code as per ARMv8-M Security Extensions.
 - </p>
 - <a name="index-_002d_002din_002dimplib_003dfile"></a>
 - <a name="index-Input-import-library"></a>
 - <p>The ‘<samp>--in-implib=file</samp>’ specifies an input import library whose symbols
 - must keep the same address in the executable being produced.  A warning is
 - given if no ‘<samp>--out-implib</samp>’ is given but new symbols have been introduced
 - in the executable that should be listed in its import library.  Otherwise, if
 - ‘<samp>--out-implib</samp>’ is specified, the symbols are added to the output import
 - library.  A warning is also given if some symbols present in the input import
 - library have disappeared from the executable.  This option is only effective
 - for Secure Gateway import libraries, ie. when ‘<samp>--cmse-implib</samp>’ is
 - specified.
 - </p>
 - 
 - 
 - <hr>
 - <div class="header">
 - <p>
 - Next: <a href="HPPA-ELF32.html#HPPA-ELF32" accesskey="n" rel="next">HPPA ELF32</a>, Previous: <a href="M68HC11_002f68HC12.html#M68HC11_002f68HC12" accesskey="p" rel="prev">M68HC11/68HC12</a>, Up: <a href="Machine-Dependent.html#Machine-Dependent" accesskey="u" rel="up">Machine Dependent</a>   [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="LD-Index.html#LD-Index" title="Index" rel="index">Index</a>]</p>
 - </div>
 - 
 - 
 - 
 - </body>
 - </html>
 
 
  |