@section Archives


@strong{Description}@*
An archive (or library) is just another BFD.  It has a symbol
table, although there's not much a user program will do with it.

The big difference between an archive BFD and an ordinary BFD
is that the archive doesn't have sections.  Instead it has a
chain of BFDs that are considered its contents.  These BFDs can
be manipulated like any other.  The BFDs contained in an
archive opened for reading will all be opened for reading.  You
may put either input or output BFDs into an archive opened for
output; they will be handled correctly when the archive is closed.

Use @code{bfd_openr_next_archived_file} to step through
the contents of an archive opened for input.  You don't
have to read the entire archive if you don't want
to!  Read it until you find what you want.

A BFD returned by @code{bfd_openr_next_archived_file} can be
closed manually with @code{bfd_close}.  If you do not close it,
then a second iteration through the members of an archive may
return the same BFD.  If you close the archive BFD, then all
the member BFDs will automatically be closed as well.

Archive contents of output BFDs are chained through the
@code{archive_next} pointer in a BFD.  The first one is findable
through the @code{archive_head} slot of the archive.  Set it with
@code{bfd_set_archive_head} (q.v.).  A given BFD may be in only
one open output archive at a time.

As expected, the BFD archive code is more general than the
archive code of any given environment.  BFD archives may
contain files of different formats (e.g., a.out and coff) and
even different architectures.  You may even place archives
recursively into archives!

This can cause unexpected confusion, since some archive
formats are more expressive than others.  For instance, Intel
COFF archives can preserve long filenames; SunOS a.out archives
cannot.  If you move a file from the first to the second
format and back again, the filename may be truncated.
Likewise, different a.out environments have different
conventions as to how they truncate filenames, whether they
preserve directory names in filenames, etc.  When
interoperating with native tools, be sure your files are
homogeneous.

Beware: most of these formats do not react well to the
presence of spaces in filenames.  We do the best we can, but
can't always handle this case due to restrictions in the format of
archives.  Many Unix utilities are braindead in regards to
spaces and such in filenames anyway, so this shouldn't be much
of a restriction.

Archives are supported in BFD in @code{archive.c}.

@subsection Archive functions


@findex bfd_get_next_mapent
@subsubsection @code{bfd_get_next_mapent}
@strong{Synopsis}
@example
symindex bfd_get_next_mapent
   (bfd *abfd, symindex previous, carsym **sym);
@end example
@strong{Description}@*
Step through archive @var{abfd}'s symbol table (if it
has one).  Successively update @var{sym} with the next symbol's
information, returning that symbol's (internal) index into the
symbol table.

Supply @code{BFD_NO_MORE_SYMBOLS} as the @var{previous} entry to get
the first one; returns @code{BFD_NO_MORE_SYMBOLS} when you've already
got the last one.

A @code{carsym} is a canonical archive symbol.  The only
user-visible element is its name, a null-terminated string.

@findex bfd_set_archive_head
@subsubsection @code{bfd_set_archive_head}
@strong{Synopsis}
@example
bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
@end example
@strong{Description}@*
Set the head of the chain of
BFDs contained in the archive @var{output} to @var{new_head}.

@findex bfd_openr_next_archived_file
@subsubsection @code{bfd_openr_next_archived_file}
@strong{Synopsis}
@example
bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
@end example
@strong{Description}@*
Provided a BFD, @var{archive}, containing an archive and NULL, open
an input BFD on the first contained element and returns that.
Subsequent calls should pass
the archive and the previous return value to return a created
BFD to the next contained element. NULL is returned when there
are no more.

