gold is an ELF linker. It is intended to have complete support for
|
gold is an ELF linker. It is intended to have complete support for
|
ELF and to run as fast as possible on modern systems. For normal use
|
ELF and to run as fast as possible on modern systems. For normal use
|
it is a drop-in replacement for the older GNU linker.
|
it is a drop-in replacement for the older GNU linker.
|
|
|
gold is part of the GNU binutils. See ../binutils/README for more
|
gold is part of the GNU binutils. See ../binutils/README for more
|
general notes, including where to send bug reports.
|
general notes, including where to send bug reports.
|
|
|
gold was originally developed at Google, and was contributed to the
|
gold was originally developed at Google, and was contributed to the
|
Free Software Foundation in March 2008. At Google it was designed by
|
Free Software Foundation in March 2008. At Google it was designed by
|
Ian Lance Taylor, with major contributions by Cary Coutant, Craig
|
Ian Lance Taylor, with major contributions by Cary Coutant, Craig
|
Silverstein, and Andrew Chatham.
|
Silverstein, and Andrew Chatham.
|
|
|
The existing GNU linker manual is intended to be accurate
|
The existing GNU linker manual is intended to be accurate
|
documentation for features which gold supports. gold supports most of
|
documentation for features which gold supports. gold supports most of
|
the features of the GNU linker for ELF targets. Notable
|
the features of the GNU linker for ELF targets. Notable
|
omissions--features of the GNU linker not currently supported in
|
omissions--features of the GNU linker not currently supported in
|
gold--are:
|
gold--are:
|
* MEMORY regions in linker scripts
|
* MEMORY regions in linker scripts
|
* MRI compatible linker scripts
|
* MRI compatible linker scripts
|
* cross-reference reports (--cref)
|
* cross-reference reports (--cref)
|
* various other minor options
|
* various other minor options
|
|
|
|
|
Notes on the code
|
Notes on the code
|
=================
|
=================
|
|
|
These are some notes which may be helpful to people working on the
|
These are some notes which may be helpful to people working on the
|
source code of gold itself.
|
source code of gold itself.
|
|
|
gold is written in C++. It is a GNU program, and therefore follows
|
gold is written in C++. It is a GNU program, and therefore follows
|
the GNU formatting standards as modified for C++. Source documents in
|
the GNU formatting standards as modified for C++. Source documents in
|
order of decreasing precedence:
|
order of decreasing precedence:
|
http://www.gnu.org/prep/standards/
|
http://www.gnu.org/prep/standards/
|
http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/C++STYLE
|
http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/C++STYLE
|
http://www.zembu.com/eng/procs/c++style.html
|
http://www.zembu.com/eng/procs/c++style.html
|
|
|
The linker is intended to have complete support for cross-compilation,
|
The linker is intended to have complete support for cross-compilation,
|
while still supporting the normal case of native linking as fast as
|
while still supporting the normal case of native linking as fast as
|
possible. In order to do this, many classes are actually templates
|
possible. In order to do this, many classes are actually templates
|
whose parameter is the ELF file class (e.g., 32 bits or 64 bits). The
|
whose parameter is the ELF file class (e.g., 32 bits or 64 bits). The
|
C++ code is the same, but we don't pay the execution time cost of
|
C++ code is the same, but we don't pay the execution time cost of
|
always using 64-bit integers if the target is 32 bits. Many of these
|
always using 64-bit integers if the target is 32 bits. Many of these
|
class templates also have an endianness parameter: true for
|
class templates also have an endianness parameter: true for
|
big-endian, false for little-endian.
|
big-endian, false for little-endian.
|
|
|
The linker is multi-threaded. The Task class represents a single unit
|
The linker is multi-threaded. The Task class represents a single unit
|
of work. Task objects are stored on a single Workqueue object. Tasks
|
of work. Task objects are stored on a single Workqueue object. Tasks
|
communicate via Task_token objects. Task_token objects are only
|
communicate via Task_token objects. Task_token objects are only
|
manipulated while holding the master Workqueue lock. Relatively few
|
manipulated while holding the master Workqueue lock. Relatively few
|
mutexes are used.
|
mutexes are used.
|
|
|
|
|
Build requirements
|
Build requirements
|
==================
|
==================
|
|
|
The gold source code uses templates heavily. Building it requires a
|
The gold source code uses templates heavily. Building it requires a
|
recent version of g++. g++ 4.0.3 is known to work. g++ 3.2 and g++
|
recent version of g++. g++ 4.0.3 is known to work. g++ 3.2 and g++
|
3.4.3 are known to fail.
|
3.4.3 are known to fail.
|
|
|
The linker script parser uses features which are only in newer
|
The linker script parser uses features which are only in newer
|
versions of bison. bison 2.3 is known to work. bison 1.26 is known
|
versions of bison. bison 2.3 is known to work. bison 1.26 is known
|
to fail. If you are building gold from an official binutils release,
|
to fail. If you are building gold from an official binutils release,
|
the bison output should already be included.
|
the bison output should already be included.
|
|
|