\input texinfo
@setfilename ld.info
@c Copyright (C) 1991-2015 Free Software Foundation, Inc.
@syncodeindex ky cp
@c man begin INCLUDE
@include configdoc.texi
@c (configdoc.texi is generated by the Makefile)
@include bfdver.texi
@c man end

@c @smallbook

@macro gcctabopt{body}
@code{\body\}
@end macro

@c man begin NAME
@ifset man
@c Configure for the generation of man pages
@set UsesEnvVars
@set GENERIC
@set ARM
@set C6X
@set H8300
@set HPPA
@set I960
@set M68HC11
@set M68K
@set MIPS
@set MMIX
@set MSP430
@set NDS32
@set NIOSII
@set POWERPC
@set POWERPC64
@set Renesas
@set SPU
@set TICOFF
@set WIN32
@set XTENSA
@end ifset
@c man end

@ifnottex
@dircategory Software development
@direntry
* Ld: (ld).                       The GNU linker.
@end direntry
@end ifnottex

@copying
This file documents the @sc{gnu} linker LD
@ifset VERSION_PACKAGE
@value{VERSION_PACKAGE}
@end ifset
version @value{VERSION}.

Copyright @copyright{} 1991-2015 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''.
@end copying
@iftex
@finalout
@setchapternewpage odd
@settitle The GNU linker
@titlepage
@title The GNU linker
@sp 1
@subtitle @code{ld}
@ifset VERSION_PACKAGE
@subtitle @value{VERSION_PACKAGE}
@end ifset
@subtitle Version @value{VERSION}
@author Steve Chamberlain
@author Ian Lance Taylor
@page

@tex
{\parskip=0pt
\hfill Red Hat Inc\par
\hfill nickc\@credhat.com, doc\@redhat.com\par
\hfill {\it The GNU linker}\par
\hfill Edited by Jeffrey Osier (jeffrey\@cygnus.com)\par
}
\global\parindent=0pt % Steve likes it this way.
@end tex

@vskip 0pt plus 1filll
@c man begin COPYRIGHT
Copyright @copyright{} 1991-2015 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''.
@c man end

@end titlepage
@end iftex
@contents
@c FIXME: Talk about importance of *order* of args, cmds to linker!

@ifnottex
@node Top
@top LD
This file documents the @sc{gnu} linker ld
@ifset VERSION_PACKAGE
@value{VERSION_PACKAGE}
@end ifset
version @value{VERSION}.

This document is distributed under the terms of the GNU Free
Documentation License version 1.3.  A copy of the license is included
in the section entitled ``GNU Free Documentation License''.

@menu
* Overview::                    Overview
* Invocation::                  Invocation
* Scripts::                     Linker Scripts
@ifset GENERIC
* Machine Dependent::           Machine Dependent Features
@end ifset
@ifclear GENERIC
@ifset H8300
* H8/300::                      ld and the H8/300
@end ifset
@ifset Renesas
* Renesas::                     ld and other Renesas micros
@end ifset
@ifset I960
* i960::                        ld and the Intel 960 family
@end ifset
@ifset ARM
* ARM::				ld and the ARM family
@end ifset
@ifset M68HC11
* M68HC11/68HC12::              ld and the Motorola 68HC11 and 68HC12 families
@end ifset
@ifset HPPA
* HPPA ELF32::                  ld and HPPA 32-bit ELF
@end ifset
@ifset M68K
* M68K::                        ld and Motorola 68K family
@end ifset
@ifset MIPS
* MIPS::                        ld and MIPS family
@end ifset
@ifset POWERPC
* PowerPC ELF32::               ld and PowerPC 32-bit ELF Support
@end ifset
@ifset POWERPC64
* PowerPC64 ELF64::             ld and PowerPC64 64-bit ELF Support
@end ifset
@ifset SPU
* SPU ELF::			ld and SPU ELF Support
@end ifset
@ifset TICOFF
* TI COFF::                     ld and the TI COFF
@end ifset
@ifset WIN32
* Win32::                       ld and WIN32 (cygwin/mingw)
@end ifset
@ifset XTENSA
* Xtensa::                      ld and Xtensa Processors
@end ifset
@end ifclear
@ifclear SingleFormat
* BFD::                         BFD
@end ifclear
@c Following blank line required for remaining bug in makeinfo conds/menus

* Reporting Bugs::              Reporting Bugs
* MRI::                         MRI Compatible Script Files
* GNU Free Documentation License::  GNU Free Documentation License
* LD Index::                       LD Index
@end menu
@end ifnottex

@node Overview
@chapter Overview

@cindex @sc{gnu} linker
@cindex what is this?

@ifset man
@c man begin SYNOPSIS
ld [@b{options}] @var{objfile} @dots{}
@c man end

@c man begin SEEALSO
ar(1), nm(1), objcopy(1), objdump(1), readelf(1) and
the Info entries for @file{binutils} and
@file{ld}.
@c man end
@end ifset

@c man begin DESCRIPTION

@command{ld} combines a number of object and archive files, relocates
their data and ties up symbol references. Usually the last step in
compiling a program is to run @command{ld}.

@command{ld} accepts Linker Command Language files written in
a superset of AT&T's Link Editor Command Language syntax,
to provide explicit and total control over the linking process.

@ifset man
@c For the man only
This man page does not describe the command language; see the
@command{ld} entry in @code{info} for full details on the command
language and on other aspects of the GNU linker.
@end ifset

@ifclear SingleFormat
This version of @command{ld} uses the general purpose BFD libraries
to operate on object files. This allows @command{ld} to read, combine, and
write object files in many different formats---for example, COFF or
@code{a.out}.  Different formats may be linked together to produce any
available kind of object file.  @xref{BFD}, for more information.
@end ifclear

Aside from its flexibility, the @sc{gnu} linker is more helpful than other
linkers in providing diagnostic information.  Many linkers abandon
execution immediately upon encountering an error; whenever possible,
@command{ld} continues executing, allowing you to identify other errors
(or, in some cases, to get an output file in spite of the error).

@c man end

@node Invocation
@chapter Invocation

@c man begin DESCRIPTION

The @sc{gnu} linker @command{ld} is meant to cover a broad range of situations,
and to be as compatible as possible with other linkers.  As a result,
you have many choices to control its behavior.

@c man end

@ifset UsesEnvVars
@menu
* Options::                     Command Line Options
* Environment::                 Environment Variables
@end menu

@node Options
@section Command Line Options
@end ifset

@cindex command line
@cindex options

@c man begin OPTIONS

The linker supports a plethora of command-line options, but in actual
practice few of them are used in any particular context.
@cindex standard Unix system
For instance, a frequent use of @command{ld} is to link standard Unix
object files on a standard, supported Unix system.  On such a system, to
link a file @code{hello.o}:

@smallexample
ld -o @var{output} /lib/crt0.o hello.o -lc
@end smallexample

This tells @command{ld} to produce a file called @var{output} as the
result of linking the file @code{/lib/crt0.o} with @code{hello.o} and
the library @code{libc.a}, which will come from the standard search
directories.  (See the discussion of the @samp{-l} option below.)

Some of the command-line options to @command{ld} may be specified at any
point in the command line.  However, options which refer to files, such
as @samp{-l} or @samp{-T}, cause the file to be read at the point at
which the option appears in the command line, relative to the object
files and other file options.  Repeating non-file options with a
different argument will either have no further effect, or override prior
occurrences (those further to the left on the command line) of that
option.  Options which may be meaningfully specified more than once are
noted in the descriptions below.

@cindex object files
Non-option arguments are object files or archives which are to be linked
together.  They may follow, precede, or be mixed in with command-line
options, except that an object file argument may not be placed between
an option and its argument.

Usually the linker is invoked with at least one object file, but you can
specify other forms of binary input files using @samp{-l}, @samp{-R},
and the script command language.  If @emph{no} binary input files at all
are specified, the linker does not produce any output, and issues the
message @samp{No input files}.

If the linker cannot recognize the format of an object file, it will
assume that it is a linker script.  A script specified in this way
augments the main linker script used for the link (either the default
linker script or the one specified by using @samp{-T}).  This feature
permits the linker to link against a file which appears to be an object
or an archive, but actually merely defines some symbol values, or uses
@code{INPUT} or @code{GROUP} to load other objects.  Specifying a
script in this way merely augments the main linker script, with the
extra commands placed after the main script; use the @samp{-T} option
to replace the default linker script entirely, but note the effect of
the @code{INSERT} command.  @xref{Scripts}.

For options whose names are a single letter,
option arguments must either follow the option letter without intervening
whitespace, or be given as separate arguments immediately following the
option that requires them.

For options whose names are multiple letters, either one dash or two can
precede the option name; for example, @samp{-trace-symbol} and
@samp{--trace-symbol} are equivalent.  Note---there is one exception to
this rule.  Multiple letter options that start with a lower case 'o' can
only be preceded by two dashes.  This is to reduce confusion with the
@samp{-o} option.  So for example @samp{-omagic} sets the output file
name to @samp{magic} whereas @samp{--omagic} sets the NMAGIC flag on the
output.

Arguments to multiple-letter options must either be separated from the
option name by an equals sign, or be given as separate arguments
immediately following the option that requires them.  For example,
@samp{--trace-symbol foo} and @samp{--trace-symbol=foo} are equivalent.
Unique abbreviations of the names of multiple-letter options are
accepted.

Note---if the linker is being invoked indirectly, via a compiler driver
(e.g. @samp{gcc}) then all the linker command line options should be
prefixed by @samp{-Wl,} (or whatever is appropriate for the particular
compiler driver) like this:

@smallexample
  gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
@end smallexample

This is important, because otherwise the compiler driver program may
silently drop the linker options, resulting in a bad link.  Confusion
may also arise when passing options that require values through a
driver, as the use of a space between option and argument acts as
a separator, and causes the driver to pass only the option to the linker
and the argument to the compiler.  In this case, it is simplest to use
the joined forms of both single- and multiple-letter options, such as:

@smallexample
  gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
@end smallexample

Here is a table of the generic command line switches accepted by the GNU
linker:

@table @gcctabopt
@include at-file.texi

@kindex -a @var{keyword}
@item -a @var{keyword}
This option is supported for HP/UX compatibility.  The @var{keyword}
argument must be one of the strings @samp{archive}, @samp{shared}, or
@samp{default}.  @samp{-aarchive} is functionally equivalent to
@samp{-Bstatic}, and the other two keywords are functionally equivalent
to @samp{-Bdynamic}.  This option may be used any number of times.

@kindex --audit @var{AUDITLIB}
@item --audit @var{AUDITLIB}
Adds @var{AUDITLIB} to the @code{DT_AUDIT} entry of the dynamic section.
@var{AUDITLIB} is not checked for existence, nor will it use the DT_SONAME
specified in the library.  If specified multiple times @code{DT_AUDIT}
will contain a colon separated list of audit interfaces to use. If the linker
finds an object with an audit entry while searching for shared libraries,
it will add a corresponding @code{DT_DEPAUDIT} entry in the output file.
This option is only meaningful on ELF platforms supporting the rtld-audit
interface.

@ifset I960
@cindex architectures
@kindex -A @var{arch}
@item -A @var{architecture}
@kindex --architecture=@var{arch}
@itemx --architecture=@var{architecture}
In the current release of @command{ld}, this option is useful only for the
Intel 960 family of architectures.  In that @command{ld} configuration, the
@var{architecture} argument identifies the particular architecture in
the 960 family, enabling some safeguards and modifying the
archive-library search path.  @xref{i960,,@command{ld} and the Intel 960
family}, for details.

Future releases of @command{ld} may support similar functionality for
other architecture families.
@end ifset

@ifclear SingleFormat
@cindex binary input format
@kindex -b @var{format}
@kindex --format=@var{format}
@cindex input format
@cindex input format
@item -b @var{input-format}
@itemx --format=@var{input-format}
@command{ld} may be configured to support more than one kind of object
file.  If your @command{ld} is configured this way, you can use the
@samp{-b} option to specify the binary format for input object files
that follow this option on the command line.  Even when @command{ld} is
configured to support alternative object formats, you don't usually need
to specify this, as @command{ld} should be configured to expect as a
default input format the most usual format on each machine.
@var{input-format} is a text string, the name of a particular format
supported by the BFD libraries.  (You can list the available binary
formats with @samp{objdump -i}.)
@xref{BFD}.

You may want to use this option if you are linking files with an unusual
binary format.  You can also use @samp{-b} to switch formats explicitly (when
linking object files of different formats), by including
@samp{-b @var{input-format}} before each group of object files in a
particular format.

The default format is taken from the environment variable
@code{GNUTARGET}.
@ifset UsesEnvVars
@xref{Environment}.
@end ifset
You can also define the input format from a script, using the command
@code{TARGET};
@ifclear man
see @ref{Format Commands}.
@end ifclear
@end ifclear

@kindex -c @var{MRI-cmdfile}
@kindex --mri-script=@var{MRI-cmdfile}
@cindex compatibility, MRI
@item -c @var{MRI-commandfile}
@itemx --mri-script=@var{MRI-commandfile}
For compatibility with linkers produced by MRI, @command{ld} accepts script
files written in an alternate, restricted command language, described in
@ifclear man
@ref{MRI,,MRI Compatible Script Files}.
@end ifclear
@ifset man
the MRI Compatible Script Files section of GNU ld documentation.
@end ifset
Introduce MRI script files with
the option @samp{-c}; use the @samp{-T} option to run linker
scripts written in the general-purpose @command{ld} scripting language.
If @var{MRI-cmdfile} does not exist, @command{ld} looks for it in the directories
specified by any @samp{-L} options.

@cindex common allocation
@kindex -d
@kindex -dc
@kindex -dp
@item -d
@itemx -dc
@itemx -dp
These three options are equivalent; multiple forms are supported for
compatibility with other linkers.  They assign space to common symbols
even if a relocatable output file is specified (with @samp{-r}).  The
script command @code{FORCE_COMMON_ALLOCATION} has the same effect.
@xref{Miscellaneous Commands}.

@kindex --depaudit @var{AUDITLIB}
@kindex -P @var{AUDITLIB}
@item --depaudit @var{AUDITLIB}
@itemx -P @var{AUDITLIB}
Adds @var{AUDITLIB} to the @code{DT_DEPAUDIT} entry of the dynamic section.
@var{AUDITLIB} is not checked for existence, nor will it use the DT_SONAME
specified in the library.  If specified multiple times @code{DT_DEPAUDIT}
will contain a colon separated list of audit interfaces to use.  This
option is only meaningful on ELF platforms supporting the rtld-audit interface.
The -P option is provided for Solaris compatibility.

@cindex entry point, from command line
@kindex -e @var{entry}
@kindex --entry=@var{entry}
@item -e @var{entry}
@itemx --entry=@var{entry}
Use @var{entry} as the explicit symbol for beginning execution of your
program, rather than the default entry point.  If there is no symbol
named @var{entry}, the linker will try to parse @var{entry} as a number,
and use that as the entry address (the number will be interpreted in
base 10; you may use a leading @samp{0x} for base 16, or a leading
@samp{0} for base 8).  @xref{Entry Point}, for a discussion of defaults
and other ways of specifying the entry point.

@kindex --exclude-libs
@item --exclude-libs @var{lib},@var{lib},...
Specifies a list of archive libraries from which symbols should not be automatically
exported.  The library names may be delimited by commas or colons.  Specifying
@code{--exclude-libs ALL} excludes symbols in all archive libraries from
automatic export.  This option is available only for the i386 PE targeted
port of the linker and for ELF targeted ports.  For i386 PE, symbols
explicitly listed in a .def file are still exported, regardless of this
option.  For ELF targeted ports, symbols affected by this option will
be treated as hidden.

@kindex --exclude-modules-for-implib
@item --exclude-modules-for-implib @var{module},@var{module},...
Specifies a list of object files or archive members, from which symbols
should not be automatically exported, but which should be copied wholesale
into the import library being generated during the link.  The module names
may be delimited by commas or colons, and must match exactly the filenames
used by @command{ld} to open the files; for archive members, this is simply
the member name, but for object files the name listed must include and
match precisely any path used to specify the input file on the linker's
command-line.  This option is available only for the i386 PE targeted port
of the linker.  Symbols explicitly listed in a .def file are still exported,
regardless of this option.

@cindex dynamic symbol table
@kindex -E
@kindex --export-dynamic
@kindex --no-export-dynamic
@item -E
@itemx --export-dynamic
@itemx --no-export-dynamic
When creating a dynamically linked executable, using the @option{-E}
option or the @option{--export-dynamic} option causes the linker to add
all symbols to the dynamic symbol table.  The dynamic symbol table is the
set of symbols which are visible from dynamic objects at run time.

If you do not use either of these options (or use the
@option{--no-export-dynamic} option to restore the default behavior), the
dynamic symbol table will normally contain only those symbols which are
referenced by some dynamic object mentioned in the link.

If you use @code{dlopen} to load a dynamic object which needs to refer
back to the symbols defined by the program, rather than some other
dynamic object, then you will probably need to use this option when
linking the program itself.

You can also use the dynamic list to control what symbols should
be added to the dynamic symbol table if the output format supports it.
See the description of @samp{--dynamic-list}.

Note that this option is specific to ELF targeted ports.  PE targets
support a similar function to export all symbols from a DLL or EXE; see
the description of @samp{--export-all-symbols} below.

@ifclear SingleFormat
@cindex big-endian objects
@cindex endianness
@kindex -EB
@item -EB
Link big-endian objects.  This affects the default output format.

@cindex little-endian objects
@kindex -EL
@item -EL
Link little-endian objects.  This affects the default output format.
@end ifclear

@kindex -f @var{name}
@kindex --auxiliary=@var{name}
@item -f @var{name}
@itemx --auxiliary=@var{name}
When creating an ELF shared object, set the internal DT_AUXILIARY field
to the specified name.  This tells the dynamic linker that the symbol
table of the shared object should be used as an auxiliary filter on the
symbol table of the shared object @var{name}.

If you later link a program against this filter object, then, when you
run the program, the dynamic linker will see the DT_AUXILIARY field.  If
the dynamic linker resolves any symbols from the filter object, it will
first check whether there is a definition in the shared object
@var{name}.  If there is one, it will be used instead of the definition
in the filter object.  The shared object @var{name} need not exist.
Thus the shared object @var{name} may be used to provide an alternative
implementation of certain functions, perhaps for debugging or for
machine specific performance.

This option may be specified more than once.  The DT_AUXILIARY entries
will be created in the order in which they appear on the command line.

@kindex -F @var{name}
@kindex --filter=@var{name}
@item -F @var{name}
@itemx --filter=@var{name}
When creating an ELF shared object, set the internal DT_FILTER field to
the specified name.  This tells the dynamic linker that the symbol table
of the shared object which is being created should be used as a filter
on the symbol table of the shared object @var{name}.

If you later link a program against this filter object, then, when you
run the program, the dynamic linker will see the DT_FILTER field.  The
dynamic linker will resolve symbols according to the symbol table of the
filter object as usual, but it will actually link to the definitions
found in the shared object @var{name}.  Thus the filter object can be
used to select a subset of the symbols provided by the object
@var{name}.

Some older linkers used the @option{-F} option throughout a compilation
toolchain for specifying object-file format for both input and output
object files.
@ifclear SingleFormat
The @sc{gnu} linker uses other mechanisms for this purpose: the
@option{-b}, @option{--format}, @option{--oformat} options, the
@code{TARGET} command in linker scripts, and the @code{GNUTARGET}
environment variable.
@end ifclear
The @sc{gnu} linker will ignore the @option{-F} option when not
creating an ELF shared object.

@cindex finalization function
@kindex -fini=@var{name}
@item -fini=@var{name}
When creating an ELF executable or shared object, call NAME when the
executable or shared object is unloaded, by setting DT_FINI to the
address of the function.  By default, the linker uses @code{_fini} as
the function to call.

@kindex -g
@item -g
Ignored.  Provided for compatibility with other tools.

@kindex -G @var{value}
@kindex --gpsize=@var{value}
@cindex object size
@item -G @var{value}
@itemx --gpsize=@var{value}
Set the maximum size of objects to be optimized using the GP register to
@var{size}.  This is only meaningful for object file formats such as
MIPS ELF that support putting large and small objects into different
sections.  This is ignored for other object file formats.

@cindex runtime library name
@kindex -h @var{name}
@kindex -soname=@var{name}
@item -h @var{name}
@itemx -soname=@var{name}
When creating an ELF shared object, set the internal DT_SONAME field to
the specified name.  When an executable is linked with a shared object
which has a DT_SONAME field, then when the executable is run the dynamic
linker will attempt to load the shared object specified by the DT_SONAME
field rather than the using the file name given to the linker.

@kindex -i
@cindex incremental link
@item -i
Perform an incremental link (same as option @samp{-r}).

@cindex initialization function
@kindex -init=@var{name}
@item -init=@var{name}
When creating an ELF executable or shared object, call NAME when the
executable or shared object is loaded, by setting DT_INIT to the address
of the function.  By default, the linker uses @code{_init} as the
function to call.

@cindex archive files, from cmd line
@kindex -l @var{namespec}
@kindex --library=@var{namespec}
@item -l @var{namespec}
@itemx --library=@var{namespec}
Add the archive or object file specified by @var{namespec} to the
list of files to link.  This option may be used any number of times.
If @var{namespec} is of the form @file{:@var{filename}}, @command{ld}
will search the library path for a file called @var{filename}, otherwise it
will search the library path for a file called @file{lib@var{namespec}.a}.

On systems which support shared libraries, @command{ld} may also search for
files other than @file{lib@var{namespec}.a}.  Specifically, on ELF
and SunOS systems, @command{ld} will search a directory for a library
called @file{lib@var{namespec}.so} before searching for one called
@file{lib@var{namespec}.a}.  (By convention, a @code{.so} extension
indicates a shared library.)  Note that this behavior does not apply
to @file{:@var{filename}}, which always specifies a file called
@var{filename}.

The linker will search an archive only once, at the location where it is
specified on the command line.  If the archive defines a symbol which
was undefined in some object which appeared before the archive on the
command line, the linker will include the appropriate file(s) from the
archive.  However, an undefined symbol in an object appearing later on
the command line will not cause the linker to search the archive again.

