Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

@c Copyright (C) 1988-2020 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.

@node Collect2
@chapter @code{collect2}

GCC uses a utility called @code{collect2} on nearly all systems to arrange
to call various initialization functions at start time.

The program @code{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 @samp{.c} file containing a table of them,
compiles it, and links the program a second time including that file.

@findex __main
@cindex constructors, automatic calls
The actual calls to the constructors are carried out by a subroutine
called @code{__main}, which is called (automatically) at the beginning
of the body of @code{main} (provided @code{main} was compiled with GNU
CC)@.  Calling @code{__main} is necessary, even when compiling C code, to
allow linking C and C++ object code together.  (If you use
@option{-nostdlib}, you get an unresolved reference to @code{__main},
since it's defined in the standard GCC library.  Include @option{-lgcc} at
the end of your compiler command line to resolve this reference.)

The program @code{collect2} is installed as @code{ld} in the directory
where the passes of the compiler are installed.  When @code{collect2}
needs to find the @emph{real} @code{ld}, it tries the following file
names:

@itemize @bullet
@item
a hard coded linker file name, if GCC was configured with the
@option{--with-ld} option.

@item
@file{real-ld} in the directories listed in the compiler's search
directories.

@item
@file{real-ld} in the directories listed in the environment variable
@code{PATH}.

@item
The file specified in the @code{REAL_LD_FILE_NAME} configuration macro,
if specified.

@item
@file{ld} in the compiler's search directories, except that
@code{collect2} will not execute itself recursively.

@item
@file{ld} in @code{PATH}.
@end itemize

``The compiler's search directories'' means all the directories where
@command{gcc} searches for passes of the compiler.  This includes
directories that you specify with @option{-B}.

Cross-compilers search a little differently:

@itemize @bullet
@item
@file{real-ld} in the compiler's search directories.

@item
@file{@var{target}-real-ld} in @code{PATH}.

@item
The file specified in the @code{REAL_LD_FILE_NAME} configuration macro,
if specified.

@item
@file{ld} in the compiler's search directories.

@item
@file{@var{target}-ld} in @code{PATH}.
@end itemize

@code{collect2} explicitly avoids running @code{ld} using the file name
under which @code{collect2} itself was invoked.  In fact, it remembers
up a list of such names---in case one copy of @code{collect2} finds
another copy (or version) of @code{collect2} installed as @code{ld} in a
second place in the search path.

@code{collect2} searches for the utilities @code{nm} and @code{strip}
using the same algorithm as above for @code{ld}.