193 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			193 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<html lang="en">
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								<title>ARM - Untitled</title>
							 | 
						||
| 
								 | 
							
								<meta http-equiv="Content-Type" content="text/html">
							 | 
						||
| 
								 | 
							
								<meta name="description" content="Untitled">
							 | 
						||
| 
								 | 
							
								<meta name="generator" content="makeinfo 4.7">
							 | 
						||
| 
								 | 
							
								<link title="Top" rel="start" href="index.html#Top">
							 | 
						||
| 
								 | 
							
								<link rel="up" href="Machine-Dependent.html#Machine-Dependent" title="Machine Dependent">
							 | 
						||
| 
								 | 
							
								<link rel="prev" href="i960.html#i960" title="i960">
							 | 
						||
| 
								 | 
							
								<link rel="next" href="HPPA-ELF32.html#HPPA-ELF32" title="HPPA ELF32">
							 | 
						||
| 
								 | 
							
								<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
							 | 
						||
| 
								 | 
							
								<!--
							 | 
						||
| 
								 | 
							
								This file documents the GNU linker LD
							 | 
						||
| 
								 | 
							
								(GNU Binutils)
							 | 
						||
| 
								 | 
							
								version 2.19.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000,
							 | 
						||
| 
								 | 
							
								2001, 2002, 2003, 2004, 2005, 2006, 2007 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.1
							 | 
						||
| 
								 | 
							
								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''.-->
							 | 
						||
| 
								 | 
							
								<meta http-equiv="Content-Style-Type" content="text/css">
							 | 
						||
| 
								 | 
							
								<style type="text/css"><!--
							 | 
						||
| 
								 | 
							
								  pre.display { font-family:inherit }
							 | 
						||
| 
								 | 
							
								  pre.format  { font-family:inherit }
							 | 
						||