See the @option{-(} option for a way to force the linker to search
archives multiple times.

You may list the same archive multiple times on the command line.

@ifset GENERIC
This type of archive searching is standard for Unix linkers.  However,
if you are using @command{ld} on AIX, note that it is different from the
behaviour of the AIX linker.
@end ifset

@cindex search directory, from cmd line
@kindex -L @var{dir}
@kindex --library-path=@var{dir}
@item -L @var{searchdir}
@itemx --library-path=@var{searchdir}
Add path @var{searchdir} to the list of paths that @command{ld} will search
for archive libraries and @command{ld} control scripts.  You may use this
option any number of times.  The directories are searched in the order
in which they are specified on the command line.  Directories specified
on the command line are searched before the default directories.  All
@option{-L} options apply to all @option{-l} options, regardless of the
order in which the options appear.  @option{-L} options do not affect
how @command{ld} searches for a linker script unless @option{-T}
option is specified.

If @var{searchdir} begins with @code{=}, then the @code{=} will be replaced
by the @dfn{sysroot prefix}, controlled by the @samp{--sysroot} option, or
specified when the linker is configured.

@ifset UsesEnvVars
The default set of paths searched (without being specified with
@samp{-L}) depends on which emulation mode @command{ld} is using, and in
some cases also on how it was configured.  @xref{Environment}.
@end ifset

The paths can also be specified in a link script with the
@code{SEARCH_DIR} command.  Directories specified this way are searched
at the point in which the linker script appears in the command line.

@cindex emulation
@kindex -m @var{emulation}
@item -m @var{emulation}
Emulate the @var{emulation} linker.  You can list the available
emulations with the @samp{--verbose} or @samp{-V} options.

If the @samp{-m} option is not used, the emulation is taken from the
@code{LDEMULATION} environment variable, if that is defined.

Otherwise, the default emulation depends upon how the linker was
configured.

@cindex link map
@kindex -M
@kindex --print-map
@item -M
@itemx --print-map
Print a link map to the standard output.  A link map provides
information about the link, including the following:

@itemize @bullet
@item
Where object files are mapped into memory.
@item
How common symbols are allocated.
@item
All archive members included in the link, with a mention of the symbol
which caused the archive member to be brought in.
@item
The values assigned to symbols.

Note - symbols whose values are computed by an expression which
involves a reference to a previous value of the same symbol may not
have correct result displayed in the link map.  This is because the
linker discards intermediate results and only retains the final value
of an expression.  Under such circumstances the linker will display
the final value enclosed by square brackets.  Thus for example a
linker script containing:

@smallexample
   foo = 1
   foo = foo * 4
   foo = foo + 8
@end smallexample

will produce the following output in the link map if the @option{-M}
option is used:

@smallexample
   0x00000001                foo = 0x1
   [0x0000000c]                foo = (foo * 0x4)
   [0x0000000c]                foo = (foo + 0x8)
@end smallexample

See @ref{Expressions} for more information about expressions in linker
scripts.
@end itemize

@kindex -n
@cindex read-only text
@cindex NMAGIC
@kindex --nmagic
@item -n
@itemx --nmagic
Turn off page alignment of sections, and disable linking against shared
libraries.  If the output format supports Unix style magic numbers,
mark the output as @code{NMAGIC}.

@kindex -N
@kindex --omagic
@cindex read/write from cmd line
@cindex OMAGIC
@item -N
@itemx --omagic
Set the text and data sections to be readable and writable.  Also, do
not page-align the data segment, and disable linking against shared
libraries.  If the output format supports Unix style magic numbers,
mark the output as @code{OMAGIC}. Note: Although a writable text section
is allowed for PE-COFF targets, it does not conform to the format
specification published by Microsoft.

@kindex --no-omagic
@cindex OMAGIC
@item --no-omagic
This option negates most of the effects of the @option{-N} option.  It
sets the text section to be read-only, and forces the data segment to
be page-aligned.  Note - this option does not enable linking against
shared libraries.  Use @option{-Bdynamic} for this.

@kindex -o @var{output}
@kindex --output=@var{output}
@cindex naming the output file
@item -o @var{output}
@itemx --output=@var{output}
Use @var{output} as the name for the program produced by @command{ld}; if this
option is not specified, the name @file{a.out} is used by default.  The
script command @code{OUTPUT} can also specify the output file name.

@kindex -O @var{level}
@cindex generating optimized output
@item -O @var{level}
If @var{level} is a numeric values greater than zero @command{ld} optimizes
the output.  This might take significantly longer and therefore probably
should only be enabled for the final binary.  At the moment this
option only affects ELF shared library generation.  Future releases of
the linker may make more use of this option.  Also currently there is
no difference in the linker's behaviour for different non-zero values
of this option.  Again this may change with future releases.

@kindex --push-state
@cindex push state governing input file handling
@item --push-state
The @option{--push-state} allows to preserve the current state of the
flags which govern the input file handling so that they can all be
restored with one corresponding @option{--pop-state} option.

The option which are covered are: @option{-Bdynamic}, @option{-Bstatic},
@option{-dn}, @option{-dy}, @option{-call_shared}, @option{-non_shared},
@option{-static}, @option{-N}, @option{-n}, @option{--whole-archive},
@option{--no-whole-archive}, @option{-r}, @option{-Ur},
@option{--copy-dt-needed-entries}, @option{--no-copy-dt-needed-entries},
@option{--as-needed}, @option{--no-as-needed}, and @option{-a}.

One target for this option are specifications for @file{pkg-config}.  When
used with the @option{--libs} option all possibly needed libraries are
listed and then possibly linked with all the time.  It is better to return
something as follows:

@smallexample
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
@end smallexample

@kindex --pop-state
@cindex pop state governing input file handling
Undoes the effect of --push-state, restores the previous values of the
flags governing input file handling.

@kindex -q
@kindex --emit-relocs
@cindex retain relocations in final executable
@item -q
@itemx --emit-relocs
Leave relocation sections and contents in fully linked executables.
Post link analysis and optimization tools may need this information in
order to perform correct modifications of executables.  This results
in larger executables.

This option is currently only supported on ELF platforms.

@kindex --force-dynamic
@cindex forcing the creation of dynamic sections
@item --force-dynamic
Force the output file to have dynamic sections.  This option is specific
to VxWorks targets.

@cindex partial link
@cindex relocatable output
@kindex -r
@kindex --relocatable
@item -r
@itemx --relocatable
Generate relocatable output---i.e., generate an output file that can in
turn serve as input to @command{ld}.  This is often called @dfn{partial
linking}.  As a side effect, in environments that support standard Unix
magic numbers, this option also sets the output file's magic number to
@code{OMAGIC}.
@c ; see @option{-N}.
If this option is not specified, an absolute file is produced.  When
linking C++ programs, this option @emph{will not} resolve references to
constructors; to do that, use @samp{-Ur}.

When an input file does not have the same format as the output file,
partial linking is only supported if that input file does not contain any
relocations.  Different output formats can have further restrictions; for
example some @code{a.out}-based formats do not support partial linking
with input files in other formats at all.

This option does the same thing as @samp{-i}.

@kindex -R @var{file}
@kindex --just-symbols=@var{file}
@cindex symbol-only input
@item -R @var{filename}
@itemx --just-symbols=@var{filename}
Read symbol names and their addresses from @var{filename}, but do not
relocate it or include it in the output.  This allows your output file
to refer symbolically to absolute locations of memory defined in other
programs.  You may use this option more than once.

For compatibility with other ELF linkers, if the @option{-R} option is
followed by a directory name, rather than a file name, it is treated as
the @option{-rpath} option.

@kindex -s
@kindex --strip-all
@cindex strip all symbols
@item -s
@itemx --strip-all
Omit all symbol information from the output file.

@kindex -S
@kindex --strip-debug
@cindex strip debugger symbols
@item -S
@itemx --strip-debug
Omit debugger symbol information (but not all symbols) from the output file.

@kindex -t
@kindex --trace
@cindex input files, displaying
@item -t
@itemx --trace
Print the names of the input files as @command{ld} processes them.

@kindex -T @var{script}
@kindex --script=@var{script}
@cindex script files
@item -T @var{scriptfile}
@itemx --script=@var{scriptfile}
Use @var{scriptfile} as the linker script.  This script replaces
@command{ld}'s default linker script (rather than adding to it), so
@var{commandfile} must specify everything necessary to describe the
output file.  @xref{Scripts}.  If @var{scriptfile} does not exist in
the current directory, @code{ld} looks for it in the directories
specified by any preceding @samp{-L} options.  Multiple @samp{-T}
options accumulate.

@kindex -dT @var{script}
@kindex --default-script=@var{script}
@cindex script files
@item -dT @var{scriptfile}
@itemx --default-script=@var{scriptfile}
Use @var{scriptfile} as the default linker script.  @xref{Scripts}.

This option is similar to the @option{--script} option except that
processing of the script is delayed until after the rest of the
command line has been processed.  This allows options placed after the
@option{--default-script} option on the command line to affect the
behaviour of the linker script, which can be important when the linker
command line cannot be directly controlled by the user.  (eg because
the command line is being constructed by another tool, such as
@samp{gcc}).

@kindex -u @var{symbol}
@kindex --undefined=@var{symbol}
@cindex undefined symbol
@item -u @var{symbol}
@itemx --undefined=@var{symbol}
Force @var{symbol} to be entered in the output file as an undefined
symbol.  Doing this may, for example, trigger linking of additional
modules from standard libraries.  @samp{-u} may be repeated with
different option arguments to enter additional undefined symbols.  This
option is equivalent to the @code{EXTERN} linker script command.

@kindex -Ur
@cindex constructors
@item -Ur
For anything other than C++ programs, this option is equivalent to
@samp{-r}: it generates relocatable output---i.e., an output file that can in
turn serve as input to @command{ld}.  When linking C++ programs, @samp{-Ur}
@emph{does} resolve references to constructors, unlike @samp{-r}.
It does not work to use @samp{-Ur} on files that were themselves linked
with @samp{-Ur}; once the constructor table has been built, it cannot
be added to.  Use @samp{-Ur} only for the last partial link, and
@samp{-r} for the others.

@kindex --unique[=@var{SECTION}]
@item --unique[=@var{SECTION}]
Creates a separate output section for every input section matching
@var{SECTION}, or if the optional wildcard @var{SECTION} argument is
missing, for every orphan input section.  An orphan section is one not
specifically mentioned in a linker script.  You may use this option
multiple times on the command line;  It prevents the normal merging of
input sections with the same name, overriding output section assignments
in a linker script.

@kindex -v
@kindex -V
@kindex --version
@cindex version
@item -v
@itemx --version
@itemx -V
Display the version number for @command{ld}.  The @option{-V} option also
lists the supported emulations.

@kindex -x
@kindex --discard-all
@cindex deleting local symbols
@item -x
@itemx --discard-all
Delete all local symbols.

@kindex -X
@kindex --discard-locals
@cindex local symbols, deleting
@item -X
@itemx --discard-locals
Delete all temporary local symbols.  (These symbols start with
system-specific local label prefixes, typically @samp{.L} for ELF systems
or @samp{L} for traditional a.out systems.)

@kindex -y @var{symbol}
@kindex --trace-symbol=@var{symbol}
@cindex symbol tracing
@item -y @var{symbol}
@itemx --trace-symbol=@var{symbol}
Print the name of each linked file in which @var{symbol} appears.  This
option may be given any number of times.  On many systems it is necessary
to prepend an underscore.

This option is useful when you have an undefined symbol in your link but
don't know where the reference is coming from.

@kindex -Y @var{path}
@item -Y @var{path}
Add @var{path} to the default library search path.  This option exists
for Solaris compatibility.

@kindex -z @var{keyword}
@item -z @var{keyword}
The recognized keywords are:
@table @samp

@item combreloc
Combines multiple reloc sections and sorts them to make dynamic symbol
lookup caching possible.

@item defs
Disallows undefined symbols in object files.  Undefined symbols in
shared libraries are still allowed.

@item execstack
Marks the object as requiring executable stack.

@item global
This option is only meaningful when building a shared object.  It makes
the symbols defined by this shared object available for symbol resolution
of subsequently loaded libraries.

@item initfirst
This option is only meaningful when building a shared object.
It marks the object so that its runtime initialization will occur
before the runtime initialization of any other objects brought into
the process at the same time.  Similarly the runtime finalization of
the object will occur after the runtime finalization of any other
objects.

@item interpose
Marks the object that its symbol table interposes before all symbols
but the primary executable.

@item lazy
When generating an executable or shared library, mark it to tell the
dynamic linker to defer function call resolution to the point when
the function is called (lazy binding), rather than at load time.
Lazy binding is the default.

@item loadfltr
Marks  the object that its filters be processed immediately at
runtime.

@item muldefs
Allows multiple definitions.

@item nocombreloc
Disables multiple reloc sections combining.

@item nocopyreloc
Disable linker generated .dynbss variables used in place of variables
defined in shared libraries.  May result in dynamic text relocations.

@item nodefaultlib
Marks the object that the search for dependencies of this object will
ignore any default library search paths.

@item nodelete
Marks the object shouldn't be unloaded at runtime.

@item nodlopen
Marks the object not available to @code{dlopen}.

@item nodump
Marks the object can not be dumped by @code{dldump}.

@item noexecstack
Marks the object as not requiring executable stack.

@item text
Treat DT_TEXTREL in shared object as error.

@item notext
Don't treat DT_TEXTREL in shared object as error.

@item textoff
Don't treat DT_TEXTREL in shared object as error.

@item norelro
Don't create an ELF @code{PT_GNU_RELRO} segment header in the object.

@item now
When generating an executable or shared library, mark it to tell the
dynamic linker to resolve all symbols when the program is started, or
when the shared library is linked to using dlopen, instead of
deferring function call resolution to the point when the function is
first called.

@item origin
Marks the object may contain $ORIGIN.

@item relro
Create an ELF @code{PT_GNU_RELRO} segment header in the object.

@item max-page-size=@var{value}
Set the emulation maximum page size to @var{value}.

@item common-page-size=@var{value}
Set the emulation common page size to @var{value}.

@item stack-size=@var{value}
Specify a stack size for in an ELF @code{PT_GNU_STACK} segment.
Specifying zero will override any default non-zero sized
@code{PT_GNU_STACK} segment creation.

@item bndplt
Always generate BND prefix in PLT entries. Supported for Linux/x86_64.

@item noextern-protected-data
Don't treat protected data symbol as external when building shared
library.  This option overrides linker backend default.  It can be used
to workaround incorrect relocations against protected data symbols
generated by compiler.  Updates on protected data symbols by another
module aren't visibile to the resulting shared library.  Supported for
i386 and x86-64.

@end table

Other keywords are ignored for Solaris compatibility.

@kindex -(
@cindex groups of archives
@item -( @var{archives} -)
@itemx --start-group @var{archives} --end-group
The @var{archives} should be a list of archive files.  They may be
either explicit file names, or @samp{-l} options.

The specified archives are searched repeatedly until no new undefined
references are created.  Normally, an archive is searched only once in
the order that it is specified on the command line.  If a symbol in that
archive is needed to resolve an undefined symbol referred to by an
object in an archive that appears later on the command line, the linker
would not be able to resolve that reference.  By grouping the archives,
they all be searched repeatedly until all possible references are
resolved.

Using this option has a significant performance cost.  It is best to use
it only when there are unavoidable circular references between two or
more archives.

@kindex --accept-unknown-input-arch
@kindex --no-accept-unknown-input-arch
@item --accept-unknown-input-arch
@itemx --no-accept-unknown-input-arch
Tells the linker to accept input files whose architecture cannot be
recognised.  The assumption is that the user knows what they are doing
and deliberately wants to link in these unknown input files.  This was
the default behaviour of the linker, before release 2.14.  The default
behaviour from release 2.14 onwards is to reject such input files, and
so the @samp{--accept-unknown-input-arch} option has been added to
restore the old behaviour.

@kindex --as-needed
@kindex --no-as-needed
@item --as-needed
@itemx --no-as-needed
This option affects ELF DT_NEEDED tags for dynamic libraries mentioned
on the command line after the @option{--as-needed} option.  Normally
the linker will add a DT_NEEDED tag for each dynamic library mentioned
on the command line, regardless of whether the library is actually
needed or not.  @option{--as-needed} causes a DT_NEEDED tag to only be
emitted for a library that @emph{at that point in the link} satisfies a
non-weak undefined symbol reference from a regular object file or, if
the library is not found in the DT_NEEDED lists of other needed libraries, a
non-weak undefined symbol reference from another needed dynamic library.
Object files or libraries appearing on the command line @emph{after}
the library in question do not affect whether the library is seen as
needed.  This is similar to the rules for extraction of object files
from archives.  @option{--no-as-needed} restores the default behaviour.

@kindex --add-needed
@kindex --no-add-needed
@item --add-needed
@itemx --no-add-needed
These two options have been deprecated because of the similarity of
their names to the @option{--as-needed} and @option{--no-as-needed}
options.  They have been replaced by @option{--copy-dt-needed-entries}
and @option{--no-copy-dt-needed-entries}.

@kindex -assert @var{keyword}
@item -assert @var{keyword}
This option is ignored for SunOS compatibility.

@kindex -Bdynamic
@kindex -dy
@kindex -call_shared
@item -Bdynamic
@itemx -dy
@itemx -call_shared
Link against dynamic libraries.  This is only meaningful on platforms
for which shared libraries are supported.  This option is normally the
default on such platforms.  The different variants of this option are
for compatibility with various systems.  You may use this option
multiple times on the command line: it affects library searching for
@option{-l} options which follow it.

@kindex -Bgroup
@item -Bgroup
Set the @code{DF_1_GROUP} flag in the @code{DT_FLAGS_1} entry in the dynamic
section.  This causes the runtime linker to handle lookups in this
object and its dependencies to be performed only inside the group.
@option{--unresolved-symbols=report-all} is implied.  This option is
only meaningful on ELF platforms which support shared libraries.

@kindex -Bstatic
@kindex -dn
@kindex -non_shared
@kindex -static
@item -Bstatic
@itemx -dn
@itemx -non_shared
@itemx -static
Do not link against shared libraries.  This is only meaningful on
platforms for which shared libraries are supported.  The different
variants of this option are for compatibility with various systems.  You
may use this option multiple times on the command line: it affects
library searching for @option{-l} options which follow it.  This
option also implies @option{--unresolved-symbols=report-all}.  This
option can be used with @option{-shared}.  Doing so means that a
shared library is being created but that all of the library's external
references must be resolved by pulling in entries from static
libraries.

@kindex -Bsymbolic
@item -Bsymbolic
When creating a shared library, bind references to global symbols to the
definition within the shared library, if any.  Normally, it is possible
for a program linked against a shared library to override the definition
within the shared library.  This option is only meaningful on ELF
platforms which support shared libraries.

@kindex -Bsymbolic-functions
@item -Bsymbolic-functions
When creating a shared library, bind references to global function
symbols to the definition within the shared library, if any.
This option is only meaningful on ELF platforms which support shared
libraries.

@kindex --dynamic-list=@var{dynamic-list-file}
@item --dynamic-list=@var{dynamic-list-file}
Specify the name of a dynamic list file to the linker.  This is
typically used when creating shared libraries to specify a list of
global symbols whose references shouldn't be bound to the definition
within the shared library, or creating dynamically linked executables
to specify a list of symbols which should be added to the symbol table
in the executable.  This option is only meaningful on ELF platforms
which support shared libraries.

The format of the dynamic list is the same as the version node without
scope and node name.  See @ref{VERSION} for more information.

@kindex --dynamic-list-data
@item --dynamic-list-data
Include all global data symbols to the dynamic list.

@kindex --dynamic-list-cpp-new
@item --dynamic-list-cpp-new
Provide the builtin dynamic list for C++ operator new and delete.  It
is mainly useful for building shared libstdc++.

@kindex --dynamic-list-cpp-typeinfo
@item --dynamic-list-cpp-typeinfo
Provide the builtin dynamic list for C++ runtime type identification.

@kindex --check-sections
@kindex --no-check-sections
@item --check-sections
@itemx --no-check-sections
Asks the linker @emph{not} to check section addresses after they have
been assigned to see if there are any overlaps.  Normally the linker will
perform this check, and if it finds any overlaps it will produce
suitable error messages.  The linker does know about, and does make
allowances for sections in overlays.  The default behaviour can be
restored by using the command line switch @option{--check-sections}.
Section overlap is not usually checked for relocatable links.  You can
force checking in that case by using the @option{--check-sections}
option.

@kindex --copy-dt-needed-entries
@kindex --no-copy-dt-needed-entries
@item --copy-dt-needed-entries
@itemx --no-copy-dt-needed-entries
This option affects the treatment of dynamic libraries referred to
by DT_NEEDED tags @emph{inside} ELF dynamic libraries mentioned on the
command line.  Normally the linker won't add a DT_NEEDED tag to the
output binary for each library mentioned in a DT_NEEDED tag in an
input dynamic library.  With @option{--copy-dt-needed-entries}
specified on the command line however any dynamic libraries that
follow it will have their DT_NEEDED entries added.  The default
behaviour can be restored with @option{--no-copy-dt-needed-entries}.

This option also has an effect on the resolution of symbols in dynamic
libraries.  With @option{--copy-dt-needed-entries} dynamic libraries
mentioned on the command line will be recursively searched, following
their DT_NEEDED tags to other libraries, in order to resolve symbols
required by the output binary.  With the default setting however
the searching of dynamic libraries that follow it will stop with the
dynamic library itself.  No DT_NEEDED links will be traversed to resolve
symbols.

@cindex cross reference table
@kindex --cref
@item --cref
Output a cross reference table.  If a linker map file is being
generated, the cross reference table is printed to the map file.
Otherwise, it is printed on the standard output.

The format of the table is intentionally simple, so that it may be
easily processed by a script if necessary.  The symbols are printed out,
sorted by name.  For each symbol, a list of file names is given.  If the
symbol is defined, the first file listed is the location of the
definition.  If the symbol is defined as a common value then any files
where this happens appear next.  Finally any files that reference the
symbol are listed.

@cindex common allocation
@kindex --no-define-common
@item --no-define-common
This option inhibits the assignment of addresses to common symbols.
The script command @code{INHIBIT_COMMON_ALLOCATION} has the same effect.
@xref{Miscellaneous Commands}.

The @samp{--no-define-common} option allows decoupling
the decision to assign addresses to Common symbols from the choice
of the output file type; otherwise a non-Relocatable output type
forces assigning addresses to Common symbols.
Using @samp{--no-define-common} allows Common symbols that are referenced
from a shared library to be assigned addresses only in the main program.
This eliminates the unused duplicate space in the shared library,
and also prevents any possible confusion over resolving to the wrong
duplicate when there are many dynamic modules with specialized search
paths for runtime symbol resolution.

@cindex symbols, from command line
@kindex --defsym=@var{symbol}=@var{exp}
@item --defsym=@var{symbol}=@var{expression}
Create a global symbol in the output file, containing the absolute
address given by @var{expression}.  You may use this option as many
times as necessary to define multiple symbols in the command line.  A
limited form of arithmetic is supported for the @var{expression} in this
context: you may give a hexadecimal constant or the name of an existing
symbol, or use @code{+} and @code{-} to add or subtract hexadecimal
constants or symbols.  If you need more elaborate expressions, consider
using the linker command language from a script (@pxref{Assignments}).
@emph{Note:} there should be no white space between @var{symbol}, the
equals sign (``@key{=}''), and @var{expression}.

@cindex demangling, from command line
@kindex --demangle[=@var{style}]
@kindex --no-demangle
@item --demangle[=@var{style}]
@itemx --no-demangle
These options control whether to demangle symbol names in error messages
and other output.  When the linker is told to demangle, it tries to
present symbol names in a readable fashion: it strips leading
underscores if they are used by the object file format, and converts C++
mangled symbol names into user readable names.  Different compilers have
different mangling styles.  The optional demangling style argument can be used
to choose an appropriate demangling style for your compiler.  The linker will
demangle by default unless the environment variable @samp{COLLECT_NO_DEMANGLE}
is set.  These options may be used to override the default.

@cindex dynamic linker, from command line
@kindex -I@var{file}
@kindex --dynamic-linker=@var{file}
@item -I@var{file}
@itemx --dynamic-linker=@var{file}
Set the name of the dynamic linker.  This is only meaningful when
generating dynamically linked ELF executables.  The default dynamic
linker is normally correct; don't use this unless you know what you are
doing.

@kindex --fatal-warnings
@kindex --no-fatal-warnings
@item --fatal-warnings
@itemx --no-fatal-warnings
Treat all warnings as errors.  The default behaviour can be restored
with the option @option{--no-fatal-warnings}.

@kindex --force-exe-suffix
@item  --force-exe-suffix
Make sure that an output file has a .exe suffix.

If a successfully built fully linked output file does not have a
@code{.exe} or @code{.dll} suffix, this option forces the linker to copy
the output file to one of the same name with a @code{.exe} suffix. This
option is useful when using unmodified Unix makefiles on a Microsoft
Windows host, since some versions of Windows won't run an image unless
it ends in a @code{.exe} suffix.

@kindex --gc-sections
@kindex --no-gc-sections
@cindex garbage collection
@item --gc-sections
@itemx --no-gc-sections
Enable garbage collection of unused input sections.  It is ignored on
targets that do not support this option.  The default behaviour (of not
performing this garbage collection) can be restored by specifying
@samp{--no-gc-sections} on the command line.  Note that garbage
collection for COFF and PE format targets is supported, but the
implementation is currently considered to be experimental.

@samp{--gc-sections} decides which input sections are used by
examining symbols and relocations.  The section containing the entry
symbol and all sections containing symbols undefined on the
command-line will be kept, as will sections containing symbols
referenced by dynamic objects.  Note that when building shared
libraries, the linker must assume that any visible symbol is
referenced.  Once this initial set of sections has been determined,
the linker recursively marks as used any section referenced by their
relocations.  See @samp{--entry} and @samp{--undefined}.

This option can be set when doing a partial link (enabled with option
@samp{-r}).  In this case the root of symbols kept must be explicitly
specified either by an @samp{--entry} or @samp{--undefined} option or by
a @code{ENTRY} command in the linker script.

@kindex --print-gc-sections
@kindex --no-print-gc-sections
@cindex garbage collection
@item --print-gc-sections
@itemx --no-print-gc-sections
List all sections removed by garbage collection.  The listing is
printed on stderr.  This option is only effective if garbage
collection has been enabled via the @samp{--gc-sections}) option.  The
default behaviour (of not listing the sections that are removed) can
be restored by specifying @samp{--no-print-gc-sections} on the command
line.

@kindex --print-output-format
@cindex output format
@item --print-output-format
Print the name of the default output format (perhaps influenced by
other command-line options).  This is the string that would appear
in an @code{OUTPUT_FORMAT} linker script command (@pxref{File Commands}).

@kindex --print-memory-usage
@cindex memory usage
@item --print-memory-usage
Print used size, total size and used size of memory regions created with
the @ref{MEMORY} command.  This is useful on embedded targets to have a
quick view of amount of free memory.  The format of the output has one
headline and one line per region.  It is both human readable and easily
parsable by tools.  Here is an example of an output:

@smallexample
Memory region         Used Size  Region Size  %age Used
             ROM:        256 KB         1 MB     25.00%
             RAM:          32 B         2 GB      0.00%
@end smallexample

@cindex help
@cindex usage
@kindex --help
@item --help
Print a summary of the command-line options on the standard output and exit.

@kindex --target-help
@item --target-help
Print a summary of all target specific options on the standard output and exit.

@kindex -Map=@var{mapfile}
@item -Map=@var{mapfile}
Print a link map to the file @var{mapfile}.  See the description of the
@option{-M} option, above.

@cindex memory usage
@kindex --no-keep-memory
@item --no-keep-memory
@command{ld} normally optimizes for speed over memory usage by caching the
symbol tables of input files in memory.  This option tells @command{ld} to
instead optimize for memory usage, by rereading the symbol tables as
necessary.  This may be required if @command{ld} runs out of memory space
while linking a large executable.

@kindex --no-undefined
@kindex -z defs
@item --no-undefined
@itemx -z defs
Report unresolved symbol references from regular object files.  This
is done even if the linker is creating a non-symbolic shared library.
The switch @option{--[no-]allow-shlib-undefined} controls the
behaviour for reporting unresolved references found in shared
libraries being linked in.

@kindex --allow-multiple-definition
@kindex -z muldefs
@item --allow-multiple-definition
@itemx -z muldefs
Normally when a symbol is defined multiple times, the linker will
report a fatal error. These options allow multiple definitions and the
first definition will be used.

@kindex --allow-shlib-undefined
@kindex --no-allow-shlib-undefined
@item --allow-shlib-undefined
@itemx --no-allow-shlib-undefined
Allows or disallows undefined symbols in shared libraries.
This switch is similar to @option{--no-undefined} except that it
determines the behaviour when the undefined symbols are in a
shared library rather than a regular object file.  It does not affect
how undefined symbols in regular object files are handled.

The default behaviour is to report errors for any undefined symbols
referenced in shared libraries if the linker is being used to create
an executable, but to allow them if the linker is being used to create
a shared library.

The reasons for allowing undefined symbol references in shared
libraries specified at link time are that:

@itemize @bullet
@item
A shared library specified at link time may not be the same as the one
that is available at load time, so the symbol might actually be
resolvable at load time.
@item
There are some operating systems, eg BeOS and HPPA, where undefined
symbols in shared libraries are normal.

The BeOS kernel for example patches shared libraries at load time to
select whichever function is most appropriate for the current
architecture.  This is used, for example, to dynamically select an
appropriate memset function.
@end itemize

@kindex --no-undefined-version
@item --no-undefined-version
Normally when a symbol has an undefined version, the linker will ignore
it. This option disallows symbols with undefined version and a fatal error
will be issued instead.

@kindex --default-symver
@item --default-symver
Create and use a default symbol version (the soname) for unversioned
exported symbols.

@kindex --default-imported-symver
@item --default-imported-symver
Create and use a default symbol version (the soname) for unversioned
imported symbols.

@kindex --no-warn-mismatch
@item --no-warn-mismatch
Normally @command{ld} will give an error if you try to link together input
files that are mismatched for some reason, perhaps because they have
been compiled for different processors or for different endiannesses.
This option tells @command{ld} that it should silently permit such possible
errors.  This option should only be used with care, in cases when you
have taken some special action that ensures that the linker errors are
inappropriate.

@kindex --no-warn-search-mismatch
@item --no-warn-search-mismatch
Normally @command{ld} will give a warning if it finds an incompatible
library during a library search.  This option silences the warning.

@kindex --no-whole-archive
@item --no-whole-archive
Turn off the effect of the @option{--whole-archive} option for subsequent
archive files.

@cindex output file after errors
@kindex --noinhibit-exec
@item --noinhibit-exec
Retain the executable output file whenever it is still usable.
Normally, the linker will not produce an output file if it encounters
errors during the link process; it exits without writing an output file
when it issues any error whatsoever.

@kindex -nostdlib
@item -nostdlib
Only search library directories explicitly specified on the
command line.  Library directories specified in linker scripts
(including linker scripts specified on the command line) are ignored.

@ifclear SingleFormat
@kindex --oformat=@var{output-format}
@item --oformat=@var{output-format}
@command{ld} may be configured to support more than one kind of object
file.  If your @command{ld} is configured this way, you can use the
@samp{--oformat} option to specify the binary format for the output
object file.  Even when @command{ld} is configured to support alternative
object formats, you don't usually need to specify this, as @command{ld}
should be configured to produce as a default output format the most
usual format on each machine.  @var{output-format} is a text string, the
name of a particular format supported by the BFD libraries.  (You can
list the available binary formats with @samp{objdump -i}.)  The script
command @code{OUTPUT_FORMAT} can also specify the output format, but
this option overrides it.  @xref{BFD}.
@end ifclear

@kindex -pie
@kindex --pic-executable
@item -pie
@itemx --pic-executable
@cindex position independent executables
Create a position independent executable.  This is currently only supported on
ELF platforms.  Position independent executables are similar to shared
libraries in that they are relocated by the dynamic linker to the virtual
address the OS chooses for them (which can vary between invocations).  Like
normal dynamically linked executables they can be executed and symbols
defined in the executable cannot be overridden by shared libraries.

@kindex -qmagic
@item -qmagic
This option is ignored for Linux compatibility.

@kindex -Qy
@item -Qy
This option is ignored for SVR4 compatibility.

@kindex --relax
@cindex synthesizing linker
@cindex relaxing addressing modes
@cindex --no-relax
@item --relax
@itemx --no-relax
An option with machine dependent effects.
@ifset GENERIC
This option is only supported on a few targets.
@end ifset
@ifset H8300
@xref{H8/300,,@command{ld} and the H8/300}.
@end ifset
@ifset I960
@xref{i960,, @command{ld} and the Intel 960 family}.
@end ifset
@ifset XTENSA
@xref{Xtensa,, @command{ld} and Xtensa Processors}.
@end ifset
@ifset M68HC11
@xref{M68HC11/68HC12,,@command{ld} and the 68HC11 and 68HC12}.
@end ifset
@ifset NIOSII
@xref{Nios II,,@command{ld} and the Altera Nios II}.
@end ifset
@ifset POWERPC
@xref{PowerPC ELF32,,@command{ld} and PowerPC 32-bit ELF Support}.
@end ifset

On some platforms the @samp{--relax} option performs target specific,
global optimizations that become possible when the linker resolves
addressing in the program, such as relaxing address modes,
synthesizing new instructions, selecting shorter version of current
instructions, and combining constant values.

On some platforms these link time global optimizations may make symbolic
debugging of the resulting executable impossible.
@ifset GENERIC
This is known to be the case for the Matsushita MN10200 and MN10300
family of processors.
@end ifset

@ifset GENERIC
On platforms where this is not supported, @samp{--relax} is accepted,
but ignored.
@end ifset

On platforms where @samp{--relax} is accepted the option
@samp{--no-relax} can be used to disable the feature.

@cindex retaining specified symbols
@cindex stripping all but some symbols
@cindex symbols, retaining selectively
@kindex --retain-symbols-file=@var{filename}
@item --retain-symbols-file=@var{filename}
Retain @emph{only} the symbols listed in the file @var{filename},
discarding all others.  @var{filename} is simply a flat file, with one
symbol name per line.  This option is especially useful in environments
@ifset GENERIC
(such as VxWorks)
@end ifset
where a large global symbol table is accumulated gradually, to conserve
run-time memory.

@samp{--retain-symbols-file} does @emph{not} discard undefined symbols,
or symbols needed for relocations.

You may only specify @samp{--retain-symbols-file} once in the command
line.  It overrides @samp{-s} and @samp{-S}.

@ifset GENERIC
@item -rpath=@var{dir}
@cindex runtime library search path
@kindex -rpath=@var{dir}
Add a directory to the runtime library search path.  This is used when
linking an ELF executable with shared objects.  All @option{-rpath}
arguments are concatenated and passed to the runtime linker, which uses
them to locate shared objects at runtime.  The @option{-rpath} option is
also used when locating shared objects which are needed by shared
objects explicitly included in the link; see the description of the
@option{-rpath-link} option.  If @option{-rpath} is not used when linking an
ELF executable, the contents of the environment variable
@code{LD_RUN_PATH} will be used if it is defined.

The @option{-rpath} option may also be used on SunOS.  By default, on
SunOS, the linker will form a runtime search patch out of all the
@option{-L} options it is given.  If a @option{-rpath} option is used, the
runtime search path will be formed exclusively using the @option{-rpath}
options, ignoring the @option{-L} options.  This can be useful when using
gcc, which adds many @option{-L} options which may be on NFS mounted
file systems.

For compatibility with other ELF linkers, if the @option{-R} option is
followed by a directory name, rather than a file name, it is treated as
the @option{-rpath} option.
@end ifset

@ifset GENERIC
@cindex link-time runtime library search path
@kindex -rpath-link=@var{dir}
@item -rpath-link=@var{dir}
When using ELF or SunOS, one shared library may require another.  This
happens when an @code{ld -shared} link includes a shared library as one
of the input files.

When the linker encounters such a dependency when doing a non-shared,
non-relocatable link, it will automatically try to locate the required
shared library and include it in the link, if it is not included
explicitly.  In such a case, the @option{-rpath-link} option
specifies the first set of directories to search.  The
@option{-rpath-link} option may specify a sequence of directory names
either by specifying a list of names separated by colons, or by
appearing multiple times.

This option should be used with caution as it overrides the search path
that may have been hard compiled into a shared library. In such a case it
is possible to use unintentionally a different search path than the
runtime linker would do.

The linker uses the following search paths to locate required shared
libraries:
@enumerate
@item
Any directories specified by @option{-rpath-link} options.
@item
Any directories specified by @option{-rpath} options.  The difference
between @option{-rpath} and @option{-rpath-link} is that directories
specified by @option{-rpath} options are included in the executable and
used at runtime, whereas the @option{-rpath-link} option is only effective
at link time. Searching @option{-rpath} in this way is only supported
by native linkers and cross linkers which have been configured with
the @option{--with-sysroot} option.
@item
On an ELF system, for native linkers, if the @option{-rpath} and
@option{-rpath-link} options were not used, search the contents of the
environment variable @code{LD_RUN_PATH}.
@item
On SunOS, if the @option{-rpath} option was not used, search any
directories specified using @option{-L} options.
@item
For a native linker, search the contents of the environment
variable @code{LD_LIBRARY_PATH}.
@item
For a native ELF linker, the directories in @code{DT_RUNPATH} or
@code{DT_RPATH} of a shared library are searched for shared
libraries needed by it. The @code{DT_RPATH} entries are ignored if
@code{DT_RUNPATH} entries exist.
@item
The default directories, normally @file{/lib} and @file{/usr/lib}.
@item
For a native linker on an ELF system, if the file @file{/etc/ld.so.conf}
exists, the list of directories found in that file.
@end enumerate

If the required shared library is not found, the linker will issue a
warning and continue with the link.
@end ifset

@kindex -shared
@kindex -Bshareable
@item -shared
@itemx -Bshareable
@cindex shared libraries
Create a shared library.  This is currently only supported on ELF, XCOFF
and SunOS platforms.  On SunOS, the linker will automatically create a
shared library if the @option{-e} option is not used and there are
undefined symbols in the link.

@kindex --sort-common
@item --sort-common
@itemx --sort-common=ascending
@itemx --sort-common=descending
This option tells @command{ld} to sort the common symbols by alignment in
ascending or descending order when it places them in the appropriate output
sections.  The symbol alignments considered are sixteen-byte or larger,
eight-byte, four-byte, two-byte, and one-byte. This is to prevent gaps
between symbols due to alignment constraints.  If no sorting order is
specified, then descending order is assumed.

@kindex --sort-section=name
@item --sort-section=name
This option will apply @code{SORT_BY_NAME} to all wildcard section
patterns in the linker script.

@kindex --sort-section=alignment
@item --sort-section=alignment
This option will apply @code{SORT_BY_ALIGNMENT} to all wildcard section
patterns in the linker script.

@kindex --split-by-file
@item --split-by-file[=@var{size}]
Similar to @option{--split-by-reloc} but creates a new output section for
each input file when @var{size} is reached.  @var{size} defaults to a
size of 1 if not given.

@kindex --split-by-reloc
@item --split-by-reloc[=@var{count}]
Tries to creates extra sections in the output file so that no single
output section in the file contains more than @var{count} relocations.
This is useful when generating huge relocatable files for downloading into
certain real time kernels with the COFF object file format; since COFF
cannot represent more than 65535 relocations in a single section.  Note
that this will fail to work with object file formats which do not
support arbitrary sections.  The linker will not split up individual
input sections for redistribution, so if a single input section contains
more than @var{count} relocations one output section will contain that
many relocations.  @var{count} defaults to a value of 32768.

@kindex --stats
@item --stats
Compute and display statistics about the operation of the linker, such
as execution time and memory usage.

@kindex --sysroot=@var{directory}
@item --sysroot=@var{directory}
Use @var{directory} as the location of the sysroot, overriding the
configure-time default.  This option is only supported by linkers
that were configured using @option{--with-sysroot}.

@kindex --traditional-format
@cindex traditional format
@item --traditional-format
For some targets, the output of @command{ld} is different in some ways from
the output of some existing linker.  This switch requests @command{ld} to
use the traditional format instead.

@cindex dbx
For example, on SunOS, @command{ld} combines duplicate entries in the
symbol string table.  This can reduce the size of an output file with
full debugging information by over 30 percent.  Unfortunately, the SunOS
@code{dbx} program can not read the resulting program (@code{gdb} has no
trouble).  The @samp{--traditional-format} switch tells @command{ld} to not
combine duplicate entries.

@kindex --section-start=@var{sectionname}=@var{org}
@item --section-start=@var{sectionname}=@var{org}
Locate a section in the output file at the absolute
address given by @var{org}.  You may use this option as many
times as necessary to locate multiple sections in the command
line.
@var{org} must be a single hexadecimal integer;
for compatibility with other linkers, you may omit the leading
@samp{0x} usually associated with hexadecimal values.  @emph{Note:} there
should be no white space between @var{sectionname}, the equals
sign (``@key{=}''), and @var{org}.

@kindex -Tbss=@var{org}
@kindex -Tdata=@var{org}
@kindex -Ttext=@var{org}
@cindex segment origins, cmd line
@item -Tbss=@var{org}
@itemx -Tdata=@var{org}
@itemx -Ttext=@var{org}
Same as @option{--section-start}, with @code{.bss}, @code{.data} or
@code{.text} as the @var{sectionname}.

@kindex -Ttext-segment=@var{org}
@item -Ttext-segment=@var{org}
@cindex text segment origin, cmd line
When creating an ELF executable, it will set the address of the first
byte of the text segment.

@kindex -Trodata-segment=@var{org}
@item -Trodata-segment=@var{org}
@cindex rodata segment origin, cmd line
When creating an ELF executable or shared object for a target where
the read-only data is in its own segment separate from the executable
text, it will set the address of the first byte of the read-only data segment.

@kindex -Tldata-segment=@var{org}
@item -Tldata-segment=@var{org}
@cindex ldata segment origin, cmd line
When creating an ELF executable or shared object for x86-64 medium memory
model, it will set the address of the first byte of the ldata segment.

@kindex --unresolved-symbols
@item --unresolved-symbols=@var{method}
Determine how to handle unresolved symbols.  There are four possible
values for @samp{method}:

@table @samp
@item ignore-all
Do not report any unresolved symbols.

@item report-all
Report all unresolved symbols.  This is the default.

@item ignore-in-object-files
Report unresolved symbols that are contained in shared libraries, but
ignore them if they come from regular object files.

@item ignore-in-shared-libs
Report unresolved symbols that come from regular object files, but
ignore them if they come from shared libraries.  This can be useful
when creating a dynamic binary and it is known that all the shared
libraries that it should be referencing are included on the linker's
command line.
@end table

The behaviour for shared libraries on their own can also be controlled
by the @option{--[no-]allow-shlib-undefined} option.

Normally the linker will generate an error message for each reported
unresolved symbol but the option @option{--warn-unresolved-symbols}
can change this to a warning.

@kindex --verbose[=@var{NUMBER}]
@cindex verbose[=@var{NUMBER}]
@item --dll-verbose
@itemx --verbose[=@var{NUMBER}]
Display the version number for @command{ld} and list the linker emulations
supported.  Display which input files can and cannot be opened.  Display
the linker script being used by the linker. If the optional @var{NUMBER}
argument > 1, plugin symbol status will also be displayed.

@kindex --version-script=@var{version-scriptfile}
@cindex version script, symbol versions
@item --version-script=@var{version-scriptfile}
Specify the name of a version script to the linker.  This is typically
used when creating shared libraries to specify additional information
about the version hierarchy for the library being created.  This option
is only fully supported on ELF platforms which support shared libraries;
see @ref{VERSION}.  It is partially supported on PE platforms, which can
use version scripts to filter symbol visibility in auto-export mode: any
symbols marked @samp{local} in the version script will not be exported.
@xref{WIN32}.

@kindex --warn-common
@cindex warnings, on combining symbols
@cindex combining symbols, warnings on
@item --warn-common
Warn when a common symbol is combined with another common symbol or with
a symbol definition.  Unix linkers allow this somewhat sloppy practice,
but linkers on some other operating systems do not.  This option allows
you to find potential problems from combining global symbols.
Unfortunately, some C libraries use this practice, so you may get some
warnings about symbols in the libraries as well as in your programs.

There are three kinds of global symbols, illustrated here by C examples:

@table @samp
@item int i = 1;
A definition, which goes in the initialized data section of the output
file.

@item extern int i;
An undefined reference, which does not allocate space.
There must be either a definition or a common symbol for the
variable somewhere.

@item int i;
A common symbol.  If there are only (one or more) common symbols for a
variable, it goes in the uninitialized data area of the output file.
The linker merges multiple common symbols for the same variable into a
single symbol.  If they are of different sizes, it picks the largest
size.  The linker turns a common symbol into a declaration, if there is
a definition of the same variable.
@end table

The @samp{--warn-common} option can produce five kinds of warnings.
Each warning consists of a pair of lines: the first describes the symbol
just encountered, and the second describes the previous symbol
encountered with the same name.  One or both of the two symbols will be
a common symbol.

@enumerate
@item
Turning a common symbol into a reference, because there is already a
definition for the symbol.
@smallexample
@var{file}(@var{section}): warning: common of `@var{symbol}'
   overridden by definition
@var{file}(@var{section}): warning: defined here
@end smallexample

@item
Turning a common symbol into a reference, because a later definition for
the symbol is encountered.  This is the same as the previous case,
except that the symbols are encountered in a different order.
@smallexample
@var{file}(@var{section}): warning: definition of `@var{symbol}'
   overriding common
@var{file}(@var{section}): warning: common is here
@end smallexample

@item
Merging a common symbol with a previous same-sized common symbol.
@smallexample
@var{file}(@var{section}): warning: multiple common
   of `@var{symbol}'
@var{file}(@var{section}): warning: previous common is here
@end smallexample

@item
Merging a common symbol with a previous larger common symbol.
@smallexample
@var{file}(@var{section}): warning: common of `@var{symbol}'
   overridden by larger common
@var{file}(@var{section}): warning: larger common is here
@end smallexample

@item
Merging a common symbol with a previous smaller common symbol.  This is
the same as the previous case, except that the symbols are
encountered in a different order.
@smallexample
@var{file}(@var{section}): warning: common of `@var{symbol}'
   overriding smaller common
@var{file}(@var{section}): warning: smaller common is here
@end smallexample
@end enumerate

@kindex --warn-constructors
@item --warn-constructors
Warn if any global constructors are used.  This is only useful for a few
object file formats.  For formats like COFF or ELF, the linker can not
detect the use of global constructors.

@kindex --warn-multiple-gp
@item --warn-multiple-gp
Warn if multiple global pointer values are required in the output file.
This is only meaningful for certain processors, such as the Alpha.
Specifically, some processors put large-valued constants in a special
section.  A special register (the global pointer) points into the middle
of this section, so that constants can be loaded efficiently via a
base-register relative addressing mode.  Since the offset in
base-register relative mode is fixed and relatively small (e.g., 16
bits), this limits the maximum size of the constant pool.  Thus, in
large programs, it is often necessary to use multiple global pointer
values in order to be able to address all possible constants.  This
option causes a warning to be issued whenever this case occurs.

@kindex --warn-once
@cindex warnings, on undefined symbols
@cindex undefined symbols, warnings on
@item --warn-once
Only warn once for each undefined symbol, rather than once per module
which refers to it.

@kindex --warn-orphan
@kindex --no-warn-orphan
@cindex warnings, on orphan sections
@cindex orphan sections, warnings on
@item --warn-orphan
The @option{--warn-orphan} option tells the linker to generate a
warning message whenever it has to place an orphan section into the
output file.  @xref{Orphan Sections}  The @option{--no-warn-orphan}
option restores the default behaviour of just silently placing these
sections.

@kindex --warn-section-align
@cindex warnings, on section alignment
@cindex section alignment, warnings on
@item --warn-section-align
Warn if the address of an output section is changed because of
alignment.  Typically, the alignment will be set by an input section.
The address will only be changed if it not explicitly specified; that
is, if the @code{SECTIONS} command does not specify a start address for
the section (@pxref{SECTIONS}).

@kindex --warn-shared-textrel
@item --warn-shared-textrel
Warn if the linker adds a DT_TEXTREL to a shared object.

@kindex --warn-alternate-em
@item --warn-alternate-em
Warn if an object has alternate ELF machine code.

@kindex --warn-unresolved-symbols
@item --warn-unresolved-symbols
If the linker is going to report an unresolved symbol (see the option
@option{--unresolved-symbols}) it will normally generate an error.
This option makes it generate a warning instead.

@kindex --error-unresolved-symbols
@item --error-unresolved-symbols
This restores the linker's default behaviour of generating errors when
it is reporting unresolved symbols.

@kindex --whole-archive
@cindex including an entire archive
@item --whole-archive
For each archive mentioned on the command line after the
@option{--whole-archive} option, include every object file in the archive
in the link, rather than searching the archive for the required object
files.  This is normally used to turn an archive file into a shared
library, forcing every object to be included in the resulting shared
library.  This option may be used more than once.

Two notes when using this option from gcc: First, gcc doesn't know
about this option, so you have to use @option{-Wl,-whole-archive}.
Second, don't forget to use @option{-Wl,-no-whole-archive} after your
list of archives, because gcc will add its own list of archives to
your link and you may not want this flag to affect those as well.

@kindex --wrap=@var{symbol}
@item --wrap=@var{symbol}
Use a wrapper function for @var{symbol}.  Any undefined reference to
@var{symbol} will be resolved to @code{__wrap_@var{symbol}}.  Any
undefined reference to @code{__real_@var{symbol}} will be resolved to
@var{symbol}.

This can be used to provide a wrapper for a system function.  The
wrapper function should be called @code{__wrap_@var{symbol}}.  If it
wishes to call the system function, it should call
@code{__real_@var{symbol}}.

Here is a trivial example:

@smallexample
void *
__wrap_malloc (size_t c)
@{
  printf ("malloc called with %zu\n", c);
  return __real_malloc (c);
@}
@end smallexample

If you link other code with this file using @option{--wrap malloc}, then
all calls to @code{malloc} will call the function @code{__wrap_malloc}
instead.  The call to @code{__real_malloc} in @code{__wrap_malloc} will
call the real @code{malloc} function.

You may wish to provide a @code{__real_malloc} function as well, so that
links without the @option{--wrap} option will succeed.  If you do this,
you should not put the definition of @code{__real_malloc} in the same
file as @code{__wrap_malloc}; if you do, the assembler may resolve the
call before the linker has a chance to wrap it to @code{malloc}.

@kindex --eh-frame-hdr
@item --eh-frame-hdr
Request creation of @code{.eh_frame_hdr} section and ELF
@code{PT_GNU_EH_FRAME} segment header.

@kindex --ld-generated-unwind-info
@item --no-ld-generated-unwind-info
Request creation of @code{.eh_frame} unwind info for linker
generated code sections like PLT.  This option is on by default
if linker generated unwind info is supported.

@kindex --enable-new-dtags
@kindex --disable-new-dtags
@item --enable-new-dtags
@itemx --disable-new-dtags
This linker can create the new dynamic tags in ELF. But the older ELF
systems may not understand them. If you specify
@option{--enable-new-dtags}, the new dynamic tags will be created as needed
and older dynamic tags will be omitted.
If you specify @option{--disable-new-dtags}, no new dynamic tags will be
created. By default, the new dynamic tags are not created. Note that
those options are only available for ELF systems.

@kindex --hash-size=@var{number}
@item --hash-size=@var{number}
Set the default size of the linker's hash tables to a prime number
close to @var{number}.  Increasing this value can reduce the length of
time it takes the linker to perform its tasks, at the expense of
increasing the linker's memory requirements.  Similarly reducing this
value can reduce the memory requirements at the expense of speed.

@kindex --hash-style=@var{style}
@item --hash-style=@var{style}
Set the type of linker's hash table(s).  @var{style} can be either
@code{sysv} for classic ELF @code{.hash} section, @code{gnu} for
new style GNU @code{.gnu.hash} section or @code{both} for both
the classic ELF @code{.hash} and new style GNU @code{.gnu.hash}
hash tables.  The default is @code{sysv}.

@kindex --compress-debug-sections=none
@kindex --compress-debug-sections=zlib
@kindex --compress-debug-sections=zlib-gnu
@kindex --compress-debug-sections=zlib-gabi
@item --compress-debug-sections=none
@itemx --compress-debug-sections=zlib
@itemx --compress-debug-sections=zlib-gnu
@itemx --compress-debug-sections=zlib-gabi
On ELF platforms , these options control how DWARF debug sections are
compressed using zlib.  @option{--compress-debug-sections=none} doesn't
compress DWARF debug sections.  @option{--compress-debug-sections=zlib}
and @option{--compress-debug-sections=zlib-gnu} compress DWARF debug
sections and rename debug section names to begin with @samp{.zdebug}
instead of @samp{.debug}.  @option{--compress-debug-sections=zlib-gabi}
compresses DWARF debug sections with SHF_COMPRESSED from the ELF ABI.

@kindex --reduce-memory-overheads
@item --reduce-memory-overheads
This option reduces memory requirements at ld runtime, at the expense of
linking speed.  This was introduced to select the old O(n^2) algorithm
for link map file generation, rather than the new O(n) algorithm which uses
about 40% more memory for symbol storage.

Another effect of the switch is to set the default hash table size to
1021, which again saves memory at the cost of lengthening the linker's
run time.  This is not done however if the @option{--hash-size} switch
has been used.

The @option{--reduce-memory-overheads} switch may be also be used to
enable other tradeoffs in future versions of the linker.

@kindex --build-id
@kindex --build-id=@var{style}
@item --build-id
@itemx --build-id=@var{style}
Request the creation of a @code{.note.gnu.build-id} ELF note section
or a @code{.build-id} COFF section.  The contents of the note are
unique bits identifying this linked file.  @var{style} can be
@code{uuid} to use 128 random bits, @code{sha1} to use a 160-bit
@sc{SHA1} hash on the normative parts of the output contents,
@code{md5} to use a 128-bit @sc{MD5} hash on the normative parts of
the output contents, or @code{0x@var{hexstring}} to use a chosen bit
string specified as an even number of hexadecimal digits (@code{-} and
@code{:} characters between digit pairs are ignored).  If @var{style}
is omitted, @code{sha1} is used.

The @code{md5} and @code{sha1} styles produces an identifier
that is always the same in an identical output file, but will be
unique among all nonidentical output files.  It is not intended
to be compared as a checksum for the file's contents.  A linked
file may be changed later by other tools, but the build ID bit
string identifying the original linked file does not change.

Passing @code{none} for @var{style} disables the setting from any
@code{--build-id} options earlier on the command line.
@end table

@c man end

@subsection Options Specific to i386 PE Targets

@c man begin OPTIONS

The i386 PE linker supports the @option{-shared} option, which causes
the output to be a dynamically linked library (DLL) instead of a
normal executable.  You should name the output @code{*.dll} when you
use this option.  In addition, the linker fully supports the standard
@code{*.def} files, which may be specified on the linker command line
like an object file (in fact, it should precede archives it exports
symbols from, to ensure that they get linked in, just like a normal
object file).

In addition to the options common to all targets, the i386 PE linker
support additional command line options that are specific to the i386
PE target.  Options that take values may be separated from their
values by either a space or an equals sign.

@table @gcctabopt

@kindex --add-stdcall-alias
@item --add-stdcall-alias
If given, symbols with a stdcall suffix (@@@var{nn}) will be exported
as-is and also with the suffix stripped.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --base-file
@item --base-file @var{file}
Use @var{file} as the name of a file in which to save the base
addresses of all the relocations needed for generating DLLs with
@file{dlltool}.
[This is an i386 PE specific option]

@kindex --dll
@item --dll
Create a DLL instead of a regular executable.  You may also use
@option{-shared} or specify a @code{LIBRARY} in a given @code{.def}
file.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --enable-long-section-names
@kindex --disable-long-section-names
@item --enable-long-section-names
@itemx --disable-long-section-names
The PE variants of the Coff object format add an extension that permits
the use of section names longer than eight characters, the normal limit
for Coff.  By default, these names are only allowed in object files, as
fully-linked executable images do not carry the Coff string table required
to support the longer names.  As a GNU extension, it is possible to
allow their use in executable images as well, or to (probably pointlessly!)
disallow it in object files, by using these two options.  Executable images
generated with these long section names are slightly non-standard, carrying
as they do a string table, and may generate confusing output when examined
with non-GNU PE-aware tools, such as file viewers and dumpers.  However,
GDB relies on the use of PE long section names to find Dwarf-2 debug
information sections in an executable image at runtime, and so if neither
option is specified on the command-line, @command{ld} will enable long
section names, overriding the default and technically correct behaviour,
when it finds the presence of debug information while linking an executable
image and not stripping symbols.
[This option is valid for all PE targeted ports of the linker]

@kindex --enable-stdcall-fixup
@kindex --disable-stdcall-fixup
@item --enable-stdcall-fixup
@itemx --disable-stdcall-fixup
If the link finds a symbol that it cannot resolve, it will attempt to
do ``fuzzy linking'' by looking for another defined symbol that differs
only in the format of the symbol name (cdecl vs stdcall) and will
resolve that symbol by linking to the match.  For example, the
undefined symbol @code{_foo} might be linked to the function
@code{_foo@@12}, or the undefined symbol @code{_bar@@16} might be linked
to the function @code{_bar}.  When the linker does this, it prints a
warning, since it normally should have failed to link, but sometimes
import libraries generated from third-party dlls may need this feature
to be usable.  If you specify @option{--enable-stdcall-fixup}, this
feature is fully enabled and warnings are not printed.  If you specify
@option{--disable-stdcall-fixup}, this feature is disabled and such
mismatches are considered to be errors.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --leading-underscore
@kindex --no-leading-underscore
@item --leading-underscore
@itemx --no-leading-underscore
For most targets default symbol-prefix is an underscore and is defined
in target's description. By this option it is possible to
disable/enable the default underscore symbol-prefix.

@cindex DLLs, creating
@kindex --export-all-symbols
@item --export-all-symbols
If given, all global symbols in the objects used to build a DLL will
be exported by the DLL.  Note that this is the default if there
otherwise wouldn't be any exported symbols.  When symbols are
explicitly exported via DEF files or implicitly exported via function
attributes, the default is to not export anything else unless this
option is given.  Note that the symbols @code{DllMain@@12},
@code{DllEntryPoint@@0}, @code{DllMainCRTStartup@@12}, and
@code{impure_ptr} will not be automatically
exported.  Also, symbols imported from other DLLs will not be
re-exported, nor will symbols specifying the DLL's internal layout
such as those beginning with @code{_head_} or ending with
@code{_iname}.  In addition, no symbols from @code{libgcc},
@code{libstd++}, @code{libmingw32}, or @code{crtX.o} will be exported.
Symbols whose names begin with @code{__rtti_} or @code{__builtin_} will
not be exported, to help with C++ DLLs.  Finally, there is an
extensive list of cygwin-private symbols that are not exported
(obviously, this applies on when building DLLs for cygwin targets).
These cygwin-excludes are: @code{_cygwin_dll_entry@@12},
@code{_cygwin_crt0_common@@8}, @code{_cygwin_noncygwin_dll_entry@@12},
@code{_fmode}, @code{_impure_ptr}, @code{cygwin_attach_dll},
@code{cygwin_premain0}, @code{cygwin_premain1}, @code{cygwin_premain2},
@code{cygwin_premain3}, and @code{environ}.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --exclude-symbols
@item --exclude-symbols @var{symbol},@var{symbol},...
Specifies a list of symbols which should not be automatically
exported.  The symbol names may be delimited by commas or colons.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --exclude-all-symbols
@item --exclude-all-symbols
Specifies no symbols should be automatically exported.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --file-alignment
@item --file-alignment
Specify the file alignment.  Sections in the file will always begin at
file offsets which are multiples of this number.  This defaults to
512.
[This option is specific to the i386 PE targeted port of the linker]

@cindex heap size
@kindex --heap
@item --heap @var{reserve}
@itemx --heap @var{reserve},@var{commit}
Specify the number of bytes of memory to reserve (and optionally commit)
to be used as heap for this program.  The default is 1MB reserved, 4K
committed.
[This option is specific to the i386 PE targeted port of the linker]

@cindex image base
@kindex --image-base
@item --image-base @var{value}
Use @var{value} as the base address of your program or dll.  This is
the lowest memory location that will be used when your program or dll
is loaded.  To reduce the need to relocate and improve performance of
your dlls, each should have a unique base address and not overlap any
other dlls.  The default is 0x400000 for executables, and 0x10000000
for dlls.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --kill-at
@item --kill-at
If given, the stdcall suffixes (@@@var{nn}) will be stripped from
symbols before they are exported.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --large-address-aware
@item --large-address-aware
If given, the appropriate bit in the ``Characteristics'' field of the COFF
header is set to indicate that this executable supports virtual addresses
greater than 2 gigabytes.  This should be used in conjunction with the /3GB
or /USERVA=@var{value} megabytes switch in the ``[operating systems]''
section of the BOOT.INI.  Otherwise, this bit has no effect.
[This option is specific to PE targeted ports of the linker]

@kindex --disable-large-address-aware
@item --disable-large-address-aware
Reverts the effect of a previous @samp{--large-address-aware} option.
This is useful if @samp{--large-address-aware} is always set by the compiler
driver (e.g. Cygwin gcc) and the executable does not support virtual
addresses greater than 2 gigabytes.
[This option is specific to PE targeted ports of the linker]

@kindex --major-image-version
@item --major-image-version @var{value}
Sets the major number of the ``image version''.  Defaults to 1.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --major-os-version
@item --major-os-version @var{value}
Sets the major number of the ``os version''.  Defaults to 4.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --major-subsystem-version
@item --major-subsystem-version @var{value}
Sets the major number of the ``subsystem version''.  Defaults to 4.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --minor-image-version
@item --minor-image-version @var{value}
Sets the minor number of the ``image version''.  Defaults to 0.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --minor-os-version
@item --minor-os-version @var{value}
Sets the minor number of the ``os version''.  Defaults to 0.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --minor-subsystem-version
@item --minor-subsystem-version @var{value}
Sets the minor number of the ``subsystem version''.  Defaults to 0.
[This option is specific to the i386 PE targeted port of the linker]

@cindex DEF files, creating
@cindex DLLs, creating
@kindex --output-def
@item --output-def @var{file}
The linker will create the file @var{file} which will contain a DEF
file corresponding to the DLL the linker is generating.  This DEF file
(which should be called @code{*.def}) may be used to create an import
library with @code{dlltool} or may be used as a reference to
automatically or implicitly exported symbols.
[This option is specific to the i386 PE targeted port of the linker]

@cindex DLLs, creating
@kindex --out-implib
@item --out-implib @var{file}
The linker will create the file @var{file} which will contain an
import lib corresponding to the DLL the linker is generating. This
import lib (which should be called @code{*.dll.a} or @code{*.a}
may be used to link clients against the generated DLL; this behaviour
makes it possible to skip a separate @code{dlltool} import library
creation step.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --enable-auto-image-base
@item --enable-auto-image-base
@itemx --enable-auto-image-base=@var{value}
Automatically choose the image base for DLLs, optionally starting with base
@var{value}, unless one is specified using the @code{--image-base} argument.
By using a hash generated from the dllname to create unique image bases
for each DLL, in-memory collisions and relocations which can delay program
execution are avoided.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --disable-auto-image-base
@item --disable-auto-image-base
Do not automatically generate a unique image base.  If there is no
user-specified image base (@code{--image-base}) then use the platform
default.
[This option is specific to the i386 PE targeted port of the linker]

@cindex DLLs, linking to
@kindex --dll-search-prefix
@item --dll-search-prefix @var{string}
When linking dynamically to a dll without an import library,
search for @code{<string><basename>.dll} in preference to
@code{lib<basename>.dll}. This behaviour allows easy distinction
between DLLs built for the various "subplatforms": native, cygwin,
uwin, pw, etc.  For instance, cygwin DLLs typically use
@code{--dll-search-prefix=cyg}.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --enable-auto-import
@item --enable-auto-import
Do sophisticated linking of @code{_symbol} to @code{__imp__symbol} for
DATA imports from DLLs, and create the necessary thunking symbols when
building the import libraries with those DATA exports. Note: Use of the
'auto-import' extension will cause the text section of the image file
to be made writable. This does not conform to the PE-COFF format
specification published by Microsoft.

Note - use of the 'auto-import' extension will also cause read only
data which would normally be placed into the .rdata section to be
placed into the .data section instead.  This is in order to work
around a problem with consts that is described here:
http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html

Using 'auto-import' generally will 'just work' -- but sometimes you may
see this message:

"variable '<var>' can't be auto-imported. Please read the
documentation for ld's @code{--enable-auto-import} for details."

This message occurs when some (sub)expression accesses an address
ultimately given by the sum of two constants (Win32 import tables only
allow one).  Instances where this may occur include accesses to member
fields of struct variables imported from a DLL, as well as using a
constant index into an array variable imported from a DLL.  Any
multiword variable (arrays, structs, long long, etc) may trigger
this error condition.  However, regardless of the exact data type
of the offending exported variable, ld will always detect it, issue
the warning, and exit.

There are several ways to address this difficulty, regardless of the
data type of the exported variable:

One way is to use --enable-runtime-pseudo-reloc switch. This leaves the task
of adjusting references in your client code for runtime environment, so
this method works only when runtime environment supports this feature.

A second solution is to force one of the 'constants' to be a variable --
that is, unknown and un-optimizable at compile time.  For arrays,
there are two possibilities: a) make the indexee (the array's address)
a variable, or b) make the 'constant' index a variable.  Thus:

@example
extern type extern_array[];
extern_array[1] -->
   @{ volatile type *t=extern_array; t[1] @}
@end example

or

@example
extern type extern_array[];
extern_array[1] -->
   @{ volatile int t=1; extern_array[t] @}
@end example

For structs (and most other multiword data types) the only option
is to make the struct itself (or the long long, or the ...) variable:

@example
extern struct s extern_struct;
extern_struct.field -->
   @{ volatile struct s *t=&extern_struct; t->field @}
@end example

or

@example
extern long long extern_ll;
extern_ll -->
  @{ volatile long long * local_ll=&extern_ll; *local_ll @}
@end example

A third method of dealing with this difficulty is to abandon
'auto-import' for the offending symbol and mark it with
@code{__declspec(dllimport)}.  However, in practice that
requires using compile-time #defines to indicate whether you are
building a DLL, building client code that will link to the DLL, or
merely building/linking to a static library.   In making the choice
between the various methods of resolving the 'direct address with
constant offset' problem, you should consider typical real-world usage:

Original:
@example
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv)@{
  printf("%d\n",arr[1]);
@}
@end example

Solution 1:
@example
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv)@{
  /* This workaround is for win32 and cygwin; do not "optimize" */
  volatile int *parr = arr;
  printf("%d\n",parr[1]);
@}
@end example

Solution 2:
@example
--foo.h
/* Note: auto-export is assumed (no __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
  !(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#define FOO_IMPORT __declspec(dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv)@{
  printf("%d\n",arr[1]);
@}
@end example

A fourth way to avoid this problem is to re-code your
library to use a functional interface rather than a data interface
for the offending variables (e.g. set_foo() and get_foo() accessor
functions).
[This option is specific to the i386 PE targeted port of the linker]

@kindex --disable-auto-import
@item --disable-auto-import
Do not attempt to do sophisticated linking of @code{_symbol} to
@code{__imp__symbol} for DATA imports from DLLs.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --enable-runtime-pseudo-reloc
@item --enable-runtime-pseudo-reloc
If your code contains expressions described in --enable-auto-import section,
that is, DATA imports from DLL with non-zero offset, this switch will create
a vector of 'runtime pseudo relocations' which can be used by runtime
environment to adjust references to such data in your client code.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --disable-runtime-pseudo-reloc
@item --disable-runtime-pseudo-reloc
Do not create pseudo relocations for non-zero offset DATA imports from
DLLs.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --enable-extra-pe-debug
@item --enable-extra-pe-debug
Show additional debug info related to auto-import symbol thunking.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --section-alignment
@item --section-alignment
Sets the section alignment.  Sections in memory will always begin at
addresses which are a multiple of this number.  Defaults to 0x1000.
[This option is specific to the i386 PE targeted port of the linker]

@cindex stack size
@kindex --stack
@item --stack @var{reserve}
@itemx --stack @var{reserve},@var{commit}
Specify the number of bytes of memory to reserve (and optionally commit)
to be used as stack for this program.  The default is 2MB reserved, 4K
committed.
[This option is specific to the i386 PE targeted port of the linker]

@kindex --subsystem
@item --subsystem @var{which}
@itemx --subsystem @var{which}:@var{major}
@itemx --subsystem @var{which}:@var{major}.@var{minor}
Specifies the subsystem under which your program will execute.  The
legal values for @var{which} are @code{native}, @code{windows},
@code{console}, @code{posix}, and @code{xbox}.  You may optionally set
the subsystem version also.  Numeric values are also accepted for
@var{which}.
[This option is specific to the i386 PE targeted port of the linker]

The following options set flags in the @code{DllCharacteristics} field
of the PE file header:
[These options are specific to PE targeted ports of the linker]

@kindex --high-entropy-va
@item --high-entropy-va
Image is compatible with 64-bit address space layout randomization
(ASLR).

@kindex --dynamicbase
@item --dynamicbase
The image base address may be relocated using address space layout
randomization (ASLR).  This feature was introduced with MS Windows
Vista for i386 PE targets.

@kindex --forceinteg
@item --forceinteg
Code integrity checks are enforced.

@kindex --nxcompat
@item --nxcompat
The image is compatible with the Data Execution Prevention.
This feature was introduced with MS Windows XP SP2 for i386 PE targets.

@kindex --no-isolation
@item --no-isolation
Although the image understands isolation, do not isolate the image.

@kindex --no-seh
@item --no-seh
The image does not use SEH. No SE handler may be called from
this image.

@kindex --no-bind
@item --no-bind
Do not bind this image.

@kindex --wdmdriver
@item --wdmdriver
The driver uses the MS Windows Driver Model.

@kindex --tsaware
@item --tsaware
The image is Terminal Server aware.

@kindex --insert-timestamp
@item --insert-timestamp
@itemx --no-insert-timestamp
Insert a real timestamp into the image.  This is the default behaviour
as it matches legacy code and it means that the image will work with
other, proprietary tools.  The problem with this default is that it
will result in slightly different images being produced each tiem the
same sources are linked.  The option @option{--no-insert-timestamp}
can be used to insert a zero value for the timestamp, this ensuring
that binaries produced from indentical sources will compare
identically.
@end table

@c man end

@ifset C6X
@subsection Options specific to C6X uClinux targets

@c man begin OPTIONS

The C6X uClinux target uses a binary format called DSBT to support shared
libraries.  Each shared library in the system needs to have a unique index;
all executables use an index of 0.

@table @gcctabopt

@kindex --dsbt-size
@item --dsbt-size @var{size}
This option sets the number of entires in the DSBT of the current executable
or shared library to @var{size}.  The default is to create a table with 64
entries.

@kindex --dsbt-index
@item --dsbt-index @var{index}
This option sets the DSBT index of the current executable or shared library
to @var{index}.  The default is 0, which is appropriate for generating
executables.  If a shared library is generated with a DSBT index of 0, the
@code{R_C6000_DSBT_INDEX} relocs are copied into the output file.

@kindex --no-merge-exidx-entries
The @samp{--no-merge-exidx-entries} switch disables the merging of adjacent
exidx entries in frame unwind info.

@end table

@c man end
@end ifset

@ifset M68HC11
@subsection Options specific to Motorola 68HC11 and 68HC12 targets

@c man begin OPTIONS

The 68HC11 and 68HC12 linkers support specific options to control the
memory bank switching mapping and trampoline code generation.

@table @gcctabopt

@kindex --no-trampoline
@item --no-trampoline
This option disables the generation of trampoline. By default a trampoline
is generated for each far function which is called using a @code{jsr}
instruction (this happens when a pointer to a far function is taken).

@kindex --bank-window
@item --bank-window @var{name}
This option indicates to the linker the name of the memory region in
the @samp{MEMORY} specification that describes the memory bank window.
The definition of such region is then used by the linker to compute
paging and addresses within the memory window.

@end table

@c man end
@end ifset

@ifset M68K
@subsection Options specific to Motorola 68K target

@c man begin OPTIONS

The following options are supported to control handling of GOT generation
when linking for 68K targets.

@table @gcctabopt

@kindex --got
@item --got=@var{type}
This option tells the linker which GOT generation scheme to use.
@var{type} should be one of @samp{single}, @samp{negative},
@samp{multigot} or @samp{target}.  For more information refer to the
Info entry for @file{ld}.

@end table

@c man end
@end ifset

@ifset MIPS
@subsection Options specific to MIPS targets

@c man begin OPTIONS

The following options are supported to control microMIPS instruction
generation when linking for MIPS targets.

@table @gcctabopt

@kindex --insn32
@item --insn32
@kindex --no-insn32
@itemx --no-insn32
These options control the choice of microMIPS instructions used in code
generated by the linker, such as that in the PLT or lazy binding stubs,
or in relaxation.  If @samp{--insn32} is used, then the linker only uses
32-bit instruction encodings.  By default or if @samp{--no-insn32} is
used, all instruction encodings are used, including 16-bit ones where
possible.

@end table

@c man end
@end ifset

@ifset UsesEnvVars
@node Environment
@section Environment Variables

@c man begin ENVIRONMENT

You can change the behaviour of @command{ld} with the environment variables
@ifclear SingleFormat
@code{GNUTARGET},
@end ifclear
@code{LDEMULATION} and @code{COLLECT_NO_DEMANGLE}.

@ifclear SingleFormat
@kindex GNUTARGET
@cindex default input format
@code{GNUTARGET} determines the input-file object format if you don't
use @samp{-b} (or its synonym @samp{--format}).  Its value should be one
of the BFD names for an input format (@pxref{BFD}).  If there is no
@code{GNUTARGET} in the environment, @command{ld} uses the natural format
of the target. If @code{GNUTARGET} is set to @code{default} then BFD
attempts to discover the input format by examining binary input files;
this method often succeeds, but there are potential ambiguities, since
there is no method of ensuring that the magic number used to specify
object-file formats is unique.  However, the configuration procedure for
BFD on each system places the conventional format for that system first
in the search-list, so ambiguities are resolved in favor of convention.
@end ifclear

@kindex LDEMULATION
@cindex default emulation
@cindex emulation, default
@code{LDEMULATION} determines the default emulation if you don't use the
@samp{-m} option.  The emulation can affect various aspects of linker
behaviour, particularly the default linker script.  You can list the
available emulations with the @samp{--verbose} or @samp{-V} options.  If
the @samp{-m} option is not used, and the @code{LDEMULATION} environment
variable is not defined, the default emulation depends upon how the
linker was configured.

@kindex COLLECT_NO_DEMANGLE
@cindex demangling, default
Normally, the linker will default to demangling symbols.  However, if
@code{COLLECT_NO_DEMANGLE} is set in the environment, then it will
default to not demangling symbols.  This environment variable is used in
a similar fashion by the @code{gcc} linker wrapper program.  The default
may be overridden by the @samp{--demangle} and @samp{--no-demangle}
options.

@c man end
@end ifset

@node Scripts
@chapter Linker Scripts

@cindex scripts
@cindex linker scripts
@cindex command files
Every link is controlled by a @dfn{linker script}.  This script is
written in the linker command language.

The main purpose of the linker script is to describe how the sections in
the input files should be mapped into the output file, and to control
the memory layout of the output file.  Most linker scripts do nothing
more than this.  However, when necessary, the linker script can also
direct the linker to perform many other operations, using the commands
described below.

The linker always uses a linker script.  If you do not supply one
yourself, the linker will use a default script that is compiled into the
linker executable.  You can use the @samp{--verbose} command line option
to display the default linker script.  Certain command line options,
such as @samp{-r} or @samp{-N}, will affect the default linker script.

You may supply your own linker script by using the @samp{-T} command
line option.  When you do this, your linker script will replace the
default linker script.

You may also use linker scripts implicitly by naming them as input files
to the linker, as though they were files to be linked.  @xref{Implicit
Linker Scripts}.

@menu
* Basic Script Concepts::	Basic Linker Script Concepts
* Script Format::		Linker Script Format
* Simple Example::		Simple Linker Script Example
* Simple Commands::		Simple Linker Script Commands
* Assignments::			Assigning Values to Symbols
* SECTIONS::			SECTIONS Command
* MEMORY::			MEMORY Command
* PHDRS::			PHDRS Command
* VERSION::			VERSION Command
* Expressions::			Expressions in Linker Scripts
* Implicit Linker Scripts::	Implicit Linker Scripts
@end menu

@node Basic Script Concepts
@section Basic Linker Script Concepts
@cindex linker script concepts
We need to define some basic concepts and vocabulary in order to
describe the linker script language.

The linker combines input files into a single output file.  The output
file and each input file are in a special data format known as an
@dfn{object file format}.  Each file is called an @dfn{object file}.
The output file is often called an @dfn{executable}, but for our
purposes we will also call it an object file.  Each object file has,
among other things, a list of @dfn{sections}.  We sometimes refer to a
section in an input file as an @dfn{input section}; similarly, a section
in the output file is an @dfn{output section}.

Each section in an object file has a name and a size.  Most sections
also have an associated block of data, known as the @dfn{section
contents}.  A section may be marked as @dfn{loadable}, which means that
the contents should be loaded into memory when the output file is run.
A section with no contents may be @dfn{allocatable}, which means that an
area in memory should be set aside, but nothing in particular should be
loaded there (in some cases this memory must be zeroed out).  A section
which is neither loadable nor allocatable typically contains some sort
of debugging information.

Every loadable or allocatable output section has two addresses.  The
first is the @dfn{VMA}, or virtual memory address.  This is the address
the section will have when the output file is run.  The second is the
@dfn{LMA}, or load memory address.  This is the address at which the
section will be loaded.  In most cases the two addresses will be the
same.  An example of when they might be different is when a data section
is loaded into ROM, and then copied into RAM when the program starts up
(this technique is often used to initialize global variables in a ROM
based system).  In this case the ROM address would be the LMA, and the
RAM address would be the VMA.

You can see the sections in an object file by using the @code{objdump}
program with the @samp{-h} option.

Every object file also has a list of @dfn{symbols}, known as the
@dfn{symbol table}.  A symbol may be defined or undefined.  Each symbol
has a name, and each defined symbol has an address, among other
information.  If you compile a C or C++ program into an object file, you
will get a defined symbol for every defined function and global or
static variable.  Every undefined function or global variable which is
referenced in the input file will become an undefined symbol.

You can see the symbols in an object file by using the @code{nm}
program, or by using the @code{objdump} program with the @samp{-t}
option.

@node Script Format
@section Linker Script Format
@cindex linker script format
Linker scripts are text files.

You write a linker script as a series of commands.  Each command is
either a keyword, possibly followed by arguments, or an assignment to a
symbol.  You may separate commands using semicolons.  Whitespace is
generally ignored.

Strings such as file or format names can normally be entered directly.
If the file name contains a character such as a comma which would
otherwise serve to separate file names, you may put the file name in
double quotes.  There is no way to use a double quote character in a
file name.

You may include comments in linker scripts just as in C, delimited by
@samp{/*} and @samp{*/}.  As in C, comments are syntactically equivalent
to whitespace.

@node Simple Example
@section Simple Linker Script Example
@cindex linker script example
@cindex example of linker script
Many linker scripts are fairly simple.

The simplest possible linker script has just one command:
@samp{SECTIONS}.  You use the @samp{SECTIONS} command to describe the
memory layout of the output file.

The @samp{SECTIONS} command is a powerful command.  Here we will
describe a simple use of it.  Let's assume your program consists only of
code, initialized data, and uninitialized data.  These will be in the
@samp{.text}, @samp{.data}, and @samp{.bss} sections, respectively.
Let's assume further that these are the only sections which appear in
your input files.

For this example, let's say that the code should be loaded at address
0x10000, and that the data should start at address 0x8000000.  Here is a
linker script which will do that:
@smallexample
SECTIONS
@{
  . = 0x10000;
  .text : @{ *(.text) @}
  . = 0x8000000;
  .data : @{ *(.data) @}
  .bss : @{ *(.bss) @}
@}
@end smallexample

You write the @samp{SECTIONS} command as the keyword @samp{SECTIONS},
followed by a series of symbol assignments and output section
descriptions enclosed in curly braces.

The first line inside the @samp{SECTIONS} command of the above example
sets the value of the special symbol @samp{.}, which is the location
counter.  If you do not specify the address of an output section in some
other way (other ways are described later), the address is set from the
current value of the location counter.  The location counter is then
incremented by the size of the output section.  At the start of the
@samp{SECTIONS} command, the location counter has the value @samp{0}.

The second line defines an output section, @samp{.text}.  The colon is
required syntax which may be ignored for now.  Within the curly braces
after the output section name, you list the names of the input sections
which should be placed into this output section.  The @samp{*} is a
wildcard which matches any file name.  The expression @samp{*(.text)}
means all @samp{.text} input sections in all input files.

Since the location counter is @samp{0x10000} when the output section
@samp{.text} is defined, the linker will set the address of the
@samp{.text} section in the output file to be @samp{0x10000}.

The remaining lines define the @samp{.data} and @samp{.bss} sections in
the output file.  The linker will place the @samp{.data} output section
at address @samp{0x8000000}.  After the linker places the @samp{.data}
output section, the value of the location counter will be
@samp{0x8000000} plus the size of the @samp{.data} output section.  The
effect is that the linker will place the @samp{.bss} output section
immediately after the @samp{.data} output section in memory.

The linker will ensure that each output section has the required
alignment, by increasing the location counter if necessary.  In this
example, the specified addresses for the @samp{.text} and @samp{.data}
sections will probably satisfy any alignment constraints, but the linker
may have to create a small gap between the @samp{.data} and @samp{.bss}
sections.

That's it!  That's a simple and complete linker script.

@node Simple Commands
@section Simple Linker Script Commands
@cindex linker script simple commands
In this section we describe the simple linker script commands.

@menu
* Entry Point::			Setting the entry point
* File Commands::		Commands dealing with files
@ifclear SingleFormat
* Format Commands::		Commands dealing with object file formats
@end ifclear

* REGION_ALIAS::		Assign alias names to memory regions
* Miscellaneous Commands::	Other linker script commands
@end menu

@node Entry Point
@subsection Setting the Entry Point
@kindex ENTRY(@var{symbol})
@cindex start of execution
@cindex first instruction
@cindex entry point
The first instruction to execute in a program is called the @dfn{entry
point}.  You can use the @code{ENTRY} linker script command to set the
entry point.  The argument is a symbol name:
@smallexample
ENTRY(@var{symbol})
@end smallexample

There are several ways to set the entry point.  The linker will set the
entry point by trying each of the following methods in order, and
stopping when one of them succeeds:
@itemize @bullet
@item
the @samp{-e} @var{entry} command-line option;
@item
the @code{ENTRY(@var{symbol})} command in a linker script;
@item
the value of a target specific symbol, if it is defined;  For many
targets this is @code{start}, but PE and BeOS based systems for example
check a list of possible entry symbols, matching the first one found.
@item
the address of the first byte of the @samp{.text} section, if present;
@item
The address @code{0}.
@end itemize

@node File Commands
@subsection Commands Dealing with Files
@cindex linker script file commands
Several linker script commands deal with files.

@table @code
@item INCLUDE @var{filename}
@kindex INCLUDE @var{filename}
@cindex including a linker script
Include the linker script @var{filename} at this point.  The file will
be searched for in the current directory, and in any directory specified
with the @option{-L} option.  You can nest calls to @code{INCLUDE} up to
10 levels deep.

You can place @code{INCLUDE} directives at the top level, in @code{MEMORY} or
@code{SECTIONS} commands, or in output section descriptions.

@item INPUT(@var{file}, @var{file}, @dots{})
@itemx INPUT(@var{file} @var{file} @dots{})
@kindex INPUT(@var{files})
@cindex input files in linker scripts
@cindex input object files in linker scripts
@cindex linker script input object files
The @code{INPUT} command directs the linker to include the named files
in the link, as though they were named on the command line.

For example, if you always want to include @file{subr.o} any time you do
a link, but you can't be bothered to put it on every link command line,
then you can put @samp{INPUT (subr.o)} in your linker script.

In fact, if you like, you can list all of your input files in the linker
script, and then invoke the linker with nothing but a @samp{-T} option.

In case a @dfn{sysroot prefix} is configured, and the filename starts
with the @samp{/} character, and the script being processed was
located inside the @dfn{sysroot prefix}, the filename will be looked
for in the @dfn{sysroot prefix}.  Otherwise, the linker will try to
open the file in the current directory.  If it is not found, the
linker will search through the archive library search path.
The @dfn{sysroot prefix} can also be forced by specifying @code{=}
as the first character in the filename path.  See also the
description of @samp{-L} in @ref{Options,,Command Line Options}.

If you use @samp{INPUT (-l@var{file})}, @command{ld} will transform the
name to @code{lib@var{file}.a}, as with the command line argument
@samp{-l}.

When you use the @code{INPUT} command in an implicit linker script, the
files will be included in the link at the point at which the linker
script file is included.  This can affect archive searching.

@item GROUP(@var{file}, @var{file}, @dots{})
@itemx GROUP(@var{file} @var{file} @dots{})
@kindex GROUP(@var{files})
@cindex grouping input files
The @code{GROUP} command is like @code{INPUT}, except that the named
files should all be archives, and they are searched repeatedly until no
new undefined references are created.  See the description of @samp{-(}
in @ref{Options,,Command Line Options}.

@item AS_NEEDED(@var{file}, @var{file}, @dots{})
@itemx AS_NEEDED(@var{file} @var{file} @dots{})
@kindex AS_NEEDED(@var{files})
This construct can appear only inside of the @code{INPUT} or @code{GROUP}
commands, among other filenames.  The files listed will be handled
as if they appear directly in the @code{INPUT} or @code{GROUP} commands,
with the exception of ELF shared libraries, that will be added only
when they are actually needed.  This construct essentially enables
@option{--as-needed} option for all the files listed inside of it
and restores previous @option{--as-needed} resp. @option{--no-as-needed}
setting afterwards.

@item OUTPUT(@var{filename})
@kindex OUTPUT(@var{filename})
@cindex output file name in linker script
The @code{OUTPUT} command names the output file.  Using
@code{OUTPUT(@var{filename})} in the linker script is exactly like using
@samp{-o @var{filename}} on the command line (@pxref{Options,,Command
Line Options}).  If both are used, the command line option takes
precedence.

You can use the @code{OUTPUT} command to define a default name for the
output file other than the usual default of @file{a.out}.

@item SEARCH_DIR(@var{path})
@kindex SEARCH_DIR(@var{path})
@cindex library search path in linker script
@cindex archive search path in linker script
@cindex search path in linker script
The @code{SEARCH_DIR} command adds @var{path} to the list of paths where
@command{ld} looks for archive libraries.  Using
@code{SEARCH_DIR(@var{path})} is exactly like using @samp{-L @var{path}}
on the command line (@pxref{Options,,Command Line Options}).  If both
are used, then the linker will search both paths.  Paths specified using
the command line option are searched first.

@item STARTUP(@var{filename})
@kindex STARTUP(@var{filename})
@cindex first input file
The @code{STARTUP} command is just like the @code{INPUT} command, except
that @var{filename} will become the first input file to be linked, as
though it were specified first on the command line.  This may be useful
when using a system in which the entry point is always the start of the
first file.
@end table

@ifclear SingleFormat
@node Format Commands
@subsection Commands Dealing with Object File Formats
A couple of linker script commands deal with object file formats.

@table @code
@item OUTPUT_FORMAT(@var{bfdname})
@itemx OUTPUT_FORMAT(@var{default}, @var{big}, @var{little})
@kindex OUTPUT_FORMAT(@var{bfdname})
@cindex output file format in linker script
The @code{OUTPUT_FORMAT} command names the BFD format to use for the
output file (@pxref{BFD}).  Using @code{OUTPUT_FORMAT(@var{bfdname})} is
exactly like using @samp{--oformat @var{bfdname}} on the command line
(@pxref{Options,,Command Line Options}).  If both are used, the command
line option takes precedence.

You can use @code{OUTPUT_FORMAT} with three arguments to use different
formats based on the @samp{-EB} and @samp{-EL} command line options.
This permits the linker script to set the output format based on the
desired endianness.

If neither @samp{-EB} nor @samp{-EL} are used, then the output format
will be the first argument, @var{default}.  If @samp{-EB} is used, the
output format will be the second argument, @var{big}.  If @samp{-EL} is
used, the output format will be the third argument, @var{little}.

For example, the default linker script for the MIPS ELF target uses this
command:
@smallexample
OUTPUT_FORMAT(elf32-bigmips, elf32-bigmips, elf32-littlemips)
@end smallexample
This says that the default format for the output file is
@samp{elf32-bigmips}, but if the user uses the @samp{-EL} command line
option, the output file will be created in the @samp{elf32-littlemips}
format.

@item TARGET(@var{bfdname})
@kindex TARGET(@var{bfdname})
@cindex input file format in linker script
The @code{TARGET} command names the BFD format to use when reading input
files.  It affects subsequent @code{INPUT} and @code{GROUP} commands.
This command is like using @samp{-b @var{bfdname}} on the command line
(@pxref{Options,,Command Line Options}).  If the @code{TARGET} command
is used but @code{OUTPUT_FORMAT} is not, then the last @code{TARGET}
command is also used to set the format for the output file.  @xref{BFD}.
@end table
@end ifclear

@node REGION_ALIAS
@subsection Assign alias names to memory regions
@kindex REGION_ALIAS(@var{alias}, @var{region})
@cindex region alias
@cindex region names

Alias names can be added to existing memory regions created with the
@ref{MEMORY} command.  Each name corresponds to at most one memory region.

@smallexample
REGION_ALIAS(@var{alias}, @var{region})
@end smallexample

The @code{REGION_ALIAS} function creates an alias name @var{alias} for the
memory region @var{region}.  This allows a flexible mapping of output sections
to memory regions.  An example follows.

Suppose we have an application for embedded systems which come with various
memory storage devices.  All have a general purpose, volatile memory @code{RAM}
that allows code execution or data storage.  Some may have a read-only,
non-volatile memory @code{ROM} that allows code execution and read-only data
access.  The last variant is a read-only, non-volatile memory @code{ROM2} with
read-only data access and no code execution capability.  We have four output
sections:

@itemize @bullet
@item
@code{.text} program code;
@item
@code{.rodata} read-only data;
@item
@code{.data} read-write initialized data;
@item
@code{.bss} read-write zero initialized data.
@end itemize

The goal is to provide a linker command file that contains a system independent
part defining the output sections and a system dependent part mapping the
output sections to the memory regions available on the system.  Our embedded
systems come with three different memory setups @code{A}, @code{B} and
@code{C}:
@multitable @columnfractions .25 .25 .25 .25
@item Section @tab Variant A @tab Variant B @tab Variant C
@item .text @tab RAM @tab ROM @tab ROM
@item .rodata @tab RAM @tab ROM @tab ROM2
@item .data @tab RAM @tab RAM/ROM @tab RAM/ROM2
@item .bss @tab RAM @tab RAM @tab RAM
@end multitable
The notation @code{RAM/ROM} or @code{RAM/ROM2} means that this section is
loaded into region @code{ROM} or @code{ROM2} respectively.  Please note that
the load address of the @code{.data} section starts in all three variants at
the end of the @code{.rodata} section.

The base linker script that deals with the output sections follows.  It
includes the system dependent @code{linkcmds.memory} file that describes the
memory layout:
@smallexample
INCLUDE linkcmds.memory

SECTIONS
  @{
    .text :
      @{
        *(.text)
      @} > REGION_TEXT
    .rodata :
      @{
        *(.rodata)
        rodata_end = .;
      @} > REGION_RODATA
    .data : AT (rodata_end)
      @{
        data_start = .;
        *(.data)
      @} > REGION_DATA
    data_size = SIZEOF(.data);
    data_load_start = LOADADDR(.data);
    .bss :
      @{
        *(.bss)
      @} > REGION_BSS
  @}
@end smallexample

Now we need three different @code{linkcmds.memory} files to define memory
regions and alias names.  The content of @code{linkcmds.memory} for the three
variants @code{A}, @code{B} and @code{C}:
@table @code
@item A
Here everything goes into the @code{RAM}.
@smallexample
MEMORY
  @{
    RAM : ORIGIN = 0, LENGTH = 4M
  @}

REGION_ALIAS("REGION_TEXT", RAM);
REGION_ALIAS("REGION_RODATA", RAM);
REGION_ALIAS("REGION_DATA", RAM);
REGION_ALIAS("REGION_BSS", RAM);
@end smallexample
@item B
Program code and read-only data go into the @code{ROM}.  Read-write data goes
into the @code{RAM}.  An image of the initialized data is loaded into the
@code{ROM} and will be copied during system start into the @code{RAM}.
@smallexample
MEMORY
  @{
    ROM : ORIGIN = 0, LENGTH = 3M
    RAM : ORIGIN = 0x10000000, LENGTH = 1M
  @}

REGION_ALIAS("REGION_TEXT", ROM);
REGION_ALIAS("REGION_RODATA", ROM);
REGION_ALIAS("REGION_DATA", RAM);
REGION_ALIAS("REGION_BSS", RAM);
@end smallexample
@item C
Program code goes into the @code{ROM}.  Read-only data goes into the
@code{ROM2}.  Read-write data goes into the @code{RAM}.  An image of the
initialized data is loaded into the @code{ROM2} and will be copied during
system start into the @code{RAM}.
@smallexample
MEMORY
  @{
    ROM : ORIGIN = 0, LENGTH = 2M
    ROM2 : ORIGIN = 0x10000000, LENGTH = 1M
    RAM : ORIGIN = 0x20000000, LENGTH = 1M
  @}

REGION_ALIAS("REGION_TEXT", ROM);
REGION_ALIAS("REGION_RODATA", ROM2);
REGION_ALIAS("REGION_DATA", RAM);
REGION_ALIAS("REGION_BSS", RAM);
@end smallexample
@end table

It is possible to write a common system initialization routine to copy the
@code{.data} section from @code{ROM} or @code{ROM2} into the @code{RAM} if
necessary:
@smallexample
#include <string.h>

extern char data_start [];
extern char data_size [];
extern char data_load_start [];

void copy_data(void)
@{
  if (data_start != data_load_start)
    @{
      memcpy(data_start, data_load_start, (size_t) data_size);
    @}
@}
@end smallexample

@node Miscellaneous Commands
@subsection Other Linker Script Commands
There are a few other linker scripts commands.

@table @code
@item ASSERT(@var{exp}, @var{message})
@kindex ASSERT
@cindex assertion in linker script
Ensure that @var{exp} is non-zero.  If it is zero, then exit the linker
with an error code, and print @var{message}.

Note that assertions are checked before the final stages of linking
take place.  This means that expressions involving symbols PROVIDEd
inside section definitions will fail if the user has not set values
for those symbols.  The only exception to this rule is PROVIDEd
symbols that just reference dot.  Thus an assertion like this:

@smallexample
  .stack :
  @{
    PROVIDE (__stack = .);
    PROVIDE (__stack_size = 0x100);
    ASSERT ((__stack > (_end + __stack_size)), "Error: No room left for the stack");
  @}
@end smallexample

will fail if @code{__stack_size} is not defined elsewhere.  Symbols
PROVIDEd outside of section definitions are evaluated earlier, so they
can be used inside ASSERTions.  Thus:

@smallexample
  PROVIDE (__stack_size = 0x100);
  .stack :
  @{
    PROVIDE (__stack = .);
    ASSERT ((__stack > (_end + __stack_size)), "Error: No room left for the stack");
  @}
@end smallexample

will work.

@item EXTERN(@var{symbol} @var{symbol} @dots{})
@kindex EXTERN
@cindex undefined symbol in linker script
Force @var{symbol} to be entered in the output file as an undefined
symbol.  Doing this may, for example, trigger linking of additional
modules from standard libraries.  You may list several @var{symbol}s for
each @code{EXTERN}, and you may use @code{EXTERN} multiple times.  This
command has the same effect as the @samp{-u} command-line option.

@item FORCE_COMMON_ALLOCATION
@kindex FORCE_COMMON_ALLOCATION
@cindex common allocation in linker script
This command has the same effect as the @samp{-d} command-line option:
to make @command{ld} assign space to common symbols even if a relocatable
output file is specified (@samp{-r}).

@item INHIBIT_COMMON_ALLOCATION
@kindex INHIBIT_COMMON_ALLOCATION
@cindex common allocation in linker script
This command has the same effect as the @samp{--no-define-common}
command-line option: to make @code{ld} omit the assignment of addresses
to common symbols even for a non-relocatable output file.

@item INSERT [ AFTER | BEFORE ] @var{output_section}
@kindex INSERT
@cindex insert user script into default script
This command is typically used in a script specified by @samp{-T} to
augment the default @code{SECTIONS} with, for example, overlays.  It
inserts all prior linker script statements after (or before)
@var{output_section}, and also causes @samp{-T} to not override the
default linker script.  The exact insertion point is as for orphan
sections.  @xref{Location Counter}.  The insertion happens after the
linker has mapped input sections to output sections.  Prior to the
insertion, since @samp{-T} scripts are parsed before the default
linker script, statements in the @samp{-T} script occur before the
default linker script statements in the internal linker representation
of the script.  In particular, input section assignments will be made
to @samp{-T} output sections before those in the default script.  Here
is an example of how a @samp{-T} script using @code{INSERT} might look:

@smallexample
SECTIONS
@{
  OVERLAY :
  @{
    .ov1 @{ ov1*(.text) @}
    .ov2 @{ ov2*(.text) @}
  @}
@}
INSERT AFTER .text;
@end smallexample

@item NOCROSSREFS(@var{section} @var{section} @dots{})
@kindex NOCROSSREFS(@var{sections})
@cindex cross references
This command may be used to tell @command{ld} to issue an error about any
references among certain output sections.

In certain types of programs, particularly on embedded systems when
using overlays, when one section is loaded into memory, another section
will not be.  Any direct references between the two sections would be
errors.  For example, it would be an error if code in one section called
a function defined in the other section.

The @code{NOCROSSREFS} command takes a list of output section names.  If
@command{ld} detects any cross references between the sections, it reports
an error and returns a non-zero exit status.  Note that the
@code{NOCROSSREFS} command uses output section names, not input section
names.

@ifclear SingleFormat
@item OUTPUT_ARCH(@var{bfdarch})
@kindex OUTPUT_ARCH(@var{bfdarch})
@cindex machine architecture
@cindex architecture
Specify a particular output machine architecture.  The argument is one
of the names used by the BFD library (@pxref{BFD}).  You can see the
architecture of an object file by using the @code{objdump} program with
the @samp{-f} option.
@end ifclear

@item LD_FEATURE(@var{string})
@kindex LD_FEATURE(@var{string})
This command may be used to modify @command{ld} behavior.  If
@var{string} is @code{"SANE_EXPR"} then absolute symbols and numbers
in a script are simply treated as numbers everywhere.
@xref{Expression Section}.
@end table

@node Assignments
@section Assigning Values to Symbols
@cindex assignment in scripts
@cindex symbol definition, scripts
@cindex variables, defining
You may assign a value to a symbol in a linker script.  This will define
the symbol and place it into the symbol table with a global scope.

@menu
* Simple Assignments::		Simple Assignments
* HIDDEN::			HIDDEN
* PROVIDE::			PROVIDE
* PROVIDE_HIDDEN::		PROVIDE_HIDDEN
* Source Code Reference::	How to use a linker script defined symbol in source code
@end menu

@node Simple Assignments
@subsection Simple Assignments

You may assign to a symbol using any of the C assignment operators:

@table @code
@item @var{symbol} = @var{expression} ;
@itemx @var{symbol} += @var{expression} ;
@itemx @var{symbol} -= @var{expression} ;
@itemx @var{symbol} *= @var{expression} ;
@itemx @var{symbol} /= @var{expression} ;
@itemx @var{symbol} <<= @var{expression} ;
@itemx @var{symbol} >>= @var{expression} ;
@itemx @var{symbol} &= @var{expression} ;
@itemx @var{symbol} |= @var{expression} ;
@end table

The first case will define @var{symbol} to the value of
@var{expression}.  In the other cases, @var{symbol} must already be
defined, and the value will be adjusted accordingly.

The special symbol name @samp{.} indicates the location counter.  You
may only use this within a @code{SECTIONS} command.  @xref{Location Counter}.

The semicolon after @var{expression} is required.

Expressions are defined below; see @ref{Expressions}.

You may write symbol assignments as commands in their own right, or as
statements within a @code{SECTIONS} command, or as part of an output
section description in a @code{SECTIONS} command.

The section of the symbol will be set from the section of the
expression; for more information, see @ref{Expression Section}.

Here is an example showing the three different places that symbol
assignments may be used:

@smallexample
floating_point = 0;
SECTIONS
@{
  .text :
    @{
      *(.text)
      _etext = .;
    @}
  _bdata = (. + 3) & ~ 3;
  .data : @{ *(.data) @}
@}
@end smallexample
@noindent
In this example, the symbol @samp{floating_point} will be defined as
zero.  The symbol @samp{_etext} will be defined as the address following
the last @samp{.text} input section.  The symbol @samp{_bdata} will be
defined as the address following the @samp{.text} output section aligned
upward to a 4 byte boundary.

@node HIDDEN
@subsection HIDDEN
@cindex HIDDEN
For ELF targeted ports, define a symbol that will be hidden and won't be
exported.  The syntax is @code{HIDDEN(@var{symbol} = @var{expression})}.

Here is the example from @ref{Simple Assignments}, rewritten to use
@code{HIDDEN}:

@smallexample
HIDDEN(floating_point = 0);
SECTIONS
@{
  .text :
    @{
      *(.text)
      HIDDEN(_etext = .);
    @}
  HIDDEN(_bdata = (. + 3) & ~ 3);
  .data : @{ *(.data) @}
@}
@end smallexample
@noindent
In this case none of the three symbols will be visible outside this module.

@node PROVIDE
@subsection PROVIDE
@cindex PROVIDE
In some cases, it is desirable for a linker script to define a symbol
only if it is referenced and is not defined by any object included in
the link.  For example, traditional linkers defined the symbol
@samp{etext}.  However, ANSI C requires that the user be able to use
@samp{etext} as a function name without encountering an error.  The
@code{PROVIDE} keyword may be used to define a symbol, such as
@samp{etext}, only if it is referenced but not defined.  The syntax is
@code{PROVIDE(@var{symbol} = @var{expression})}.

Here is an example of using @code{PROVIDE} to define @samp{etext}:
@smallexample
SECTIONS
@{
  .text :
    @{
      *(.text)
      _etext = .;
      PROVIDE(etext = .);
    @}
@}
@end smallexample

In this example, if the program defines @samp{_etext} (with a leading
underscore), the linker will give a multiple definition error.  If, on
the other hand, the program defines @samp{etext} (with no leading
underscore), the linker will silently use the definition in the program.
If the program references @samp{etext} but does not define it, the
linker will use the definition in the linker script.

@node PROVIDE_HIDDEN
@subsection PROVIDE_HIDDEN
@cindex PROVIDE_HIDDEN
Similar to @code{PROVIDE}.  For ELF targeted ports, the symbol will be
hidden and won't be exported.

@node Source Code Reference
@subsection Source Code Reference

Accessing a linker script defined variable from source code is not
intuitive.  In particular a linker script symbol is not equivalent to
a variable declaration in a high level language, it is instead a
symbol that does not have a value.

Before going further, it is important to note that compilers often
transform names in the source code into different names when they are
stored in the symbol table.  For example, Fortran compilers commonly
prepend or append an underscore, and C++ performs extensive @samp{name
mangling}.  Therefore there might be a discrepancy between the name
of a variable as it is used in source code and the name of the same
variable as it is defined in a linker script.  For example in C a
linker script variable might be referred to as:

@smallexample
  extern int foo;
@end smallexample

But in the linker script it might be defined as:

@smallexample
  _foo = 1000;
@end smallexample

In the remaining examples however it is assumed that no name
transformation has taken place.

When a symbol is declared in a high level language such as C, two
things happen.  The first is that the compiler reserves enough space
in the program's memory to hold the @emph{value} of the symbol.  The
second is that the compiler creates an entry in the program's symbol
table which holds the symbol's @emph{address}.  ie the symbol table
contains the address of the block of memory holding the symbol's
value.  So for example the following C declaration, at file scope:

@smallexample
  int foo = 1000;
@end smallexample

creates an entry called @samp{foo} in the symbol table.  This entry
holds the address of an @samp{int} sized block of memory where the
number 1000 is initially stored.

When a program references a symbol the compiler generates code that
first accesses the symbol table to find the address of the symbol's
memory block and then code to read the value from that memory block.
So:

@smallexample
  foo = 1;
@end smallexample

looks up the symbol @samp{foo} in the symbol table, gets the address
associated with this symbol and then writes the value 1 into that
address.  Whereas:

@smallexample
  int * a = & foo;
@end smallexample

looks up the symbol @samp{foo} in the symbol table, gets its address
and then copies this address into the block of memory associated with
the variable @samp{a}.

Linker scripts symbol declarations, by contrast, create an entry in
the symbol table but do not assign any memory to them.  Thus they are
an address without a value.  So for example the linker script definition:

@smallexample
  foo = 1000;
@end smallexample

creates an entry in the symbol table called @samp{foo} which holds
the address of memory location 1000, but nothing special is stored at
address 1000.  This means that you cannot access the @emph{value} of a
linker script defined symbol - it has no value - all you can do is
access the @emph{address} of a linker script defined symbol.

Hence when you are using a linker script defined symbol in source code
you should always take the address of the symbol, and never attempt to
use its value.  For example suppose you want to copy the contents of a
section of memory called .ROM into a section called .FLASH and the
linker script contains these declarations:

@smallexample
@group
  start_of_ROM   = .ROM;
  end_of_ROM     = .ROM + sizeof (.ROM) - 1;
  start_of_FLASH = .FLASH;
@end group
@end smallexample

Then the C source code to perform the copy would be:

@smallexample
@group
  extern char start_of_ROM, end_of_ROM, start_of_FLASH;

  memcpy (& start_of_FLASH, & start_of_ROM, & end_of_ROM - & start_of_ROM);
@end group
@end smallexample

Note the use of the @samp{&} operators.  These are correct.

@node SECTIONS
@section SECTIONS Command
@kindex SECTIONS
The @code{SECTIONS} command tells the linker how to map input sections
into output sections, and how to place the output sections in memory.

The format of the @code{SECTIONS} command is:
@smallexample
SECTIONS
@{
  @var{sections-command}
  @var{sections-command}
  @dots{}
@}
@end smallexample

Each @var{sections-command} may of be one of the following:

@itemize @bullet
@item
an @code{ENTRY} command (@pxref{Entry Point,,Entry command})
@item
a symbol assignment (@pxref{Assignments})
@item
an output section description
@item
an overlay description
@end itemize

The @code{ENTRY} command and symbol assignments are permitted inside the
@code{SECTIONS} command for convenience in using the location counter in
those commands.  This can also make the linker script easier to
understand because you can use those commands at meaningful points in
the layout of the output file.

Output section descriptions and overlay descriptions are described
below.

If you do not use a @code{SECTIONS} command in your linker script, the
linker will place each input section into an identically named output
section in the order that the sections are first encountered in the
input files.  If all input sections are present in the first file, for
example, the order of sections in the output file will match the order
in the first input file.  The first section will be at address zero.

@menu
* Output Section Description::	Output section description
* Output Section Name::		Output section name
* Output Section Address::	Output section address
* Input Section::		Input section description
* Output Section Data::		Output section data
* Output Section Keywords::	Output section keywords
* Output Section Discarding::	Output section discarding
* Output Section Attributes::	Output section attributes
* Overlay Description::		Overlay description
@end menu

@node Output Section Description
@subsection Output Section Description
The full description of an output section looks like this:
@smallexample
@group
@var{section} [@var{address}] [(@var{type})] :
  [AT(@var{lma})]
  [ALIGN(@var{section_align}) | ALIGN_WITH_INPUT]
  [SUBALIGN(@var{subsection_align})]
  [@var{constraint}]
  @{
    @var{output-section-command}
    @var{output-section-command}
    @dots{}
  @} [>@var{region}] [AT>@var{lma_region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}] [,]
@end group
@end smallexample

Most output sections do not use most of the optional section attributes.

The whitespace around @var{section} is required, so that the section
name is unambiguous.  The colon and the curly braces are also required.
The comma at the end may be required if a @var{fillexp} is used and
the next @var{sections-command} looks like a continuation of the expression.
The line breaks and other white space are optional.

Each @var{output-section-command} may be one of the following:

@itemize @bullet
@item
a symbol assignment (@pxref{Assignments})
@item
an input section description (@pxref{Input Section})
@item
data values to include directly (@pxref{Output Section Data})
@item
a special output section keyword (@pxref{Output Section Keywords})
@end itemize

@node Output Section Name
@subsection Output Section Name
@cindex name, section
@cindex section name
The name of the output section is @var{section}.  @var{section} must
meet the constraints of your output format.  In formats which only
support a limited number of sections, such as @code{a.out}, the name
must be one of the names supported by the format (@code{a.out}, for
example, allows only @samp{.text}, @samp{.data} or @samp{.bss}). If the
output format supports any number of sections, but with numbers and not
names (as is the case for Oasys), the name should be supplied as a
quoted numeric string.  A section name may consist of any sequence of
characters, but a name which contains any unusual characters such as
commas must be quoted.

The output section name @samp{/DISCARD/} is special; @ref{Output Section
Discarding}.

@node Output Section Address
@subsection Output Section Address
@cindex address, section
@cindex section address
The @var{address} is an expression for the VMA (the virtual memory
address) of the output section.  This address is optional, but if it
is provided then the output address will be set exactly as specified.

If the output address is not specified then one will be chosen for the
section, based on the heuristic below.  This address will be adjusted
to fit the alignment requirement of the output section.  The
alignment requirement is the strictest alignment of any input section
contained within the output section.

The output section address heuristic is as follows:

@itemize @bullet
@item
If an output memory @var{region} is set for the section then it
is added to this region and its address will be the next free address
in that region.

@item
If the MEMORY command has been used to create a list of memory
regions then the first region which has attributes compatible with the
section is selected to contain it.  The section's output address will
be the next free address in that region; @ref{MEMORY}.

@item
If no memory regions were specified, or none match the section then
the output address will be based on the current value of the location
counter.
@end itemize

@noindent
For example:

@smallexample
.text . : @{ *(.text) @}
@end smallexample

@noindent
and

@smallexample
.text : @{ *(.text) @}
@end smallexample

@noindent
are subtly different.  The first will set the address of the
@samp{.text} output section to the current value of the location
counter.  The second will set it to the current value of the location
counter aligned to the strictest alignment of any of the @samp{.text}
input sections.

The @var{address} may be an arbitrary expression; @ref{Expressions}.
For example, if you want to align the section on a 0x10 byte boundary,
so that the lowest four bits of the section address are zero, you could
do something like this:
@smallexample
.text ALIGN(0x10) : @{ *(.text) @}
@end smallexample
@noindent
This works because @code{ALIGN} returns the current location counter
aligned upward to the specified value.

Specifying @var{address} for a section will change the value of the
location counter, provided that the section is non-empty.  (Empty
sections are ignored).

@node Input Section
@subsection Input Section Description
@cindex input sections
@cindex mapping input sections to output sections
The most common output section command is an input section description.

The input section description is the most basic linker script operation.
You use output sections to tell the linker how to lay out your program
in memory.  You use input section descriptions to tell the linker how to
map the input files into your memory layout.

@menu
* Input Section Basics::	Input section basics
* Input Section Wildcards::	Input section wildcard patterns
* Input Section Common::	Input section for common symbols
* Input Section Keep::		Input section and garbage collection
* Input Section Example::	Input section example
@end menu

@node Input Section Basics
@subsubsection Input Section Basics
@cindex input section basics
An input section description consists of a file name optionally followed
by a list of section names in parentheses.

The file name and the section name may be wildcard patterns, which we
describe further below (@pxref{Input Section Wildcards}).

The most common input section description is to include all input
sections with a particular name in the output section.  For example, to
include all input @samp{.text} sections, you would write:
@smallexample
*(.text)
@end smallexample
@noindent
Here the @samp{*} is a wildcard which matches any file name.  To exclude a list
of files from matching the file name wildcard, EXCLUDE_FILE may be used to
match all files except the ones specified in the EXCLUDE_FILE list.  For
example:
@smallexample
*(EXCLUDE_FILE (*crtend.o *otherfile.o) .ctors)
@end smallexample
will cause all .ctors sections from all files except @file{crtend.o} and
@file{otherfile.o} to be included.

There are two ways to include more than one section:
@smallexample
*(.text .rdata)
*(.text) *(.rdata)
@end smallexample
@noindent
The difference between these is the order in which the @samp{.text} and
@samp{.rdata} input sections will appear in the output section.  In the
first example, they will be intermingled, appearing in the same order as
they are found in the linker input.  In the second example, all
@samp{.text} input sections will appear first, followed by all
@samp{.rdata} input sections.

You can specify a file name to include sections from a particular file.
You would do this if one or more of your files contain special data that
needs to be at a particular location in memory.  For example:
@smallexample
data.o(.data)
@end smallexample

To refine the sections that are included based on the section flags
of an input section, INPUT_SECTION_FLAGS may be used.

Here is a simple example for using Section header flags for ELF sections:

@smallexample
@group
SECTIONS @{
  .text : @{ INPUT_SECTION_FLAGS (SHF_MERGE & SHF_STRINGS) *(.text) @}
  .text2 :  @{ INPUT_SECTION_FLAGS (!SHF_WRITE) *(.text) @}
@}
@end group
@end smallexample

In this example, the output section @samp{.text} will be comprised of any
input section matching the name *(.text) whose section header flags
@code{SHF_MERGE} and @code{SHF_STRINGS} are set.  The output section
@samp{.text2} will be comprised of any input section matching the name *(.text)
whose section header flag @code{SHF_WRITE} is clear.

You can also specify files within archives by writing a pattern
matching the archive, a colon, then the pattern matching the file,
with no whitespace around the colon.

@table @samp
@item archive:file
matches file within archive
@item archive:
matches the whole archive
@item :file
matches file but not one in an archive
@end table

Either one or both of @samp{archive} and @samp{file} can contain shell
wildcards.  On DOS based file systems, the linker will assume that a
single letter followed by a colon is a drive specifier, so
@samp{c:myfile.o} is a simple file specification, not @samp{myfile.o}
within an archive called @samp{c}.  @samp{archive:file} filespecs may
also be used within an @code{EXCLUDE_FILE} list, but may not appear in
other linker script contexts.  For instance, you cannot extract a file
from an archive by using @samp{archive:file} in an @code{INPUT}
command.

If you use a file name without a list of sections, then all sections in
the input file will be included in the output section.  This is not
commonly done, but it may by useful on occasion.  For example:
@smallexample
data.o
@end smallexample

When you use a file name which is not an @samp{archive:file} specifier
and does not contain any wild card
characters, the linker will first see if you also specified the file
name on the linker command line or in an @code{INPUT} command.  If you
did not, the linker will attempt to open the file as an input file, as
though it appeared on the command line.  Note that this differs from an
@code{INPUT} command, because the linker will not search for the file in
the archive search path.

@node Input Section Wildcards
@subsubsection Input Section Wildcard Patterns
@cindex input section wildcards
@cindex wildcard file name patterns
@cindex file name wildcard patterns
@cindex section name wildcard patterns
In an input section description, either the file name or the section
name or both may be wildcard patterns.

The file name of @samp{*} seen in many examples is a simple wildcard
pattern for the file name.

The wildcard patterns are like those used by the Unix shell.

@table @samp
@item *
matches any number of characters
@item ?
matches any single character
@item [@var{chars}]
matches a single instance of any of the @var{chars}; the @samp{-}
character may be used to specify a range of characters, as in
@samp{[a-z]} to match any lower case letter
@item \
quotes the following character
@end table

When a file name is matched with a wildcard, the wildcard characters
will not match a @samp{/} character (used to separate directory names on
Unix).  A pattern consisting of a single @samp{*} character is an
exception; it will always match any file name, whether it contains a
@samp{/} or not.  In a section name, the wildcard characters will match
a @samp{/} character.

File name wildcard patterns only match files which are explicitly
specified on the command line or in an @code{INPUT} command.  The linker
does not search directories to expand wildcards.

If a file name matches more than one wildcard pattern, or if a file name
appears explicitly and is also matched by a wildcard pattern, the linker
will use the first match in the linker script.  For example, this
sequence of input section descriptions is probably in error, because the
@file{data.o} rule will not be used:
@smallexample
.data : @{ *(.data) @}
.data1 : @{ data.o(.data) @}
@end smallexample

@cindex SORT_BY_NAME
Normally, the linker will place files and sections matched by wildcards
in the order in which they are seen during the link.  You can change
this by using the @code{SORT_BY_NAME} keyword, which appears before a wildcard
pattern in parentheses (e.g., @code{SORT_BY_NAME(.text*)}).  When the
@code{SORT_BY_NAME} keyword is used, the linker will sort the files or sections
into ascending order by name before placing them in the output file.

@cindex SORT_BY_ALIGNMENT
@code{SORT_BY_ALIGNMENT} is very similar to @code{SORT_BY_NAME}. The
difference is @code{SORT_BY_ALIGNMENT} will sort sections into
descending order by alignment before placing them in the output file.
Larger alignments are placed before smaller alignments in order to
reduce the amount of padding necessary.

@cindex SORT_BY_INIT_PRIORITY
@code{SORT_BY_INIT_PRIORITY} is very similar to @code{SORT_BY_NAME}. The
difference is @code{SORT_BY_INIT_PRIORITY} will sort sections into
ascending order by numerical value of the GCC init_priority attribute
encoded in the section name before placing them in the output file.

@cindex SORT
@code{SORT} is an alias for @code{SORT_BY_NAME}.

When there are nested section sorting commands in linker script, there
can be at most 1 level of nesting for section sorting commands.

@enumerate
@item
@code{SORT_BY_NAME} (@code{SORT_BY_ALIGNMENT} (wildcard section pattern)).
It will sort the input sections by name first, then by alignment if two
sections have the same name.
@item
@code{SORT_BY_ALIGNMENT} (@code{SORT_BY_NAME} (wildcard section pattern)).
It will sort the input sections by alignment first, then by name if two
sections have the same alignment.
@item
@code{SORT_BY_NAME} (@code{SORT_BY_NAME} (wildcard section pattern)) is
treated the same as @code{SORT_BY_NAME} (wildcard section pattern).
@item
@code{SORT_BY_ALIGNMENT} (@code{SORT_BY_ALIGNMENT} (wildcard section pattern))
is treated the same as @code{SORT_BY_ALIGNMENT} (wildcard section pattern).
@item
All other nested section sorting commands are invalid.
@end enumerate

When both command line section sorting option and linker script
section sorting command are used, section sorting command always
takes precedence over the command line option.

If the section sorting command in linker script isn't nested, the
command line option will make the section sorting command to be
treated as nested sorting command.

@enumerate
@item
@code{SORT_BY_NAME} (wildcard section pattern ) with
@option{--sort-sections alignment} is equivalent to
@code{SORT_BY_NAME} (@code{SORT_BY_ALIGNMENT} (wildcard section pattern)).
@item
@code{SORT_BY_ALIGNMENT} (wildcard section pattern) with
@option{--sort-section name} is equivalent to
@code{SORT_BY_ALIGNMENT} (@code{SORT_BY_NAME} (wildcard section pattern)).
@end enumerate

If the section sorting command in linker script is nested, the
command line option will be ignored.

@cindex SORT_NONE
@code{SORT_NONE} disables section sorting by ignoring the command line
section sorting option.

If you ever get confused about where input sections are going, use the
@samp{-M} linker option to generate a map file.  The map file shows
precisely how input sections are mapped to output sections.

This example shows how wildcard patterns might be used to partition
files.  This linker script directs the linker to place all @samp{.text}
sections in @samp{.text} and all @samp{.bss} sections in @samp{.bss}.
The linker will place the @samp{.data} section from all files beginning
with an upper case character in @samp{.DATA}; for all other files, the
linker will place the @samp{.data} section in @samp{.data}.
@smallexample
@group
SECTIONS @{
  .text : @{ *(.text) @}
  .DATA : @{ [A-Z]*(.data) @}
  .data : @{ *(.data) @}
  .bss : @{ *(.bss) @}
@}
@end group
@end smallexample

@node Input Section Common
@subsubsection Input Section for Common Symbols
@cindex common symbol placement
@cindex uninitialized data placement
A special notation is needed for common symbols, because in many object
file formats common symbols do not have a particular input section.  The
linker treats common symbols as though they are in an input section
named @samp{COMMON}.

You may use file names with the @samp{COMMON} section just as with any
other input sections.  You can use this to place common symbols from a
particular input file in one section while common symbols from other
input files are placed in another section.

In most cases, common symbols in input files will be placed in the
@samp{.bss} section in the output file.  For example:
@smallexample
.bss @{ *(.bss) *(COMMON) @}
@end smallexample

@cindex scommon section
@cindex small common symbols
Some object file formats have more than one type of common symbol.  For
example, the MIPS ELF object file format distinguishes standard common
symbols and small common symbols.  In this case, the linker will use a
different special section name for other types of common symbols.  In
the case of MIPS ELF, the linker uses @samp{COMMON} for standard common
symbols and @samp{.scommon} for small common symbols.  This permits you
to map the different types of common symbols into memory at different
locations.

@cindex [COMMON]
You will sometimes see @samp{[COMMON]} in old linker scripts.  This
notation is now considered obsolete.  It is equivalent to
@samp{*(COMMON)}.

@node Input Section Keep
@subsubsection Input Section and Garbage Collection
@cindex KEEP
@cindex garbage collection
When link-time garbage collection is in use (@samp{--gc-sections}),
it is often useful to mark sections that should not be eliminated.
This is accomplished by surrounding an input section's wildcard entry
with @code{KEEP()}, as in @code{KEEP(*(.init))} or
@code{KEEP(SORT_BY_NAME(*)(.ctors))}.

@node Input Section Example
@subsubsection Input Section Example
The following example is a complete linker script.  It tells the linker
to read all of the sections from file @file{all.o} and place them at the
start of output section @samp{outputa} which starts at location
@samp{0x10000}.  All of section @samp{.input1} from file @file{foo.o}
follows immediately, in the same output section.  All of section
@samp{.input2} from @file{foo.o} goes into output section
@samp{outputb}, followed by section @samp{.input1} from @file{foo1.o}.
All of the remaining @samp{.input1} and @samp{.input2} sections from any
files are written to output section @samp{outputc}.

@smallexample
@group
SECTIONS @{
  outputa 0x10000 :
    @{
    all.o
    foo.o (.input1)
    @}
@end group
@group
  outputb :
    @{
    foo.o (.input2)
    foo1.o (.input1)
    @}
@end group
@group
  outputc :
    @{
    *(.input1)
    *(.input2)
    @}
@}
@end group
@end smallexample

@node Output Section Data
@subsection Output Section Data
@cindex data
@cindex section data
@cindex output section data
@kindex BYTE(@var{expression})
@kindex SHORT(@var{expression})
@kindex LONG(@var{expression})
@kindex QUAD(@var{expression})
@kindex SQUAD(@var{expression})
You can include explicit bytes of data in an output section by using
@code{BYTE}, @code{SHORT}, @code{LONG}, @code{QUAD}, or @code{SQUAD} as
an output section command.  Each keyword is followed by an expression in
parentheses providing the value to store (@pxref{Expressions}).  The
value of the expression is stored at the current value of the location
counter.

The @code{BYTE}, @code{SHORT}, @code{LONG}, and @code{QUAD} commands
store one, two, four, and eight bytes (respectively).  After storing the
bytes, the location counter is incremented by the number of bytes
stored.

For example, this will store the byte 1 followed by the four byte value
of the symbol @samp{addr}:
@smallexample
BYTE(1)
LONG(addr)
@end smallexample

When using a 64 bit host or target, @code{QUAD} and @code{SQUAD} are the
same; they both store an 8 byte, or 64 bit, value.  When both host and
target are 32 bits, an expression is computed as 32 bits.  In this case
@code{QUAD} stores a 32 bit value zero extended to 64 bits, and
@code{SQUAD} stores a 32 bit value sign extended to 64 bits.

If the object file format of the output file has an explicit endianness,
which is the normal case, the value will be stored in that endianness.
When the object file format does not have an explicit endianness, as is
true of, for example, S-records, the value will be stored in the
endianness of the first input object file.

Note---these commands only work inside a section description and not
between them, so the following will produce an error from the linker:
@smallexample
SECTIONS @{@ .text : @{@ *(.text) @}@ LONG(1) .data : @{@ *(.data) @}@ @}@
@end smallexample
whereas this will work:
@smallexample
SECTIONS @{@ .text : @{@ *(.text) ; LONG(1) @}@ .data : @{@ *(.data) @}@ @}@
@end smallexample

@kindex FILL(@var{expression})
@cindex holes, filling
@cindex unspecified memory
You may use the @code{FILL} command to set the fill pattern for the
current section.  It is followed by an expression in parentheses.  Any
otherwise unspecified regions of memory within the section (for example,
gaps left due to the required alignment of input sections) are filled
with the value of the expression, repeated as
necessary.  A @code{FILL} statement covers memory locations after the
point at which it occurs in the section definition; by including more
than one @code{FILL} statement, you can have different fill patterns in
different parts of an output section.

This example shows how to fill unspecified regions of memory with the
value @samp{0x90}:
@smallexample
FILL(0x90909090)
@end smallexample

The @code{FILL} command is similar to the @samp{=@var{fillexp}} output
section attribute, but it only affects the
part of the section following the @code{FILL} command, rather than the
entire section.  If both are used, the @code{FILL} command takes
precedence.  @xref{Output Section Fill}, for details on the fill
expression.

@node Output Section Keywords
@subsection Output Section Keywords
There are a couple of keywords which can appear as output section
commands.

@table @code
@kindex CREATE_OBJECT_SYMBOLS
@cindex input filename symbols
@cindex filename symbols
@item CREATE_OBJECT_SYMBOLS
The command tells the linker to create a symbol for each input file.
The name of each symbol will be the name of the corresponding input
file.  The section of each symbol will be the output section in which
the @code{CREATE_OBJECT_SYMBOLS} command appears.

This is conventional for the a.out object file format.  It is not
normally used for any other object file format.

@kindex CONSTRUCTORS
@cindex C++ constructors, arranging in link
@cindex constructors, arranging in link
@item CONSTRUCTORS
When linking using the a.out object file format, the linker uses an
unusual set construct to support C++ global constructors and
destructors.  When linking object file formats which do not support
arbitrary sections, such as ECOFF and XCOFF, the linker will
automatically recognize C++ global constructors and destructors by name.
For these object file formats, the @code{CONSTRUCTORS} command tells the
linker to place constructor information in the output section where the
@code{CONSTRUCTORS} command appears.  The @code{CONSTRUCTORS} command is
ignored for other object file formats.

The symbol @w{@code{__CTOR_LIST__}} marks the start of the global
constructors, and the symbol @w{@code{__CTOR_END__}} marks the end.
Similarly, @w{@code{__DTOR_LIST__}} and @w{@code{__DTOR_END__}} mark
the start and end of the global destructors.  The
first word in the list is the number of entries, followed by the address
of each constructor or destructor, followed by a zero word.  The
compiler must arrange to actually run the code.  For these object file
formats @sc{gnu} C++ normally calls constructors from a subroutine
@code{__main}; a call to @code{__main} is automatically inserted into
the startup code for @code{main}.  @sc{gnu} C++ normally runs
destructors either by using @code{atexit}, or directly from the function
@code{exit}.

For object file formats such as @code{COFF} or @code{ELF} which support
arbitrary section names, @sc{gnu} C++ will normally arrange to put the
addresses of global constructors and destructors into the @code{.ctors}
and @code{.dtors} sections.  Placing the following sequence into your
linker script will build the sort of table which the @sc{gnu} C++
runtime code expects to see.

@smallexample
      __CTOR_LIST__ = .;
      LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
      *(.ctors)
      LONG(0)
      __CTOR_END__ = .;
      __DTOR_LIST__ = .;
      LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
      *(.dtors)
      LONG(0)
      __DTOR_END__ = .;
@end smallexample

If you are using the @sc{gnu} C++ support for initialization priority,
which provides some control over the order in which global constructors
are run, you must sort the constructors at link time to ensure that they
are executed in the correct order.  When using the @code{CONSTRUCTORS}
command, use @samp{SORT_BY_NAME(CONSTRUCTORS)} instead.  When using the
@code{.ctors} and @code{.dtors} sections, use @samp{*(SORT_BY_NAME(.ctors))} and
@samp{*(SORT_BY_NAME(.dtors))} instead of just @samp{*(.ctors)} and
@samp{*(.dtors)}.

Normally the compiler and linker will handle these issues automatically,
and you will not need to concern yourself with them.  However, you may
need to consider this if you are using C++ and writing your own linker
scripts.

@end table

@node Output Section Discarding
@subsection Output Section Discarding
@cindex discarding sections
@cindex sections, discarding
@cindex removing sections
The linker will not normally create output sections with no contents.
This is for convenience when referring to input sections that may or
may not be present in any of the input files.  For example:
@smallexample
.foo : @{ *(.foo) @}
@end smallexample
@noindent
will only create a @samp{.foo} section in the output file if there is a
@samp{.foo} section in at least one input file, and if the input
sections are not all empty.  Other link script directives that allocate
space in an output section will also create the output section.  So
too will assignments to dot even if the assignment does not create
space, except for @samp{. = 0}, @samp{. = . + 0}, @samp{. = sym},
@samp{. = . + sym} and @samp{. = ALIGN (. != 0, expr, 1)} when
@samp{sym} is an absolute symbol of value 0 defined in the script.
This allows you to force output of an empty section with @samp{. = .}.

The linker will ignore address assignments (@pxref{Output Section Address})
on discarded output sections, except when the linker script defines
symbols in the output section.  In that case the linker will obey
the address assignments, possibly advancing dot even though the
section is discarded.

@cindex /DISCARD/
The special output section name @samp{/DISCARD/} may be used to discard
input sections.  Any input sections which are assigned to an output
section named @samp{/DISCARD/} are not included in the output file.

@node Output Section Attributes
@subsection Output Section Attributes
@cindex output section attributes
We showed above that the full description of an output section looked
like this:

@smallexample
@group
@var{section} [@var{address}] [(@var{type})] :
  [AT(@var{lma})]
  [ALIGN(@var{section_align})]
  [SUBALIGN(@var{subsection_align})]
  [@var{constraint}]
  @{
    @var{output-section-command}
    @var{output-section-command}
    @dots{}
  @} [>@var{region}] [AT>@var{lma_region}] [:@var{phdr} :@var{phdr} @dots{}] [=@var{fillexp}]
@end group
@end smallexample

We've already described @var{section}, @var{address}, and
@var{output-section-command}.  In this section we will describe the
remaining section attributes.

@menu
* Output Section Type::		Output section type
* Output Section LMA::		Output section LMA
* Forced Output Alignment::	Forced Output Alignment
* Forced Input Alignment::	Forced Input Alignment
* Output Section Constraint::   Output section constraint
* Output Section Region::	Output section region
* Output Section Phdr::		Output section phdr
* Output Section Fill::		Output section fill
@end menu

@node Output Section Type
@subsubsection Output Section Type
Each output section may have a type.  The type is a keyword in
parentheses.  The following types are defined:

@table @code
@item NOLOAD
The section should be marked as not loadable, so that it will not be
loaded into memory when the program is run.
@item DSECT
@itemx COPY
@itemx INFO
@itemx OVERLAY
These type names are supported for backward compatibility, and are
rarely used.  They all have the same effect: the section should be
marked as not allocatable, so that no memory is allocated for the
section when the program is run.
@end table

@kindex NOLOAD
@cindex prevent unnecessary loading
@cindex loading, preventing
The linker normally sets the attributes of an output section based on
the input sections which map into it.  You can override this by using
the section type.  For example, in the script sample below, the
@samp{ROM} section is addressed at memory location @samp{0} and does not
need to be loaded when the program is run.
@smallexample
@group
SECTIONS @{
  ROM 0 (NOLOAD) : @{ @dots{} @}
  @dots{}
@}
@end group
@end smallexample

@node Output Section LMA
@subsubsection Output Section LMA
@kindex AT>@var{lma_region}
@kindex AT(@var{lma})
@cindex load address
@cindex section load address
Every section has a virtual address (VMA) and a load address (LMA); see
@ref{Basic Script Concepts}.  The virtual address is specified by the
@pxref{Output Section Address} described earlier.  The load address is
specified by the @code{AT} or @code{AT>} keywords.  Specifying a load
address is optional.

The @code{AT} keyword takes an expression as an argument.  This
specifies the exact load address of the section.  The @code{AT>} keyword
takes the name of a memory region as an argument.  @xref{MEMORY}.  The
load address of the section is set to the next free address in the
region, aligned to the section's alignment requirements.

If neither @code{AT} nor @code{AT>} is specified for an allocatable
section, the linker will use the following heuristic to determine the
load address:

@itemize @bullet
@item
If the section has a specific VMA address, then this is used as
the LMA address as well.

@item
If the section is not allocatable then its LMA is set to its VMA.

@item
Otherwise if a memory region can be found that is compatible
with the current section, and this region contains at least one
section, then the LMA is set so the difference between the
VMA and LMA is the same as the difference between the VMA and LMA of
the last section in the located region.

@item
If no memory regions have been declared then a default region
that covers the entire address space is used in the previous step.

@item
If no suitable region could be found, or there was no previous
section then the LMA is set equal to the VMA.
@end itemize

@cindex ROM initialized data
@cindex initialized data in ROM
This feature is designed to make it easy to build a ROM image.  For
example, the following linker script creates three output sections: one
called @samp{.text}, which starts at @code{0x1000}, one called
@samp{.mdata}, which is loaded at the end of the @samp{.text} section
even though its VMA is @code{0x2000}, and one called @samp{.bss} to hold
uninitialized data at address @code{0x3000}.  The symbol @code{_data} is
defined with the value @code{0x2000}, which shows that the location
counter holds the VMA value, not the LMA value.

@smallexample
@group
SECTIONS
  @{
  .text 0x1000 : @{ *(.text) _etext = . ; @}
  .mdata 0x2000 :
    AT ( ADDR (.text) + SIZEOF (.text) )
    @{ _data = . ; *(.data); _edata = . ;  @}
  .bss 0x3000 :
    @{ _bstart = . ;  *(.bss) *(COMMON) ; _bend = . ;@}
@}
@end group
@end smallexample

The run-time initialization code for use with a program generated with
this linker script would include something like the following, to copy
the initialized data from the ROM image to its runtime address.  Notice
how this code takes advantage of the symbols defined by the linker
script.

@smallexample
@group
extern char _etext, _data, _edata, _bstart, _bend;
char *src = &_etext;
char *dst = &_data;

/* ROM has data at end of text; copy it.  */
while (dst < &_edata)
  *dst++ = *src++;

/* Zero bss.  */
for (dst = &_bstart; dst< &_bend; dst++)
  *dst = 0;
@end group
@end smallexample

@node Forced Output Alignment
@subsubsection Forced Output Alignment
@kindex ALIGN(@var{section_align})
@cindex forcing output section alignment
@cindex output section alignment
You can increase an output section's alignment by using ALIGN.  As an
alternative you can enforce that the difference between the VMA and LMA remains
intact throughout this output section with the ALIGN_WITH_INPUT attribute.

@node Forced Input Alignment
@subsubsection Forced Input Alignment
@kindex SUBALIGN(@var{subsection_align})
@cindex forcing input section alignment
@cindex input section alignment
You can force input section alignment within an output section by using
SUBALIGN.  The value specified overrides any alignment given by input
sections, whether larger or smaller.

@node Output Section Constraint
@subsubsection Output Section Constraint
@kindex ONLY_IF_RO
@kindex ONLY_IF_RW
@cindex constraints on output sections
You can specify that an output section should only be created if all
of its input sections are read-only or all of its input sections are
read-write by using the keyword @code{ONLY_IF_RO} and
@code{ONLY_IF_RW} respectively.

@node Output Section Region
@subsubsection Output Section Region
@kindex >@var{region}
@cindex section, assigning to memory region
@cindex memory regions and sections
You can assign a section to a previously defined region of memory by
using @samp{>@var{region}}.  @xref{MEMORY}.

Here is a simple example:
@smallexample
@group
MEMORY @{ rom : ORIGIN = 0x1000, LENGTH = 0x1000 @}
SECTIONS @{ ROM : @{ *(.text) @} >rom @}
@end group
@end smallexample

@node Output Section Phdr
@subsubsection Output Section Phdr
@kindex :@var{phdr}
@cindex section, assigning to program header
@cindex program headers and sections
You can assign a section to a previously defined program segment by
using @samp{:@var{phdr}}.  @xref{PHDRS}.  If a section is assigned to
one or more segments, then all subsequent allocated sections will be
assigned to those segments as well, unless they use an explicitly
@code{:@var{phdr}} modifier.  You can use @code{:NONE} to tell the
linker to not put the section in any segment at all.

Here is a simple example:
@smallexample
@group
PHDRS @{ text PT_LOAD ; @}
SECTIONS @{ .text : @{ *(.text) @} :text @}
@end group
@end smallexample

@node Output Section Fill
@subsubsection Output Section Fill
@kindex =@var{fillexp}
@cindex section fill pattern
@cindex fill pattern, entire section
You can set the fill pattern for an entire section by using
@samp{=@var{fillexp}}.  @var{fillexp} is an expression
(@pxref{Expressions}).  Any otherwise unspecified regions of memory
within the output section (for example, gaps left due to the required
alignment of input sections) will be filled with the value, repeated as
necessary.  If the fill expression is a simple hex number, ie. a string
of hex digit starting with @samp{0x} and without a trailing @samp{k} or @samp{M}, then
an arbitrarily long sequence of hex digits can be used to specify the
fill pattern;  Leading zeros become part of the pattern too.  For all
other cases, including extra parentheses or a unary @code{+}, the fill
pattern is the four least significant bytes of the value of the
expression.  In all cases, the number is big-endian.

You can also change the fill value with a @code{FILL} command in the
output section commands; (@pxref{Output Section Data}).

Here is a simple example:
@smallexample
@group
SECTIONS @{ .text : @{ *(.text) @} =0x90909090 @}
@end group
@end smallexample

@node Overlay Description
@subsection Overlay Description
@kindex OVERLAY
@cindex overlays
An overlay description provides an easy way to describe sections which
are to be loaded as part of a single memory image but are to be run at
the same memory address.  At run time, some sort of overlay manager will
copy the overlaid sections in and out of the runtime memory address as
required, perhaps by simply manipulating addressing bits.  This approach
can be useful, for example, when a certain region of memory is faster
than another.

Overlays are described using the @code{OVERLAY} command.  The
@code{OVERLAY} command is used within a @code{SECTIONS} command, like an
output section description.  The full syntax of the @code{OVERLAY}
command is as follows:
@smallexample
@group
OVERLAY [@var{start}] : [NOCROSSREFS] [AT ( @var{ldaddr} )]
  @{
    @var{secname1}
      @{
        @var{output-section-command}
        @var{output-section-command}
        @dots{}
      @} [:@var{phdr}@dots{}] [=@var{fill}]
    @var{secname2}
      @{
        @var{output-section-command}
        @var{output-section-command}
        @dots{}
      @} [:@var{phdr}@dots{}] [=@var{fill}]
    @dots{}
  @} [>@var{region}] [:@var{phdr}@dots{}] [=@var{fill}] [,]
@end group
@end smallexample

Everything is optional except @code{OVERLAY} (a keyword), and each
section must have a name (@var{secname1} and @var{secname2} above).  The
section definitions within the @code{OVERLAY} construct are identical to
those within the general @code{SECTIONS} construct (@pxref{SECTIONS}),
except that no addresses and no memory regions may be defined for
sections within an @code{OVERLAY}.

The comma at the end may be required if a @var{fill} is used and
the next @var{sections-command} looks like a continuation of the expression.

The sections are all defined with the same starting address.  The load
addresses of the sections are arranged such that they are consecutive in
memory starting at the load address used for the @code{OVERLAY} as a
whole (as with normal section definitions, the load address is optional,
and defaults to the start address; the start address is also optional,
and defaults to the current value of the location counter).

If the @code{NOCROSSREFS} keyword is used, and there are any
references among the sections, the linker will report an error.  Since
the sections all run at the same address, it normally does not make
sense for one section to refer directly to another.
@xref{Miscellaneous Commands, NOCROSSREFS}.

For each section within the @code{OVERLAY}, the linker automatically
provides two symbols.  The symbol @code{__load_start_@var{secname}} is
defined as the starting load address of the section.  The symbol
@code{__load_stop_@var{secname}} is defined as the final load address of
the section.  Any characters within @var{secname} which are not legal
within C identifiers are removed.  C (or assembler) code may use these
symbols to move the overlaid sections around as necessary.

At the end of the overlay, the value of the location counter is set to
the start address of the overlay plus the size of the largest section.

Here is an example.  Remember that this would appear inside a
@code{SECTIONS} construct.
@smallexample
@group
  OVERLAY 0x1000 : AT (0x4000)
   @{
     .text0 @{ o1/*.o(.text) @}
     .text1 @{ o2/*.o(.text) @}
   @}
@end group
@end smallexample
@noindent
This will define both @samp{.text0} and @samp{.text1} to start at
address 0x1000.  @samp{.text0} will be loaded at address 0x4000, and
@samp{.text1} will be loaded immediately after @samp{.text0}.  The
following symbols will be defined if referenced: @code{__load_start_text0},
@code{__load_stop_text0}, @code{__load_start_text1},
@code{__load_stop_text1}.

C code to copy overlay @code{.text1} into the overlay area might look
like the following.

@smallexample
@group
  extern char __load_start_text1, __load_stop_text1;
  memcpy ((char *) 0x1000, &__load_start_text1,
          &__load_stop_text1 - &__load_start_text1);
@end group
@end smallexample

Note that the @code{OVERLAY} command is just syntactic sugar, since
everything it does can be done using the more basic commands.  The above
example could have been written identically as follows.

@smallexample
@group
  .text0 0x1000 : AT (0x4000) @{ o1/*.o(.text) @}
  PROVIDE (__load_start_text0 = LOADADDR (.text0));
  PROVIDE (__load_stop_text0 = LOADADDR (.text0) + SIZEOF (.text0));
  .text1 0x1000 : AT (0x4000 + SIZEOF (.text0)) @{ o2/*.o(.text) @}
  PROVIDE (__load_start_text1 = LOADADDR (.text1));
  PROVIDE (__load_stop_text1 = LOADADDR (.text1) + SIZEOF (.text1));
  . = 0x1000 + MAX (SIZEOF (.text0), SIZEOF (.text1));
@end group
@end smallexample

@node MEMORY
@section MEMORY Command
@kindex MEMORY
@cindex memory regions
@cindex regions of memory
@cindex allocating memory
@cindex discontinuous memory
The linker's default configuration permits allocation of all available
memory.  You can override this by using the @code{MEMORY} command.

The @code{MEMORY} command describes the location and size of blocks of
memory in the target.  You can use it to describe which memory regions
may be used by the linker, and which memory regions it must avoid.  You
can then assign sections to particular memory regions.  The linker will
set section addresses based on the memory regions, and will warn about
regions that become too full.  The linker will not shuffle sections
around to fit into the available regions.

A linker script may contain at most one use of the @code{MEMORY}
command.  However, you can define as many blocks of memory within it as
you wish.  The syntax is:
@smallexample
@group
MEMORY
  @{
    @var{name} [(@var{attr})] : ORIGIN = @var{origin}, LENGTH = @var{len}
    @dots{}
  @}
@end group
@end smallexample

The @var{name} is a name used in the linker script to refer to the
region.  The region name has no meaning outside of the linker script.
Region names are stored in a separate name space, and will not conflict
with symbol names, file names, or section names.  Each memory region
must have a distinct name within the @code{MEMORY} command.  However you can
add later alias names to existing memory regions with the @ref{REGION_ALIAS}
command.

@cindex memory region attributes
The @var{attr} string is an optional list of attributes that specify
whether to use a particular memory region for an input section which is
not explicitly mapped in the linker script.  As described in
@ref{SECTIONS}, if you do not specify an output section for some input
section, the linker will create an output section with the same name as
the input section.  If you define region attributes, the linker will use
them to select the memory region for the output section that it creates.

The @var{attr} string must consist only of the following characters:
@table @samp
@item R
Read-only section
@item W
Read/write section
@item X
Executable section
@item A
Allocatable section
@item I
Initialized section
@item L
Same as @samp{I}
@item !
Invert the sense of any of the attributes that follow
@end table

If a unmapped section matches any of the listed attributes other than
@samp{!}, it will be placed in the memory region.  The @samp{!}
attribute reverses this test, so that an unmapped section will be placed
in the memory region only if it does not match any of the listed
attributes.

@kindex ORIGIN =
@kindex o =
@kindex org =
The @var{origin} is an numerical expression for the start address of
the memory region.  The expression must evaluate to a constant and it
cannot involve any symbols.  The keyword @code{ORIGIN} may be
abbreviated to @code{org} or @code{o} (but not, for example,
@code{ORG}).

@kindex LENGTH =
@kindex len =
@kindex l =
The @var{len} is an expression for the size in bytes of the memory
region.  As with the @var{origin} expression, the expression must
be numerical only and must evaluate to a constant.  The keyword
@code{LENGTH} may be abbreviated to @code{len} or @code{l}.

In the following example, we specify that there are two memory regions
available for allocation: one starting at @samp{0} for 256 kilobytes,
and the other starting at @samp{0x40000000} for four megabytes.  The
linker will place into the @samp{rom} memory region every section which
is not explicitly mapped into a memory region, and is either read-only
or executable.  The linker will place other sections which are not
explicitly mapped into a memory region into the @samp{ram} memory
region.

@smallexample
@group
MEMORY
  @{
    rom (rx)  : ORIGIN = 0, LENGTH = 256K
    ram (!rx) : org = 0x40000000, l = 4M
  @}
@end group
@end smallexample

Once you define a memory region, you can direct the linker to place
specific output sections into that memory region by using the
@samp{>@var{region}} output section attribute.  For example, if you have
a memory region named @samp{mem}, you would use @samp{>mem} in the
output section definition.  @xref{Output Section Region}.  If no address
was specified for the output section, the linker will set the address to
the next available address within the memory region.  If the combined
output sections directed to a memory region are too large for the
region, the linker will issue an error message.

It is possible to access the origin and length of a memory in an
expression via the @code{ORIGIN(@var{memory})} and
@code{LENGTH(@var{memory})} functions:

@smallexample
@group
  _fstack = ORIGIN(ram) + LENGTH(ram) - 4;
@end group
@end smallexample

@node PHDRS
@section PHDRS Command
@kindex PHDRS
@cindex program headers
@cindex ELF program headers
@cindex program segments
@cindex segments, ELF
The ELF object file format uses @dfn{program headers}, also knows as
@dfn{segments}.  The program headers describe how the program should be
loaded into memory.  You can print them out by using the @code{objdump}
program with the @samp{-p} option.

When you run an ELF program on a native ELF system, the system loader
reads the program headers in order to figure out how to load the
program.  This will only work if the program headers are set correctly.
This manual does not describe the details of how the system loader
interprets program headers; for more information, see the ELF ABI.

The linker will create reasonable program headers by default.  However,
in some cases, you may need to specify the program headers more
precisely.  You may use the @code{PHDRS} command for this purpose.  When
the linker sees the @code{PHDRS} command in the linker script, it will
not create any program headers other than the ones specified.

The linker only pays attention to the @code{PHDRS} command when
generating an ELF output file.  In other cases, the linker will simply
ignore @code{PHDRS}.

This is the syntax of the @code{PHDRS} command.  The words @code{PHDRS},
@code{FILEHDR}, @code{AT}, and @code{FLAGS} are keywords.

@smallexample
@group
PHDRS
@{
  @var{name} @var{type} [ FILEHDR ] [ PHDRS ] [ AT ( @var{address} ) ]
        [ FLAGS ( @var{flags} ) ] ;
@}
@end group
@end smallexample

The @var{name} is used only for reference in the @code{SECTIONS} command
of the linker script.  It is not put into the output file.  Program
header names are stored in a separate name space, and will not conflict
with symbol names, file names, or section names.  Each program header
must have a distinct name.  The headers are processed in order and it
is usual for them to map to sections in ascending load address order.

Certain program header types describe segments of memory which the
system loader will load from the file.  In the linker script, you
specify the contents of these segments by placing allocatable output
sections in the segments.  You use the @samp{:@var{phdr}} output section
attribute to place a section in a particular segment.  @xref{Output
Section Phdr}.

It is normal to put certain sections in more than one segment.  This
merely implies that one segment of memory contains another.  You may
repeat @samp{:@var{phdr}}, using it once for each segment which should
contain the section.

If you place a section in one or more segments using @samp{:@var{phdr}},
then the linker will place all subsequent allocatable sections which do
not specify @samp{:@var{phdr}} in the same segments.  This is for
convenience, since generally a whole set of contiguous sections will be
placed in a single segment.  You can use @code{:NONE} to override the
default segment and tell the linker to not put the section in any
segment at all.

@kindex FILEHDR
@kindex PHDRS
You may use the @code{FILEHDR} and @code{PHDRS} keywords after
the program header type to further describe the contents of the segment.
The @code{FILEHDR} keyword means that the segment should include the ELF
file header.  The @code{PHDRS} keyword means that the segment should
include the ELF program headers themselves.  If applied to a loadable
segment (@code{PT_LOAD}), all prior loadable segments must have one of
these keywords.

The @var{type} may be one of the following.  The numbers indicate the
value of the keyword.

@table @asis
@item @code{PT_NULL} (0)
Indicates an unused program header.

@item @code{PT_LOAD} (1)
Indicates that this program header describes a segment to be loaded from
the file.

@item @code{PT_DYNAMIC} (2)
Indicates a segment where dynamic linking information can be found.

@item @code{PT_INTERP} (3)
Indicates a segment where the name of the program interpreter may be
found.

@item @code{PT_NOTE} (4)
Indicates a segment holding note information.

@item @code{PT_SHLIB} (5)
A reserved program header type, defined but not specified by the ELF
ABI.

@item @code{PT_PHDR} (6)
Indicates a segment where the program headers may be found.

@item @var{expression}
An expression giving the numeric type of the program header.  This may
be used for types not defined above.
@end table

You can specify that a segment should be loaded at a particular address
in memory by using an @code{AT} expression.  This is identical to the
@code{AT} command used as an output section attribute (@pxref{Output
Section LMA}).  The @code{AT} command for a program header overrides the
output section attribute.

The linker will normally set the segment flags based on the sections
which comprise the segment.  You may use the @code{FLAGS} keyword to
explicitly specify the segment flags.  The value of @var{flags} must be
an integer.  It is used to set the @code{p_flags} field of the program
header.

Here is an example of @code{PHDRS}.  This shows a typical set of program
headers used on a native ELF system.

@example
@group
PHDRS
@{
  headers PT_PHDR PHDRS ;
  interp PT_INTERP ;
  text PT_LOAD FILEHDR PHDRS ;
  data PT_LOAD ;
  dynamic PT_DYNAMIC ;
@}

SECTIONS
@{
  . = SIZEOF_HEADERS;
  .interp : @{ *(.interp) @} :text :interp
  .text : @{ *(.text) @} :text
  .rodata : @{ *(.rodata) @} /* defaults to :text */
  @dots{}
  . = . + 0x1000; /* move to a new page in memory */
  .data : @{ *(.data) @} :data
  .dynamic : @{ *(.dynamic) @} :data :dynamic
  @dots{}
@}
@end group
@end example

@node VERSION
@section VERSION Command
@kindex VERSION @{script text@}
@cindex symbol versions
@cindex version script
@cindex versions of symbols
The linker supports symbol versions when using ELF.  Symbol versions are
only useful when using shared libraries.  The dynamic linker can use
symbol versions to select a specific version of a function when it runs
a program that may have been linked against an earlier version of the
shared library.

You can include a version script directly in the main linker script, or
you can supply the version script as an implicit linker script.  You can
also use the @samp{--version-script} linker option.

The syntax of the @code{VERSION} command is simply
@smallexample
VERSION @{ version-script-commands @}
@end smallexample

The format of the version script commands is identical to that used by
Sun's linker in Solaris 2.5.  The version script defines a tree of
version nodes.  You specify the node names and interdependencies in the
version script.  You can specify which symbols are bound to which
version nodes, and you can reduce a specified set of symbols to local
scope so that they are not globally visible outside of the shared
library.

The easiest way to demonstrate the version script language is with a few
examples.

@smallexample
VERS_1.1 @{
	 global:
		 foo1;
	 local:
		 old*;
		 original*;
		 new*;
@};

VERS_1.2 @{
		 foo2;
@} VERS_1.1;

VERS_2.0 @{
		 bar1; bar2;
	 extern "C++" @{
		 ns::*;
		 "f(int, double)";
	 @};
@} VERS_1.2;
@end smallexample

This example version script defines three version nodes.  The first
version node defined is @samp{VERS_1.1}; it has no other dependencies.
The script binds the symbol @samp{foo1} to @samp{VERS_1.1}.  It reduces
a number of symbols to local scope so that they are not visible outside
of the shared library; this is done using wildcard patterns, so that any
symbol whose name begins with @samp{old}, @samp{original}, or @samp{new}
is matched.  The wildcard patterns available are the same as those used
in the shell when matching filenames (also known as ``globbing'').
However, if you specify the symbol name inside double quotes, then the
name is treated as literal, rather than as a glob pattern.

Next, the version script defines node @samp{VERS_1.2}.  This node
depends upon @samp{VERS_1.1}.  The script binds the symbol @samp{foo2}
to the version node @samp{VERS_1.2}.

Finally, the version script defines node @samp{VERS_2.0}.  This node
depends upon @samp{VERS_1.2}.  The scripts binds the symbols @samp{bar1}
and @samp{bar2} are bound to the version node @samp{VERS_2.0}.

When the linker finds a symbol defined in a library which is not
specifically bound to a version node, it will effectively bind it to an
unspecified base version of the library.  You can bind all otherwise
unspecified symbols to a given version node by using @samp{global: *;}
somewhere in the version script.  Note that it's slightly crazy to use
wildcards in a global spec except on the last version node.  Global
wildcards elsewhere run the risk of accidentally adding symbols to the
set exported for an old version.  That's wrong since older versions
ought to have a fixed set of symbols.

The names of the version nodes have no specific meaning other than what
they might suggest to the person reading them.  The @samp{2.0} version
could just as well have appeared in between @samp{1.1} and @samp{1.2}.
However, this would be a confusing way to write a version script.

Node name can be omitted, provided it is the only version node
in the version script.  Such version script doesn't assign any versions to
symbols, only selects which symbols will be globally visible out and which
won't.

@smallexample
@{ global: foo; bar; local: *; @};
@end smallexample

When you link an application against a shared library that has versioned
symbols, the application itself knows which version of each symbol it
requires, and it also knows which version nodes it needs from each
shared library it is linked against.  Thus at runtime, the dynamic
loader can make a quick check to make sure that the libraries you have
linked against do in fact supply all of the version nodes that the
application will need to resolve all of the dynamic symbols.  In this
way it is possible for the dynamic linker to know with certainty that
all external symbols that it needs will be resolvable without having to
search for each symbol reference.

The symbol versioning is in effect a much more sophisticated way of
doing minor version checking that SunOS does.  The fundamental problem
that is being addressed here is that typically references to external
functions are bound on an as-needed basis, and are not all bound when
the application starts up.  If a shared library is out of date, a
required interface may be missing; when the application tries to use
that interface, it may suddenly and unexpectedly fail.  With symbol
versioning, the user will get a warning when they start their program if
the libraries being used with the application are too old.

There are several GNU extensions to Sun's versioning approach.  The
first of these is the ability to bind a symbol to a version node in the
source file where the symbol is defined instead of in the versioning
script.  This was done mainly to reduce the burden on the library
maintainer.  You can do this by putting something like:
@smallexample
__asm__(".symver original_foo,foo@@VERS_1.1");
@end smallexample
@noindent
in the C source file.  This renames the function @samp{original_foo} to
be an alias for @samp{foo} bound to the version node @samp{VERS_1.1}.
The @samp{local:} directive can be used to prevent the symbol
@samp{original_foo} from being exported. A @samp{.symver} directive
takes precedence over a version script.

The second GNU extension is to allow multiple versions of the same
function to appear in a given shared library.  In this way you can make
an incompatible change to an interface without increasing the major
version number of the shared library, while still allowing applications
linked against the old interface to continue to function.

To do this, you must use multiple @samp{.symver} directives in the
source file.  Here is an example:

@smallexample
__asm__(".symver original_foo,foo@@");
__asm__(".symver old_foo,foo@@VERS_1.1");
__asm__(".symver old_foo1,foo@@VERS_1.2");
__asm__(".symver new_foo,foo@@@@VERS_2.0");
@end smallexample

In this example, @samp{foo@@} represents the symbol @samp{foo} bound to the
unspecified base version of the symbol.  The source file that contains this
example would define 4 C functions: @samp{original_foo}, @samp{old_foo},
@samp{old_foo1}, and @samp{new_foo}.

When you have multiple definitions of a given symbol, there needs to be
some way to specify a default version to which external references to
this symbol will be bound.  You can do this with the
@samp{foo@@@@VERS_2.0} type of @samp{.symver} directive.  You can only
declare one version of a symbol as the default in this manner; otherwise
you would effectively have multiple definitions of the same symbol.

If you wish to bind a reference to a specific version of the symbol
within the shared library, you can use the aliases of convenience
(i.e., @samp{old_foo}), or you can use the @samp{.symver} directive to
specifically bind to an external version of the function in question.

You can also specify the language in the version script:

@smallexample
VERSION extern "lang" @{ version-script-commands @}
@end smallexample

The supported @samp{lang}s are @samp{C}, @samp{C++}, and @samp{Java}.
The linker will iterate over the list of symbols at the link time and
demangle them according to @samp{lang} before matching them to the
patterns specified in @samp{version-script-commands}.  The default
@samp{lang} is @samp{C}.

Demangled names may contains spaces and other special characters.  As
described above, you can use a glob pattern to match demangled names,
or you can use a double-quoted string to match the string exactly.  In
the latter case, be aware that minor differences (such as differing
whitespace) between the version script and the demangler output will
cause a mismatch.  As the exact string generated by the demangler
might change in the future, even if the mangled name does not, you
should check that all of your version directives are behaving as you
expect when you upgrade.

@node Expressions
@section Expressions in Linker Scripts
@cindex expressions
@cindex arithmetic
The syntax for expressions in the linker script language is identical to
that of C expressions.  All expressions are evaluated as integers.  All
expressions are evaluated in the same size, which is 32 bits if both the
host and target are 32 bits, and is otherwise 64 bits.

You can use and set symbol values in expressions.

The linker defines several special purpose builtin functions for use in
expressions.

@menu
* Constants::			Constants
* Symbolic Constants::          Symbolic constants
* Symbols::			Symbol Names
* Orphan Sections::		Orphan Sections
* Location Counter::		The Location Counter
* Operators::			Operators
* Evaluation::			Evaluation
* Expression Section::		The Section of an Expression
* Builtin Functions::		Builtin Functions
@end menu

@node Constants
@subsection Constants
@cindex integer notation
@cindex constants in linker scripts
All constants are integers.

As in C, the linker considers an integer beginning with @samp{0} to be
octal, and an integer beginning with @samp{0x} or @samp{0X} to be
hexadecimal.  Alternatively the linker accepts suffixes of @samp{h} or
@samp{H} for hexadecimal, @samp{o} or @samp{O} for octal, @samp{b} or
@samp{B} for binary and @samp{d} or @samp{D} for decimal.  Any integer
value without a prefix or a suffix is considered to be decimal.

@cindex scaled integers
@cindex K and M integer suffixes
@cindex M and K integer suffixes
@cindex suffixes for integers
@cindex integer suffixes
In addition, you can use the suffixes @code{K} and @code{M} to scale a
constant by
@c TEXI2ROFF-KILL
@ifnottex
@c END TEXI2ROFF-KILL
@code{1024} or @code{1024*1024}
@c TEXI2ROFF-KILL
@end ifnottex
@tex
${\rm 1024}$ or ${\rm 1024}^2$
@end tex
@c END TEXI2ROFF-KILL
respectively.  For example, the following
all refer to the same quantity:

@smallexample
_fourk_1 = 4K;
_fourk_2 = 4096;
_fourk_3 = 0x1000;
_fourk_4 = 10000o;
@end smallexample

Note - the @code{K} and @code{M} suffixes cannot be used in
conjunction with the base suffixes mentioned above.

@node Symbolic Constants
@subsection Symbolic Constants
@cindex symbolic constants
@kindex CONSTANT
It is possible to refer to target specific constants via the use of
the @code{CONSTANT(@var{name})} operator, where @var{name} is one of:

@table @code
@item MAXPAGESIZE
@kindex MAXPAGESIZE
The target's maximum page size.

@item COMMONPAGESIZE
@kindex COMMONPAGESIZE
The target's default page size.
@end table

So for example:

@smallexample
  .text ALIGN (CONSTANT (MAXPAGESIZE)) : @{ *(.text) @}
@end smallexample

will create a text section aligned to the largest page boundary
supported by the target.

@node Symbols
@subsection Symbol Names
@cindex symbol names
@cindex names
@cindex quoted symbol names
@kindex "
Unless quoted, symbol names start with a letter, underscore, or period
and may include letters, digits, underscores, periods, and hyphens.
Unquoted symbol names must not conflict with any keywords.  You can
specify a symbol which contains odd characters or has the same name as a
keyword by surrounding the symbol name in double quotes:
@smallexample
"SECTION" = 9;
"with a space" = "also with a space" + 10;
@end smallexample

Since symbols can contain many non-alphabetic characters, it is safest
to delimit symbols with spaces.  For example, @samp{A-B} is one symbol,
whereas @samp{A - B} is an expression involving subtraction.

@node Orphan Sections
@subsection Orphan Sections
@cindex orphan
Orphan sections are sections present in the input files which
are not explicitly placed into the output file by the linker
script.  The linker will still copy these sections into the
output file, but it has to guess as to where they should be
placed.  The linker uses a simple heuristic to do this.  It
attempts to place orphan sections after non-orphan sections of the
same attribute, such as code vs data, loadable vs non-loadable, etc.
If there is not enough room to do this then it places
at the end of the file.

For ELF targets, the attribute of the section includes section type as
well as section flag.

If an orphaned section's name is representable as a C identifier then
the linker will automatically @pxref{PROVIDE} two symbols:
__start_SECNAME and __stop_SECNAME, where SECNAME is the name of the
section.  These indicate the start address and end address of the
orphaned section respectively.  Note: most section names are not
representable as C identifiers because they contain a @samp{.}
character.

@node Location Counter
@subsection The Location Counter
@kindex .
@cindex dot
@cindex location counter
@cindex current output location
The special linker variable @dfn{dot} @samp{.} always contains the
current output location counter.  Since the @code{.} always refers to a
location in an output section, it may only appear in an expression
within a @code{SECTIONS} command.  The @code{.} symbol may appear
anywhere that an ordinary symbol is allowed in an expression.

@cindex holes
Assigning a value to @code{.} will cause the location counter to be
moved.  This may be used to create holes in the output section.  The
location counter may not be moved backwards inside an output section,
and may not be moved backwards outside of an output section if so
doing creates areas with overlapping LMAs.

@smallexample
SECTIONS
@{
  output :
    @{
      file1(.text)
      . = . + 1000;
      file2(.text)
      . += 1000;
      file3(.text)
    @} = 0x12345678;
@}
@end smallexample
@noindent
In the previous example, the @samp{.text} section from @file{file1} is
located at the beginning of the output section @samp{output}.  It is
followed by a 1000 byte gap.  Then the @samp{.text} section from
@file{file2} appears, also with a 1000 byte gap following before the
@samp{.text} section from @file{file3}.  The notation @samp{= 0x12345678}
specifies what data to write in the gaps (@pxref{Output Section Fill}).

@cindex dot inside sections
Note: @code{.} actually refers to the byte offset from the start of the
current containing object.  Normally this is the @code{SECTIONS}
statement, whose start address is 0, hence @code{.} can be used as an
absolute address.  If @code{.} is used inside a section description
however, it refers to the byte offset from the start of that section,
not an absolute address.  Thus in a script like this:

@smallexample
SECTIONS
@{
    . = 0x100
    .text: @{
      *(.text)
      . = 0x200
    @}
    . = 0x500
    .data: @{
      *(.data)
      . += 0x600
    @}
@}
@end smallexample

The @samp{.text} section will be assigned a starting address of 0x100
and a size of exactly 0x200 bytes, even if there is not enough data in
the @samp{.text} input sections to fill this area.  (If there is too
much data, an error will be produced because this would be an attempt to
move @code{.} backwards).  The @samp{.data} section will start at 0x500
and it will have an extra 0x600 bytes worth of space after the end of
the values from the @samp{.data} input sections and before the end of
the @samp{.data} output section itself.

@cindex dot outside sections
Setting symbols to the value of the location counter outside of an
output section statement can result in unexpected values if the linker
needs to place orphan sections.  For example, given the following:

@smallexample
SECTIONS
@{
    start_of_text = . ;
    .text: @{ *(.text) @}
    end_of_text = . ;

    start_of_data = . ;
    .data: @{ *(.data) @}
    end_of_data = . ;
@}
@end smallexample

If the linker needs to place some input section, e.g. @code{.rodata},
not mentioned in the script, it might choose to place that section
between @code{.text} and @code{.data}.  You might think the linker
should place @code{.rodata} on the blank line in the above script, but
blank lines are of no particular significance to the linker.  As well,
the linker doesn't associate the above symbol names with their
sections.  Instead, it assumes that all assignments or other
statements belong to the previous output section, except for the
special case of an assignment to @code{.}.  I.e., the linker will
place the orphan @code{.rodata} section as if the script was written
as follows:

@smallexample
SECTIONS
@{
    start_of_text = . ;
    .text: @{ *(.text) @}
    end_of_text = . ;

    start_of_data = . ;
    .rodata: @{ *(.rodata) @}
    .data: @{ *(.data) @}
    end_of_data = . ;
@}
@end smallexample

This may or may not be the script author's intention for the value of
@code{start_of_data}.  One way to influence the orphan section
placement is to assign the location counter to itself, as the linker
assumes that an assignment to @code{.} is setting the start address of
a following output section and thus should be grouped with that
section.  So you could write:

@smallexample
SECTIONS
@{
    start_of_text = . ;
    .text: @{ *(.text) @}
    end_of_text = . ;

    . = . ;
    start_of_data = . ;
    .data: @{ *(.data) @}
    end_of_data = . ;
@}
@end smallexample

Now, the orphan @code{.rodata} section will be placed between
@code{end_of_text} and @code{start_of_data}.

@need 2000
@node Operators
@subsection Operators
@cindex operators for arithmetic
@cindex arithmetic operators
@cindex precedence in expressions
The linker recognizes the standard C set of arithmetic operators, with
the standard bindings and precedence levels:
@c TEXI2ROFF-KILL
@ifnottex
@c END TEXI2ROFF-KILL
@smallexample
precedence      associativity   Operators                Notes
(highest)
1               left            !  -  ~                  (1)
2               left            *  /  %
3               left            +  -
4               left            >>  <<
5               left            ==  !=  >  <  <=  >=
6               left            &
7               left            |
8               left            &&
9               left            ||
10              right           ? :
11              right           &=  +=  -=  *=  /=       (2)
(lowest)
@end smallexample
Notes:
(1) Prefix operators
(2) @xref{Assignments}.
@c TEXI2ROFF-KILL
@end ifnottex
@tex
\vskip \baselineskip
%"lispnarrowing" is the extra indent used generally for smallexample
\hskip\lispnarrowing\vbox{\offinterlineskip
\hrule
\halign
{\vrule#&\strut\hfil\ #\ \hfil&\vrule#&\strut\hfil\ #\ \hfil&\vrule#&\strut\hfil\ {\tt #}\ \hfil&\vrule#\cr
height2pt&\omit&&\omit&&\omit&\cr
&Precedence&&  Associativity  &&{\rm Operators}&\cr
height2pt&\omit&&\omit&&\omit&\cr
\noalign{\hrule}
height2pt&\omit&&\omit&&\omit&\cr
&highest&&&&&\cr
% '176 is tilde, '~' in tt font
&1&&left&&\qquad-          \char'176\      !\qquad\dag&\cr
&2&&left&&*          /        \%&\cr
&3&&left&&+          -&\cr
&4&&left&&>>         <<&\cr
&5&&left&&==         !=       >      <      <=      >=&\cr
&6&&left&&\&&\cr
&7&&left&&|&\cr
&8&&left&&{\&\&}&\cr
&9&&left&&||&\cr
&10&&right&&?        :&\cr
&11&&right&&\qquad\&=      +=       -=     *=     /=\qquad\ddag&\cr
&lowest&&&&&\cr
height2pt&\omit&&\omit&&\omit&\cr}
\hrule}
@end tex
@iftex
{
@obeylines@parskip=0pt@parindent=0pt
@dag@quad Prefix operators.
@ddag@quad @xref{Assignments}.
}
@end iftex
@c END TEXI2ROFF-KILL

@node Evaluation
@subsection Evaluation
@cindex lazy evaluation
@cindex expression evaluation order
The linker evaluates expressions lazily.  It only computes the value of
an expression when absolutely necessary.

The linker needs some information, such as the value of the start
address of the first section, and the origins and lengths of memory
regions, in order to do any linking at all.  These values are computed
as soon as possible when the linker reads in the linker script.

However, other values (such as symbol values) are not known or needed
until after storage allocation.  Such values are evaluated later, when
other information (such as the sizes of output sections) is available
for use in the symbol assignment expression.

The sizes of sections cannot be known until after allocation, so
assignments dependent upon these are not performed until after
allocation.

Some expressions, such as those depending upon the location counter
@samp{.}, must be evaluated during section allocation.

If the result of an expression is required, but the value is not
available, then an error results.  For example, a script like the
following
@smallexample
@group
SECTIONS
  @{
    .text 9+this_isnt_constant :
      @{ *(.text) @}
  @}
@end group
@end smallexample
@noindent
will cause the error message @samp{non constant expression for initial
address}.

@node Expression Section
@subsection The Section of an Expression
@cindex expression sections
@cindex absolute expressions
@cindex relative expressions
@cindex absolute and relocatable symbols
@cindex relocatable and absolute symbols
@cindex symbols, relocatable and absolute
Addresses and symbols may be section relative, or absolute.  A section
relative symbol is relocatable.  If you request relocatable output
using the @samp{-r} option, a further link operation may change the
value of a section relative symbol.  On the other hand, an absolute
symbol will retain the same value throughout any further link
operations.

Some terms in linker expressions are addresses.  This is true of
section relative symbols and for builtin functions that return an
address, such as @code{ADDR}, @code{LOADADDR}, @code{ORIGIN} and
@code{SEGMENT_START}.  Other terms are simply numbers, or are builtin
functions that return a non-address value, such as @code{LENGTH}.
One complication is that unless you set @code{LD_FEATURE ("SANE_EXPR")}
(@pxref{Miscellaneous Commands}), numbers and absolute symbols are treated
differently depending on their location, for compatibility with older
versions of @code{ld}.  Expressions appearing outside an output
section definition treat all numbers as absolute addresses.
Expressions appearing inside an output section definition treat
absolute symbols as numbers.  If @code{LD_FEATURE ("SANE_EXPR")} is
given, then absolute symbols and numbers are simply treated as numbers
everywhere.

In the following simple example,

@smallexample
@group
SECTIONS
  @{
    . = 0x100;
    __executable_start = 0x100;
    .data :
    @{
      . = 0x10;
      __data_start = 0x10;
      *(.data)
    @}
    @dots{}
  @}
@end group
@end smallexample

both @code{.} and @code{__executable_start} are set to the absolute
address 0x100 in the first two assignments, then both @code{.} and
@code{__data_start} are set to 0x10 relative to the @code{.data}
section in the second two assignments.

For expressions involving numbers, relative addresses and absolute
addresses, ld follows these rules to evaluate terms:

@itemize @bullet
@item
Unary operations on an absolute address or number, and binary
operations on two absolute addresses or two numbers, or between one
absolute address and a number, apply the operator to the value(s).
@item
Unary operations on a relative address, and binary operations on two
relative addresses in the same section or between one relative address
and a number, apply the operator to the offset part of the address(es).
@item
Other binary operations, that is, between two relative addresses not
in the same section, or between a relative address and an absolute
address, first convert any non-absolute term to an absolute address
before applying the operator.
@end itemize

The result section of each sub-expression is as follows:

@itemize @bullet
@item
An operation involving only numbers results in a number.
@item
The result of comparisons, @samp{&&} and @samp{||} is also a number.
@item
The result of other binary arithmetic and logical operations on two
relative addresses in the same section or two absolute addresses
(after above conversions) is also a number.
@item
The result of other operations on relative addresses or one
relative address and a number, is a relative address in the same
section as the relative operand(s).
@item
The result of other operations on absolute addresses (after above
conversions) is an absolute address.
@end itemize

You can use the builtin function @code{ABSOLUTE} to force an expression
to be absolute when it would otherwise be relative.  For example, to
create an absolute symbol set to the address of the end of the output
section @samp{.data}:
@smallexample
SECTIONS
  @{
    .data : @{ *(.data) _edata = ABSOLUTE(.); @}
  @}
@end smallexample
@noindent
If @samp{ABSOLUTE} were not used, @samp{_edata} would be relative to the
@samp{.data} section.

Using @code{LOADADDR} also forces an expression absolute, since this
particular builtin function returns an absolute address.

@node Builtin Functions
@subsection Builtin Functions
@cindex functions in expressions
The linker script language includes a number of builtin functions for
use in linker script expressions.

@table @code
@item ABSOLUTE(@var{exp})
@kindex ABSOLUTE(@var{exp})
@cindex expression, absolute
Return the absolute (non-relocatable, as opposed to non-negative) value
of the expression @var{exp}.  Primarily useful to assign an absolute
value to a symbol within a section definition, where symbol values are
normally section relative.  @xref{Expression Section}.

@item ADDR(@var{section})
@kindex ADDR(@var{section})
@cindex section address in expression
Return the address (VMA) of the named @var{section}.  Your
script must previously have defined the location of that section.  In
the following example, @code{start_of_output_1}, @code{symbol_1} and
@code{symbol_2} are assigned equivalent values, except that
@code{symbol_1} will be relative to the @code{.output1} section while
the other two will be absolute:
@smallexample
@group
SECTIONS @{ @dots{}
  .output1 :
    @{
    start_of_output_1 = ABSOLUTE(.);
    @dots{}
    @}
  .output :
    @{
    symbol_1 = ADDR(.output1);
    symbol_2 = start_of_output_1;
    @}
@dots{} @}
@end group
@end smallexample

@item ALIGN(@var{align})
@itemx ALIGN(@var{exp},@var{align})
@kindex ALIGN(@var{align})
@kindex ALIGN(@var{exp},@var{align})
@cindex round up location counter
@cindex align location counter
@cindex round up expression
@cindex align expression
Return the location counter (@code{.}) or arbitrary expression aligned
to the next @var{align} boundary.  The single operand @code{ALIGN}
doesn't change the value of the location counter---it just does
arithmetic on it.  The two operand @code{ALIGN} allows an arbitrary
expression to be aligned upwards (@code{ALIGN(@var{align})} is
equivalent to @code{ALIGN(., @var{align})}).

Here is an example which aligns the output @code{.data} section to the
next @code{0x2000} byte boundary after the preceding section and sets a
variable within the section to the next @code{0x8000} boundary after the
input sections:
@smallexample
@group
SECTIONS @{ @dots{}
  .data ALIGN(0x2000): @{
    *(.data)
    variable = ALIGN(0x8000);
  @}
@dots{} @}
@end group
@end smallexample
@noindent
The first use of @code{ALIGN} in this example specifies the location of
a section because it is used as the optional @var{address} attribute of
a section definition (@pxref{Output Section Address}).  The second use
of @code{ALIGN} is used to defines the value of a symbol.

The builtin function @code{NEXT} is closely related to @code{ALIGN}.

@item ALIGNOF(@var{section})
@kindex ALIGNOF(@var{section})
@cindex section alignment
Return the alignment in bytes of the named @var{section}, if that section has
been allocated.  If the section has not been allocated when this is
evaluated, the linker will report an error. In the following example,
the alignment of the @code{.output} section is stored as the first
value in that section.
@smallexample
@group
SECTIONS@{ @dots{}
  .output @{
    LONG (ALIGNOF (.output))
    @dots{}
    @}
@dots{} @}
@end group
@end smallexample

@item BLOCK(@var{exp})
@kindex BLOCK(@var{exp})
This is a synonym for @code{ALIGN}, for compatibility with older linker
scripts.  It is most often seen when setting the address of an output
section.

@item DATA_SEGMENT_ALIGN(@var{maxpagesize}, @var{commonpagesize})
@kindex DATA_SEGMENT_ALIGN(@var{maxpagesize}, @var{commonpagesize})
This is equivalent to either
@smallexample
(ALIGN(@var{maxpagesize}) + (. & (@var{maxpagesize} - 1)))
@end smallexample
or
@smallexample
(ALIGN(@var{maxpagesize}) + (. & (@var{maxpagesize} - @var{commonpagesize})))
@end smallexample
@noindent
depending on whether the latter uses fewer @var{commonpagesize} sized pages
for the data segment (area between the result of this expression and
@code{DATA_SEGMENT_END}) than the former or not.
If the latter form is used, it means @var{commonpagesize} bytes of runtime
memory will be saved at the expense of up to @var{commonpagesize} wasted
bytes in the on-disk file.

This expression can only be used directly in @code{SECTIONS} commands, not in
any output section descriptions and only once in the linker script.
@var{commonpagesize} should be less or equal to @var{maxpagesize} and should
be the system page size the object wants to be optimized for (while still
working on system page sizes up to @var{maxpagesize}).

@noindent
Example:
@smallexample
  . = DATA_SEGMENT_ALIGN(0x10000, 0x2000);
@end smallexample

@item DATA_SEGMENT_END(@var{exp})
@kindex DATA_SEGMENT_END(@var{exp})
This defines the end of data segment for @code{DATA_SEGMENT_ALIGN}
evaluation purposes.

@smallexample
  . = DATA_SEGMENT_END(.);
@end smallexample

@item DATA_SEGMENT_RELRO_END(@var{offset}, @var{exp})
@kindex DATA_SEGMENT_RELRO_END(@var{offset}, @var{exp})
This defines the end of the @code{PT_GNU_RELRO} segment when
@samp{-z relro} option is used.
When @samp{-z relro} option is not present, @code{DATA_SEGMENT_RELRO_END}
does nothing, otherwise @code{DATA_SEGMENT_ALIGN} is padded so that
@var{exp} + @var{offset} is aligned to the most commonly used page
boundary for particular target.  If present in the linker script,
it must always come in between @code{DATA_SEGMENT_ALIGN} and
@code{DATA_SEGMENT_END}.  Evaluates to the second argument plus any
padding needed at the end of the @code{PT_GNU_RELRO} segment due to
section alignment.

@smallexample
  . = DATA_SEGMENT_RELRO_END(24, .);
@end smallexample

@item DEFINED(@var{symbol})
@kindex DEFINED(@var{symbol})
@cindex symbol defaults
Return 1 if @var{symbol} is in the linker global symbol table and is
defined before the statement using DEFINED in the script, otherwise
return 0.  You can use this function to provide
default values for symbols.  For example, the following script fragment
shows how to set a global symbol @samp{begin} to the first location in
the @samp{.text} section---but if a symbol called @samp{begin} already
existed, its value is preserved:

@smallexample
@group
SECTIONS @{ @dots{}
  .text : @{
    begin = DEFINED(begin) ? begin : . ;
    @dots{}
  @}
  @dots{}
@}
@end group
@end smallexample

@item LENGTH(@var{memory})
@kindex LENGTH(@var{memory})
Return the length of the memory region named @var{memory}.

@item LOADADDR(@var{section})
@kindex LOADADDR(@var{section})
@cindex section load address in expression
Return the absolute LMA of the named @var{section}.  (@pxref{Output
Section LMA}).

@item LOG2CEIL(@var{exp})
@kindex LOG2CEIL(@var{exp})
Return the binary logarithm of @var{exp} rounded towards infinity.
@code{LOG2CEIL(0)} returns 0.

@kindex MAX
@item MAX(@var{exp1}, @var{exp2})
Returns the maximum of @var{exp1} and @var{exp2}.

@kindex MIN
@item MIN(@var{exp1}, @var{exp2})
Returns the minimum of @var{exp1} and @var{exp2}.

@item NEXT(@var{exp})
@kindex NEXT(@var{exp})
@cindex unallocated address, next
Return the next unallocated address that is a multiple of @var{exp}.
This function is closely related to @code{ALIGN(@var{exp})}; unless you
use the @code{MEMORY} command to define discontinuous memory for the
output file, the two functions are equivalent.

@item ORIGIN(@var{memory})
@kindex ORIGIN(@var{memory})
Return the origin of the memory region named @var{memory}.

@item SEGMENT_START(@var{segment}, @var{default})
@kindex SEGMENT_START(@var{segment}, @var{default})
Return the base address of the named @var{segment}.  If an explicit
value has already been given for this segment (with a command-line
@samp{-T} option) then that value will be returned otherwise the value
will be @var{default}.  At present, the @samp{-T} command-line option
can only be used to set the base address for the ``text'', ``data'', and
``bss'' sections, but you can use @code{SEGMENT_START} with any segment
name.

@item SIZEOF(@var{section})
@kindex SIZEOF(@var{section})
@cindex section size
Return the size in bytes of the named @var{section}, if that section has
been allocated.  If the section has not been allocated when this is
evaluated, the linker will report an error.  In the following example,
@code{symbol_1} and @code{symbol_2} are assigned identical values:
@smallexample
@group
SECTIONS@{ @dots{}
  .output @{
    .start = . ;
    @dots{}
    .end = . ;
    @}
  symbol_1 = .end - .start ;
  symbol_2 = SIZEOF(.output);
@dots{} @}
@end group
@end smallexample

@item SIZEOF_HEADERS
@itemx sizeof_headers
@kindex SIZEOF_HEADERS
@cindex header size
Return the size in bytes of the output file's headers.  This is
information which appears at the start of the output file.  You can use
this number when setting the start address of the first section, if you
choose, to facilitate paging.

@cindex not enough room for program headers
@cindex program headers, not enough room
When producing an ELF output file, if the linker script uses the
@code{SIZEOF_HEADERS} builtin function, the linker must compute the
number of program headers before it has determined all the section
addresses and sizes.  If the linker later discovers that it needs
additional program headers, it will report an error @samp{not enough
room for program headers}.  To avoid this error, you must avoid using
the @code{SIZEOF_HEADERS} function, or you must rework your linker
script to avoid forcing the linker to use additional program headers, or
you must define the program headers yourself using the @code{PHDRS}
command (@pxref{PHDRS}).
@end table

@node Implicit Linker Scripts
@section Implicit Linker Scripts
@cindex implicit linker scripts
If you specify a linker input file which the linker can not recognize as
an object file or an archive file, it will try to read the file as a
linker script.  If the file can not be parsed as a linker script, the
linker will report an error.

An implicit linker script will not replace the default linker script.

Typically an implicit linker script would contain only symbol
assignments, or the @code{INPUT}, @code{GROUP}, or @code{VERSION}
commands.

Any input files read because of an implicit linker script will be read
at the position in the command line where the implicit linker script was
read.  This can affect archive searching.

@ifset GENERIC
@node Machine Dependent
@chapter Machine Dependent Features

@cindex machine dependencies
@command{ld} has additional features on some platforms; the following
sections describe them.  Machines where @command{ld} has no additional
functionality are not listed.

@menu
@ifset H8300
* H8/300::                      @command{ld} and the H8/300
@end ifset
@ifset I960
* i960::                        @command{ld} and the Intel 960 family
@end ifset
@ifset M68HC11
* M68HC11/68HC12::		@code{ld} and the Motorola 68HC11 and 68HC12 families
@end ifset
@ifset ARM
* ARM::				@command{ld} and the ARM family
@end ifset
@ifset HPPA
* HPPA ELF32::                  @command{ld} and HPPA 32-bit ELF
@end ifset
@ifset M68K
* M68K::			@command{ld} and the Motorola 68K family
@end ifset
@ifset MIPS
* MIPS::			@command{ld} and the MIPS family
@end ifset
@ifset MMIX
* MMIX::			@command{ld} and MMIX
@end ifset
@ifset MSP430
* MSP430::			@command{ld} and MSP430
@end ifset
@ifset NDS32
* NDS32::			@command{ld} and NDS32
@end ifset
@ifset NIOSII
* Nios II::			@command{ld} and the Altera Nios II
@end ifset
@ifset POWERPC
* PowerPC ELF32::		@command{ld} and PowerPC 32-bit ELF Support
@end ifset
@ifset POWERPC64
* PowerPC64 ELF64::		@command{ld} and PowerPC64 64-bit ELF Support
@end ifset
@ifset SPU
* SPU ELF::			@command{ld} and SPU ELF Support
@end ifset
@ifset TICOFF
* TI COFF::                     @command{ld} and TI COFF
@end ifset
@ifset WIN32
* WIN32::                       @command{ld} and WIN32 (cygwin/mingw)
@end ifset
@ifset XTENSA
* Xtensa::                      @command{ld} and Xtensa Processors
@end ifset
@end menu
@end ifset

@ifset H8300
@ifclear GENERIC
@raisesections
@end ifclear

@node H8/300
@section @command{ld} and the H8/300

@cindex H8/300 support
For the H8/300, @command{ld} can perform these global optimizations when
you specify the @samp{--relax} command-line option.

@table @emph
@cindex relaxing on H8/300
@item relaxing address modes
@command{ld} finds all @code{jsr} and @code{jmp} instructions whose
targets are within eight bits, and turns them into eight-bit
program-counter relative @code{bsr} and @code{bra} instructions,
respectively.

@cindex synthesizing on H8/300
@item synthesizing instructions
@c FIXME: specifically mov.b, or any mov instructions really? -> mov.b only, at least on H8, H8H, H8S
@command{ld} finds all @code{mov.b} instructions which use the
sixteen-bit absolute address form, but refer to the top
page of memory, and changes them to use the eight-bit address form.
(That is: the linker turns @samp{mov.b @code{@@}@var{aa}:16} into
@samp{mov.b @code{@@}@var{aa}:8} whenever the address @var{aa} is in the
top page of memory).

@command{ld} finds all @code{mov} instructions which use the register
indirect with 32-bit displacement addressing mode, but use a small
displacement inside 16-bit displacement range, and changes them to use
the 16-bit displacement form.  (That is: the linker turns @samp{mov.b
@code{@@}@var{d}:32,ERx} into @samp{mov.b @code{@@}@var{d}:16,ERx}
whenever the displacement @var{d} is in the 16 bit signed integer
range. Only implemented in ELF-format ld).

@item bit manipulation instructions
@command{ld} finds all bit manipulation instructions like @code{band, bclr,
biand, bild, bior, bist, bixor, bld, bnot, bor, bset, bst, btst, bxor}
which use 32 bit and 16 bit absolute address form, but refer to the top
page of memory, and changes them to use the 8 bit address form.
(That is: the linker turns @samp{bset #xx:3,@code{@@}@var{aa}:32} into
@samp{bset #xx:3,@code{@@}@var{aa}:8} whenever the address @var{aa} is in
the top page of memory).

@item system control instructions
@command{ld} finds all @code{ldc.w, stc.w} instructions which use the
32 bit absolute address form, but refer to the top page of memory, and
changes them to use 16 bit address form.
(That is: the linker turns @samp{ldc.w @code{@@}@var{aa}:32,ccr} into
@samp{ldc.w @code{@@}@var{aa}:16,ccr} whenever the address @var{aa} is in
the top page of memory).
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifclear GENERIC
@ifset Renesas
@c This stuff is pointless to say unless you're especially concerned
@c with Renesas chips; don't enable it for generic case, please.
@node Renesas
@chapter @command{ld} and Other Renesas Chips

@command{ld} also supports the Renesas (formerly Hitachi) H8/300H,
H8/500, and SH chips.  No special features, commands, or command-line
options are required for these chips.
@end ifset
@end ifclear

@ifset I960
@ifclear GENERIC
@raisesections
@end ifclear

@node i960
@section @command{ld} and the Intel 960 Family

@cindex i960 support

You can use the @samp{-A@var{architecture}} command line option to
specify one of the two-letter names identifying members of the 960
family; the option specifies the desired output target, and warns of any
incompatible instructions in the input files.  It also modifies the
linker's search strategy for archive libraries, to support the use of
libraries specific to each particular architecture, by including in the
search loop names suffixed with the string identifying the architecture.

For example, if your @command{ld} command line included @w{@samp{-ACA}} as
well as @w{@samp{-ltry}}, the linker would look (in its built-in search
paths, and in any paths you specify with @samp{-L}) for a library with
the names

@smallexample
@group
try
libtry.a
tryca
libtryca.a
@end group
@end smallexample

@noindent
The first two possibilities would be considered in any event; the last
two are due to the use of @w{@samp{-ACA}}.

You can meaningfully use @samp{-A} more than once on a command line, since
the 960 architecture family allows combination of target architectures; each
use will add another pair of name variants to search for when @w{@samp{-l}}
specifies a library.

@cindex @option{--relax} on i960
@cindex relaxing on i960
@command{ld} supports the @samp{--relax} option for the i960 family.  If
you specify @samp{--relax}, @command{ld} finds all @code{balx} and
@code{calx} instructions whose targets are within 24 bits, and turns
them into 24-bit program-counter relative @code{bal} and @code{cal}
instructions, respectively.  @command{ld} also turns @code{cal}
instructions into @code{bal} instructions when it determines that the
target subroutine is a leaf routine (that is, the target subroutine does
not itself call any subroutines).

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset ARM
@ifclear GENERIC
@raisesections
@end ifclear

@ifset M68HC11
@ifclear GENERIC
@raisesections
@end ifclear

@node M68HC11/68HC12
@section @command{ld} and the Motorola 68HC11 and 68HC12 families

@cindex M68HC11 and 68HC12 support

@subsection Linker Relaxation

For the Motorola 68HC11, @command{ld} can perform these global
optimizations when you specify the @samp{--relax} command-line option.

@table @emph
@cindex relaxing on M68HC11
@item relaxing address modes
@command{ld} finds all @code{jsr} and @code{jmp} instructions whose
targets are within eight bits, and turns them into eight-bit
program-counter relative @code{bsr} and @code{bra} instructions,
respectively.

@command{ld} also looks at all 16-bit extended addressing modes and
transforms them in a direct addressing mode when the address is in
page 0 (between 0 and 0x0ff).

@item relaxing gcc instruction group
When @command{gcc} is called with @option{-mrelax}, it can emit group
of instructions that the linker can optimize to use a 68HC11 direct
addressing mode. These instructions consists of @code{bclr} or
@code{bset} instructions.

@end table

@subsection Trampoline Generation

@cindex trampoline generation on M68HC11
@cindex trampoline generation on M68HC12
For 68HC11 and 68HC12, @command{ld} can generate trampoline code to
call a far function using a normal @code{jsr} instruction. The linker
will also change the relocation to some far function to use the
trampoline address instead of the function address. This is typically the
case when a pointer to a function is taken. The pointer will in fact
point to the function trampoline.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@node ARM
@section @command{ld} and the ARM family

@cindex ARM interworking support
@kindex --support-old-code
For the ARM, @command{ld} 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} 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} 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.

@cindex thumb entry point
@cindex entry point, thumb
@kindex --thumb-entry=@var{entry}
The @samp{--thumb-entry} switch is a duplicate of the generic
@samp{--entry} 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.

@cindex PE import table prefixing
@kindex --use-nul-prefixed-import-tables
The @samp{--use-nul-prefixed-import-tables} 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.

@cindex BE8
@kindex --be8
The @samp{--be8} switch instructs @command{ld} to generate BE8 format
executables.  This option is only valid when linking big-endian
objects - ie ones which have been assembled with the @option{-EB}
option.  The resulting image will contain big-endian data and
little-endian code.

@cindex TARGET1
@kindex --target1-rel
@kindex --target1-abs
The @samp{R_ARM_TARGET1} relocation is typically used for entries in the
@samp{.init_array} section.  It is interpreted as either @samp{R_ARM_REL32}
or @samp{R_ARM_ABS32}, depending on the target.  The @samp{--target1-rel}
and @samp{--target1-abs} switches override the default.

@cindex TARGET2
@kindex --target2=@var{type}
The @samp{--target2=type} switch overrides the default definition of the
@samp{R_ARM_TARGET2} relocation.  Valid values for @samp{type}, their
meanings, and target defaults are as follows:
@table @samp
@item rel
@samp{R_ARM_REL32} (arm*-*-elf, arm*-*-eabi)
@item abs
@samp{R_ARM_ABS32} (arm*-*-symbianelf)
@item got-rel
@samp{R_ARM_GOT_PREL} (arm*-*-linux, arm*-*-*bsd)
@end table

@cindex FIX_V4BX
@kindex --fix-v4bx
The @samp{R_ARM_V4BX} 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.

In the latter case, the switch @option{--fix-v4bx} must be passed to the
linker, which causes v4t @code{BX rM} instructions to be rewritten as
@code{MOV PC,rM}, since v4 processors do not have a @code{BX} instruction.

In the former case, the switch should not be used, and @samp{R_ARM_V4BX}
relocations are ignored.

@cindex FIX_V4BX_INTERWORKING
@kindex --fix-v4bx-interworking
Replace @code{BX rM} instructions identified by @samp{R_ARM_V4BX}
relocations with a branch to the following veneer:

@smallexample
TST rM, #1
MOVEQ PC, rM
BX Rn
@end smallexample

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.

@cindex USE_BLX
@kindex --use-blx
The @samp{--use-blx} 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.

This option is enabled implicitly for SymbianOS, so there is no need to
specify it if you are using that target.

@cindex VFP11_DENORM_FIX
@kindex --vfp11-denorm-fix
The @samp{--vfp11-denorm-fix} 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.

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.

If you know you are using buggy VFP11 hardware, you can
enable this workaround by specifying the linker option
@samp{--vfp-denorm-fix=scalar} if you are using the VFP11 scalar
mode only, or @samp{--vfp-denorm-fix=vector} if you are using
vector mode (the latter also works for scalar code). The default is
@samp{--vfp-denorm-fix=none}.

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.

@cindex ARM1176 erratum workaround
@kindex --fix-arm1176
@kindex --no-fix-arm1176
The @samp{--fix-arm1176} 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}.

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/.

@cindex NO_ENUM_SIZE_WARNING
@kindex --no-enum-size-warning
The @option{--no-enum-size-warning} 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.

@cindex NO_WCHAR_SIZE_WARNING
@kindex --no-wchar-size-warning
The @option{--no-wchar-size-warning} switch prevents the linker from
warning when linking object files that specify incompatible EABI
@code{wchar_t} size attributes.  For example, with this switch enabled,
linking of an object file using 32-bit @code{wchar_t} values with another
using 16-bit @code{wchar_t} values will not be diagnosed.

@cindex PIC_VENEER
@kindex --pic-veneer
The @samp{--pic-veneer} 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} is used to generate relocatable binaries.

@cindex STUB_GROUP_SIZE
@kindex --stub-group-size=@var{N}
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 @option{--stub-group-size=N}.
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.

The value of @samp{N}, the parameter to the
@option{--stub-group-size=} 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} 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} greater than 1 (or smaller than -1) tells the
linker that a single group of stubs can service at most @samp{N} bytes
from the input sections.

The default, if @option{--stub-group-size=} is not specified, is
@samp{N = +1}.

Farcalls stubs insertion is fully supported for the ARM-EABI target
only, because it relies on object files properties not present
otherwise.

@cindex Cortex-A8 erratum workaround
@kindex --fix-cortex-a8
@kindex --no-fix-cortex-a8
The @samp{--fix-cortex-a8} 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}, or disabled unconditionally by specifying @samp{--no-fix-cortex-a8}.

The erratum only affects Thumb-2 code.  Please contact ARM for further details.

@cindex Cortex-A53 erratum 835769 workaround
@kindex --fix-cortex-a53-835769
@kindex --no-fix-cortex-a53-835769
The @samp{--fix-cortex-a53-835769} 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}, or disabled unconditionally by specifying @samp{--no-fix-cortex-a53-835769}.

Please contact ARM for further details.

@kindex --merge-exidx-entries
@kindex --no-merge-exidx-entries
@cindex Merging exidx entries
The @samp{--no-merge-exidx-entries} switch disables the merging of adjacent exidx entries in debuginfo.

@kindex --long-plt
@cindex 32-bit PLT entries
The @samp{--long-plt} 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.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset HPPA
@ifclear GENERIC
@raisesections
@end ifclear

@node HPPA ELF32
@section @command{ld} and HPPA 32-bit ELF Support
@cindex HPPA multiple sub-space stubs
@kindex --multi-subspace
When generating a shared library, @command{ld} will by default generate
import stubs suitable for use with a single sub-space application.
The @samp{--multi-subspace} switch causes @command{ld} to generate export
stubs, and different (larger) import stubs suitable for use with
multiple sub-spaces.

@cindex HPPA stub grouping
@kindex --stub-group-size=@var{N}
Long branch stubs and import/export stubs are placed by @command{ld} in
stub sections located between groups of input sections.
@samp{--stub-group-size} specifies the maximum size of a group of input
sections handled by one stub section.  Since branch offsets are signed,
a stub section may serve two groups of input sections, one group before
the stub section, and one group after it.  However, when using
conditional branches that require stubs, it may be better (for branch
prediction) that stub sections only serve one group of input sections.
A negative value for @samp{N} chooses this scheme, ensuring that
branches to stubs always use a negative offset.  Two special values of
@samp{N} are recognized, @samp{1} and @samp{-1}.  These both instruct
@command{ld} to automatically size input section groups for the branch types
detected, with the same behaviour regarding stub placement as other
positive or negative values of @samp{N} respectively.

Note that @samp{--stub-group-size} does not split input sections.  A
single input section larger than the group size specified will of course
create a larger group (of one section).  If input sections are too
large, it may not be possible for a branch to reach its stub.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset M68K
@ifclear GENERIC
@raisesections
@end ifclear

@node M68K
@section @command{ld} and the Motorola 68K family

@cindex Motorola 68K GOT generation
@kindex --got=@var{type}
The @samp{--got=@var{type}} option lets you choose the GOT generation scheme.
The choices are @samp{single}, @samp{negative}, @samp{multigot} and
@samp{target}.  When @samp{target} is selected the linker chooses
the default GOT generation scheme for the current target.
@samp{single} tells the linker to generate a single GOT with
entries only at non-negative offsets.
@samp{negative} instructs the linker to generate a single GOT with
entries at both negative and positive offsets.  Not all environments
support such GOTs.
@samp{multigot} allows the linker to generate several GOTs in the
output file.  All GOT references from a single input object
file access the same GOT, but references from different input object
files might access different GOTs.  Not all environments support such GOTs.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset MIPS
@ifclear GENERIC
@raisesections
@end ifclear

@node MIPS
@section @command{ld} and the MIPS family

@cindex MIPS microMIPS instruction choice selection
@kindex --insn32
@kindex --no-insn32
The @samp{--insn32} and @samp{--no-insn32} options control the choice of
microMIPS instructions used in code generated by the linker, such as that
in the PLT or lazy binding stubs, or in relaxation.  If @samp{--insn32} is
used, then the linker only uses 32-bit instruction encodings.  By default
or if @samp{--no-insn32} is used, all instruction encodings are used,
including 16-bit ones where possible.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset MMIX
@ifclear GENERIC
@raisesections
@end ifclear

@node MMIX
@section @code{ld} and MMIX
For MMIX, there is a choice of generating @code{ELF} object files or
@code{mmo} object files when linking.  The simulator @code{mmix}
understands the @code{mmo} format.  The binutils @code{objcopy} utility
can translate between the two formats.

There is one special section, the @samp{.MMIX.reg_contents} section.
Contents in this section is assumed to correspond to that of global
registers, and symbols referring to it are translated to special symbols,
equal to registers.  In a final link, the start address of the
@samp{.MMIX.reg_contents} section corresponds to the first allocated
global register multiplied by 8.  Register @code{$255} is not included in
this section; it is always set to the program entry, which is at the
symbol @code{Main} for @code{mmo} files.

Global symbols with the prefix @code{__.MMIX.start.}, for example
@code{__.MMIX.start..text} and @code{__.MMIX.start..data} are special.
The default linker script uses these to set the default start address
of a section.

Initial and trailing multiples of zero-valued 32-bit words in a section,
are left out from an mmo file.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset MSP430
@ifclear GENERIC
@raisesections
@end ifclear

@node  MSP430
@section @code{ld} and MSP430
For the MSP430 it is possible to select the MPU architecture.  The flag @samp{-m [mpu type]}
will select an appropriate linker script for selected MPU type.  (To get a list of known MPUs
just pass @samp{-m help} option to the linker).

@cindex MSP430 extra sections
The linker will recognize some extra sections which are MSP430 specific:

@table @code
@item @samp{.vectors}
Defines a portion of ROM where interrupt vectors located.

@item @samp{.bootloader}
Defines the bootloader portion of the ROM (if applicable).  Any code
in this section will be uploaded to the MPU.

@item @samp{.infomem}
Defines an information memory section (if applicable).  Any code in
this section will be uploaded to the MPU.

@item @samp{.infomemnobits}
This is the same as the @samp{.infomem} section except that any code
in this section will not be uploaded to the MPU.

@item @samp{.noinit}
Denotes a portion of RAM located above @samp{.bss} section.

The last two sections are used by gcc.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset NDS32
@ifclear GENERIC
@raisesections
@end ifclear

@node NDS32
@section @code{ld} and NDS32
@kindex relaxing on NDS32
For NDS32, there are some options to select relaxation behavior.  The linker
relaxes objects according to these options.

@table @code
@item @samp{--m[no-]fp-as-gp}
Disable/enable fp-as-gp relaxation.

@item @samp{--mexport-symbols=FILE}
Exporting symbols and their address into FILE as linker script.

@item @samp{--m[no-]ex9}
Disable/enable link-time EX9 relaxation.

@item @samp{--mexport-ex9=FILE}
Export the EX9 table after linking.

@item @samp{--mimport-ex9=FILE}
Import the Ex9 table for EX9 relaxation.

@item @samp{--mupdate-ex9}
Update the existing EX9 table.

@item @samp{--mex9-limit=NUM}
Maximum number of entries in the ex9 table.

@item @samp{--mex9-loop-aware}
Avoid generating the EX9 instruction inside the loop.

@item @samp{--m[no-]ifc}
Disable/enable the link-time IFC optimization.

@item @samp{--mifc-loop-aware}
Avoid generating the IFC instruction inside the loop.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset NIOSII
@ifclear GENERIC
@raisesections
@end ifclear

@node Nios II
@section @command{ld} and the Altera Nios II
@cindex Nios II call relaxation
@kindex --relax on Nios II

Call and immediate jump instructions on Nios II processors are limited to
transferring control to addresses in the same 256MB memory segment,
which may result in @command{ld} giving
@samp{relocation truncated to fit} errors with very large programs.
The command-line option @option{--relax} enables the generation of
trampolines that can access the entire 32-bit address space for calls
outside the normal @code{call} and @code{jmpi} address range.  These
trampolines are inserted at section boundaries, so may not themselves
be reachable if an input section and its associated call trampolines are
larger than 256MB.

The @option{--relax} option is enabled by default unless @option{-r}
is also specified.  You can disable trampoline generation by using the
@option{--no-relax} linker option.  You can also disable this optimization
locally by using the @samp{set .noat} directive in assembly-language
source files, as the linker-inserted trampolines use the @code{at}
register as a temporary.

Note that the linker @option{--relax} option is independent of assembler
relaxation options, and that using the GNU assembler's @option{-relax-all}
option interferes with the linker's more selective call instruction relaxation.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset POWERPC
@ifclear GENERIC
@raisesections
@end ifclear

@node PowerPC ELF32
@section @command{ld} and PowerPC 32-bit ELF Support
@cindex PowerPC long branches
@kindex --relax on PowerPC
Branches on PowerPC processors are limited to a signed 26-bit
displacement, which may result in @command{ld} giving
@samp{relocation truncated to fit} errors with very large programs.
@samp{--relax} enables the generation of trampolines that can access
the entire 32-bit address space.  These trampolines are inserted at
section boundaries, so may not themselves be reachable if an input
section exceeds 33M in size.  You may combine @samp{-r} and
@samp{--relax} to add trampolines in a partial link.  In that case
both branches to undefined symbols and inter-section branches are also
considered potentially out of range, and trampolines inserted.

@cindex PowerPC ELF32 options
@table @option
@cindex PowerPC PLT
@kindex --bss-plt
@item --bss-plt
Current PowerPC GCC accepts a @samp{-msecure-plt} option that
generates code capable of using a newer PLT and GOT layout that has
the security advantage of no executable section ever needing to be
writable and no writable section ever being executable.  PowerPC
@command{ld} will generate this layout, including stubs to access the
PLT, if all input files (including startup and static libraries) were
compiled with @samp{-msecure-plt}.  @samp{--bss-plt} forces the old
BSS PLT (and GOT layout) which can give slightly better performance.

@kindex --secure-plt
@item --secure-plt
@command{ld} will use the new PLT and GOT layout if it is linking new
@samp{-fpic} or @samp{-fPIC} code, but does not do so automatically
when linking non-PIC code.  This option requests the new PLT and GOT
layout.  A warning will be given if some object file requires the old
style BSS PLT.

@cindex PowerPC GOT
@kindex --sdata-got
@item --sdata-got
The new secure PLT and GOT are placed differently relative to other
sections compared to older BSS PLT and GOT placement.  The location of
@code{.plt} must change because the new secure PLT is an initialized
section while the old PLT is uninitialized.  The reason for the
@code{.got} change is more subtle:  The new placement allows
@code{.got} to be read-only in applications linked with
@samp{-z relro -z now}.  However, this placement means that
@code{.sdata} cannot always be used in shared libraries, because the
PowerPC ABI accesses @code{.sdata} in shared libraries from the GOT
pointer.  @samp{--sdata-got} forces the old GOT placement.  PowerPC
GCC doesn't use @code{.sdata} in shared libraries, so this option is
really only useful for other compilers that may do so.

@cindex PowerPC stub symbols
@kindex --emit-stub-syms
@item --emit-stub-syms
This option causes @command{ld} to label linker stubs with a local
symbol that encodes the stub type and destination.

@cindex PowerPC TLS optimization
@kindex --no-tls-optimize
@item --no-tls-optimize
PowerPC @command{ld} normally performs some optimization of code
sequences used to access Thread-Local Storage.  Use this option to
disable the optimization.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset POWERPC64
@ifclear GENERIC
@raisesections
@end ifclear

@node PowerPC64 ELF64
@section @command{ld} and PowerPC64 64-bit ELF Support

@cindex PowerPC64 ELF64 options
@table @option
@cindex PowerPC64 stub grouping
@kindex --stub-group-size
@item --stub-group-size
Long branch stubs, PLT call stubs  and TOC adjusting stubs are placed
by @command{ld} in stub sections located between groups of input sections.
@samp{--stub-group-size} specifies the maximum size of a group of input
sections handled by one stub section.  Since branch offsets are signed,
a stub section may serve two groups of input sections, one group before
the stub section, and one group after it.  However, when using
conditional branches that require stubs, it may be better (for branch
prediction) that stub sections only serve one group of input sections.
A negative value for @samp{N} chooses this scheme, ensuring that
branches to stubs always use a negative offset.  Two special values of
@samp{N} are recognized, @samp{1} and @samp{-1}.  These both instruct
@command{ld} to automatically size input section groups for the branch types
detected, with the same behaviour regarding stub placement as other
positive or negative values of @samp{N} respectively.

Note that @samp{--stub-group-size} does not split input sections.  A
single input section larger than the group size specified will of course
create a larger group (of one section).  If input sections are too
large, it may not be possible for a branch to reach its stub.

@cindex PowerPC64 stub symbols
@kindex --emit-stub-syms
@item --emit-stub-syms
This option causes @command{ld} to label linker stubs with a local
symbol that encodes the stub type and destination.

@cindex PowerPC64 dot symbols
@kindex --dotsyms
@kindex --no-dotsyms
@item --dotsyms, --no-dotsyms
These two options control how @command{ld} interprets version patterns
in a version script.  Older PowerPC64 compilers emitted both a
function descriptor symbol with the same name as the function, and a
code entry symbol with the name prefixed by a dot (@samp{.}).  To
properly version a function @samp{foo}, the version script thus needs
to control both @samp{foo} and @samp{.foo}.  The option
@samp{--dotsyms}, on by default, automatically adds the required
dot-prefixed patterns.  Use @samp{--no-dotsyms} to disable this
feature.

@cindex PowerPC64 TLS optimization
@kindex --no-tls-optimize
@item --no-tls-optimize
PowerPC64 @command{ld} normally performs some optimization of code
sequences used to access Thread-Local Storage.  Use this option to
disable the optimization.

@cindex PowerPC64 OPD optimization
@kindex --no-opd-optimize
@item --no-opd-optimize
PowerPC64 @command{ld} normally removes @code{.opd} section entries
corresponding to deleted link-once functions, or functions removed by
the action of @samp{--gc-sections} or linker script @code{/DISCARD/}.
Use this option to disable @code{.opd} optimization.

@cindex PowerPC64 OPD spacing
@kindex --non-overlapping-opd
@item --non-overlapping-opd
Some PowerPC64 compilers have an option to generate compressed
@code{.opd} entries spaced 16 bytes apart, overlapping the third word,
the static chain pointer (unused in C) with the first word of the next
entry.  This option expands such entries to the full 24 bytes.

@cindex PowerPC64 TOC optimization
@kindex --no-toc-optimize
@item --no-toc-optimize
PowerPC64 @command{ld} normally removes unused @code{.toc} section
entries.  Such entries are detected by examining relocations that
reference the TOC in code sections.  A reloc in a deleted code section
marks a TOC word as unneeded, while a reloc in a kept code section
marks a TOC word as needed.  Since the TOC may reference itself, TOC
relocs are also examined.  TOC words marked as both needed and
unneeded will of course be kept.  TOC words without any referencing
reloc are assumed to be part of a multi-word entry, and are kept or
discarded as per the nearest marked preceding word.  This works
reliably for compiler generated code, but may be incorrect if assembly
code is used to insert TOC entries.  Use this option to disable the
optimization.

@cindex PowerPC64 multi-TOC
@kindex --no-multi-toc
@item --no-multi-toc
If given any toc option besides @code{-mcmodel=medium} or
@code{-mcmodel=large}, PowerPC64 GCC generates code for a TOC model
where TOC
entries are accessed with a 16-bit offset from r2.  This limits the
total TOC size to 64K.  PowerPC64 @command{ld} extends this limit by
grouping code sections such that each group uses less than 64K for its
TOC entries, then inserts r2 adjusting stubs between inter-group
calls.  @command{ld} does not split apart input sections, so cannot
help if a single input file has a @code{.toc} section that exceeds
64K, most likely from linking multiple files with @command{ld -r}.
Use this option to turn off this feature.

@cindex PowerPC64 TOC sorting
@kindex --no-toc-sort
@item --no-toc-sort
By default, @command{ld} sorts TOC sections so that those whose file
happens to have a section called @code{.init} or @code{.fini} are
placed first, followed by TOC sections referenced by code generated
with PowerPC64 gcc's @code{-mcmodel=small}, and lastly TOC sections
referenced only by code generated with PowerPC64 gcc's
@code{-mcmodel=medium} or @code{-mcmodel=large} options.  Doing this
results in better TOC grouping for multi-TOC.  Use this option to turn
off this feature.

@cindex PowerPC64 PLT stub alignment
@kindex --plt-align
@kindex --no-plt-align
@item --plt-align
@itemx --no-plt-align
Use these options to control whether individual PLT call stubs are
padded so that they don't cross a 32-byte boundary, or to the
specified power of two boundary when using @code{--plt-align=}.  Note
that this isn't alignment in the usual sense.  By default PLT call
stubs are packed tightly.

@cindex PowerPC64 PLT call stub static chain
@kindex --plt-static-chain
@kindex --no-plt-static-chain
@item --plt-static-chain
@itemx --no-plt-static-chain
Use these options to control whether PLT call stubs load the static
chain pointer (r11).  @code{ld} defaults to not loading the static
chain since there is never any need to do so on a PLT call.

@cindex PowerPC64 PLT call stub thread safety
@kindex --plt-thread-safe
@kindex --no-plt-thread-safe
@item --plt-thread-safe
@itemx --no-thread-safe
With power7's weakly ordered memory model, it is possible when using
lazy binding for ld.so to update a plt entry in one thread and have
another thread see the individual plt entry words update in the wrong
order, despite ld.so carefully writing in the correct order and using
memory write barriers.  To avoid this we need some sort of read
barrier in the call stub, or use LD_BIND_NOW=1.  By default, @code{ld}
looks for calls to commonly used functions that create threads, and if
seen, adds the necessary barriers.  Use these options to change the
default behaviour.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset SPU
@ifclear GENERIC
@raisesections
@end ifclear

@node SPU ELF
@section @command{ld} and SPU ELF Support

@cindex SPU ELF options
@table @option

@cindex SPU plugins
@kindex --plugin
@item --plugin
This option marks an executable as a PIC plugin module.

@cindex SPU overlays
@kindex --no-overlays
@item --no-overlays
Normally, @command{ld} recognizes calls to functions within overlay
regions, and redirects such calls to an overlay manager via a stub.
@command{ld} also provides a built-in overlay manager.  This option
turns off all this special overlay handling.

@cindex SPU overlay stub symbols
@kindex --emit-stub-syms
@item --emit-stub-syms
This option causes @command{ld} to label overlay stubs with a local
symbol that encodes the stub type and destination.

@cindex SPU extra overlay stubs
@kindex --extra-overlay-stubs
@item --extra-overlay-stubs
This option causes @command{ld} to add overlay call stubs on all
function calls out of overlay regions.  Normally stubs are not added
on calls to non-overlay regions.

@cindex SPU local store size
@kindex --local-store=lo:hi
@item --local-store=lo:hi
@command{ld} usually checks that a final executable for SPU fits in
the address range 0 to 256k.  This option may be used to change the
range.  Disable the check entirely with @option{--local-store=0:0}.

@cindex SPU
@kindex --stack-analysis
@item --stack-analysis
SPU local store space is limited.  Over-allocation of stack space
unnecessarily limits space available for code and data, while
under-allocation results in runtime failures.  If given this option,
@command{ld} will provide an estimate of maximum stack usage.
@command{ld} does this by examining symbols in code sections to
determine the extents of functions, and looking at function prologues
for stack adjusting instructions.  A call-graph is created by looking
for relocations on branch instructions.  The graph is then searched
for the maximum stack usage path.  Note that this analysis does not
find calls made via function pointers, and does not handle recursion
and other cycles in the call graph.  Stack usage may be
under-estimated if your code makes such calls.  Also, stack usage for
dynamic allocation, e.g. alloca, will not be detected.  If a link map
is requested, detailed information about each function's stack usage
and calls will be given.

@cindex SPU
@kindex --emit-stack-syms
@item --emit-stack-syms
This option, if given along with @option{--stack-analysis} will result
in @command{ld} emitting stack sizing symbols for each function.
These take the form @code{__stack_<function_name>} for global
functions, and @code{__stack_<number>_<function_name>} for static
functions.  @code{<number>} is the section id in hex.  The value of
such symbols is the stack requirement for the corresponding function.
The symbol size will be zero, type @code{STT_NOTYPE}, binding
@code{STB_LOCAL}, and section @code{SHN_ABS}.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset TICOFF
@ifclear GENERIC
@raisesections
@end ifclear

@node TI COFF
@section @command{ld}'s Support for Various TI COFF Versions
@cindex TI COFF versions
@kindex --format=@var{version}
The @samp{--format} switch allows selection of one of the various
TI COFF versions.  The latest of this writing is 2; versions 0 and 1 are
also supported.  The TI COFF versions also vary in header byte-order
format; @command{ld} will read any version or byte order, but the output
header format depends on the default specified by the specific target.

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset WIN32
@ifclear GENERIC
@raisesections
@end ifclear

@node WIN32
@section @command{ld} and WIN32 (cygwin/mingw)

This section describes some of the win32 specific @command{ld} issues.
See @ref{Options,,Command Line Options} for detailed description of the
command line options mentioned here.

@table @emph
@cindex import libraries
@item import libraries
The standard Windows linker creates and uses so-called import
libraries, which contains information for linking to dll's.  They are
regular static archives and are handled as any other static
archive.  The cygwin and mingw ports of @command{ld} have specific
support for creating such libraries provided with the
@samp{--out-implib} command line option.

@item   exporting DLL symbols
@cindex exporting DLL symbols
The cygwin/mingw @command{ld} has several ways to export symbols for dll's.

@table @emph
@item   using auto-export functionality
@cindex using auto-export functionality
By default @command{ld} exports symbols with the auto-export functionality,
which is controlled by the following command line options:

@itemize
@item --export-all-symbols   [This is the default]
@item --exclude-symbols
@item --exclude-libs
@item --exclude-modules-for-implib
@item --version-script
@end itemize

When auto-export is in operation, @command{ld} will export all the non-local
(global and common) symbols it finds in a DLL, with the exception of a few
symbols known to belong to the system's runtime and libraries.  As it will
often not be desirable to export all of a DLL's symbols, which may include
private functions that are not part of any public interface, the command-line
options listed above may be used to filter symbols out from the list for
exporting.  The @samp{--output-def} option can be used in order to see the
final list of exported symbols with all exclusions taken into effect.

If @samp{--export-all-symbols} is not given explicitly on the
command line, then the default auto-export behavior will be @emph{disabled}
if either of the following are true:

@itemize
@item A DEF file is used.
@item Any symbol in any object file was marked with the __declspec(dllexport) attribute.
@end itemize

@item   using a DEF file
@cindex using a DEF file
Another way of exporting symbols is using a DEF file.  A DEF file is
an ASCII file containing definitions of symbols which should be
exported when a dll is created.  Usually it is named @samp{<dll
name>.def} and is added as any other object file to the linker's
command line.  The file's name must end in @samp{.def} or @samp{.DEF}.

@example
gcc -o <output> <objectfiles> <dll name>.def
@end example

Using a DEF file turns off the normal auto-export behavior, unless the
@samp{--export-all-symbols} option is also used.

Here is an example of a DEF file for a shared library called @samp{xyz.dll}:

@example
LIBRARY "xyz.dll" BASE=0x20000000

EXPORTS
foo
bar
_bar = bar
another_foo = abc.dll.afoo
var1 DATA
doo = foo == foo2
eoo DATA == var1
@end example

This example defines a DLL with a non-default base address and seven
symbols in the export table. The third exported symbol @code{_bar} is an
alias for the second. The fourth symbol, @code{another_foo} is resolved
by "forwarding" to another module and treating it as an alias for
@code{afoo} exported from the DLL @samp{abc.dll}. The final symbol
@code{var1} is declared to be a data object. The @samp{doo} symbol in
export library is an alias of @samp{foo}, which gets the string name
in export table @samp{foo2}. The @samp{eoo} symbol is an data export
symbol, which gets in export table the name @samp{var1}.

The optional @code{LIBRARY <name>} command indicates the @emph{internal}
name of the output DLL. If @samp{<name>} does not include a suffix,
the default library suffix, @samp{.DLL} is appended.

When the .DEF file is used to build an application, rather than a
library, the @code{NAME <name>} command should be used instead of
@code{LIBRARY}. If @samp{<name>} does not include a suffix, the default
executable suffix, @samp{.EXE} is appended.

With either @code{LIBRARY <name>} or @code{NAME <name>} the optional
specification @code{BASE = <number>} may be used to specify a
non-default base address for the image.

If neither @code{LIBRARY <name>} nor  @code{NAME <name>} is specified,
or they specify an empty string, the internal name is the same as the
filename specified on the command line.

The complete specification of an export symbol is:

@example
EXPORTS
  ( (  ( <name1> [ = <name2> ] )
     | ( <name1> = <module-name> . <external-name>))
  [ @@ <integer> ] [NONAME] [DATA] [CONSTANT] [PRIVATE] [== <name3>] ) *
@end example

Declares @samp{<name1>} as an exported symbol from the DLL, or declares
@samp{<name1>} as an exported alias for @samp{<name2>}; or declares
@samp{<name1>} as a "forward" alias for the symbol
@samp{<external-name>} in the DLL @samp{<module-name>}.
Optionally, the symbol may be exported by the specified ordinal
@samp{<integer>} alias. The optional @samp{<name3>} is the to be used
string in import/export table for the symbol.

The optional keywords that follow the declaration indicate:

@code{NONAME}: Do not put the symbol name in the DLL's export table.  It
will still be exported by its ordinal alias (either the value specified
by the .def specification or, otherwise, the value assigned by the
linker). The symbol name, however, does remain visible in the import
library (if any), unless @code{PRIVATE} is also specified.

@code{DATA}: The symbol is a variable or object, rather than a function.
The import lib will export only an indirect reference to @code{foo} as
the symbol @code{_imp__foo} (ie, @code{foo} must be resolved as
@code{*_imp__foo}).

@code{CONSTANT}: Like @code{DATA}, but put the undecorated @code{foo} as
well as @code{_imp__foo} into the import library. Both refer to the
read-only import address table's pointer to the variable, not to the
variable itself. This can be dangerous. If the user code fails to add
the @code{dllimport} attribute and also fails to explicitly add the
extra indirection that the use of the attribute enforces, the
application will behave unexpectedly.

@code{PRIVATE}: Put the symbol in the DLL's export table, but do not put
it into the static import library used to resolve imports at link time. The
symbol can still be imported using the @code{LoadLibrary/GetProcAddress}
API at runtime or by by using the GNU ld extension of linking directly to
the DLL without an import library.

See ld/deffilep.y in the binutils sources for the full specification of
other DEF file statements

@cindex creating a DEF file
While linking a shared dll, @command{ld} is able to create a DEF file
with the @samp{--output-def <file>} command line option.

@item   Using decorations
@cindex Using decorations
Another way of marking symbols for export is to modify the source code
itself, so that when building the DLL each symbol to be exported is
declared as:

@example
__declspec(dllexport) int a_variable
__declspec(dllexport) void a_function(int with_args)
@end example

All such symbols will be exported from the DLL.  If, however,
any of the object files in the DLL contain symbols decorated in
this way, then the normal auto-export behavior is disabled, unless
the @samp{--export-all-symbols} option is also used.

Note that object files that wish to access these symbols must @emph{not}
decorate them with dllexport.  Instead, they should use dllimport,
instead:

@example
__declspec(dllimport) int a_variable
__declspec(dllimport) void a_function(int with_args)
@end example

This complicates the structure of library header files, because
when included by the library itself the header must declare the
variables and functions as dllexport, but when included by client
code the header must declare them as dllimport.  There are a number
of idioms that are typically used to do this; often client code can
omit the __declspec() declaration completely.  See
@samp{--enable-auto-import} and @samp{automatic data imports} for more
information.
@end table

@cindex automatic data imports
@item automatic data imports
The standard Windows dll format supports data imports from dlls only
by adding special decorations (dllimport/dllexport), which let the
compiler produce specific assembler instructions to deal with this
issue.  This increases the effort necessary to port existing Un*x
code to these platforms, especially for large
c++ libraries and applications.  The auto-import feature, which was
initially provided by Paul Sokolovsky, allows one to omit the
decorations to achieve a behavior that conforms to that on POSIX/Un*x
platforms. This feature is enabled with the @samp{--enable-auto-import}
command-line option, although it is enabled by default on cygwin/mingw.
The @samp{--enable-auto-import} option itself now serves mainly to
suppress any warnings that are ordinarily emitted when linked objects
trigger the feature's use.

auto-import of variables does not always work flawlessly without
additional assistance.  Sometimes, you will see this message

"variable '<var>' can't be auto-imported. Please read the
documentation for ld's @code{--enable-auto-import} for details."

The @samp{--enable-auto-import} documentation explains why this error
occurs, and several methods that can be used to overcome this difficulty.
One of these methods is the @emph{runtime pseudo-relocs} feature, described
below.

@cindex runtime pseudo-relocation
For complex variables imported from DLLs (such as structs or classes),
object files typically contain a base address for the variable and an
offset (@emph{addend}) within the variable--to specify a particular
field or public member, for instance.  Unfortunately, the runtime loader used
in win32 environments is incapable of fixing these references at runtime
without the additional information supplied by dllimport/dllexport decorations.
The standard auto-import feature described above is unable to resolve these
references.

The @samp{--enable-runtime-pseudo-relocs} switch allows these references to
be resolved without error, while leaving the task of adjusting the references
themselves (with their non-zero addends) to specialized code provided by the
runtime environment.  Recent versions of the cygwin and mingw environments and
compilers provide this runtime support; older versions do not.  However, the
support is only necessary on the developer's platform; the compiled result will
run without error on an older system.

@samp{--enable-runtime-pseudo-relocs} is not the default; it must be explicitly
enabled as needed.

@cindex direct linking to a dll
@item direct linking to a dll
The cygwin/mingw ports of @command{ld} support the direct linking,
including data symbols, to a dll without the usage of any import
libraries.  This is much faster and uses much less memory than does the
traditional import library method, especially when linking large
libraries or applications.  When @command{ld} creates an import lib, each
function or variable exported from the dll is stored in its own bfd, even
though a single bfd could contain many exports.  The overhead involved in
storing, loading, and processing so many bfd's is quite large, and explains the
tremendous time, memory, and storage needed to link against particularly
large or complex libraries when using import libs.

Linking directly to a dll uses no extra command-line switches other than
@samp{-L} and @samp{-l}, because @command{ld} already searches for a number
of names to match each library.  All that is needed from the developer's
perspective is an understanding of this search, in order to force ld to
select the dll instead of an import library.


For instance, when ld is called with the argument @samp{-lxxx} it will attempt
to find, in the first directory of its search path,

@example
libxxx.dll.a
xxx.dll.a
libxxx.a
xxx.lib
cygxxx.dll (*)
libxxx.dll
xxx.dll
@end example

before moving on to the next directory in the search path.

(*) Actually, this is not @samp{cygxxx.dll} but in fact is @samp{<prefix>xxx.dll},
where @samp{<prefix>} is set by the @command{ld} option
@samp{--dll-search-prefix=<prefix>}. In the case of cygwin, the standard gcc spec
file includes @samp{--dll-search-prefix=cyg}, so in effect we actually search for
@samp{cygxxx.dll}.

Other win32-based unix environments, such as mingw or pw32, may use other
@samp{<prefix>}es, although at present only cygwin makes use of this feature.  It
was originally intended to help avoid name conflicts among dll's built for the
various win32/un*x environments, so that (for example) two versions of a zlib dll
could coexist on the same machine.

The generic cygwin/mingw path layout uses a @samp{bin} directory for
applications and dll's and a @samp{lib} directory for the import
libraries (using cygwin nomenclature):

@example
bin/
	cygxxx.dll
lib/
	libxxx.dll.a   (in case of dll's)
	libxxx.a       (in case of static archive)
@end example

Linking directly to a dll without using the import library can be
done two ways:

1. Use the dll directly by adding the @samp{bin} path to the link line
@example
gcc -Wl,-verbose  -o a.exe -L../bin/ -lxxx
@end example

However, as the dll's often have version numbers appended to their names
(@samp{cygncurses-5.dll}) this will often fail, unless one specifies
@samp{-L../bin -lncurses-5} to include the version.  Import libs are generally
not versioned, and do not have this difficulty.

2. Create a symbolic link from the dll to a file in the @samp{lib}
directory according to the above mentioned search pattern.  This
should be used to avoid unwanted changes in the tools needed for
making the app/dll.

@example
ln -s bin/cygxxx.dll lib/[cyg|lib|]xxx.dll[.a]
@end example

Then you can link without any make environment changes.

@example
gcc -Wl,-verbose  -o a.exe -L../lib/ -lxxx
@end example

This technique also avoids the version number problems, because the following is
perfectly legal

@example
bin/
	cygxxx-5.dll
lib/
	libxxx.dll.a -> ../bin/cygxxx-5.dll
@end example

Linking directly to a dll without using an import lib will work
even when auto-import features are exercised, and even when
@samp{--enable-runtime-pseudo-relocs} is used.

Given the improvements in speed and memory usage, one might justifiably
wonder why import libraries are used at all.  There are three reasons:

1. Until recently, the link-directly-to-dll functionality did @emph{not}
work with auto-imported data.

2. Sometimes it is necessary to include pure static objects within the
import library (which otherwise contains only bfd's for indirection
symbols that point to the exports of a dll).  Again, the import lib
for the cygwin kernel makes use of this ability, and it is not
possible to do this without an import lib.

3. Symbol aliases can only be resolved using an import lib.  This is
critical when linking against OS-supplied dll's (eg, the win32 API)
in which symbols are usually exported as undecorated aliases of their
stdcall-decorated assembly names.

So, import libs are not going away.  But the ability to replace
true import libs with a simple symbolic link to (or a copy of)
a dll, in many cases, is a useful addition to the suite of tools
binutils makes available to the win32 developer.  Given the
massive improvements in memory requirements during linking, storage
requirements, and linking speed, we expect that many developers
will soon begin to use this feature whenever possible.

@item symbol aliasing
@table @emph
@item adding additional names
Sometimes, it is useful to export symbols with additional names.
A symbol @samp{foo} will be exported as @samp{foo}, but it can also be
exported as @samp{_foo} by using special directives in the DEF file
when creating the dll.  This will affect also the optional created
import library.  Consider the following DEF file:

@example
LIBRARY "xyz.dll" BASE=0x61000000

EXPORTS
foo
_foo = foo
@end example

The line @samp{_foo = foo} maps the symbol @samp{foo} to @samp{_foo}.

Another method for creating a symbol alias is to create it in the
source code using the "weak" attribute:

@example
void foo () @{ /* Do something.  */; @}
void _foo () __attribute__ ((weak, alias ("foo")));
@end example

See the gcc manual for more information about attributes and weak
symbols.

@item renaming symbols
Sometimes it is useful to rename exports.  For instance, the cygwin
kernel does this regularly.  A symbol @samp{_foo} can be exported as
@samp{foo} but not as @samp{_foo} by using special directives in the
DEF file. (This will also affect the import library, if it is
created).  In the following example:

@example
LIBRARY "xyz.dll" BASE=0x61000000

EXPORTS
_foo = foo
@end example

The line @samp{_foo = foo} maps the exported symbol @samp{foo} to
@samp{_foo}.
@end table

Note: using a DEF file disables the default auto-export behavior,
unless the @samp{--export-all-symbols} command line option is used.
If, however, you are trying to rename symbols, then you should list
@emph{all} desired exports in the DEF file, including the symbols
that are not being renamed, and do @emph{not} use the
@samp{--export-all-symbols} option.  If you list only the
renamed symbols in the DEF file, and use @samp{--export-all-symbols}
to handle the other symbols, then the both the new names @emph{and}
the original names for the renamed symbols will be exported.
In effect, you'd be aliasing those symbols, not renaming them,
which is probably not what you wanted.

@cindex weak externals
@item weak externals
The Windows object format, PE, specifies a form of weak symbols called
weak externals.  When a weak symbol is linked and the symbol is not
defined, the weak symbol becomes an alias for some other symbol.  There
are three variants of weak externals:
@itemize
@item Definition is searched for in objects and libraries, historically
called lazy externals.
@item Definition is searched for only in other objects, not in libraries.
This form is not presently implemented.
@item No search; the symbol is an alias.  This form is not presently
implemented.
@end itemize
As a GNU extension, weak symbols that do not specify an alternate symbol
are supported.  If the symbol is undefined when linking, the symbol
uses a default value.

@cindex aligned common symbols
@item aligned common symbols
As a GNU extension to the PE file format, it is possible to specify the
desired alignment for a common symbol.  This information is conveyed from
the assembler or compiler to the linker by means of GNU-specific commands
carried in the object file's @samp{.drectve} section, which are recognized
by @command{ld} and respected when laying out the common symbols.  Native
tools will be able to process object files employing this GNU extension,
but will fail to respect the alignment instructions, and may issue noisy
warnings about unknown linker directives.

@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifset XTENSA
@ifclear GENERIC
@raisesections
@end ifclear

@node Xtensa
@section @code{ld} and Xtensa Processors

@cindex Xtensa processors
The default @command{ld} behavior for Xtensa processors is to interpret
@code{SECTIONS} commands so that lists of explicitly named sections in a
specification with a wildcard file will be interleaved when necessary to
keep literal pools within the range of PC-relative load offsets.  For
example, with the command:

@smallexample
SECTIONS
@{
  .text : @{
    *(.literal .text)
  @}
@}
@end smallexample

@noindent
@command{ld} may interleave some of the @code{.literal}
and @code{.text} sections from different object files to ensure that the
literal pools are within the range of PC-relative load offsets.  A valid
interleaving might place the @code{.literal} sections from an initial
group of files followed by the @code{.text} sections of that group of
files.  Then, the @code{.literal} sections from the rest of the files
and the @code{.text} sections from the rest of the files would follow.

@cindex @option{--relax} on Xtensa
@cindex relaxing on Xtensa
Relaxation is enabled by default for the Xtensa version of @command{ld} and
provides two important link-time optimizations.  The first optimization
is to combine identical literal values to reduce code size.  A redundant
literal will be removed and all the @code{L32R} instructions that use it
will be changed to reference an identical literal, as long as the
location of the replacement literal is within the offset range of all
the @code{L32R} instructions.  The second optimization is to remove
unnecessary overhead from assembler-generated ``longcall'' sequences of
@code{L32R}/@code{CALLX@var{n}} when the target functions are within
range of direct @code{CALL@var{n}} instructions.

For each of these cases where an indirect call sequence can be optimized
to a direct call, the linker will change the @code{CALLX@var{n}}
instruction to a @code{CALL@var{n}} instruction, remove the @code{L32R}
instruction, and remove the literal referenced by the @code{L32R}
instruction if it is not used for anything else.  Removing the
@code{L32R} instruction always reduces code size but can potentially
hurt performance by changing the alignment of subsequent branch targets.
By default, the linker will always preserve alignments, either by
switching some instructions between 24-bit encodings and the equivalent
density instructions or by inserting a no-op in place of the @code{L32R}
instruction that was removed.  If code size is more important than
performance, the @option{--size-opt} option can be used to prevent the
linker from widening density instructions or inserting no-ops, except in
a few cases where no-ops are required for correctness.

The following Xtensa-specific command-line options can be used to
control the linker:

@cindex Xtensa options
@table @option
@item --size-opt
When optimizing indirect calls to direct calls, optimize for code size
more than performance.  With this option, the linker will not insert
no-ops or widen density instructions to preserve branch target
alignment.  There may still be some cases where no-ops are required to
preserve the correctness of the code.
@end table

@ifclear GENERIC
@lowersections
@end ifclear
@end ifset

@ifclear SingleFormat
@node BFD
@chapter BFD

@cindex back end
@cindex object file management
@cindex object formats available
@kindex objdump -i
The linker accesses object and archive files using the BFD libraries.
These libraries allow the linker to use the same routines to operate on
object files whatever the object file format.  A different object file
format can be supported simply by creating a new BFD back end and adding
it to the library.  To conserve runtime memory, however, the linker and
associated tools are usually configured to support only a subset of the
object file formats available.  You can use @code{objdump -i}
(@pxref{objdump,,objdump,binutils.info,The GNU Binary Utilities}) to
list all the formats available for your configuration.

@cindex BFD requirements
@cindex requirements for BFD
As with most implementations, BFD is a compromise between
several conflicting requirements. The major factor influencing
BFD design was efficiency: any time used converting between
formats is time which would not have been spent had BFD not
been involved. This is partly offset by abstraction payback; since
BFD simplifies applications and back ends, more time and care
may be spent optimizing algorithms for a greater speed.

One minor artifact of the BFD solution which you should bear in
mind is the potential for information loss.  There are two places where
useful information can be lost using the BFD mechanism: during
conversion and during output. @xref{BFD information loss}.

@menu
* BFD outline::                 How it works: an outline of BFD
@end menu

@node BFD outline
@section How It Works: An Outline of BFD
@cindex opening object files
@include bfdsumm.texi
@end ifclear

@node Reporting Bugs
@chapter Reporting Bugs
@cindex bugs in @command{ld}
@cindex reporting bugs in @command{ld}

Your bug reports play an essential role in making @command{ld} reliable.

Reporting a bug may help you by bringing a solution to your problem, or
it may not.  But in any case the principal function of a bug report is
to help the entire community by making the next version of @command{ld}
work better.  Bug reports are your contribution to the maintenance of
@command{ld}.

In order for a bug report to serve its purpose, you must include the
information that enables us to fix the bug.

@menu
* Bug Criteria::                Have you found a bug?
* Bug Reporting::               How to report bugs
@end menu

@node Bug Criteria
@section Have You Found a Bug?
@cindex bug criteria

If you are not sure whether you have found a bug, here are some guidelines:

@itemize @bullet
@cindex fatal signal
@cindex linker crash
@cindex crash of linker
@item
If the linker gets a fatal signal, for any input whatever, that is a
@command{ld} bug.  Reliable linkers never crash.

@cindex error on valid input
@item
If @command{ld} produces an error message for valid input, that is a bug.

@cindex invalid input
@item
If @command{ld} does not produce an error message for invalid input, that
may be a bug.  In the general case, the linker can not verify that
object files are correct.

@item
If you are an experienced user of linkers, your suggestions for
improvement of @command{ld} are welcome in any case.
@end itemize

@node Bug Reporting
@section How to Report Bugs
@cindex bug reports
@cindex @command{ld} bugs, reporting

A number of companies and individuals offer support for @sc{gnu}
products.  If you obtained @command{ld} from a support organization, we
recommend you contact that organization first.

You can find contact information for many support companies and
individuals in the file @file{etc/SERVICE} in the @sc{gnu} Emacs
distribution.

@ifset BUGURL
Otherwise, send bug reports for @command{ld} to
@value{BUGURL}.
@end ifset

The fundamental principle of reporting bugs usefully is this:
@strong{report all the facts}.  If you are not sure whether to state a
fact or leave it out, state it!

Often people omit facts because they think they know what causes the
problem and assume that some details do not matter.  Thus, you might
assume that the name of a symbol you use in an example does not
matter.  Well, probably it does not, but one cannot be sure.  Perhaps
the bug is a stray memory reference which happens to fetch from the
location where that name is stored in memory; perhaps, if the name
were different, the contents of that location would fool the linker
into doing the right thing despite the bug.  Play it safe and give a
specific, complete example.  That is the easiest thing for you to do,
and the most helpful.

Keep in mind that the purpose of a bug report is to enable us to fix
the bug if it is new to us.  Therefore, always write your bug reports
on the assumption that the bug has not been reported previously.

Sometimes people give a few sketchy facts and ask, ``Does this ring a
bell?''  This cannot help us fix a bug, so it is basically useless.  We
respond by asking for enough details to enable us to investigate.
You might as well expedite matters by sending them to begin with.

To enable us to fix the bug, you should include all these things:

@itemize @bullet
@item
The version of @command{ld}.  @command{ld} announces it if you start it with
the @samp{--version} argument.

Without this, we will not know whether there is any point in looking for
the bug in the current version of @command{ld}.

@item
Any patches you may have applied to the @command{ld} source, including any
patches made to the @code{BFD} library.

@item
The type of machine you are using, and the operating system name and
version number.

@item
What compiler (and its version) was used to compile @command{ld}---e.g.
``@code{gcc-2.7}''.

@item
The command arguments you gave the linker to link your example and
observe the bug.  To guarantee you will not omit something important,
list them all.  A copy of the Makefile (or the output from make) is
sufficient.

If we were to try to guess the arguments, we would probably guess wrong
and then we might not encounter the bug.

@item
A complete input file, or set of input files, that will reproduce the
bug.  It is generally most helpful to send the actual object files
provided that they are reasonably small.  Say no more than 10K.  For
bigger files you can either make them available by FTP or HTTP or else
state that you are willing to send the object file(s) to whomever
requests them.  (Note - your email will be going to a mailing list, so
we do not want to clog it up with large attachments).  But small
attachments are best.

If the source files were assembled using @code{gas} or compiled using
@code{gcc}, then it may be OK to send the source files rather than the
object files.  In this case, be sure to say exactly what version of
@code{gas} or @code{gcc} was used to produce the object files.  Also say
how @code{gas} or @code{gcc} were configured.

@item
A description of what behavior you observe that you believe is
incorrect.  For example, ``It gets a fatal signal.''

Of course, if the bug is that @command{ld} gets a fatal signal, then we
will certainly notice it.  But if the bug is incorrect output, we might
not notice unless it is glaringly wrong.  You might as well not give us
a chance to make a mistake.

Even if the problem you experience is a fatal signal, you should still
say so explicitly.  Suppose something strange is going on, such as, your
copy of @command{ld} is out of sync, or you have encountered a bug in the
C library on your system.  (This has happened!)  Your copy might crash
and ours would not.  If you told us to expect a crash, then when ours
fails to crash, we would know that the bug was not happening for us.  If
you had not told us to expect a crash, then we would not be able to draw
any conclusion from our observations.

@item
If you wish to suggest changes to the @command{ld} source, send us context
diffs, as generated by @code{diff} with the @samp{-u}, @samp{-c}, or
@samp{-p} option.  Always send diffs from the old file to the new file.
If you even discuss something in the @command{ld} source, refer to it by
context, not by line number.

The line numbers in our development sources will not match those in your
sources.  Your line numbers would convey no useful information to us.
@end itemize

Here are some things that are not necessary:

@itemize @bullet
@item
A description of the envelope of the bug.

Often people who encounter a bug spend a lot of time investigating
which changes to the input file will make the bug go away and which
changes will not affect it.

This is often time consuming and not very useful, because the way we
will find the bug is by running a single example under the debugger
with breakpoints, not by pure deduction from a series of examples.
We recommend that you save your time for something else.

Of course, if you can find a simpler example to report @emph{instead}
of the original one, that is a convenience for us.  Errors in the
output will be easier to spot, running under the debugger will take
less time, and so on.

However, simplification is not vital; if you do not want to do this,
report the bug anyway and send us the entire test case you used.

@item
A patch for the bug.

A patch for the bug does help us if it is a good one.  But do not omit
the necessary information, such as the test case, on the assumption that
a patch is all we need.  We might see problems with your patch and decide
to fix the problem another way, or we might not understand it at all.

Sometimes with a program as complicated as @command{ld} it is very hard to
construct an example that will make the program follow a certain path
through the code.  If you do not send us the example, we will not be
able to construct one, so we will not be able to verify that the bug is
fixed.

And if we cannot understand what bug you are trying to fix, or why your
patch should be an improvement, we will not install it.  A test case will
help us to understand.

@item
A guess about what the bug is or what it depends on.

Such guesses are usually wrong.  Even we cannot guess right about such
things without first using the debugger to find the facts.
@end itemize

@node MRI
@appendix MRI Compatible Script Files
@cindex MRI compatibility
To aid users making the transition to @sc{gnu} @command{ld} from the MRI
linker, @command{ld} can use MRI compatible linker scripts as an
alternative to the more general-purpose linker scripting language
described in @ref{Scripts}.  MRI compatible linker scripts have a much
simpler command set than the scripting language otherwise used with
@command{ld}.  @sc{gnu} @command{ld} supports the most commonly used MRI
linker commands; these commands are described here.

In general, MRI scripts aren't of much use with the @code{a.out} object
file format, since it only has three sections and MRI scripts lack some
features to make use of them.

You can specify a file containing an MRI-compatible script using the
@samp{-c} command-line option.

Each command in an MRI-compatible script occupies its own line; each
command line starts with the keyword that identifies the command (though
blank lines are also allowed for punctuation).  If a line of an
MRI-compatible script begins with an unrecognized keyword, @command{ld}
issues a warning message, but continues processing the script.

Lines beginning with @samp{*} are comments.

You can write these commands using all upper-case letters, or all
lower case; for example, @samp{chip} is the same as @samp{CHIP}.
The following list shows only the upper-case form of each command.

@table @code
@cindex @code{ABSOLUTE} (MRI)
@item ABSOLUTE @var{secname}
@itemx ABSOLUTE @var{secname}, @var{secname}, @dots{} @var{secname}
Normally, @command{ld} includes in the output file all sections from all
the input files.  However, in an MRI-compatible script, you can use the
@code{ABSOLUTE} command to restrict the sections that will be present in
your output program.  If the @code{ABSOLUTE} command is used at all in a
script, then only the sections named explicitly in @code{ABSOLUTE}
commands will appear in the linker output.  You can still use other
input sections (whatever you select on the command line, or using
@code{LOAD}) to resolve addresses in the output file.

@cindex @code{ALIAS} (MRI)
@item ALIAS @var{out-secname}, @var{in-secname}
Use this command to place the data from input section @var{in-secname}
in a section called @var{out-secname} in the linker output file.

@var{in-secname} may be an integer.

@cindex @code{ALIGN} (MRI)
@item ALIGN @var{secname} = @var{expression}
Align the section called @var{secname} to @var{expression}.  The
@var{expression} should be a power of two.

@cindex @code{BASE} (MRI)
@item BASE @var{expression}
Use the value of @var{expression} as the lowest address (other than
absolute addresses) in the output file.

@cindex @code{CHIP} (MRI)
@item CHIP @var{expression}
@itemx CHIP @var{expression}, @var{expression}
This command does nothing; it is accepted only for compatibility.

@cindex @code{END} (MRI)
@item END
This command does nothing whatever; it's only accepted for compatibility.

@cindex @code{FORMAT} (MRI)
@item FORMAT @var{output-format}
Similar to the @code{OUTPUT_FORMAT} command in the more general linker
language, but restricted to one of these output formats:

@enumerate
@item
S-records, if @var{output-format} is @samp{S}

@item
IEEE, if @var{output-format} is @samp{IEEE}

@item
COFF (the @samp{coff-m68k} variant in BFD), if @var{output-format} is
@samp{COFF}
@end enumerate

@cindex @code{LIST} (MRI)
@item LIST @var{anything}@dots{}
Print (to the standard output file) a link map, as produced by the
@command{ld} command-line option @samp{-M}.

The keyword @code{LIST} may be followed by anything on the
same line, with no change in its effect.

@cindex @code{LOAD} (MRI)
@item LOAD @var{filename}
@itemx LOAD @var{filename}, @var{filename}, @dots{} @var{filename}
Include one or more object file @var{filename} in the link; this has the
same effect as specifying @var{filename} directly on the @command{ld}
command line.

@cindex @code{NAME} (MRI)
@item NAME @var{output-name}
@var{output-name} is the name for the program produced by @command{ld}; the
MRI-compatible command @code{NAME} is equivalent to the command-line
option @samp{-o} or the general script language command @code{OUTPUT}.

@cindex @code{ORDER} (MRI)
@item ORDER @var{secname}, @var{secname}, @dots{} @var{secname}
@itemx ORDER @var{secname} @var{secname} @var{secname}
Normally, @command{ld} orders the sections in its output file in the
order in which they first appear in the input files.  In an MRI-compatible
script, you can override this ordering with the @code{ORDER} command.  The
sections you list with @code{ORDER} will appear first in your output
file, in the order specified.

@cindex @code{PUBLIC} (MRI)
@item PUBLIC @var{name}=@var{expression}
@itemx PUBLIC @var{name},@var{expression}
@itemx PUBLIC @var{name} @var{expression}
Supply a value (@var{expression}) for external symbol
@var{name} used in the linker input files.

@cindex @code{SECT} (MRI)
@item SECT @var{secname}, @var{expression}
@itemx SECT @var{secname}=@var{expression}
@itemx SECT @var{secname} @var{expression}
You can use any of these three forms of the @code{SECT} command to
specify the start address (@var{expression}) for section @var{secname}.
If you have more than one @code{SECT} statement for the same
@var{secname}, only the @emph{first} sets the start address.
@end table

@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi

@node LD Index
@unnumbered LD Index

@printindex cp

@tex
% I think something like @@colophon should be in texinfo.  In the
% meantime:
\long\def\colophon{\hbox to0pt{}\vfill
\centerline{The body of this manual is set in}
\centerline{\fontname\tenrm,}
\centerline{with headings in {\bf\fontname\tenbf}}
\centerline{and examples in {\tt\fontname\tentt}.}
\centerline{{\it\fontname\tenit\/} and}
\centerline{{\sl\fontname\tensl\/}}
\centerline{are used for emphasis.}\vfill}
\page\colophon
% Blame: doc@@cygnus.com, 28mar91.
@end tex

@bye
