Position of an Archive on the Command Line
The position of an archive on the command line can affect the output file being produced. The link-editor searches an archive only to resolve undefined or tentative external references that have previously been encountered. After this search is completed and any required members have been extracted, the link-editor moves onto the next input file on the command line.
Therefore by default, the archive is not available to resolve
any new references from the input files that follow the
archive on the command line. For example, the following
command directs the link-editor to search
libfoo.a
only to resolve symbol
references that have been obtained from
file1.c
. The
libfoo.a
archive is not
available to resolve symbol references from
file2.c
or
file3.c
.
$ cc -o prog file1.c -B static -lfoo file2.c file3.c -B dynamic
Interdependencies between archives can exist, such that the extraction of members from one archive must be resolved by extracting members from another archive. If these dependencies are cyclic, the archives must be specified repeatedly on the command line to satisfy previous references.
$ cc -o prog .... -lA -lB -lC -lA -lB -lC -lA
The determination, and maintenance, of repeated
archive specifications can be tedious. The
-z rescan-now
option makes this
process simpler. The -z rescan-now
option is processed by the link-editor immediately when the
option is encountered on the command line. All archives that
have been processed from the command line prior to this
option are immediately reprocessed. This processing attempts
to locate additional archive members that resolve symbol
references. This archive rescanning continues until a pass
over the archive list occurs in which no new members are
extracted. The previous example can be simplified as
follows.
$ cc -o prog .... -lA -lB -lC -z rescan-now
Alternatively, the -z rescan-start
and
-z rescan-end
options can be
used to group mutually dependent archives together into an
archive group. These groups are reprocessed by the
link-editor immediately when the closing delimiter is
encountered on the command line. Archives found within the
group are reprocessed in an attempt to locate additional
archive members that resolve symbol references. This archive
rescanning continues until a pass over the archive group
occurs in which no new members are extracted. Using archive
groups, the previous example can be written as
follows.
$ cc -o prog .... -z rescan-start -lA -lB -lC -z rescan-end
Note:
You should specify any archives at the end of the command line unless multiple-definition conflicts require you to do otherwise.