collect2#
GCC uses a utility called collect2
on nearly all systems to arrange
to call various initialization functions at start time.
The program collect2
works by linking the program once and
looking through the linker output file for symbols with particular names
indicating they are constructor functions. If it finds any, it
creates a new temporary .c
file containing a table of them,
compiles it, and links the program a second time including that file.
The actual calls to the constructors are carried out by a subroutine
called __main
, which is called (automatically) at the beginning
of the body of main
(provided main
was compiled with GNU
CC). Calling __main
is necessary, even when compiling C code, to
allow linking C and C++ object code together. (If you use
-nostdlib
, you get an unresolved reference to __main
,
since it’s defined in the standard GCC library. Include -lgcc
at
the end of your compiler command line to resolve this reference.)
The program collect2
is installed as ld
in the directory
where the passes of the compiler are installed. When collect2
needs to find the real ld
, it tries the following file
names:
a hard coded linker file name, if GCC was configured with the
--with-ld
option.real-ld
in the directories listed in the compiler’s search directories.real-ld
in the directories listed in the environment variablePATH
.The file specified in the
REAL_LD_FILE_NAME
configuration macro, if specified.ld
in the compiler’s search directories, except thatcollect2
will not execute itself recursively.ld
inPATH
.
‘The compiler’s search directories’ means all the directories where
gcc searches for passes of the compiler. This includes
directories that you specify with -B
.
Cross-compilers search a little differently:
real-ld
in the compiler’s search directories.target-real-ld
inPATH
.The file specified in the
REAL_LD_FILE_NAME
configuration macro, if specified.ld
in the compiler’s search directories.target-ld
inPATH
.
collect2
explicitly avoids running ld
using the file name
under which collect2
itself was invoked. In fact, it remembers
up a list of such names—in case one copy of collect2
finds
another copy (or version) of collect2
installed as ld
in a
second place in the search path.
collect2
searches for the utilities nm
and strip
using the same algorithm as above for ld
.