1@section Archives
2
3
4@strong{Description}@*
5An archive (or library) is just another BFD.  It has a symbol
6table, although there's not much a user program will do with it.
7
8The big difference between an archive BFD and an ordinary BFD
9is that the archive doesn't have sections.  Instead it has a
10chain of BFDs that are considered its contents.  These BFDs can
11be manipulated like any other.  The BFDs contained in an
12archive opened for reading will all be opened for reading.  You
13may put either input or output BFDs into an archive opened for
14output; they will be handled correctly when the archive is closed.
15
16Use @code{bfd_openr_next_archived_file} to step through
17the contents of an archive opened for input.  You don't
18have to read the entire archive if you don't want
19to!  Read it until you find what you want.
20
21Archive contents of output BFDs are chained through the
22@code{next} pointer in a BFD.  The first one is findable through
23the @code{archive_head} slot of the archive.  Set it with
24@code{bfd_set_archive_head} (q.v.).  A given BFD may be in only one
25open output archive at a time.
26
27As expected, the BFD archive code is more general than the
28archive code of any given environment.  BFD archives may
29contain files of different formats (e.g., a.out and coff) and
30even different architectures.  You may even place archives
31recursively into archives!
32
33This can cause unexpected confusion, since some archive
34formats are more expressive than others.  For instance, Intel
35COFF archives can preserve long filenames; SunOS a.out archives
36cannot.  If you move a file from the first to the second
37format and back again, the filename may be truncated.
38Likewise, different a.out environments have different
39conventions as to how they truncate filenames, whether they
40preserve directory names in filenames, etc.  When
41interoperating with native tools, be sure your files are
42homogeneous.
43
44Beware: most of these formats do not react well to the
45presence of spaces in filenames.  We do the best we can, but
46can't always handle this case due to restrictions in the format of
47archives.  Many Unix utilities are braindead in regards to
48spaces and such in filenames anyway, so this shouldn't be much
49of a restriction.
50
51Archives are supported in BFD in @code{archive.c}.
52
53@findex bfd_get_next_mapent
54@subsubsection @code{bfd_get_next_mapent}
55@strong{Synopsis}
56@example
57symindex bfd_get_next_mapent
58   (bfd *abfd, symindex previous, carsym **sym);
59@end example
60@strong{Description}@*
61Step through archive @var{abfd}'s symbol table (if it
62has one).  Successively update @var{sym} with the next symbol's
63information, returning that symbol's (internal) index into the
64symbol table.
65
66Supply @code{BFD_NO_MORE_SYMBOLS} as the @var{previous} entry to get
67the first one; returns @code{BFD_NO_MORE_SYMBOLS} when you've already
68got the last one.
69
70A @code{carsym} is a canonical archive symbol.  The only
71user-visible element is its name, a null-terminated string.
72
73@findex bfd_set_archive_head
74@subsubsection @code{bfd_set_archive_head}
75@strong{Synopsis}
76@example
77bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
78@end example
79@strong{Description}@*
80Set the head of the chain of
81BFDs contained in the archive @var{output} to @var{new_head}.
82
83@findex bfd_openr_next_archived_file
84@subsubsection @code{bfd_openr_next_archived_file}
85@strong{Synopsis}
86@example
87bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
88@end example
89@strong{Description}@*
90Provided a BFD, @var{archive}, containing an archive and NULL, open
91an input BFD on the first contained element and returns that.
92Subsequent calls should pass
93the archive and the previous return value to return a created
94BFD to the next contained element. NULL is returned when there
95are no more.
96
97