| 
								 | 
							
								  pre.smalldisplay { font-family:inherit; font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smallformat  { font-family:inherit; font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smallexample { font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smalllisp    { font-size:smaller }
							 | 
						||
| 
								 | 
							
								  span.sc { font-variant:small-caps }
							 | 
						||
| 
								 | 
							
								  span.roman { font-family: serif; font-weight: normal; } 
							 | 
						||
| 
								 | 
							
								--></style>
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								<body>
							 | 
						||
| 
								 | 
							
								<div class="node">
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								<a name="ARM"></a>Next: <a rel="next" accesskey="n" href="HPPA-ELF32.html#HPPA-ELF32">HPPA ELF32</a>,
							 | 
						||
| 
								 | 
							
								Previous: <a rel="previous" accesskey="p" href="i960.html#i960">i960</a>,
							 | 
						||
| 
								 | 
							
								Up: <a rel="up" accesskey="u" href="Machine-Dependent.html#Machine-Dependent">Machine Dependent</a>
							 | 
						||
| 
								 | 
							
								<hr><br>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3 class="section">4.4 <span class="command">ld</span> and the ARM family</h3>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p><a name="index-ARM-interworking-support-532"></a><a name="index-_002d_002dsupport_002dold_002dcode-533"></a>For the ARM, <span class="command">ld</span> 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 <span class="samp">-mthumb-interwork</span> 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 <span class="samp">--support-old-code</span> 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-534"></a><a name="index-entry-point_002c-thumb-535"></a><a name="index-_002d_002dthumb_002dentry_003d_0040var_007bentry_007d-536"></a>The <span class="samp">--thumb-entry</span> switch is a duplicate of the generic
							 | 
						||
| 
								 | 
							
								<span class="samp">--entry</span> 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-BE8-537"></a><a name="index-_002d_002dbe8-538"></a>The <span class="samp">--be8</span> switch instructs <span class="command">ld</span> to generate BE8 format
							 | 
						||
| 
								 | 
							
								executables.  This option is only valid when linking big-endian objects. 
							 | 
						||
| 
								 | 
							
								The resulting image will contain big-endian data and little-endian code.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-TARGET1-539"></a><a name="index-_002d_002dtarget1_002drel-540"></a><a name="index-_002d_002dtarget1_002dabs-541"></a>The <span class="samp">R_ARM_TARGET1</span> relocation is typically used for entries in the
							 | 
						||
| 
								 | 
							
								<span class="samp">.init_array</span> section.  It is interpreted as either <span class="samp">R_ARM_REL32</span>
							 | 
						||
| 
								 | 
							
								or <span class="samp">R_ARM_ABS32</span>, depending on the target.  The <span class="samp">--target1-rel</span>
							 | 
						||
| 
								 | 
							
								and <span class="samp">--target1-abs</span> switches override the default.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-TARGET2-542"></a><a name="index-_002d_002dtarget2_003d_0040var_007btype_007d-543"></a>The <span class="samp">--target2=type</span> switch overrides the default definition of the
							 | 
						||
| 
								 | 
							
								<span class="samp">R_ARM_TARGET2</span> relocation.  Valid values for <span class="samp">type</span>, their
							 | 
						||
| 
								 | 
							
								meanings, and target defaults are as follows:
							 | 
						||
| 
								 | 
							
								     <dl>
							 | 
						||
| 
								 | 
							
								<dt><span class="samp">rel</span><dd><span class="samp">R_ARM_REL32</span> (arm*-*-elf, arm*-*-eabi)
							 | 
						||
| 
								 | 
							
								<br><dt><span class="samp">abs</span><dd><span class="samp">R_ARM_ABS32</span> (arm*-*-symbianelf)
							 | 
						||
| 
								 | 
							
								<br><dt><span class="samp">got-rel</span><dd><span class="samp">R_ARM_GOT_PREL</span> (arm*-*-linux, arm*-*-*bsd)
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-FIX_005fV4BX-544"></a><a name="index-_002d_002dfix_002dv4bx-545"></a>The <span class="samp">R_ARM_V4BX</span> 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>In the latter case, the switch <span class="option">--fix-v4bx</span> 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>In the former case, the switch should not be used, and <span class="samp">R_ARM_V4BX</span>
							 | 
						||
| 
								 | 
							
								relocations are ignored.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-FIX_005fV4BX_005fINTERWORKING-546"></a><a name="index-_002d_002dfix_002dv4bx_002dinterworking-547"></a>Replace <code>BX rM</code> instructions identified by <span class="samp">R_ARM_V4BX</span>
							 | 
						||
| 
								 | 
							
								relocations with a branch to the following veneer:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<pre class="smallexample">     TST rM, #1
							 | 
						||
| 
								 | 
							
								     MOVEQ PC, rM
							 | 
						||
| 
								 | 
							
								     BX Rn
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								   <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 progrm behavior in rare cases.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-USE_005fBLX-548"></a><a name="index-_002d_002duse_002dblx-549"></a>The <span class="samp">--use-blx</span> 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>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-550"></a><a name="index-_002d_002dvfp11_002ddenorm_002dfix-551"></a>The <span class="samp">--vfp11-denorm-fix</span> 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>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>If you know you are using buggy VFP11 hardware, you can
							 | 
						||
| 
								 | 
							
								enable this workaround by specifying the linker option
							 | 
						||
| 
								 | 
							
								<span class="samp">--vfp-denorm-fix=scalar</span> if you are using the VFP11 scalar
							 | 
						||
| 
								 | 
							
								mode only, or <span class="samp">--vfp-denorm-fix=vector</span> if you are using
							 | 
						||
| 
								 | 
							
								vector mode (the latter also works for scalar code). The default is
							 | 
						||
| 
								 | 
							
								<span class="samp">--vfp-denorm-fix=none</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <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-NO_005fENUM_005fSIZE_005fWARNING-552"></a><a name="index-_002d_002dno_002denum_002dsize_002dwarning-553"></a>The <span class="option">--no-enum-size-warning</span> 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-554"></a><a name="index-_002d_002dno_002dwchar_002dsize_002dwarning-555"></a>The <span class="option">--no-wchar-size-warning</span> 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-556"></a><a name="index-_002d_002dpic_002dveneer-557"></a>The <span class="samp">--pic-veneer</span> 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
							 | 
						||
| 
								 | 
							
								<span class="samp">--emit-relocs</span> is used to generate relocatable binaries.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-STUB_005fGROUP_005fSIZE-558"></a><a name="index-_002d_002dstub_002dgroup_002dsize_003d_0040var_007bN_007d-559"></a>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 <span class="option">--stub-group-size=N</span>. 
							 | 
						||
| 
								 | 
							
								The placement is important because a poor choice can create a need for
							 | 
						||
| 
								 | 
							
								duplicate stubs, increasing the code sizw.  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>The value of <span class="samp">N</span>, the parameter to the
							 | 
						||
| 
								 | 
							
								<span class="option">--stub-group-size=</span> option controls where the stub groups are
							 | 
						||
| 
								 | 
							
								placed.  If it is negative then all stubs are placed before 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 <span class="samp">N</span> 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 <span class="samp">N</span> greater than 1 (or smaller than -1) tells the
							 | 
						||
| 
								 | 
							
								linker that a single group of stubs can service at most <span class="samp">N</span> bytes
							 | 
						||
| 
								 | 
							
								from the input sections.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>The default, if <span class="option">--stub-group-size=</span> is not specified, is
							 | 
						||
| 
								 | 
							
								<span class="samp">N = +1</span>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>Farcalls stubs insertion is fully supported for the ARM-EABI target
							 | 
						||
| 
								 | 
							
								only, because it relies on object files properties not present
							 | 
						||
| 
								 | 
							
								otherwise.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   </body></html>
							 | 
						||
| 
								 | 
							
								
							 |