754 lines
33 KiB
Plaintext
754 lines
33 KiB
Plaintext
|
This is Info file ld.info, produced by Makeinfo-1.64 from the input
|
|||
|
file ./ld.texinfo.
|
|||
|
|
|||
|
START-INFO-DIR-ENTRY
|
|||
|
* Ld: (ld). The GNU linker.
|
|||
|
END-INFO-DIR-ENTRY
|
|||
|
|
|||
|
This file documents the GNU linker LD.
|
|||
|
|
|||
|
Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software
|
|||
|
Foundation, Inc.
|
|||
|
|
|||
|
Permission is granted to make and distribute verbatim copies of this
|
|||
|
manual provided the copyright notice and this permission notice are
|
|||
|
preserved on all copies.
|
|||
|
|
|||
|
Permission is granted to copy and distribute modified versions of
|
|||
|
this manual under the conditions for verbatim copying, provided also
|
|||
|
that the entire resulting derived work is distributed under the terms
|
|||
|
of a permission notice identical to this one.
|
|||
|
|
|||
|
Permission is granted to copy and distribute translations of this
|
|||
|
manual into another language, under the above conditions for modified
|
|||
|
versions.
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Option Commands, Prev: Version Script, Up: Commands
|
|||
|
|
|||
|
Option Commands
|
|||
|
===============
|
|||
|
|
|||
|
The command language includes a number of other commands that you can
|
|||
|
use for specialized purposes. They are similar in purpose to
|
|||
|
command-line options.
|
|||
|
|
|||
|
`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 `CONSTRUCTORS' command
|
|||
|
tells the linker where this information should be placed. The
|
|||
|
`CONSTRUCTORS' command is ignored for other object file formats.
|
|||
|
|
|||
|
The symbol `__CTOR_LIST__' marks the start of the global
|
|||
|
constructors, and the symbol `__DTOR_LIST' marks the end. 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 GNU C++ calls constructors from a
|
|||
|
subroutine `__main'; a call to `__main' is automatically inserted
|
|||
|
into the startup code for `main'. GNU C++ runs destructors either
|
|||
|
by using `atexit', or directly from the function `exit'.
|
|||
|
|
|||
|
For object file formats such as `COFF' or `ELF' which support
|
|||
|
multiple sections, GNU C++ will normally arrange to put the
|
|||
|
addresses of global constructors and destructors into the `.ctors'
|
|||
|
and `.dtors' sections. Placing the following sequence into your
|
|||
|
linker script will build the sort of table which the GNU C++
|
|||
|
runtime code expects to see.
|
|||
|
|
|||
|
__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__ = .;
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
`FLOAT'
|
|||
|
`NOFLOAT'
|
|||
|
These keywords were used in some older linkers to request a
|
|||
|
particular math subroutine library. `ld' doesn't use the
|
|||
|
keywords, assuming instead that any necessary subroutines are in
|
|||
|
libraries specified using the general mechanisms for linking to
|
|||
|
archives; but to permit the use of scripts that were written for
|
|||
|
the older linkers, the keywords `FLOAT' and `NOFLOAT' are accepted
|
|||
|
and ignored.
|
|||
|
|
|||
|
`FORCE_COMMON_ALLOCATION'
|
|||
|
This command has the same effect as the `-d' command-line option:
|
|||
|
to make `ld' assign space to common symbols even if a relocatable
|
|||
|
output file is specified (`-r').
|
|||
|
|
|||
|
`INCLUDE FILENAME'
|
|||
|
Include the linker script FILENAME at this point. The file will
|
|||
|
be searched for in the current directory, and in any directory
|
|||
|
specified with the `-L' option. You can nest calls to `INCLUDE'
|
|||
|
up to 10 levels deep.
|
|||
|
|
|||
|
`INPUT ( FILE, FILE, ... )'
|
|||
|
`INPUT ( FILE FILE ... )'
|
|||
|
Use this command to include binary input files in the link, without
|
|||
|
including them in a particular section definition. Specify the
|
|||
|
full name for each FILE, including `.a' if required.
|
|||
|
|
|||
|
`ld' searches for each FILE through the archive-library search
|
|||
|
path, just as for files you specify on the command line. See the
|
|||
|
description of `-L' in *Note Command Line Options: Options.
|
|||
|
|
|||
|
If you use `-lFILE', `ld' will transform the name to `libFILE.a'
|
|||
|
as with the command line argument `-l'.
|
|||
|
|
|||
|
`GROUP ( FILE, FILE, ... )'
|
|||
|
`GROUP ( FILE FILE ... )'
|
|||
|
This command is like `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 `-(' in
|
|||
|
*Note Command Line Options: Options.
|
|||
|
|
|||
|
`OUTPUT ( FILENAME )'
|
|||
|
Use this command to name the link output file FILENAME. The
|
|||
|
effect of `OUTPUT(FILENAME)' is identical to the effect of
|
|||
|
`-o FILENAME', which overrides it. You can use this command to
|
|||
|
supply a default output-file name other than `a.out'.
|
|||
|
|
|||
|
`OUTPUT_ARCH ( BFDNAME )'
|
|||
|
Specify a particular output machine architecture, with one of the
|
|||
|
names used by the BFD back-end routines (*note BFD::.). This
|
|||
|
command is often unnecessary; the architecture is most often set
|
|||
|
implicitly by either the system BFD configuration or as a side
|
|||
|
effect of the `OUTPUT_FORMAT' command.
|
|||
|
|
|||
|
`OUTPUT_FORMAT ( BFDNAME )'
|
|||
|
When `ld' is configured to support multiple object code formats,
|
|||
|
you can use this command to specify a particular output format.
|
|||
|
BFDNAME is one of the names used by the BFD back-end routines
|
|||
|
(*note BFD::.). The effect is identical to the effect of the
|
|||
|
`--oformat' command-line option. This selection affects only the
|
|||
|
output file; the related command `TARGET' affects primarily input
|
|||
|
files.
|
|||
|
|
|||
|
`SEARCH_DIR ( PATH )'
|
|||
|
Add PATH to the list of paths where `ld' looks for archive
|
|||
|
libraries. `SEARCH_DIR(PATH)' has the same effect as `-LPATH' on
|
|||
|
the command line.
|
|||
|
|
|||
|
`STARTUP ( FILENAME )'
|
|||
|
Ensure that FILENAME is the first input file used in the link
|
|||
|
process.
|
|||
|
|
|||
|
`TARGET ( FORMAT )'
|
|||
|
When `ld' is configured to support multiple object code formats,
|
|||
|
you can use this command to change the input-file object code
|
|||
|
format (like the command-line option `-b' or its synonym
|
|||
|
`--format'). The argument FORMAT is one of the strings used by
|
|||
|
BFD to name binary formats. If `TARGET' is specified but
|
|||
|
`OUTPUT_FORMAT' is not, the last `TARGET' argument is also used as
|
|||
|
the default format for the `ld' output file. *Note BFD::.
|
|||
|
|
|||
|
If you don't use the `TARGET' command, `ld' uses the value of the
|
|||
|
environment variable `GNUTARGET', if available, to select the
|
|||
|
output file format. If that variable is also absent, `ld' uses
|
|||
|
the default format configured for your machine in the BFD
|
|||
|
libraries.
|
|||
|
|
|||
|
`NOCROSSREFS ( SECTION SECTION ... )'
|
|||
|
This command may be used to tell `ld' to issue an error about any
|
|||
|
references among certain sections.
|
|||
|
|
|||
|
In certain types of programs, particularly on embedded systems,
|
|||
|
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 `NOCROSSREFS' command takes a list of section names. If `ld'
|
|||
|
detects any cross references between the sections, it reports an
|
|||
|
error and returns a non-zero exit status. The `NOCROSSREFS'
|
|||
|
command uses output section names, defined in the `SECTIONS'
|
|||
|
command. It does not use the names of input sections.
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Machine Dependent, Next: BFD, Prev: Commands, Up: Top
|
|||
|
|
|||
|
Machine Dependent Features
|
|||
|
**************************
|
|||
|
|
|||
|
`ld' has additional features on some platforms; the following
|
|||
|
sections describe them. Machines where `ld' has no additional
|
|||
|
functionality are not listed.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* H8/300:: `ld' and the H8/300
|
|||
|
* i960:: `ld' and the Intel 960 family
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: H8/300, Next: i960, Up: Machine Dependent
|
|||
|
|
|||
|
`ld' and the H8/300
|
|||
|
===================
|
|||
|
|
|||
|
For the H8/300, `ld' can perform these global optimizations when you
|
|||
|
specify the `--relax' command-line option.
|
|||
|
|
|||
|
*relaxing address modes*
|
|||
|
`ld' finds all `jsr' and `jmp' instructions whose targets are
|
|||
|
within eight bits, and turns them into eight-bit program-counter
|
|||
|
relative `bsr' and `bra' instructions, respectively.
|
|||
|
|
|||
|
*synthesizing instructions*
|
|||
|
`ld' finds all `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 `mov.b `@'AA:16' into `mov.b `@'AA:8' whenever the
|
|||
|
address AA is in the top page of memory).
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: i960, Prev: H8/300, Up: Machine Dependent
|
|||
|
|
|||
|
`ld' and the Intel 960 family
|
|||
|
=============================
|
|||
|
|
|||
|
You can use the `-AARCHITECTURE' 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 `ld' command line included `-ACA' as well as
|
|||
|
`-ltry', the linker would look (in its built-in search paths, and in
|
|||
|
any paths you specify with `-L') for a library with the names
|
|||
|
|
|||
|
try
|
|||
|
libtry.a
|
|||
|
tryca
|
|||
|
libtryca.a
|
|||
|
|
|||
|
The first two possibilities would be considered in any event; the last
|
|||
|
two are due to the use of `-ACA'.
|
|||
|
|
|||
|
You can meaningfully use `-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 `-l'
|
|||
|
specifies a library.
|
|||
|
|
|||
|
`ld' supports the `--relax' option for the i960 family. If you
|
|||
|
specify `--relax', `ld' finds all `balx' and `calx' instructions whose
|
|||
|
targets are within 24 bits, and turns them into 24-bit program-counter
|
|||
|
relative `bal' and `cal' instructions, respectively. `ld' also turns
|
|||
|
`cal' instructions into `bal' instructions when it determines that the
|
|||
|
target subroutine is a leaf routine (that is, the target subroutine does
|
|||
|
not itself call any subroutines).
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: BFD, Next: Reporting Bugs, Prev: Machine Dependent, Up: Top
|
|||
|
|
|||
|
BFD
|
|||
|
***
|
|||
|
|
|||
|
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 `objdump -i' (*note
|
|||
|
objdump: (binutils.info)objdump.) to list all the formats available for
|
|||
|
your configuration.
|
|||
|
|
|||
|
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. *Note BFD information loss::.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* BFD outline:: How it works: an outline of BFD
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: BFD outline, Up: BFD
|
|||
|
|
|||
|
How it works: an outline of BFD
|
|||
|
===============================
|
|||
|
|
|||
|
When an object file is opened, BFD subroutines automatically
|
|||
|
determine the format of the input object file. They then build a
|
|||
|
descriptor in memory with pointers to routines that will be used to
|
|||
|
access elements of the object file's data structures.
|
|||
|
|
|||
|
As different information from the the object files is required, BFD
|
|||
|
reads from different sections of the file and processes them. For
|
|||
|
example, a very common operation for the linker is processing symbol
|
|||
|
tables. Each BFD back end provides a routine for converting between
|
|||
|
the object file's representation of symbols and an internal canonical
|
|||
|
format. When the linker asks for the symbol table of an object file, it
|
|||
|
calls through a memory pointer to the routine from the relevant BFD
|
|||
|
back end which reads and converts the table into a canonical form. The
|
|||
|
linker then operates upon the canonical form. When the link is finished
|
|||
|
and the linker writes the output file's symbol table, another BFD back
|
|||
|
end routine is called to take the newly created symbol table and
|
|||
|
convert it into the chosen output format.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* BFD information loss:: Information Loss
|
|||
|
* Canonical format:: The BFD canonical object-file format
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: BFD information loss, Next: Canonical format, Up: BFD outline
|
|||
|
|
|||
|
Information Loss
|
|||
|
----------------
|
|||
|
|
|||
|
*Information can be lost during output.* The output formats
|
|||
|
supported by BFD do not provide identical facilities, and information
|
|||
|
which can be described in one form has nowhere to go in another format.
|
|||
|
One example of this is alignment information in `b.out'. There is
|
|||
|
nowhere in an `a.out' format file to store alignment information on the
|
|||
|
contained data, so when a file is linked from `b.out' and an `a.out'
|
|||
|
image is produced, alignment information will not propagate to the
|
|||
|
output file. (The linker will still use the alignment information
|
|||
|
internally, so the link is performed correctly).
|
|||
|
|
|||
|
Another example is COFF section names. COFF files may contain an
|
|||
|
unlimited number of sections, each one with a textual section name. If
|
|||
|
the target of the link is a format which does not have many sections
|
|||
|
(e.g., `a.out') or has sections without names (e.g., the Oasys format),
|
|||
|
the link cannot be done simply. You can circumvent this problem by
|
|||
|
describing the desired input-to-output section mapping with the linker
|
|||
|
command language.
|
|||
|
|
|||
|
*Information can be lost during canonicalization.* The BFD internal
|
|||
|
canonical form of the external formats is not exhaustive; there are
|
|||
|
structures in input formats for which there is no direct representation
|
|||
|
internally. This means that the BFD back ends cannot maintain all
|
|||
|
possible data richness through the transformation between external to
|
|||
|
internal and back to external formats.
|
|||
|
|
|||
|
This limitation is only a problem when an application reads one
|
|||
|
format and writes another. Each BFD back end is responsible for
|
|||
|
maintaining as much data as possible, and the internal BFD canonical
|
|||
|
form has structures which are opaque to the BFD core, and exported only
|
|||
|
to the back ends. When a file is read in one format, the canonical form
|
|||
|
is generated for BFD and the application. At the same time, the back
|
|||
|
end saves away any information which may otherwise be lost. If the data
|
|||
|
is then written back in the same format, the back end routine will be
|
|||
|
able to use the canonical form provided by the BFD core as well as the
|
|||
|
information it prepared earlier. Since there is a great deal of
|
|||
|
commonality between back ends, there is no information lost when
|
|||
|
linking or copying big endian COFF to little endian COFF, or `a.out' to
|
|||
|
`b.out'. When a mixture of formats is linked, the information is only
|
|||
|
lost from the files whose format differs from the destination.
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Canonical format, Prev: BFD information loss, Up: BFD outline
|
|||
|
|
|||
|
The BFD canonical object-file format
|
|||
|
------------------------------------
|
|||
|
|
|||
|
The greatest potential for loss of information occurs when there is
|
|||
|
the least overlap between the information provided by the source
|
|||
|
format, that stored by the canonical format, and that needed by the
|
|||
|
destination format. A brief description of the canonical form may help
|
|||
|
you understand which kinds of data you can count on preserving across
|
|||
|
conversions.
|
|||
|
|
|||
|
*files*
|
|||
|
Information stored on a per-file basis includes target machine
|
|||
|
architecture, particular implementation format type, a demand
|
|||
|
pageable bit, and a write protected bit. Information like Unix
|
|||
|
magic numbers is not stored here--only the magic numbers' meaning,
|
|||
|
so a `ZMAGIC' file would have both the demand pageable bit and the
|
|||
|
write protected text bit set. The byte order of the target is
|
|||
|
stored on a per-file basis, so that big- and little-endian object
|
|||
|
files may be used with one another.
|
|||
|
|
|||
|
*sections*
|
|||
|
Each section in the input file contains the name of the section,
|
|||
|
the section's original address in the object file, size and
|
|||
|
alignment information, various flags, and pointers into other BFD
|
|||
|
data structures.
|
|||
|
|
|||
|
*symbols*
|
|||
|
Each symbol contains a pointer to the information for the object
|
|||
|
file which originally defined it, its name, its value, and various
|
|||
|
flag bits. When a BFD back end reads in a symbol table, it
|
|||
|
relocates all symbols to make them relative to the base of the
|
|||
|
section where they were defined. Doing this ensures that each
|
|||
|
symbol points to its containing section. Each symbol also has a
|
|||
|
varying amount of hidden private data for the BFD back end. Since
|
|||
|
the symbol points to the original file, the private data format
|
|||
|
for that symbol is accessible. `ld' can operate on a collection
|
|||
|
of symbols of wildly different formats without problems.
|
|||
|
|
|||
|
Normal global and simple local symbols are maintained on output,
|
|||
|
so an output file (no matter its format) will retain symbols
|
|||
|
pointing to functions and to global, static, and common variables.
|
|||
|
Some symbol information is not worth retaining; in `a.out', type
|
|||
|
information is stored in the symbol table as long symbol names.
|
|||
|
This information would be useless to most COFF debuggers; the
|
|||
|
linker has command line switches to allow users to throw it away.
|
|||
|
|
|||
|
There is one word of type information within the symbol, so if the
|
|||
|
format supports symbol type information within symbols (for
|
|||
|
example, COFF, IEEE, Oasys) and the type is simple enough to fit
|
|||
|
within one word (nearly everything but aggregates), the
|
|||
|
information will be preserved.
|
|||
|
|
|||
|
*relocation level*
|
|||
|
Each canonical BFD relocation record contains a pointer to the
|
|||
|
symbol to relocate to, the offset of the data to relocate, the
|
|||
|
section the data is in, and a pointer to a relocation type
|
|||
|
descriptor. Relocation is performed by passing messages through
|
|||
|
the relocation type descriptor and the symbol pointer. Therefore,
|
|||
|
relocations can be performed on output data using a relocation
|
|||
|
method that is only available in one of the input formats. For
|
|||
|
instance, Oasys provides a byte relocation format. A relocation
|
|||
|
record requesting this relocation type would point indirectly to a
|
|||
|
routine to perform this, so the relocation may be performed on a
|
|||
|
byte being written to a 68k COFF file, even though 68k COFF has no
|
|||
|
such relocation type.
|
|||
|
|
|||
|
*line numbers*
|
|||
|
Object formats can contain, for debugging purposes, some form of
|
|||
|
mapping between symbols, source line numbers, and addresses in the
|
|||
|
output file. These addresses have to be relocated along with the
|
|||
|
symbol information. Each symbol with an associated list of line
|
|||
|
number records points to the first record of the list. The head
|
|||
|
of a line number list consists of a pointer to the symbol, which
|
|||
|
allows finding out the address of the function whose line number
|
|||
|
is being described. The rest of the list is made up of pairs:
|
|||
|
offsets into the section and line numbers. Any format which can
|
|||
|
simply derive this information can pass it successfully between
|
|||
|
formats (COFF, IEEE and Oasys).
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Reporting Bugs, Next: MRI, Prev: BFD, Up: Top
|
|||
|
|
|||
|
Reporting Bugs
|
|||
|
**************
|
|||
|
|
|||
|
Your bug reports play an essential role in making `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 `ld' work
|
|||
|
better. Bug reports are your contribution to the maintenance of `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
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Bug Criteria, Next: Bug Reporting, Up: Reporting Bugs
|
|||
|
|
|||
|
Have you found a bug?
|
|||
|
=====================
|
|||
|
|
|||
|
If you are not sure whether you have found a bug, here are some
|
|||
|
guidelines:
|
|||
|
|
|||
|
* If the linker gets a fatal signal, for any input whatever, that is
|
|||
|
a `ld' bug. Reliable linkers never crash.
|
|||
|
|
|||
|
* If `ld' produces an error message for valid input, that is a bug.
|
|||
|
|
|||
|
* If `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.
|
|||
|
|
|||
|
* If you are an experienced user of linkers, your suggestions for
|
|||
|
improvement of `ld' are welcome in any case.
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: Bug Reporting, Prev: Bug Criteria, Up: Reporting Bugs
|
|||
|
|
|||
|
How to report bugs
|
|||
|
==================
|
|||
|
|
|||
|
A number of companies and individuals offer support for GNU
|
|||
|
products. If you obtained `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 `etc/SERVICE' in the GNU Emacs distribution.
|
|||
|
|
|||
|
In any event, we also recommend that you send bug reports for `ld'
|
|||
|
to `bug-gnu-utils@prep.ai.mit.edu'.
|
|||
|
|
|||
|
The fundamental principle of reporting bugs usefully is this:
|
|||
|
*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?" Those bug reports are useless, and we urge everyone to *refuse
|
|||
|
to respond to them* except to chide the sender to report bugs properly.
|
|||
|
|
|||
|
To enable us to fix the bug, you should include all these things:
|
|||
|
|
|||
|
* The version of `ld'. `ld' announces it if you start it with the
|
|||
|
`--version' argument.
|
|||
|
|
|||
|
Without this, we will not know whether there is any point in
|
|||
|
looking for the bug in the current version of `ld'.
|
|||
|
|
|||
|
* Any patches you may have applied to the `ld' source, including any
|
|||
|
patches made to the `BFD' library.
|
|||
|
|
|||
|
* The type of machine you are using, and the operating system name
|
|||
|
and version number.
|
|||
|
|
|||
|
* What compiler (and its version) was used to compile `ld'--e.g.
|
|||
|
"`gcc-2.7'".
|
|||
|
|
|||
|
* 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.
|
|||
|
|
|||
|
* 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, uuencoded if necessary to get them through the mail system.
|
|||
|
Making them available for anonymous FTP is not as good, but may
|
|||
|
be the only reasonable choice for large object files.
|
|||
|
|
|||
|
If the source files were assembled using `gas' or compiled using
|
|||
|
`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
|
|||
|
`gas' or `gcc' was used to produce the object files. Also say how
|
|||
|
`gas' or `gcc' were configured.
|
|||
|
|
|||
|
* 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 `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 `ld' is out of synch, 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.
|
|||
|
|
|||
|
* If you wish to suggest changes to the `ld' source, send us context
|
|||
|
diffs, as generated by `diff' with the `-u', `-c', or `-p' option.
|
|||
|
Always send diffs from the old file to the new file. If you even
|
|||
|
discuss something in the `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.
|
|||
|
|
|||
|
Here are some things that are not necessary:
|
|||
|
|
|||
|
* 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 *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.
|
|||
|
|
|||
|
* 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 `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.
|
|||
|
|
|||
|
* 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.
|
|||
|
|
|||
|
|
|||
|
File: ld.info, Node: MRI, Next: Index, Prev: Reporting Bugs, Up: Top
|
|||
|
|
|||
|
MRI Compatible Script Files
|
|||
|
***************************
|
|||
|
|
|||
|
To aid users making the transition to GNU `ld' from the MRI linker,
|
|||
|
`ld' can use MRI compatible linker scripts as an alternative to the
|
|||
|
more general-purpose linker scripting language described in *Note
|
|||
|
Command Language: Commands. MRI compatible linker scripts have a much
|
|||
|
simpler command set than the scripting language otherwise used with
|
|||
|
`ld'. GNU `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 `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
|
|||
|
`-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, `ld' issues
|
|||
|
a warning message, but continues processing the script.
|
|||
|
|
|||
|
Lines beginning with `*' are comments.
|
|||
|
|
|||
|
You can write these commands using all upper-case letters, or all
|
|||
|
lower case; for example, `chip' is the same as `CHIP'. The following
|
|||
|
list shows only the upper-case form of each command.
|
|||
|
|
|||
|
`ABSOLUTE SECNAME'
|
|||
|
`ABSOLUTE SECNAME, SECNAME, ... SECNAME'
|
|||
|
Normally, `ld' includes in the output file all sections from all
|
|||
|
the input files. However, in an MRI-compatible script, you can
|
|||
|
use the `ABSOLUTE' command to restrict the sections that will be
|
|||
|
present in your output program. If the `ABSOLUTE' command is used
|
|||
|
at all in a script, then only the sections named explicitly in
|
|||
|
`ABSOLUTE' commands will appear in the linker output. You can
|
|||
|
still use other input sections (whatever you select on the command
|
|||
|
line, or using `LOAD') to resolve addresses in the output file.
|
|||
|
|
|||
|
`ALIAS OUT-SECNAME, IN-SECNAME'
|
|||
|
Use this command to place the data from input section IN-SECNAME
|
|||
|
in a section called OUT-SECNAME in the linker output file.
|
|||
|
|
|||
|
IN-SECNAME may be an integer.
|
|||
|
|
|||
|
`ALIGN SECNAME = EXPRESSION'
|
|||
|
Align the section called SECNAME to EXPRESSION. The EXPRESSION
|
|||
|
should be a power of two.
|
|||
|
|
|||
|
`BASE EXPRESSION'
|
|||
|
Use the value of EXPRESSION as the lowest address (other than
|
|||
|
absolute addresses) in the output file.
|
|||
|
|
|||
|
`CHIP EXPRESSION'
|
|||
|
`CHIP EXPRESSION, EXPRESSION'
|
|||
|
This command does nothing; it is accepted only for compatibility.
|
|||
|
|
|||
|
`END'
|
|||
|
This command does nothing whatever; it's only accepted for
|
|||
|
compatibility.
|
|||
|
|
|||
|
`FORMAT OUTPUT-FORMAT'
|
|||
|
Similar to the `OUTPUT_FORMAT' command in the more general linker
|
|||
|
language, but restricted to one of these output formats:
|
|||
|
|
|||
|
1. S-records, if OUTPUT-FORMAT is `S'
|
|||
|
|
|||
|
2. IEEE, if OUTPUT-FORMAT is `IEEE'
|
|||
|
|
|||
|
3. COFF (the `coff-m68k' variant in BFD), if OUTPUT-FORMAT is
|
|||
|
`COFF'
|
|||
|
|
|||
|
`LIST ANYTHING...'
|
|||
|
Print (to the standard output file) a link map, as produced by the
|
|||
|
`ld' command-line option `-M'.
|
|||
|
|
|||
|
The keyword `LIST' may be followed by anything on the same line,
|
|||
|
with no change in its effect.
|
|||
|
|
|||
|
`LOAD FILENAME'
|
|||
|
`LOAD FILENAME, FILENAME, ... FILENAME'
|
|||
|
Include one or more object file FILENAME in the link; this has the
|
|||
|
same effect as specifying FILENAME directly on the `ld' command
|
|||
|
line.
|
|||
|
|
|||
|
`NAME OUTPUT-NAME'
|
|||
|
OUTPUT-NAME is the name for the program produced by `ld'; the
|
|||
|
MRI-compatible command `NAME' is equivalent to the command-line
|
|||
|
option `-o' or the general script language command `OUTPUT'.
|
|||
|
|
|||
|
`ORDER SECNAME, SECNAME, ... SECNAME'
|
|||
|
`ORDER SECNAME SECNAME SECNAME'
|
|||
|
Normally, `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
|
|||
|
`ORDER' command. The sections you list with `ORDER' will appear
|
|||
|
first in your output file, in the order specified.
|
|||
|
|
|||
|
`PUBLIC NAME=EXPRESSION'
|
|||
|
`PUBLIC NAME,EXPRESSION'
|
|||
|
`PUBLIC NAME EXPRESSION'
|
|||
|
Supply a value (EXPRESSION) for external symbol NAME used in the
|
|||
|
linker input files.
|
|||
|
|
|||
|
`SECT SECNAME, EXPRESSION'
|
|||
|
`SECT SECNAME=EXPRESSION'
|
|||
|
`SECT SECNAME EXPRESSION'
|
|||
|
You can use any of these three forms of the `SECT' command to
|
|||
|
specify the start address (EXPRESSION) for section SECNAME. If
|
|||
|
you have more than one `SECT' statement for the same SECNAME, only
|
|||
|
the *first* sets the start address.
|
|||
|
|