1*fae548d3Szrj /* BFD back-end for archive files (libraries).
2*fae548d3Szrj Copyright (C) 1990-2020 Free Software Foundation, Inc.
3*fae548d3Szrj Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
4*fae548d3Szrj
5*fae548d3Szrj This file is part of BFD, the Binary File Descriptor library.
6*fae548d3Szrj
7*fae548d3Szrj This program is free software; you can redistribute it and/or modify
8*fae548d3Szrj it under the terms of the GNU General Public License as published by
9*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or
10*fae548d3Szrj (at your option) any later version.
11*fae548d3Szrj
12*fae548d3Szrj This program is distributed in the hope that it will be useful,
13*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
14*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*fae548d3Szrj GNU General Public License for more details.
16*fae548d3Szrj
17*fae548d3Szrj You should have received a copy of the GNU General Public License
18*fae548d3Szrj along with this program; if not, write to the Free Software
19*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
20*fae548d3Szrj
21*fae548d3Szrj /*
22*fae548d3Szrj @setfilename archive-info
23*fae548d3Szrj SECTION
24*fae548d3Szrj Archives
25*fae548d3Szrj
26*fae548d3Szrj DESCRIPTION
27*fae548d3Szrj An archive (or library) is just another BFD. It has a symbol
28*fae548d3Szrj table, although there's not much a user program will do with it.
29*fae548d3Szrj
30*fae548d3Szrj The big difference between an archive BFD and an ordinary BFD
31*fae548d3Szrj is that the archive doesn't have sections. Instead it has a
32*fae548d3Szrj chain of BFDs that are considered its contents. These BFDs can
33*fae548d3Szrj be manipulated like any other. The BFDs contained in an
34*fae548d3Szrj archive opened for reading will all be opened for reading. You
35*fae548d3Szrj may put either input or output BFDs into an archive opened for
36*fae548d3Szrj output; they will be handled correctly when the archive is closed.
37*fae548d3Szrj
38*fae548d3Szrj Use <<bfd_openr_next_archived_file>> to step through
39*fae548d3Szrj the contents of an archive opened for input. You don't
40*fae548d3Szrj have to read the entire archive if you don't want
41*fae548d3Szrj to! Read it until you find what you want.
42*fae548d3Szrj
43*fae548d3Szrj A BFD returned by <<bfd_openr_next_archived_file>> can be
44*fae548d3Szrj closed manually with <<bfd_close>>. If you do not close it,
45*fae548d3Szrj then a second iteration through the members of an archive may
46*fae548d3Szrj return the same BFD. If you close the archive BFD, then all
47*fae548d3Szrj the member BFDs will automatically be closed as well.
48*fae548d3Szrj
49*fae548d3Szrj Archive contents of output BFDs are chained through the
50*fae548d3Szrj <<archive_next>> pointer in a BFD. The first one is findable
51*fae548d3Szrj through the <<archive_head>> slot of the archive. Set it with
52*fae548d3Szrj <<bfd_set_archive_head>> (q.v.). A given BFD may be in only
53*fae548d3Szrj one open output archive at a time.
54*fae548d3Szrj
55*fae548d3Szrj As expected, the BFD archive code is more general than the
56*fae548d3Szrj archive code of any given environment. BFD archives may
57*fae548d3Szrj contain files of different formats (e.g., a.out and coff) and
58*fae548d3Szrj even different architectures. You may even place archives
59*fae548d3Szrj recursively into archives!
60*fae548d3Szrj
61*fae548d3Szrj This can cause unexpected confusion, since some archive
62*fae548d3Szrj formats are more expressive than others. For instance, Intel
63*fae548d3Szrj COFF archives can preserve long filenames; SunOS a.out archives
64*fae548d3Szrj cannot. If you move a file from the first to the second
65*fae548d3Szrj format and back again, the filename may be truncated.
66*fae548d3Szrj Likewise, different a.out environments have different
67*fae548d3Szrj conventions as to how they truncate filenames, whether they
68*fae548d3Szrj preserve directory names in filenames, etc. When
69*fae548d3Szrj interoperating with native tools, be sure your files are
70*fae548d3Szrj homogeneous.
71*fae548d3Szrj
72*fae548d3Szrj Beware: most of these formats do not react well to the
73*fae548d3Szrj presence of spaces in filenames. We do the best we can, but
74*fae548d3Szrj can't always handle this case due to restrictions in the format of
75*fae548d3Szrj archives. Many Unix utilities are braindead in regards to
76*fae548d3Szrj spaces and such in filenames anyway, so this shouldn't be much
77*fae548d3Szrj of a restriction.
78*fae548d3Szrj
79*fae548d3Szrj Archives are supported in BFD in <<archive.c>>.
80*fae548d3Szrj
81*fae548d3Szrj SUBSECTION
82*fae548d3Szrj Archive functions
83*fae548d3Szrj */
84*fae548d3Szrj
85*fae548d3Szrj /* Assumes:
86*fae548d3Szrj o - all archive elements start on an even boundary, newline padded;
87*fae548d3Szrj o - all arch headers are char *;
88*fae548d3Szrj o - all arch headers are the same size (across architectures).
89*fae548d3Szrj */
90*fae548d3Szrj
91*fae548d3Szrj /* Some formats provide a way to cram a long filename into the short
92*fae548d3Szrj (16 chars) space provided by a BSD archive. The trick is: make a
93*fae548d3Szrj special "file" in the front of the archive, sort of like the SYMDEF
94*fae548d3Szrj entry. If the filename is too long to fit, put it in the extended
95*fae548d3Szrj name table, and use its index as the filename. To prevent
96*fae548d3Szrj confusion prepend the index with a space. This means you can't
97*fae548d3Szrj have filenames that start with a space, but then again, many Unix
98*fae548d3Szrj utilities can't handle that anyway.
99*fae548d3Szrj
100*fae548d3Szrj This scheme unfortunately requires that you stand on your head in
101*fae548d3Szrj order to write an archive since you need to put a magic file at the
102*fae548d3Szrj front, and need to touch every entry to do so. C'est la vie.
103*fae548d3Szrj
104*fae548d3Szrj We support two variants of this idea:
105*fae548d3Szrj The SVR4 format (extended name table is named "//"),
106*fae548d3Szrj and an extended pseudo-BSD variant (extended name table is named
107*fae548d3Szrj "ARFILENAMES/"). The origin of the latter format is uncertain.
108*fae548d3Szrj
109*fae548d3Szrj BSD 4.4 uses a third scheme: It writes a long filename
110*fae548d3Szrj directly after the header. This allows 'ar q' to work.
111*fae548d3Szrj */
112*fae548d3Szrj
113*fae548d3Szrj /* Summary of archive member names:
114*fae548d3Szrj
115*fae548d3Szrj Symbol table (must be first):
116*fae548d3Szrj "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib.
117*fae548d3Szrj "/ " - Symbol table, system 5 style.
118*fae548d3Szrj
119*fae548d3Szrj Long name table (must be before regular file members):
120*fae548d3Szrj "// " - Long name table, System 5 R4 style.
121*fae548d3Szrj "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4).
122*fae548d3Szrj
123*fae548d3Szrj Regular file members with short names:
124*fae548d3Szrj "filename.o/ " - Regular file, System 5 style (embedded spaces ok).
125*fae548d3Szrj "filename.o " - Regular file, Berkeley style (no embedded spaces).
126*fae548d3Szrj
127*fae548d3Szrj Regular files with long names (or embedded spaces, for BSD variants):
128*fae548d3Szrj "/18 " - SVR4 style, name at offset 18 in name table.
129*fae548d3Szrj "#1/23 " - Long name (or embedded spaces) 23 characters long,
130*fae548d3Szrj BSD 4.4 style, full name follows header.
131*fae548d3Szrj " 18 " - Long name 18 characters long, extended pseudo-BSD.
132*fae548d3Szrj */
133*fae548d3Szrj
134*fae548d3Szrj #include "sysdep.h"
135*fae548d3Szrj #include "bfd.h"
136*fae548d3Szrj #include "libiberty.h"
137*fae548d3Szrj #include "libbfd.h"
138*fae548d3Szrj #include "aout/ar.h"
139*fae548d3Szrj #include "aout/ranlib.h"
140*fae548d3Szrj #include "safe-ctype.h"
141*fae548d3Szrj #include "hashtab.h"
142*fae548d3Szrj #include "filenames.h"
143*fae548d3Szrj #include "bfdlink.h"
144*fae548d3Szrj
145*fae548d3Szrj #ifndef errno
146*fae548d3Szrj extern int errno;
147*fae548d3Szrj #endif
148*fae548d3Szrj
149*fae548d3Szrj /* We keep a cache of archive filepointers to archive elements to
150*fae548d3Szrj speed up searching the archive by filepos. We only add an entry to
151*fae548d3Szrj the cache when we actually read one. We also don't sort the cache;
152*fae548d3Szrj it's generally short enough to search linearly.
153*fae548d3Szrj Note that the pointers here point to the front of the ar_hdr, not
154*fae548d3Szrj to the front of the contents! */
155*fae548d3Szrj struct ar_cache
156*fae548d3Szrj {
157*fae548d3Szrj file_ptr ptr;
158*fae548d3Szrj bfd *arbfd;
159*fae548d3Szrj };
160*fae548d3Szrj
161*fae548d3Szrj #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
162*fae548d3Szrj #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
163*fae548d3Szrj
164*fae548d3Szrj #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
165*fae548d3Szrj #define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header)
166*fae548d3Szrj
167*fae548d3Szrj /* True iff NAME designated a BSD 4.4 extended name. */
168*fae548d3Szrj
169*fae548d3Szrj #define is_bsd44_extended_name(NAME) \
170*fae548d3Szrj (NAME[0] == '#' && NAME[1] == '1' && NAME[2] == '/' && ISDIGIT (NAME[3]))
171*fae548d3Szrj
172*fae548d3Szrj void
_bfd_ar_spacepad(char * p,size_t n,const char * fmt,long val)173*fae548d3Szrj _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
174*fae548d3Szrj {
175*fae548d3Szrj static char buf[20];
176*fae548d3Szrj size_t len;
177*fae548d3Szrj
178*fae548d3Szrj snprintf (buf, sizeof (buf), fmt, val);
179*fae548d3Szrj len = strlen (buf);
180*fae548d3Szrj if (len < n)
181*fae548d3Szrj {
182*fae548d3Szrj memcpy (p, buf, len);
183*fae548d3Szrj memset (p + len, ' ', n - len);
184*fae548d3Szrj }
185*fae548d3Szrj else
186*fae548d3Szrj memcpy (p, buf, n);
187*fae548d3Szrj }
188*fae548d3Szrj
189*fae548d3Szrj bfd_boolean
_bfd_ar_sizepad(char * p,size_t n,bfd_size_type size)190*fae548d3Szrj _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
191*fae548d3Szrj {
192*fae548d3Szrj static char buf[21];
193*fae548d3Szrj size_t len;
194*fae548d3Szrj
195*fae548d3Szrj snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
196*fae548d3Szrj len = strlen (buf);
197*fae548d3Szrj if (len > n)
198*fae548d3Szrj {
199*fae548d3Szrj bfd_set_error (bfd_error_file_too_big);
200*fae548d3Szrj return FALSE;
201*fae548d3Szrj }
202*fae548d3Szrj if (len < n)
203*fae548d3Szrj {
204*fae548d3Szrj memcpy (p, buf, len);
205*fae548d3Szrj memset (p + len, ' ', n - len);
206*fae548d3Szrj }
207*fae548d3Szrj else
208*fae548d3Szrj memcpy (p, buf, n);
209*fae548d3Szrj return TRUE;
210*fae548d3Szrj }
211*fae548d3Szrj
212*fae548d3Szrj bfd_boolean
_bfd_generic_mkarchive(bfd * abfd)213*fae548d3Szrj _bfd_generic_mkarchive (bfd *abfd)
214*fae548d3Szrj {
215*fae548d3Szrj bfd_size_type amt = sizeof (struct artdata);
216*fae548d3Szrj
217*fae548d3Szrj abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
218*fae548d3Szrj if (bfd_ardata (abfd) == NULL)
219*fae548d3Szrj return FALSE;
220*fae548d3Szrj
221*fae548d3Szrj /* Already cleared by bfd_zalloc above.
222*fae548d3Szrj bfd_ardata (abfd)->cache = NULL;
223*fae548d3Szrj bfd_ardata (abfd)->archive_head = NULL;
224*fae548d3Szrj bfd_ardata (abfd)->symdefs = NULL;
225*fae548d3Szrj bfd_ardata (abfd)->extended_names = NULL;
226*fae548d3Szrj bfd_ardata (abfd)->extended_names_size = 0;
227*fae548d3Szrj bfd_ardata (abfd)->tdata = NULL; */
228*fae548d3Szrj
229*fae548d3Szrj return TRUE;
230*fae548d3Szrj }
231*fae548d3Szrj
232*fae548d3Szrj /*
233*fae548d3Szrj FUNCTION
234*fae548d3Szrj bfd_get_next_mapent
235*fae548d3Szrj
236*fae548d3Szrj SYNOPSIS
237*fae548d3Szrj symindex bfd_get_next_mapent
238*fae548d3Szrj (bfd *abfd, symindex previous, carsym **sym);
239*fae548d3Szrj
240*fae548d3Szrj DESCRIPTION
241*fae548d3Szrj Step through archive @var{abfd}'s symbol table (if it
242*fae548d3Szrj has one). Successively update @var{sym} with the next symbol's
243*fae548d3Szrj information, returning that symbol's (internal) index into the
244*fae548d3Szrj symbol table.
245*fae548d3Szrj
246*fae548d3Szrj Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
247*fae548d3Szrj the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
248*fae548d3Szrj got the last one.
249*fae548d3Szrj
250*fae548d3Szrj A <<carsym>> is a canonical archive symbol. The only
251*fae548d3Szrj user-visible element is its name, a null-terminated string.
252*fae548d3Szrj */
253*fae548d3Szrj
254*fae548d3Szrj symindex
bfd_get_next_mapent(bfd * abfd,symindex prev,carsym ** entry)255*fae548d3Szrj bfd_get_next_mapent (bfd *abfd, symindex prev, carsym **entry)
256*fae548d3Szrj {
257*fae548d3Szrj if (!bfd_has_map (abfd))
258*fae548d3Szrj {
259*fae548d3Szrj bfd_set_error (bfd_error_invalid_operation);
260*fae548d3Szrj return BFD_NO_MORE_SYMBOLS;
261*fae548d3Szrj }
262*fae548d3Szrj
263*fae548d3Szrj if (prev == BFD_NO_MORE_SYMBOLS)
264*fae548d3Szrj prev = 0;
265*fae548d3Szrj else
266*fae548d3Szrj ++prev;
267*fae548d3Szrj if (prev >= bfd_ardata (abfd)->symdef_count)
268*fae548d3Szrj return BFD_NO_MORE_SYMBOLS;
269*fae548d3Szrj
270*fae548d3Szrj *entry = (bfd_ardata (abfd)->symdefs + prev);
271*fae548d3Szrj return prev;
272*fae548d3Szrj }
273*fae548d3Szrj
274*fae548d3Szrj /* To be called by backends only. */
275*fae548d3Szrj
276*fae548d3Szrj bfd *
_bfd_create_empty_archive_element_shell(bfd * obfd)277*fae548d3Szrj _bfd_create_empty_archive_element_shell (bfd *obfd)
278*fae548d3Szrj {
279*fae548d3Szrj return _bfd_new_bfd_contained_in (obfd);
280*fae548d3Szrj }
281*fae548d3Szrj
282*fae548d3Szrj /*
283*fae548d3Szrj FUNCTION
284*fae548d3Szrj bfd_set_archive_head
285*fae548d3Szrj
286*fae548d3Szrj SYNOPSIS
287*fae548d3Szrj bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
288*fae548d3Szrj
289*fae548d3Szrj DESCRIPTION
290*fae548d3Szrj Set the head of the chain of
291*fae548d3Szrj BFDs contained in the archive @var{output} to @var{new_head}.
292*fae548d3Szrj */
293*fae548d3Szrj
294*fae548d3Szrj bfd_boolean
bfd_set_archive_head(bfd * output_archive,bfd * new_head)295*fae548d3Szrj bfd_set_archive_head (bfd *output_archive, bfd *new_head)
296*fae548d3Szrj {
297*fae548d3Szrj output_archive->archive_head = new_head;
298*fae548d3Szrj return TRUE;
299*fae548d3Szrj }
300*fae548d3Szrj
301*fae548d3Szrj bfd *
_bfd_look_for_bfd_in_cache(bfd * arch_bfd,file_ptr filepos)302*fae548d3Szrj _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
303*fae548d3Szrj {
304*fae548d3Szrj htab_t hash_table = bfd_ardata (arch_bfd)->cache;
305*fae548d3Szrj struct ar_cache m;
306*fae548d3Szrj
307*fae548d3Szrj m.ptr = filepos;
308*fae548d3Szrj
309*fae548d3Szrj if (hash_table)
310*fae548d3Szrj {
311*fae548d3Szrj struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m);
312*fae548d3Szrj if (!entry)
313*fae548d3Szrj return NULL;
314*fae548d3Szrj
315*fae548d3Szrj /* Unfortunately this flag is set after checking that we have
316*fae548d3Szrj an archive, and checking for an archive means one element has
317*fae548d3Szrj sneaked into the cache. */
318*fae548d3Szrj entry->arbfd->no_export = arch_bfd->no_export;
319*fae548d3Szrj return entry->arbfd;
320*fae548d3Szrj }
321*fae548d3Szrj else
322*fae548d3Szrj return NULL;
323*fae548d3Szrj }
324*fae548d3Szrj
325*fae548d3Szrj static hashval_t
hash_file_ptr(const void * p)326*fae548d3Szrj hash_file_ptr (const void * p)
327*fae548d3Szrj {
328*fae548d3Szrj return (hashval_t) (((struct ar_cache *) p)->ptr);
329*fae548d3Szrj }
330*fae548d3Szrj
331*fae548d3Szrj /* Returns non-zero if P1 and P2 are equal. */
332*fae548d3Szrj
333*fae548d3Szrj static int
eq_file_ptr(const void * p1,const void * p2)334*fae548d3Szrj eq_file_ptr (const void * p1, const void * p2)
335*fae548d3Szrj {
336*fae548d3Szrj struct ar_cache *arc1 = (struct ar_cache *) p1;
337*fae548d3Szrj struct ar_cache *arc2 = (struct ar_cache *) p2;
338*fae548d3Szrj return arc1->ptr == arc2->ptr;
339*fae548d3Szrj }
340*fae548d3Szrj
341*fae548d3Szrj /* The calloc function doesn't always take size_t (e.g. on VMS)
342*fae548d3Szrj so wrap it to avoid a compile time warning. */
343*fae548d3Szrj
344*fae548d3Szrj static void *
_bfd_calloc_wrapper(size_t a,size_t b)345*fae548d3Szrj _bfd_calloc_wrapper (size_t a, size_t b)
346*fae548d3Szrj {
347*fae548d3Szrj return calloc (a, b);
348*fae548d3Szrj }
349*fae548d3Szrj
350*fae548d3Szrj /* Kind of stupid to call cons for each one, but we don't do too many. */
351*fae548d3Szrj
352*fae548d3Szrj bfd_boolean
_bfd_add_bfd_to_archive_cache(bfd * arch_bfd,file_ptr filepos,bfd * new_elt)353*fae548d3Szrj _bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt)
354*fae548d3Szrj {
355*fae548d3Szrj struct ar_cache *cache;
356*fae548d3Szrj htab_t hash_table = bfd_ardata (arch_bfd)->cache;
357*fae548d3Szrj
358*fae548d3Szrj /* If the hash table hasn't been created, create it. */
359*fae548d3Szrj if (hash_table == NULL)
360*fae548d3Szrj {
361*fae548d3Szrj hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr,
362*fae548d3Szrj NULL, _bfd_calloc_wrapper, free);
363*fae548d3Szrj if (hash_table == NULL)
364*fae548d3Szrj return FALSE;
365*fae548d3Szrj bfd_ardata (arch_bfd)->cache = hash_table;
366*fae548d3Szrj }
367*fae548d3Szrj
368*fae548d3Szrj /* Insert new_elt into the hash table by filepos. */
369*fae548d3Szrj cache = (struct ar_cache *) bfd_zalloc (arch_bfd, sizeof (struct ar_cache));
370*fae548d3Szrj cache->ptr = filepos;
371*fae548d3Szrj cache->arbfd = new_elt;
372*fae548d3Szrj *htab_find_slot (hash_table, (const void *) cache, INSERT) = cache;
373*fae548d3Szrj
374*fae548d3Szrj /* Provide a means of accessing this from child. */
375*fae548d3Szrj arch_eltdata (new_elt)->parent_cache = hash_table;
376*fae548d3Szrj arch_eltdata (new_elt)->key = filepos;
377*fae548d3Szrj
378*fae548d3Szrj return TRUE;
379*fae548d3Szrj }
380*fae548d3Szrj
381*fae548d3Szrj static bfd *
open_nested_file(const char * filename,bfd * archive)382*fae548d3Szrj open_nested_file (const char *filename, bfd *archive)
383*fae548d3Szrj {
384*fae548d3Szrj const char *target;
385*fae548d3Szrj bfd *n_bfd;
386*fae548d3Szrj
387*fae548d3Szrj target = NULL;
388*fae548d3Szrj if (!archive->target_defaulted)
389*fae548d3Szrj target = archive->xvec->name;
390*fae548d3Szrj n_bfd = bfd_openr (filename, target);
391*fae548d3Szrj if (n_bfd != NULL)
392*fae548d3Szrj {
393*fae548d3Szrj n_bfd->lto_output = archive->lto_output;
394*fae548d3Szrj n_bfd->no_export = archive->no_export;
395*fae548d3Szrj n_bfd->my_archive = archive;
396*fae548d3Szrj }
397*fae548d3Szrj return n_bfd;
398*fae548d3Szrj }
399*fae548d3Szrj
400*fae548d3Szrj static bfd *
find_nested_archive(const char * filename,bfd * arch_bfd)401*fae548d3Szrj find_nested_archive (const char *filename, bfd *arch_bfd)
402*fae548d3Szrj {
403*fae548d3Szrj bfd *abfd;
404*fae548d3Szrj
405*fae548d3Szrj /* PR 15140: Don't allow a nested archive pointing to itself. */
406*fae548d3Szrj if (filename_cmp (filename, arch_bfd->filename) == 0)
407*fae548d3Szrj {
408*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
409*fae548d3Szrj return NULL;
410*fae548d3Szrj }
411*fae548d3Szrj
412*fae548d3Szrj for (abfd = arch_bfd->nested_archives;
413*fae548d3Szrj abfd != NULL;
414*fae548d3Szrj abfd = abfd->archive_next)
415*fae548d3Szrj {
416*fae548d3Szrj if (filename_cmp (filename, abfd->filename) == 0)
417*fae548d3Szrj return abfd;
418*fae548d3Szrj }
419*fae548d3Szrj abfd = open_nested_file (filename, arch_bfd);
420*fae548d3Szrj if (abfd)
421*fae548d3Szrj {
422*fae548d3Szrj abfd->archive_next = arch_bfd->nested_archives;
423*fae548d3Szrj arch_bfd->nested_archives = abfd;
424*fae548d3Szrj }
425*fae548d3Szrj return abfd;
426*fae548d3Szrj }
427*fae548d3Szrj
428*fae548d3Szrj /* The name begins with space. Hence the rest of the name is an index into
429*fae548d3Szrj the string table. */
430*fae548d3Szrj
431*fae548d3Szrj static char *
get_extended_arelt_filename(bfd * arch,const char * name,file_ptr * originp)432*fae548d3Szrj get_extended_arelt_filename (bfd *arch, const char *name, file_ptr *originp)
433*fae548d3Szrj {
434*fae548d3Szrj unsigned long table_index = 0;
435*fae548d3Szrj const char *endp;
436*fae548d3Szrj
437*fae548d3Szrj /* Should extract string so that I can guarantee not to overflow into
438*fae548d3Szrj the next region, but I'm too lazy. */
439*fae548d3Szrj errno = 0;
440*fae548d3Szrj /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
441*fae548d3Szrj table_index = strtol (name + 1, (char **) &endp, 10);
442*fae548d3Szrj if (errno != 0 || table_index >= bfd_ardata (arch)->extended_names_size)
443*fae548d3Szrj {
444*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
445*fae548d3Szrj return NULL;
446*fae548d3Szrj }
447*fae548d3Szrj /* In a thin archive, a member of an archive-within-an-archive
448*fae548d3Szrj will have the offset in the inner archive encoded here. */
449*fae548d3Szrj if (bfd_is_thin_archive (arch) && endp != NULL && *endp == ':')
450*fae548d3Szrj {
451*fae548d3Szrj file_ptr origin = strtol (endp + 1, NULL, 10);
452*fae548d3Szrj
453*fae548d3Szrj if (errno != 0)
454*fae548d3Szrj {
455*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
456*fae548d3Szrj return NULL;
457*fae548d3Szrj }
458*fae548d3Szrj *originp = origin;
459*fae548d3Szrj }
460*fae548d3Szrj else
461*fae548d3Szrj *originp = 0;
462*fae548d3Szrj
463*fae548d3Szrj return bfd_ardata (arch)->extended_names + table_index;
464*fae548d3Szrj }
465*fae548d3Szrj
466*fae548d3Szrj /* This functions reads an arch header and returns an areltdata pointer, or
467*fae548d3Szrj NULL on error.
468*fae548d3Szrj
469*fae548d3Szrj Presumes the file pointer is already in the right place (ie pointing
470*fae548d3Szrj to the ar_hdr in the file). Moves the file pointer; on success it
471*fae548d3Szrj should be pointing to the front of the file contents; on failure it
472*fae548d3Szrj could have been moved arbitrarily. */
473*fae548d3Szrj
474*fae548d3Szrj void *
_bfd_generic_read_ar_hdr(bfd * abfd)475*fae548d3Szrj _bfd_generic_read_ar_hdr (bfd *abfd)
476*fae548d3Szrj {
477*fae548d3Szrj return _bfd_generic_read_ar_hdr_mag (abfd, NULL);
478*fae548d3Szrj }
479*fae548d3Szrj
480*fae548d3Szrj /* Alpha ECOFF uses an optional different ARFMAG value, so we have a
481*fae548d3Szrj variant of _bfd_generic_read_ar_hdr which accepts a magic string. */
482*fae548d3Szrj
483*fae548d3Szrj void *
_bfd_generic_read_ar_hdr_mag(bfd * abfd,const char * mag)484*fae548d3Szrj _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
485*fae548d3Szrj {
486*fae548d3Szrj struct ar_hdr hdr;
487*fae548d3Szrj char *hdrp = (char *) &hdr;
488*fae548d3Szrj bfd_size_type parsed_size;
489*fae548d3Szrj struct areltdata *ared;
490*fae548d3Szrj char *filename = NULL;
491*fae548d3Szrj bfd_size_type namelen = 0;
492*fae548d3Szrj bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
493*fae548d3Szrj char *allocptr = 0;
494*fae548d3Szrj file_ptr origin = 0;
495*fae548d3Szrj unsigned int extra_size = 0;
496*fae548d3Szrj char fmag_save;
497*fae548d3Szrj int scan;
498*fae548d3Szrj
499*fae548d3Szrj if (bfd_bread (hdrp, sizeof (struct ar_hdr), abfd) != sizeof (struct ar_hdr))
500*fae548d3Szrj {
501*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
502*fae548d3Szrj bfd_set_error (bfd_error_no_more_archived_files);
503*fae548d3Szrj return NULL;
504*fae548d3Szrj }
505*fae548d3Szrj if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
506*fae548d3Szrj && (mag == NULL
507*fae548d3Szrj || strncmp (hdr.ar_fmag, mag, 2) != 0))
508*fae548d3Szrj {
509*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
510*fae548d3Szrj return NULL;
511*fae548d3Szrj }
512*fae548d3Szrj
513*fae548d3Szrj errno = 0;
514*fae548d3Szrj fmag_save = hdr.ar_fmag[0];
515*fae548d3Szrj hdr.ar_fmag[0] = 0;
516*fae548d3Szrj scan = sscanf (hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size);
517*fae548d3Szrj hdr.ar_fmag[0] = fmag_save;
518*fae548d3Szrj if (scan != 1)
519*fae548d3Szrj {
520*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
521*fae548d3Szrj return NULL;
522*fae548d3Szrj }
523*fae548d3Szrj
524*fae548d3Szrj /* Extract the filename from the archive - there are two ways to
525*fae548d3Szrj specify an extended name table, either the first char of the
526*fae548d3Szrj name is a space, or it's a slash. */
527*fae548d3Szrj if ((hdr.ar_name[0] == '/'
528*fae548d3Szrj || (hdr.ar_name[0] == ' '
529*fae548d3Szrj && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
530*fae548d3Szrj && bfd_ardata (abfd)->extended_names != NULL)
531*fae548d3Szrj {
532*fae548d3Szrj filename = get_extended_arelt_filename (abfd, hdr.ar_name, &origin);
533*fae548d3Szrj if (filename == NULL)
534*fae548d3Szrj return NULL;
535*fae548d3Szrj }
536*fae548d3Szrj /* BSD4.4-style long filename. */
537*fae548d3Szrj else if (is_bsd44_extended_name (hdr.ar_name))
538*fae548d3Szrj {
539*fae548d3Szrj /* BSD-4.4 extended name */
540*fae548d3Szrj namelen = atoi (&hdr.ar_name[3]);
541*fae548d3Szrj allocsize += namelen + 1;
542*fae548d3Szrj parsed_size -= namelen;
543*fae548d3Szrj extra_size = namelen;
544*fae548d3Szrj
545*fae548d3Szrj allocptr = (char *) bfd_zmalloc (allocsize);
546*fae548d3Szrj if (allocptr == NULL)
547*fae548d3Szrj return NULL;
548*fae548d3Szrj filename = (allocptr
549*fae548d3Szrj + sizeof (struct areltdata)
550*fae548d3Szrj + sizeof (struct ar_hdr));
551*fae548d3Szrj if (bfd_bread (filename, namelen, abfd) != namelen)
552*fae548d3Szrj {
553*fae548d3Szrj free (allocptr);
554*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
555*fae548d3Szrj bfd_set_error (bfd_error_no_more_archived_files);
556*fae548d3Szrj return NULL;
557*fae548d3Szrj }
558*fae548d3Szrj filename[namelen] = '\0';
559*fae548d3Szrj }
560*fae548d3Szrj else
561*fae548d3Szrj {
562*fae548d3Szrj /* We judge the end of the name by looking for '/' or ' '.
563*fae548d3Szrj Note: The SYSV format (terminated by '/') allows embedded
564*fae548d3Szrj spaces, so only look for ' ' if we don't find '/'. */
565*fae548d3Szrj
566*fae548d3Szrj char *e;
567*fae548d3Szrj e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
568*fae548d3Szrj if (e == NULL)
569*fae548d3Szrj {
570*fae548d3Szrj e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
571*fae548d3Szrj if (e == NULL)
572*fae548d3Szrj e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
573*fae548d3Szrj }
574*fae548d3Szrj
575*fae548d3Szrj if (e != NULL)
576*fae548d3Szrj namelen = e - hdr.ar_name;
577*fae548d3Szrj else
578*fae548d3Szrj {
579*fae548d3Szrj /* If we didn't find a termination character, then the name
580*fae548d3Szrj must be the entire field. */
581*fae548d3Szrj namelen = ar_maxnamelen (abfd);
582*fae548d3Szrj }
583*fae548d3Szrj
584*fae548d3Szrj allocsize += namelen + 1;
585*fae548d3Szrj }
586*fae548d3Szrj
587*fae548d3Szrj if (!allocptr)
588*fae548d3Szrj {
589*fae548d3Szrj allocptr = (char *) bfd_zmalloc (allocsize);
590*fae548d3Szrj if (allocptr == NULL)
591*fae548d3Szrj return NULL;
592*fae548d3Szrj }
593*fae548d3Szrj
594*fae548d3Szrj ared = (struct areltdata *) allocptr;
595*fae548d3Szrj
596*fae548d3Szrj ared->arch_header = allocptr + sizeof (struct areltdata);
597*fae548d3Szrj memcpy (ared->arch_header, &hdr, sizeof (struct ar_hdr));
598*fae548d3Szrj ared->parsed_size = parsed_size;
599*fae548d3Szrj ared->extra_size = extra_size;
600*fae548d3Szrj ared->origin = origin;
601*fae548d3Szrj
602*fae548d3Szrj if (filename != NULL)
603*fae548d3Szrj ared->filename = filename;
604*fae548d3Szrj else
605*fae548d3Szrj {
606*fae548d3Szrj ared->filename = allocptr + (sizeof (struct areltdata) +
607*fae548d3Szrj sizeof (struct ar_hdr));
608*fae548d3Szrj if (namelen)
609*fae548d3Szrj memcpy (ared->filename, hdr.ar_name, namelen);
610*fae548d3Szrj ared->filename[namelen] = '\0';
611*fae548d3Szrj }
612*fae548d3Szrj
613*fae548d3Szrj return ared;
614*fae548d3Szrj }
615*fae548d3Szrj
616*fae548d3Szrj /* Append the relative pathname for a member of the thin archive
617*fae548d3Szrj to the pathname of the directory containing the archive. */
618*fae548d3Szrj
619*fae548d3Szrj char *
_bfd_append_relative_path(bfd * arch,char * elt_name)620*fae548d3Szrj _bfd_append_relative_path (bfd *arch, char *elt_name)
621*fae548d3Szrj {
622*fae548d3Szrj const char *arch_name = arch->filename;
623*fae548d3Szrj const char *base_name = lbasename (arch_name);
624*fae548d3Szrj size_t prefix_len;
625*fae548d3Szrj char *filename;
626*fae548d3Szrj
627*fae548d3Szrj if (base_name == arch_name)
628*fae548d3Szrj return elt_name;
629*fae548d3Szrj
630*fae548d3Szrj prefix_len = base_name - arch_name;
631*fae548d3Szrj filename = (char *) bfd_alloc (arch, prefix_len + strlen (elt_name) + 1);
632*fae548d3Szrj if (filename == NULL)
633*fae548d3Szrj return NULL;
634*fae548d3Szrj
635*fae548d3Szrj strncpy (filename, arch_name, prefix_len);
636*fae548d3Szrj strcpy (filename + prefix_len, elt_name);
637*fae548d3Szrj return filename;
638*fae548d3Szrj }
639*fae548d3Szrj
640*fae548d3Szrj /* This is an internal function; it's mainly used when indexing
641*fae548d3Szrj through the archive symbol table, but also used to get the next
642*fae548d3Szrj element, since it handles the bookkeeping so nicely for us. */
643*fae548d3Szrj
644*fae548d3Szrj bfd *
_bfd_get_elt_at_filepos(bfd * archive,file_ptr filepos)645*fae548d3Szrj _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
646*fae548d3Szrj {
647*fae548d3Szrj struct areltdata *new_areldata;
648*fae548d3Szrj bfd *n_bfd;
649*fae548d3Szrj char *filename;
650*fae548d3Szrj
651*fae548d3Szrj n_bfd = _bfd_look_for_bfd_in_cache (archive, filepos);
652*fae548d3Szrj if (n_bfd)
653*fae548d3Szrj return n_bfd;
654*fae548d3Szrj
655*fae548d3Szrj if (0 > bfd_seek (archive, filepos, SEEK_SET))
656*fae548d3Szrj return NULL;
657*fae548d3Szrj
658*fae548d3Szrj if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
659*fae548d3Szrj return NULL;
660*fae548d3Szrj
661*fae548d3Szrj filename = new_areldata->filename;
662*fae548d3Szrj
663*fae548d3Szrj if (bfd_is_thin_archive (archive))
664*fae548d3Szrj {
665*fae548d3Szrj /* This is a proxy entry for an external file. */
666*fae548d3Szrj if (! IS_ABSOLUTE_PATH (filename))
667*fae548d3Szrj {
668*fae548d3Szrj filename = _bfd_append_relative_path (archive, filename);
669*fae548d3Szrj if (filename == NULL)
670*fae548d3Szrj {
671*fae548d3Szrj free (new_areldata);
672*fae548d3Szrj return NULL;
673*fae548d3Szrj }
674*fae548d3Szrj }
675*fae548d3Szrj
676*fae548d3Szrj if (new_areldata->origin > 0)
677*fae548d3Szrj {
678*fae548d3Szrj /* This proxy entry refers to an element of a nested archive.
679*fae548d3Szrj Locate the member of that archive and return a bfd for it. */
680*fae548d3Szrj bfd *ext_arch = find_nested_archive (filename, archive);
681*fae548d3Szrj
682*fae548d3Szrj if (ext_arch == NULL
683*fae548d3Szrj || ! bfd_check_format (ext_arch, bfd_archive))
684*fae548d3Szrj {
685*fae548d3Szrj free (new_areldata);
686*fae548d3Szrj return NULL;
687*fae548d3Szrj }
688*fae548d3Szrj n_bfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
689*fae548d3Szrj if (n_bfd == NULL)
690*fae548d3Szrj {
691*fae548d3Szrj free (new_areldata);
692*fae548d3Szrj return NULL;
693*fae548d3Szrj }
694*fae548d3Szrj n_bfd->proxy_origin = bfd_tell (archive);
695*fae548d3Szrj
696*fae548d3Szrj /* Copy BFD_COMPRESS, BFD_DECOMPRESS and BFD_COMPRESS_GABI
697*fae548d3Szrj flags. */
698*fae548d3Szrj n_bfd->flags |= archive->flags & (BFD_COMPRESS
699*fae548d3Szrj | BFD_DECOMPRESS
700*fae548d3Szrj | BFD_COMPRESS_GABI);
701*fae548d3Szrj
702*fae548d3Szrj return n_bfd;
703*fae548d3Szrj }
704*fae548d3Szrj
705*fae548d3Szrj /* It's not an element of a nested archive;
706*fae548d3Szrj open the external file as a bfd. */
707*fae548d3Szrj n_bfd = open_nested_file (filename, archive);
708*fae548d3Szrj if (n_bfd == NULL)
709*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
710*fae548d3Szrj }
711*fae548d3Szrj else
712*fae548d3Szrj {
713*fae548d3Szrj n_bfd = _bfd_create_empty_archive_element_shell (archive);
714*fae548d3Szrj }
715*fae548d3Szrj
716*fae548d3Szrj if (n_bfd == NULL)
717*fae548d3Szrj {
718*fae548d3Szrj free (new_areldata);
719*fae548d3Szrj return NULL;
720*fae548d3Szrj }
721*fae548d3Szrj
722*fae548d3Szrj n_bfd->proxy_origin = bfd_tell (archive);
723*fae548d3Szrj
724*fae548d3Szrj if (bfd_is_thin_archive (archive))
725*fae548d3Szrj {
726*fae548d3Szrj n_bfd->origin = 0;
727*fae548d3Szrj }
728*fae548d3Szrj else
729*fae548d3Szrj {
730*fae548d3Szrj n_bfd->origin = n_bfd->proxy_origin;
731*fae548d3Szrj n_bfd->filename = bfd_strdup (filename);
732*fae548d3Szrj if (n_bfd->filename == NULL)
733*fae548d3Szrj goto out;
734*fae548d3Szrj }
735*fae548d3Szrj
736*fae548d3Szrj n_bfd->arelt_data = new_areldata;
737*fae548d3Szrj
738*fae548d3Szrj /* Copy BFD_COMPRESS, BFD_DECOMPRESS and BFD_COMPRESS_GABI flags. */
739*fae548d3Szrj n_bfd->flags |= archive->flags & (BFD_COMPRESS
740*fae548d3Szrj | BFD_DECOMPRESS
741*fae548d3Szrj | BFD_COMPRESS_GABI);
742*fae548d3Szrj
743*fae548d3Szrj /* Copy is_linker_input. */
744*fae548d3Szrj n_bfd->is_linker_input = archive->is_linker_input;
745*fae548d3Szrj
746*fae548d3Szrj if (archive->no_element_cache
747*fae548d3Szrj || _bfd_add_bfd_to_archive_cache (archive, filepos, n_bfd))
748*fae548d3Szrj return n_bfd;
749*fae548d3Szrj
750*fae548d3Szrj out:
751*fae548d3Szrj free (new_areldata);
752*fae548d3Szrj n_bfd->arelt_data = NULL;
753*fae548d3Szrj bfd_close (n_bfd);
754*fae548d3Szrj return NULL;
755*fae548d3Szrj }
756*fae548d3Szrj
757*fae548d3Szrj /* Return the BFD which is referenced by the symbol in ABFD indexed by
758*fae548d3Szrj SYM_INDEX. SYM_INDEX should have been returned by bfd_get_next_mapent. */
759*fae548d3Szrj
760*fae548d3Szrj bfd *
_bfd_generic_get_elt_at_index(bfd * abfd,symindex sym_index)761*fae548d3Szrj _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index)
762*fae548d3Szrj {
763*fae548d3Szrj carsym *entry;
764*fae548d3Szrj
765*fae548d3Szrj entry = bfd_ardata (abfd)->symdefs + sym_index;
766*fae548d3Szrj return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
767*fae548d3Szrj }
768*fae548d3Szrj
769*fae548d3Szrj bfd *
_bfd_noarchive_get_elt_at_index(bfd * abfd,symindex sym_index ATTRIBUTE_UNUSED)770*fae548d3Szrj _bfd_noarchive_get_elt_at_index (bfd *abfd,
771*fae548d3Szrj symindex sym_index ATTRIBUTE_UNUSED)
772*fae548d3Szrj {
773*fae548d3Szrj return (bfd *) _bfd_ptr_bfd_null_error (abfd);
774*fae548d3Szrj }
775*fae548d3Szrj
776*fae548d3Szrj /*
777*fae548d3Szrj FUNCTION
778*fae548d3Szrj bfd_openr_next_archived_file
779*fae548d3Szrj
780*fae548d3Szrj SYNOPSIS
781*fae548d3Szrj bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
782*fae548d3Szrj
783*fae548d3Szrj DESCRIPTION
784*fae548d3Szrj Provided a BFD, @var{archive}, containing an archive and NULL, open
785*fae548d3Szrj an input BFD on the first contained element and returns that.
786*fae548d3Szrj Subsequent calls should pass the archive and the previous return
787*fae548d3Szrj value to return a created BFD to the next contained element. NULL
788*fae548d3Szrj is returned when there are no more.
789*fae548d3Szrj Note - if you want to process the bfd returned by this call be
790*fae548d3Szrj sure to call bfd_check_format() on it first.
791*fae548d3Szrj */
792*fae548d3Szrj
793*fae548d3Szrj bfd *
bfd_openr_next_archived_file(bfd * archive,bfd * last_file)794*fae548d3Szrj bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
795*fae548d3Szrj {
796*fae548d3Szrj if ((bfd_get_format (archive) != bfd_archive)
797*fae548d3Szrj || (archive->direction == write_direction))
798*fae548d3Szrj {
799*fae548d3Szrj bfd_set_error (bfd_error_invalid_operation);
800*fae548d3Szrj return NULL;
801*fae548d3Szrj }
802*fae548d3Szrj
803*fae548d3Szrj return BFD_SEND (archive,
804*fae548d3Szrj openr_next_archived_file, (archive, last_file));
805*fae548d3Szrj }
806*fae548d3Szrj
807*fae548d3Szrj bfd *
bfd_generic_openr_next_archived_file(bfd * archive,bfd * last_file)808*fae548d3Szrj bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
809*fae548d3Szrj {
810*fae548d3Szrj ufile_ptr filestart;
811*fae548d3Szrj
812*fae548d3Szrj if (!last_file)
813*fae548d3Szrj filestart = bfd_ardata (archive)->first_file_filepos;
814*fae548d3Szrj else
815*fae548d3Szrj {
816*fae548d3Szrj filestart = last_file->proxy_origin;
817*fae548d3Szrj if (! bfd_is_thin_archive (archive))
818*fae548d3Szrj {
819*fae548d3Szrj bfd_size_type size = arelt_size (last_file);
820*fae548d3Szrj
821*fae548d3Szrj filestart += size;
822*fae548d3Szrj /* Pad to an even boundary...
823*fae548d3Szrj Note that last_file->origin can be odd in the case of
824*fae548d3Szrj BSD-4.4-style element with a long odd size. */
825*fae548d3Szrj filestart += filestart % 2;
826*fae548d3Szrj if (filestart < last_file->proxy_origin)
827*fae548d3Szrj {
828*fae548d3Szrj /* Prevent looping. See PR19256. */
829*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
830*fae548d3Szrj return NULL;
831*fae548d3Szrj }
832*fae548d3Szrj }
833*fae548d3Szrj }
834*fae548d3Szrj
835*fae548d3Szrj return _bfd_get_elt_at_filepos (archive, filestart);
836*fae548d3Szrj }
837*fae548d3Szrj
838*fae548d3Szrj bfd *
_bfd_noarchive_openr_next_archived_file(bfd * archive,bfd * last_file ATTRIBUTE_UNUSED)839*fae548d3Szrj _bfd_noarchive_openr_next_archived_file (bfd *archive,
840*fae548d3Szrj bfd *last_file ATTRIBUTE_UNUSED)
841*fae548d3Szrj {
842*fae548d3Szrj return (bfd *) _bfd_ptr_bfd_null_error (archive);
843*fae548d3Szrj }
844*fae548d3Szrj
845*fae548d3Szrj const bfd_target *
bfd_generic_archive_p(bfd * abfd)846*fae548d3Szrj bfd_generic_archive_p (bfd *abfd)
847*fae548d3Szrj {
848*fae548d3Szrj struct artdata *tdata_hold;
849*fae548d3Szrj char armag[SARMAG + 1];
850*fae548d3Szrj bfd_size_type amt;
851*fae548d3Szrj
852*fae548d3Szrj if (bfd_bread (armag, SARMAG, abfd) != SARMAG)
853*fae548d3Szrj {
854*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
855*fae548d3Szrj bfd_set_error (bfd_error_wrong_format);
856*fae548d3Szrj return NULL;
857*fae548d3Szrj }
858*fae548d3Szrj
859*fae548d3Szrj bfd_set_thin_archive (abfd, strncmp (armag, ARMAGT, SARMAG) == 0);
860*fae548d3Szrj
861*fae548d3Szrj if (strncmp (armag, ARMAG, SARMAG) != 0
862*fae548d3Szrj && ! bfd_is_thin_archive (abfd))
863*fae548d3Szrj {
864*fae548d3Szrj bfd_set_error (bfd_error_wrong_format);
865*fae548d3Szrj return NULL;
866*fae548d3Szrj }
867*fae548d3Szrj
868*fae548d3Szrj tdata_hold = bfd_ardata (abfd);
869*fae548d3Szrj
870*fae548d3Szrj amt = sizeof (struct artdata);
871*fae548d3Szrj bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
872*fae548d3Szrj if (bfd_ardata (abfd) == NULL)
873*fae548d3Szrj {
874*fae548d3Szrj bfd_ardata (abfd) = tdata_hold;
875*fae548d3Szrj return NULL;
876*fae548d3Szrj }
877*fae548d3Szrj
878*fae548d3Szrj bfd_ardata (abfd)->first_file_filepos = SARMAG;
879*fae548d3Szrj /* Cleared by bfd_zalloc above.
880*fae548d3Szrj bfd_ardata (abfd)->cache = NULL;
881*fae548d3Szrj bfd_ardata (abfd)->archive_head = NULL;
882*fae548d3Szrj bfd_ardata (abfd)->symdefs = NULL;
883*fae548d3Szrj bfd_ardata (abfd)->extended_names = NULL;
884*fae548d3Szrj bfd_ardata (abfd)->extended_names_size = 0;
885*fae548d3Szrj bfd_ardata (abfd)->tdata = NULL; */
886*fae548d3Szrj
887*fae548d3Szrj if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
888*fae548d3Szrj || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
889*fae548d3Szrj {
890*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
891*fae548d3Szrj bfd_set_error (bfd_error_wrong_format);
892*fae548d3Szrj bfd_release (abfd, bfd_ardata (abfd));
893*fae548d3Szrj bfd_ardata (abfd) = tdata_hold;
894*fae548d3Szrj return NULL;
895*fae548d3Szrj }
896*fae548d3Szrj
897*fae548d3Szrj if (abfd->target_defaulted && bfd_has_map (abfd))
898*fae548d3Szrj {
899*fae548d3Szrj bfd *first;
900*fae548d3Szrj unsigned int save;
901*fae548d3Szrj
902*fae548d3Szrj /* This archive has a map, so we may presume that the contents
903*fae548d3Szrj are object files. Make sure that if the first file in the
904*fae548d3Szrj archive can be recognized as an object file, it is for this
905*fae548d3Szrj target. If not, assume that this is the wrong format. If
906*fae548d3Szrj the first file is not an object file, somebody is doing
907*fae548d3Szrj something weird, and we permit it so that ar -t will work.
908*fae548d3Szrj
909*fae548d3Szrj This is done because any normal format will recognize any
910*fae548d3Szrj normal archive, regardless of the format of the object files.
911*fae548d3Szrj We do accept an empty archive. */
912*fae548d3Szrj
913*fae548d3Szrj save = abfd->no_element_cache;
914*fae548d3Szrj abfd->no_element_cache = 1;
915*fae548d3Szrj first = bfd_openr_next_archived_file (abfd, NULL);
916*fae548d3Szrj abfd->no_element_cache = save;
917*fae548d3Szrj if (first != NULL)
918*fae548d3Szrj {
919*fae548d3Szrj first->target_defaulted = FALSE;
920*fae548d3Szrj if (bfd_check_format (first, bfd_object)
921*fae548d3Szrj && first->xvec != abfd->xvec)
922*fae548d3Szrj bfd_set_error (bfd_error_wrong_object_format);
923*fae548d3Szrj bfd_close (first);
924*fae548d3Szrj }
925*fae548d3Szrj }
926*fae548d3Szrj
927*fae548d3Szrj return abfd->xvec;
928*fae548d3Szrj }
929*fae548d3Szrj
930*fae548d3Szrj /* Some constants for a 32 bit BSD archive structure. We do not
931*fae548d3Szrj support 64 bit archives presently; so far as I know, none actually
932*fae548d3Szrj exist. Supporting them would require changing these constants, and
933*fae548d3Szrj changing some H_GET_32 to H_GET_64. */
934*fae548d3Szrj
935*fae548d3Szrj /* The size of an external symdef structure. */
936*fae548d3Szrj #define BSD_SYMDEF_SIZE 8
937*fae548d3Szrj
938*fae548d3Szrj /* The offset from the start of a symdef structure to the file offset. */
939*fae548d3Szrj #define BSD_SYMDEF_OFFSET_SIZE 4
940*fae548d3Szrj
941*fae548d3Szrj /* The size of the symdef count. */
942*fae548d3Szrj #define BSD_SYMDEF_COUNT_SIZE 4
943*fae548d3Szrj
944*fae548d3Szrj /* The size of the string count. */
945*fae548d3Szrj #define BSD_STRING_COUNT_SIZE 4
946*fae548d3Szrj
947*fae548d3Szrj /* Read a BSD-style archive symbol table. Returns FALSE on error,
948*fae548d3Szrj TRUE otherwise. */
949*fae548d3Szrj
950*fae548d3Szrj static bfd_boolean
do_slurp_bsd_armap(bfd * abfd)951*fae548d3Szrj do_slurp_bsd_armap (bfd *abfd)
952*fae548d3Szrj {
953*fae548d3Szrj struct areltdata *mapdata;
954*fae548d3Szrj unsigned int counter;
955*fae548d3Szrj bfd_byte *raw_armap, *rbase;
956*fae548d3Szrj struct artdata *ardata = bfd_ardata (abfd);
957*fae548d3Szrj char *stringbase;
958*fae548d3Szrj bfd_size_type parsed_size, amt;
959*fae548d3Szrj carsym *set;
960*fae548d3Szrj
961*fae548d3Szrj mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
962*fae548d3Szrj if (mapdata == NULL)
963*fae548d3Szrj return FALSE;
964*fae548d3Szrj parsed_size = mapdata->parsed_size;
965*fae548d3Szrj free (mapdata);
966*fae548d3Szrj /* PR 17512: file: 883ff754. */
967*fae548d3Szrj /* PR 17512: file: 0458885f. */
968*fae548d3Szrj if (parsed_size < 4)
969*fae548d3Szrj return FALSE;
970*fae548d3Szrj
971*fae548d3Szrj raw_armap = (bfd_byte *) bfd_alloc (abfd, parsed_size);
972*fae548d3Szrj if (raw_armap == NULL)
973*fae548d3Szrj return FALSE;
974*fae548d3Szrj
975*fae548d3Szrj if (bfd_bread (raw_armap, parsed_size, abfd) != parsed_size)
976*fae548d3Szrj {
977*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
978*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
979*fae548d3Szrj byebye:
980*fae548d3Szrj bfd_release (abfd, raw_armap);
981*fae548d3Szrj return FALSE;
982*fae548d3Szrj }
983*fae548d3Szrj
984*fae548d3Szrj ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
985*fae548d3Szrj if (ardata->symdef_count * BSD_SYMDEF_SIZE >
986*fae548d3Szrj parsed_size - BSD_SYMDEF_COUNT_SIZE)
987*fae548d3Szrj {
988*fae548d3Szrj /* Probably we're using the wrong byte ordering. */
989*fae548d3Szrj bfd_set_error (bfd_error_wrong_format);
990*fae548d3Szrj goto byebye;
991*fae548d3Szrj }
992*fae548d3Szrj
993*fae548d3Szrj rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
994*fae548d3Szrj stringbase = ((char *) rbase
995*fae548d3Szrj + ardata->symdef_count * BSD_SYMDEF_SIZE
996*fae548d3Szrj + BSD_STRING_COUNT_SIZE);
997*fae548d3Szrj amt = ardata->symdef_count * sizeof (carsym);
998*fae548d3Szrj ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
999*fae548d3Szrj if (!ardata->symdefs)
1000*fae548d3Szrj return FALSE;
1001*fae548d3Szrj
1002*fae548d3Szrj for (counter = 0, set = ardata->symdefs;
1003*fae548d3Szrj counter < ardata->symdef_count;
1004*fae548d3Szrj counter++, set++, rbase += BSD_SYMDEF_SIZE)
1005*fae548d3Szrj {
1006*fae548d3Szrj set->name = H_GET_32 (abfd, rbase) + stringbase;
1007*fae548d3Szrj set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1008*fae548d3Szrj }
1009*fae548d3Szrj
1010*fae548d3Szrj ardata->first_file_filepos = bfd_tell (abfd);
1011*fae548d3Szrj /* Pad to an even boundary if you have to. */
1012*fae548d3Szrj ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1013*fae548d3Szrj /* FIXME, we should provide some way to free raw_ardata when
1014*fae548d3Szrj we are done using the strings from it. For now, it seems
1015*fae548d3Szrj to be allocated on an objalloc anyway... */
1016*fae548d3Szrj abfd->has_armap = TRUE;
1017*fae548d3Szrj return TRUE;
1018*fae548d3Szrj }
1019*fae548d3Szrj
1020*fae548d3Szrj /* Read a COFF archive symbol table. Returns FALSE on error, TRUE
1021*fae548d3Szrj otherwise. */
1022*fae548d3Szrj
1023*fae548d3Szrj static bfd_boolean
do_slurp_coff_armap(bfd * abfd)1024*fae548d3Szrj do_slurp_coff_armap (bfd *abfd)
1025*fae548d3Szrj {
1026*fae548d3Szrj struct areltdata *mapdata;
1027*fae548d3Szrj int *raw_armap, *rawptr;
1028*fae548d3Szrj struct artdata *ardata = bfd_ardata (abfd);
1029*fae548d3Szrj char *stringbase;
1030*fae548d3Szrj char *stringend;
1031*fae548d3Szrj bfd_size_type stringsize;
1032*fae548d3Szrj bfd_size_type parsed_size;
1033*fae548d3Szrj carsym *carsyms;
1034*fae548d3Szrj bfd_size_type nsymz; /* Number of symbols in armap. */
1035*fae548d3Szrj bfd_vma (*swap) (const void *);
1036*fae548d3Szrj char int_buf[sizeof (long)];
1037*fae548d3Szrj bfd_size_type carsym_size, ptrsize;
1038*fae548d3Szrj unsigned int i;
1039*fae548d3Szrj
1040*fae548d3Szrj mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1041*fae548d3Szrj if (mapdata == NULL)
1042*fae548d3Szrj return FALSE;
1043*fae548d3Szrj parsed_size = mapdata->parsed_size;
1044*fae548d3Szrj free (mapdata);
1045*fae548d3Szrj
1046*fae548d3Szrj if (bfd_bread (int_buf, 4, abfd) != 4)
1047*fae548d3Szrj {
1048*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
1049*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
1050*fae548d3Szrj return FALSE;
1051*fae548d3Szrj }
1052*fae548d3Szrj /* It seems that all numeric information in a coff archive is always
1053*fae548d3Szrj in big endian format, nomatter the host or target. */
1054*fae548d3Szrj swap = bfd_getb32;
1055*fae548d3Szrj nsymz = bfd_getb32 (int_buf);
1056*fae548d3Szrj stringsize = parsed_size - (4 * nsymz) - 4;
1057*fae548d3Szrj
1058*fae548d3Szrj /* The coff armap must be read sequentially. So we construct a
1059*fae548d3Szrj bsd-style one in core all at once, for simplicity. */
1060*fae548d3Szrj
1061*fae548d3Szrj if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym))
1062*fae548d3Szrj {
1063*fae548d3Szrj bfd_set_error (bfd_error_no_memory);
1064*fae548d3Szrj return FALSE;
1065*fae548d3Szrj }
1066*fae548d3Szrj
1067*fae548d3Szrj carsym_size = (nsymz * sizeof (carsym));
1068*fae548d3Szrj ptrsize = (4 * nsymz);
1069*fae548d3Szrj
1070*fae548d3Szrj if (carsym_size + stringsize + 1 <= carsym_size)
1071*fae548d3Szrj {
1072*fae548d3Szrj bfd_set_error (bfd_error_no_memory);
1073*fae548d3Szrj return FALSE;
1074*fae548d3Szrj }
1075*fae548d3Szrj
1076*fae548d3Szrj ardata->symdefs = (struct carsym *) bfd_alloc (abfd,
1077*fae548d3Szrj carsym_size + stringsize + 1);
1078*fae548d3Szrj if (ardata->symdefs == NULL)
1079*fae548d3Szrj return FALSE;
1080*fae548d3Szrj carsyms = ardata->symdefs;
1081*fae548d3Szrj stringbase = ((char *) ardata->symdefs) + carsym_size;
1082*fae548d3Szrj
1083*fae548d3Szrj /* Allocate and read in the raw offsets. */
1084*fae548d3Szrj raw_armap = (int *) bfd_alloc (abfd, ptrsize);
1085*fae548d3Szrj if (raw_armap == NULL)
1086*fae548d3Szrj goto release_symdefs;
1087*fae548d3Szrj if (bfd_bread (raw_armap, ptrsize, abfd) != ptrsize
1088*fae548d3Szrj || (bfd_bread (stringbase, stringsize, abfd) != stringsize))
1089*fae548d3Szrj {
1090*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
1091*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
1092*fae548d3Szrj goto release_symdefs;
1093*fae548d3Szrj }
1094*fae548d3Szrj
1095*fae548d3Szrj /* OK, build the carsyms. */
1096*fae548d3Szrj stringend = stringbase + stringsize;
1097*fae548d3Szrj *stringend = 0;
1098*fae548d3Szrj for (i = 0; i < nsymz; i++)
1099*fae548d3Szrj {
1100*fae548d3Szrj rawptr = raw_armap + i;
1101*fae548d3Szrj carsyms->file_offset = swap ((bfd_byte *) rawptr);
1102*fae548d3Szrj carsyms->name = stringbase;
1103*fae548d3Szrj stringbase += strlen (stringbase);
1104*fae548d3Szrj if (stringbase != stringend)
1105*fae548d3Szrj ++stringbase;
1106*fae548d3Szrj carsyms++;
1107*fae548d3Szrj }
1108*fae548d3Szrj
1109*fae548d3Szrj ardata->symdef_count = nsymz;
1110*fae548d3Szrj ardata->first_file_filepos = bfd_tell (abfd);
1111*fae548d3Szrj /* Pad to an even boundary if you have to. */
1112*fae548d3Szrj ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1113*fae548d3Szrj
1114*fae548d3Szrj abfd->has_armap = TRUE;
1115*fae548d3Szrj bfd_release (abfd, raw_armap);
1116*fae548d3Szrj
1117*fae548d3Szrj /* Check for a second archive header (as used by PE). */
1118*fae548d3Szrj {
1119*fae548d3Szrj struct areltdata *tmp;
1120*fae548d3Szrj
1121*fae548d3Szrj bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
1122*fae548d3Szrj tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1123*fae548d3Szrj if (tmp != NULL)
1124*fae548d3Szrj {
1125*fae548d3Szrj if (tmp->arch_header[0] == '/'
1126*fae548d3Szrj && tmp->arch_header[1] == ' ')
1127*fae548d3Szrj {
1128*fae548d3Szrj ardata->first_file_filepos +=
1129*fae548d3Szrj (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
1130*fae548d3Szrj }
1131*fae548d3Szrj free (tmp);
1132*fae548d3Szrj }
1133*fae548d3Szrj }
1134*fae548d3Szrj
1135*fae548d3Szrj return TRUE;
1136*fae548d3Szrj
1137*fae548d3Szrj release_symdefs:
1138*fae548d3Szrj bfd_release (abfd, (ardata)->symdefs);
1139*fae548d3Szrj return FALSE;
1140*fae548d3Szrj }
1141*fae548d3Szrj
1142*fae548d3Szrj /* This routine can handle either coff-style or bsd-style armaps
1143*fae548d3Szrj (archive symbol table). Returns FALSE on error, TRUE otherwise */
1144*fae548d3Szrj
1145*fae548d3Szrj bfd_boolean
bfd_slurp_armap(bfd * abfd)1146*fae548d3Szrj bfd_slurp_armap (bfd *abfd)
1147*fae548d3Szrj {
1148*fae548d3Szrj char nextname[17];
1149*fae548d3Szrj int i = bfd_bread (nextname, 16, abfd);
1150*fae548d3Szrj
1151*fae548d3Szrj if (i == 0)
1152*fae548d3Szrj return TRUE;
1153*fae548d3Szrj if (i != 16)
1154*fae548d3Szrj return FALSE;
1155*fae548d3Szrj
1156*fae548d3Szrj if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1157*fae548d3Szrj return FALSE;
1158*fae548d3Szrj
1159*fae548d3Szrj if (CONST_STRNEQ (nextname, "__.SYMDEF ")
1160*fae548d3Szrj || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */
1161*fae548d3Szrj return do_slurp_bsd_armap (abfd);
1162*fae548d3Szrj else if (CONST_STRNEQ (nextname, "/ "))
1163*fae548d3Szrj return do_slurp_coff_armap (abfd);
1164*fae548d3Szrj else if (CONST_STRNEQ (nextname, "/SYM64/ "))
1165*fae548d3Szrj {
1166*fae548d3Szrj /* 64bit (Irix 6) archive. */
1167*fae548d3Szrj #ifdef BFD64
1168*fae548d3Szrj return _bfd_archive_64_bit_slurp_armap (abfd);
1169*fae548d3Szrj #else
1170*fae548d3Szrj bfd_set_error (bfd_error_wrong_format);
1171*fae548d3Szrj return FALSE;
1172*fae548d3Szrj #endif
1173*fae548d3Szrj }
1174*fae548d3Szrj else if (CONST_STRNEQ (nextname, "#1/20 "))
1175*fae548d3Szrj {
1176*fae548d3Szrj /* Mach-O has a special name for armap when the map is sorted by name.
1177*fae548d3Szrj However because this name has a space it is slightly more difficult
1178*fae548d3Szrj to check it. */
1179*fae548d3Szrj struct ar_hdr hdr;
1180*fae548d3Szrj char extname[21];
1181*fae548d3Szrj
1182*fae548d3Szrj if (bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
1183*fae548d3Szrj return FALSE;
1184*fae548d3Szrj /* Read the extended name. We know its length. */
1185*fae548d3Szrj if (bfd_bread (extname, 20, abfd) != 20)
1186*fae548d3Szrj return FALSE;
1187*fae548d3Szrj if (bfd_seek (abfd, -(file_ptr) (sizeof (hdr) + 20), SEEK_CUR) != 0)
1188*fae548d3Szrj return FALSE;
1189*fae548d3Szrj extname[20] = 0;
1190*fae548d3Szrj if (CONST_STRNEQ (extname, "__.SYMDEF SORTED")
1191*fae548d3Szrj || CONST_STRNEQ (extname, "__.SYMDEF"))
1192*fae548d3Szrj return do_slurp_bsd_armap (abfd);
1193*fae548d3Szrj }
1194*fae548d3Szrj
1195*fae548d3Szrj abfd->has_armap = FALSE;
1196*fae548d3Szrj return TRUE;
1197*fae548d3Szrj }
1198*fae548d3Szrj
1199*fae548d3Szrj /** Extended name table.
1200*fae548d3Szrj
1201*fae548d3Szrj Normally archives support only 14-character filenames.
1202*fae548d3Szrj
1203*fae548d3Szrj Intel has extended the format: longer names are stored in a special
1204*fae548d3Szrj element (the first in the archive, or second if there is an armap);
1205*fae548d3Szrj the name in the ar_hdr is replaced by <space><index into filename
1206*fae548d3Szrj element>. Index is the P.R. of an int (decimal). Data General have
1207*fae548d3Szrj extended the format by using the prefix // for the special element. */
1208*fae548d3Szrj
1209*fae548d3Szrj /* Returns FALSE on error, TRUE otherwise. */
1210*fae548d3Szrj
1211*fae548d3Szrj bfd_boolean
_bfd_slurp_extended_name_table(bfd * abfd)1212*fae548d3Szrj _bfd_slurp_extended_name_table (bfd *abfd)
1213*fae548d3Szrj {
1214*fae548d3Szrj char nextname[17];
1215*fae548d3Szrj struct areltdata *namedata;
1216*fae548d3Szrj bfd_size_type amt;
1217*fae548d3Szrj
1218*fae548d3Szrj /* FIXME: Formatting sucks here, and in case of failure of BFD_READ,
1219*fae548d3Szrj we probably don't want to return TRUE. */
1220*fae548d3Szrj if (bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET) != 0)
1221*fae548d3Szrj return FALSE;
1222*fae548d3Szrj
1223*fae548d3Szrj if (bfd_bread (nextname, 16, abfd) == 16)
1224*fae548d3Szrj {
1225*fae548d3Szrj if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1226*fae548d3Szrj return FALSE;
1227*fae548d3Szrj
1228*fae548d3Szrj if (! CONST_STRNEQ (nextname, "ARFILENAMES/ ")
1229*fae548d3Szrj && ! CONST_STRNEQ (nextname, "// "))
1230*fae548d3Szrj {
1231*fae548d3Szrj bfd_ardata (abfd)->extended_names = NULL;
1232*fae548d3Szrj bfd_ardata (abfd)->extended_names_size = 0;
1233*fae548d3Szrj return TRUE;
1234*fae548d3Szrj }
1235*fae548d3Szrj
1236*fae548d3Szrj namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1237*fae548d3Szrj if (namedata == NULL)
1238*fae548d3Szrj return FALSE;
1239*fae548d3Szrj
1240*fae548d3Szrj amt = namedata->parsed_size;
1241*fae548d3Szrj if (amt + 1 == 0)
1242*fae548d3Szrj goto byebye;
1243*fae548d3Szrj
1244*fae548d3Szrj bfd_ardata (abfd)->extended_names_size = amt;
1245*fae548d3Szrj bfd_ardata (abfd)->extended_names = (char *) bfd_alloc (abfd, amt + 1);
1246*fae548d3Szrj if (bfd_ardata (abfd)->extended_names == NULL)
1247*fae548d3Szrj {
1248*fae548d3Szrj byebye:
1249*fae548d3Szrj free (namedata);
1250*fae548d3Szrj bfd_ardata (abfd)->extended_names = NULL;
1251*fae548d3Szrj bfd_ardata (abfd)->extended_names_size = 0;
1252*fae548d3Szrj return FALSE;
1253*fae548d3Szrj }
1254*fae548d3Szrj
1255*fae548d3Szrj if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
1256*fae548d3Szrj {
1257*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
1258*fae548d3Szrj bfd_set_error (bfd_error_malformed_archive);
1259*fae548d3Szrj bfd_release (abfd, (bfd_ardata (abfd)->extended_names));
1260*fae548d3Szrj bfd_ardata (abfd)->extended_names = NULL;
1261*fae548d3Szrj goto byebye;
1262*fae548d3Szrj }
1263*fae548d3Szrj bfd_ardata (abfd)->extended_names[amt] = 0;
1264*fae548d3Szrj
1265*fae548d3Szrj /* Since the archive is supposed to be printable if it contains
1266*fae548d3Szrj text, the entries in the list are newline-padded, not null
1267*fae548d3Szrj padded. In SVR4-style archives, the names also have a
1268*fae548d3Szrj trailing '/'. DOS/NT created archive often have \ in them
1269*fae548d3Szrj We'll fix all problems here. */
1270*fae548d3Szrj {
1271*fae548d3Szrj char *ext_names = bfd_ardata (abfd)->extended_names;
1272*fae548d3Szrj char *temp = ext_names;
1273*fae548d3Szrj char *limit = temp + namedata->parsed_size;
1274*fae548d3Szrj
1275*fae548d3Szrj for (; temp < limit; ++temp)
1276*fae548d3Szrj {
1277*fae548d3Szrj if (*temp == ARFMAG[1])
1278*fae548d3Szrj temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
1279*fae548d3Szrj if (*temp == '\\')
1280*fae548d3Szrj *temp = '/';
1281*fae548d3Szrj }
1282*fae548d3Szrj *limit = '\0';
1283*fae548d3Szrj }
1284*fae548d3Szrj
1285*fae548d3Szrj /* Pad to an even boundary if you have to. */
1286*fae548d3Szrj bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1287*fae548d3Szrj bfd_ardata (abfd)->first_file_filepos +=
1288*fae548d3Szrj (bfd_ardata (abfd)->first_file_filepos) % 2;
1289*fae548d3Szrj
1290*fae548d3Szrj free (namedata);
1291*fae548d3Szrj }
1292*fae548d3Szrj return TRUE;
1293*fae548d3Szrj }
1294*fae548d3Szrj
1295*fae548d3Szrj #ifdef VMS
1296*fae548d3Szrj
1297*fae548d3Szrj /* Return a copy of the stuff in the filename between any :]> and a
1298*fae548d3Szrj semicolon. */
1299*fae548d3Szrj
1300*fae548d3Szrj static const char *
normalize(bfd * abfd,const char * file)1301*fae548d3Szrj normalize (bfd *abfd, const char *file)
1302*fae548d3Szrj {
1303*fae548d3Szrj const char *first;
1304*fae548d3Szrj const char *last;
1305*fae548d3Szrj char *copy;
1306*fae548d3Szrj
1307*fae548d3Szrj if (abfd->flags & BFD_ARCHIVE_FULL_PATH)
1308*fae548d3Szrj return file;
1309*fae548d3Szrj
1310*fae548d3Szrj first = file + strlen (file) - 1;
1311*fae548d3Szrj last = first + 1;
1312*fae548d3Szrj
1313*fae548d3Szrj while (first != file)
1314*fae548d3Szrj {
1315*fae548d3Szrj if (*first == ';')
1316*fae548d3Szrj last = first;
1317*fae548d3Szrj if (*first == ':' || *first == ']' || *first == '>')
1318*fae548d3Szrj {
1319*fae548d3Szrj first++;
1320*fae548d3Szrj break;
1321*fae548d3Szrj }
1322*fae548d3Szrj first--;
1323*fae548d3Szrj }
1324*fae548d3Szrj
1325*fae548d3Szrj copy = bfd_alloc (abfd, last - first + 1);
1326*fae548d3Szrj if (copy == NULL)
1327*fae548d3Szrj return NULL;
1328*fae548d3Szrj
1329*fae548d3Szrj memcpy (copy, first, last - first);
1330*fae548d3Szrj copy[last - first] = 0;
1331*fae548d3Szrj
1332*fae548d3Szrj return copy;
1333*fae548d3Szrj }
1334*fae548d3Szrj
1335*fae548d3Szrj #else
1336*fae548d3Szrj static const char *
normalize(bfd * abfd,const char * file)1337*fae548d3Szrj normalize (bfd *abfd, const char *file)
1338*fae548d3Szrj {
1339*fae548d3Szrj if (abfd->flags & BFD_ARCHIVE_FULL_PATH)
1340*fae548d3Szrj return file;
1341*fae548d3Szrj return lbasename (file);
1342*fae548d3Szrj }
1343*fae548d3Szrj #endif
1344*fae548d3Szrj
1345*fae548d3Szrj /* Adjust a relative path name based on the reference path.
1346*fae548d3Szrj For example:
1347*fae548d3Szrj
1348*fae548d3Szrj Relative path Reference path Result
1349*fae548d3Szrj ------------- -------------- ------
1350*fae548d3Szrj bar.o lib.a bar.o
1351*fae548d3Szrj foo/bar.o lib.a foo/bar.o
1352*fae548d3Szrj bar.o foo/lib.a ../bar.o
1353*fae548d3Szrj foo/bar.o baz/lib.a ../foo/bar.o
1354*fae548d3Szrj bar.o ../lib.a <parent of current dir>/bar.o
1355*fae548d3Szrj ; ../bar.o ../lib.a bar.o
1356*fae548d3Szrj ; ../bar.o lib.a ../bar.o
1357*fae548d3Szrj foo/bar.o ../lib.a <parent of current dir>/foo/bar.o
1358*fae548d3Szrj bar.o ../../lib.a <grandparent>/<parent>/bar.o
1359*fae548d3Szrj bar.o foo/baz/lib.a ../../bar.o
1360*fae548d3Szrj
1361*fae548d3Szrj Note - the semicolons above are there to prevent the BFD chew
1362*fae548d3Szrj utility from interpreting those lines as prototypes to put into
1363*fae548d3Szrj the autogenerated bfd.h header...
1364*fae548d3Szrj
1365*fae548d3Szrj Note - the string is returned in a static buffer. */
1366*fae548d3Szrj
1367*fae548d3Szrj static const char *
adjust_relative_path(const char * path,const char * ref_path)1368*fae548d3Szrj adjust_relative_path (const char * path, const char * ref_path)
1369*fae548d3Szrj {
1370*fae548d3Szrj static char *pathbuf = NULL;
1371*fae548d3Szrj static unsigned int pathbuf_len = 0;
1372*fae548d3Szrj const char *pathp;
1373*fae548d3Szrj const char *refp;
1374*fae548d3Szrj char * lpath;
1375*fae548d3Szrj char * rpath;
1376*fae548d3Szrj unsigned int len;
1377*fae548d3Szrj unsigned int dir_up = 0;
1378*fae548d3Szrj unsigned int dir_down = 0;
1379*fae548d3Szrj char *newp;
1380*fae548d3Szrj char * pwd = getpwd ();
1381*fae548d3Szrj const char * down;
1382*fae548d3Szrj
1383*fae548d3Szrj /* Remove symlinks, '.' and '..' from the paths, if possible. */
1384*fae548d3Szrj lpath = lrealpath (path);
1385*fae548d3Szrj pathp = lpath == NULL ? path : lpath;
1386*fae548d3Szrj
1387*fae548d3Szrj rpath = lrealpath (ref_path);
1388*fae548d3Szrj refp = rpath == NULL ? ref_path : rpath;
1389*fae548d3Szrj
1390*fae548d3Szrj /* Remove common leading path elements. */
1391*fae548d3Szrj for (;;)
1392*fae548d3Szrj {
1393*fae548d3Szrj const char *e1 = pathp;
1394*fae548d3Szrj const char *e2 = refp;
1395*fae548d3Szrj
1396*fae548d3Szrj while (*e1 && ! IS_DIR_SEPARATOR (*e1))
1397*fae548d3Szrj ++e1;
1398*fae548d3Szrj while (*e2 && ! IS_DIR_SEPARATOR (*e2))
1399*fae548d3Szrj ++e2;
1400*fae548d3Szrj if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
1401*fae548d3Szrj || filename_ncmp (pathp, refp, e1 - pathp) != 0)
1402*fae548d3Szrj break;
1403*fae548d3Szrj pathp = e1 + 1;
1404*fae548d3Szrj refp = e2 + 1;
1405*fae548d3Szrj }
1406*fae548d3Szrj
1407*fae548d3Szrj len = strlen (pathp) + 1;
1408*fae548d3Szrj /* For each leading path element in the reference path,
1409*fae548d3Szrj insert "../" into the path. */
1410*fae548d3Szrj for (; *refp; ++refp)
1411*fae548d3Szrj if (IS_DIR_SEPARATOR (*refp))
1412*fae548d3Szrj {
1413*fae548d3Szrj /* PR 12710: If the path element is "../" then instead of
1414*fae548d3Szrj inserting "../" we need to insert the name of the directory
1415*fae548d3Szrj at the current level. */
1416*fae548d3Szrj if (refp > ref_path + 1
1417*fae548d3Szrj && refp[-1] == '.'
1418*fae548d3Szrj && refp[-2] == '.')
1419*fae548d3Szrj dir_down ++;
1420*fae548d3Szrj else
1421*fae548d3Szrj dir_up ++;
1422*fae548d3Szrj }
1423*fae548d3Szrj
1424*fae548d3Szrj /* If the lrealpath calls above succeeded then we should never
1425*fae548d3Szrj see dir_up and dir_down both being non-zero. */
1426*fae548d3Szrj
1427*fae548d3Szrj len += 3 * dir_up;
1428*fae548d3Szrj
1429*fae548d3Szrj if (dir_down)
1430*fae548d3Szrj {
1431*fae548d3Szrj down = pwd + strlen (pwd) - 1;
1432*fae548d3Szrj
1433*fae548d3Szrj while (dir_down && down > pwd)
1434*fae548d3Szrj {
1435*fae548d3Szrj if (IS_DIR_SEPARATOR (*down))
1436*fae548d3Szrj --dir_down;
1437*fae548d3Szrj }
1438*fae548d3Szrj BFD_ASSERT (dir_down == 0);
1439*fae548d3Szrj len += strlen (down) + 1;
1440*fae548d3Szrj }
1441*fae548d3Szrj else
1442*fae548d3Szrj down = NULL;
1443*fae548d3Szrj
1444*fae548d3Szrj if (len > pathbuf_len)
1445*fae548d3Szrj {
1446*fae548d3Szrj if (pathbuf != NULL)
1447*fae548d3Szrj free (pathbuf);
1448*fae548d3Szrj pathbuf_len = 0;
1449*fae548d3Szrj pathbuf = (char *) bfd_malloc (len);
1450*fae548d3Szrj if (pathbuf == NULL)
1451*fae548d3Szrj goto out;
1452*fae548d3Szrj pathbuf_len = len;
1453*fae548d3Szrj }
1454*fae548d3Szrj
1455*fae548d3Szrj newp = pathbuf;
1456*fae548d3Szrj while (dir_up-- > 0)
1457*fae548d3Szrj {
1458*fae548d3Szrj /* FIXME: Support Windows style path separators as well. */
1459*fae548d3Szrj strcpy (newp, "../");
1460*fae548d3Szrj newp += 3;
1461*fae548d3Szrj }
1462*fae548d3Szrj
1463*fae548d3Szrj if (down)
1464*fae548d3Szrj sprintf (newp, "%s/%s", down, pathp);
1465*fae548d3Szrj else
1466*fae548d3Szrj strcpy (newp, pathp);
1467*fae548d3Szrj
1468*fae548d3Szrj out:
1469*fae548d3Szrj free (lpath);
1470*fae548d3Szrj free (rpath);
1471*fae548d3Szrj return pathbuf;
1472*fae548d3Szrj }
1473*fae548d3Szrj
1474*fae548d3Szrj /* Build a BFD style extended name table. */
1475*fae548d3Szrj
1476*fae548d3Szrj bfd_boolean
_bfd_archive_bsd_construct_extended_name_table(bfd * abfd,char ** tabloc,bfd_size_type * tablen,const char ** name)1477*fae548d3Szrj _bfd_archive_bsd_construct_extended_name_table (bfd *abfd,
1478*fae548d3Szrj char **tabloc,
1479*fae548d3Szrj bfd_size_type *tablen,
1480*fae548d3Szrj const char **name)
1481*fae548d3Szrj {
1482*fae548d3Szrj *name = "ARFILENAMES/";
1483*fae548d3Szrj return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
1484*fae548d3Szrj }
1485*fae548d3Szrj
1486*fae548d3Szrj /* Build an SVR4 style extended name table. */
1487*fae548d3Szrj
1488*fae548d3Szrj bfd_boolean
_bfd_archive_coff_construct_extended_name_table(bfd * abfd,char ** tabloc,bfd_size_type * tablen,const char ** name)1489*fae548d3Szrj _bfd_archive_coff_construct_extended_name_table (bfd *abfd,
1490*fae548d3Szrj char **tabloc,
1491*fae548d3Szrj bfd_size_type *tablen,
1492*fae548d3Szrj const char **name)
1493*fae548d3Szrj {
1494*fae548d3Szrj *name = "//";
1495*fae548d3Szrj return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
1496*fae548d3Szrj }
1497*fae548d3Szrj
1498*fae548d3Szrj bfd_boolean
_bfd_noarchive_construct_extended_name_table(bfd * abfd ATTRIBUTE_UNUSED,char ** tabloc ATTRIBUTE_UNUSED,bfd_size_type * len ATTRIBUTE_UNUSED,const char ** name ATTRIBUTE_UNUSED)1499*fae548d3Szrj _bfd_noarchive_construct_extended_name_table (bfd *abfd ATTRIBUTE_UNUSED,
1500*fae548d3Szrj char **tabloc ATTRIBUTE_UNUSED,
1501*fae548d3Szrj bfd_size_type *len ATTRIBUTE_UNUSED,
1502*fae548d3Szrj const char **name ATTRIBUTE_UNUSED)
1503*fae548d3Szrj {
1504*fae548d3Szrj return TRUE;
1505*fae548d3Szrj }
1506*fae548d3Szrj
1507*fae548d3Szrj /* Follows archive_head and produces an extended name table if
1508*fae548d3Szrj necessary. Returns (in tabloc) a pointer to an extended name
1509*fae548d3Szrj table, and in tablen the length of the table. If it makes an entry
1510*fae548d3Szrj it clobbers the filename so that the element may be written without
1511*fae548d3Szrj further massage. Returns TRUE if it ran successfully, FALSE if
1512*fae548d3Szrj something went wrong. A successful return may still involve a
1513*fae548d3Szrj zero-length tablen! */
1514*fae548d3Szrj
1515*fae548d3Szrj bfd_boolean
_bfd_construct_extended_name_table(bfd * abfd,bfd_boolean trailing_slash,char ** tabloc,bfd_size_type * tablen)1516*fae548d3Szrj _bfd_construct_extended_name_table (bfd *abfd,
1517*fae548d3Szrj bfd_boolean trailing_slash,
1518*fae548d3Szrj char **tabloc,
1519*fae548d3Szrj bfd_size_type *tablen)
1520*fae548d3Szrj {
1521*fae548d3Szrj unsigned int maxname = ar_maxnamelen (abfd);
1522*fae548d3Szrj bfd_size_type total_namelen = 0;
1523*fae548d3Szrj bfd *current;
1524*fae548d3Szrj char *strptr;
1525*fae548d3Szrj const char *last_filename;
1526*fae548d3Szrj long last_stroff;
1527*fae548d3Szrj
1528*fae548d3Szrj *tablen = 0;
1529*fae548d3Szrj last_filename = NULL;
1530*fae548d3Szrj
1531*fae548d3Szrj /* Figure out how long the table should be. */
1532*fae548d3Szrj for (current = abfd->archive_head;
1533*fae548d3Szrj current != NULL;
1534*fae548d3Szrj current = current->archive_next)
1535*fae548d3Szrj {
1536*fae548d3Szrj const char *normal;
1537*fae548d3Szrj unsigned int thislen;
1538*fae548d3Szrj
1539*fae548d3Szrj if (bfd_is_thin_archive (abfd))
1540*fae548d3Szrj {
1541*fae548d3Szrj const char *filename = current->filename;
1542*fae548d3Szrj
1543*fae548d3Szrj /* If the element being added is a member of another archive
1544*fae548d3Szrj (i.e., we are flattening), use the containing archive's name. */
1545*fae548d3Szrj if (current->my_archive
1546*fae548d3Szrj && ! bfd_is_thin_archive (current->my_archive))
1547*fae548d3Szrj filename = current->my_archive->filename;
1548*fae548d3Szrj
1549*fae548d3Szrj /* If the path is the same as the previous path seen,
1550*fae548d3Szrj reuse it. This can happen when flattening a thin
1551*fae548d3Szrj archive that contains other archives. */
1552*fae548d3Szrj if (last_filename && filename_cmp (last_filename, filename) == 0)
1553*fae548d3Szrj continue;
1554*fae548d3Szrj
1555*fae548d3Szrj last_filename = filename;
1556*fae548d3Szrj
1557*fae548d3Szrj /* If the path is relative, adjust it relative to
1558*fae548d3Szrj the containing archive. */
1559*fae548d3Szrj if (! IS_ABSOLUTE_PATH (filename)
1560*fae548d3Szrj && ! IS_ABSOLUTE_PATH (abfd->filename))
1561*fae548d3Szrj normal = adjust_relative_path (filename, abfd->filename);
1562*fae548d3Szrj else
1563*fae548d3Szrj normal = filename;
1564*fae548d3Szrj
1565*fae548d3Szrj /* In a thin archive, always store the full pathname
1566*fae548d3Szrj in the extended name table. */
1567*fae548d3Szrj total_namelen += strlen (normal) + 1;
1568*fae548d3Szrj if (trailing_slash)
1569*fae548d3Szrj /* Leave room for trailing slash. */
1570*fae548d3Szrj ++total_namelen;
1571*fae548d3Szrj
1572*fae548d3Szrj continue;
1573*fae548d3Szrj }
1574*fae548d3Szrj
1575*fae548d3Szrj normal = normalize (abfd, current->filename);
1576*fae548d3Szrj if (normal == NULL)
1577*fae548d3Szrj return FALSE;
1578*fae548d3Szrj
1579*fae548d3Szrj thislen = strlen (normal);
1580*fae548d3Szrj
1581*fae548d3Szrj if (thislen > maxname
1582*fae548d3Szrj && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1583*fae548d3Szrj thislen = maxname;
1584*fae548d3Szrj
1585*fae548d3Szrj if (thislen > maxname)
1586*fae548d3Szrj {
1587*fae548d3Szrj /* Add one to leave room for \n. */
1588*fae548d3Szrj total_namelen += thislen + 1;
1589*fae548d3Szrj if (trailing_slash)
1590*fae548d3Szrj {
1591*fae548d3Szrj /* Leave room for trailing slash. */
1592*fae548d3Szrj ++total_namelen;
1593*fae548d3Szrj }
1594*fae548d3Szrj }
1595*fae548d3Szrj else
1596*fae548d3Szrj {
1597*fae548d3Szrj struct ar_hdr *hdr = arch_hdr (current);
1598*fae548d3Szrj if (filename_ncmp (normal, hdr->ar_name, thislen) != 0
1599*fae548d3Szrj || (thislen < sizeof hdr->ar_name
1600*fae548d3Szrj && hdr->ar_name[thislen] != ar_padchar (current)))
1601*fae548d3Szrj {
1602*fae548d3Szrj /* Must have been using extended format even though it
1603*fae548d3Szrj didn't need to. Fix it to use normal format. */
1604*fae548d3Szrj memcpy (hdr->ar_name, normal, thislen);
1605*fae548d3Szrj if (thislen < maxname
1606*fae548d3Szrj || (thislen == maxname && thislen < sizeof hdr->ar_name))
1607*fae548d3Szrj hdr->ar_name[thislen] = ar_padchar (current);
1608*fae548d3Szrj }
1609*fae548d3Szrj }
1610*fae548d3Szrj }
1611*fae548d3Szrj
1612*fae548d3Szrj if (total_namelen == 0)
1613*fae548d3Szrj return TRUE;
1614*fae548d3Szrj
1615*fae548d3Szrj *tabloc = (char *) bfd_alloc (abfd, total_namelen);
1616*fae548d3Szrj if (*tabloc == NULL)
1617*fae548d3Szrj return FALSE;
1618*fae548d3Szrj
1619*fae548d3Szrj *tablen = total_namelen;
1620*fae548d3Szrj strptr = *tabloc;
1621*fae548d3Szrj
1622*fae548d3Szrj last_filename = NULL;
1623*fae548d3Szrj last_stroff = 0;
1624*fae548d3Szrj
1625*fae548d3Szrj for (current = abfd->archive_head;
1626*fae548d3Szrj current != NULL;
1627*fae548d3Szrj current = current->archive_next)
1628*fae548d3Szrj {
1629*fae548d3Szrj const char *normal;
1630*fae548d3Szrj unsigned int thislen;
1631*fae548d3Szrj long stroff;
1632*fae548d3Szrj const char *filename = current->filename;
1633*fae548d3Szrj
1634*fae548d3Szrj if (bfd_is_thin_archive (abfd))
1635*fae548d3Szrj {
1636*fae548d3Szrj /* If the element being added is a member of another archive
1637*fae548d3Szrj (i.e., we are flattening), use the containing archive's name. */
1638*fae548d3Szrj if (current->my_archive
1639*fae548d3Szrj && ! bfd_is_thin_archive (current->my_archive))
1640*fae548d3Szrj filename = current->my_archive->filename;
1641*fae548d3Szrj /* If the path is the same as the previous path seen,
1642*fae548d3Szrj reuse it. This can happen when flattening a thin
1643*fae548d3Szrj archive that contains other archives.
1644*fae548d3Szrj If the path is relative, adjust it relative to
1645*fae548d3Szrj the containing archive. */
1646*fae548d3Szrj if (last_filename && filename_cmp (last_filename, filename) == 0)
1647*fae548d3Szrj normal = last_filename;
1648*fae548d3Szrj else if (! IS_ABSOLUTE_PATH (filename)
1649*fae548d3Szrj && ! IS_ABSOLUTE_PATH (abfd->filename))
1650*fae548d3Szrj normal = adjust_relative_path (filename, abfd->filename);
1651*fae548d3Szrj else
1652*fae548d3Szrj normal = filename;
1653*fae548d3Szrj }
1654*fae548d3Szrj else
1655*fae548d3Szrj {
1656*fae548d3Szrj normal = normalize (abfd, filename);
1657*fae548d3Szrj if (normal == NULL)
1658*fae548d3Szrj return FALSE;
1659*fae548d3Szrj }
1660*fae548d3Szrj
1661*fae548d3Szrj thislen = strlen (normal);
1662*fae548d3Szrj if (thislen > maxname || bfd_is_thin_archive (abfd))
1663*fae548d3Szrj {
1664*fae548d3Szrj /* Works for now; may need to be re-engineered if we
1665*fae548d3Szrj encounter an oddball archive format and want to
1666*fae548d3Szrj generalise this hack. */
1667*fae548d3Szrj struct ar_hdr *hdr = arch_hdr (current);
1668*fae548d3Szrj if (normal == last_filename)
1669*fae548d3Szrj stroff = last_stroff;
1670*fae548d3Szrj else
1671*fae548d3Szrj {
1672*fae548d3Szrj last_filename = filename;
1673*fae548d3Szrj stroff = strptr - *tabloc;
1674*fae548d3Szrj last_stroff = stroff;
1675*fae548d3Szrj memcpy (strptr, normal, thislen);
1676*fae548d3Szrj strptr += thislen;
1677*fae548d3Szrj if (trailing_slash)
1678*fae548d3Szrj *strptr++ = '/';
1679*fae548d3Szrj *strptr++ = ARFMAG[1];
1680*fae548d3Szrj }
1681*fae548d3Szrj hdr->ar_name[0] = ar_padchar (current);
1682*fae548d3Szrj if (bfd_is_thin_archive (abfd) && current->origin > 0)
1683*fae548d3Szrj {
1684*fae548d3Szrj int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:",
1685*fae548d3Szrj stroff);
1686*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len,
1687*fae548d3Szrj "%-ld",
1688*fae548d3Szrj current->origin - sizeof (struct ar_hdr));
1689*fae548d3Szrj }
1690*fae548d3Szrj else
1691*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff);
1692*fae548d3Szrj }
1693*fae548d3Szrj }
1694*fae548d3Szrj
1695*fae548d3Szrj return TRUE;
1696*fae548d3Szrj }
1697*fae548d3Szrj
1698*fae548d3Szrj /* Do not construct an extended name table but transforms name field into
1699*fae548d3Szrj its extended form. */
1700*fae548d3Szrj
1701*fae548d3Szrj bfd_boolean
_bfd_archive_bsd44_construct_extended_name_table(bfd * abfd,char ** tabloc,bfd_size_type * tablen,const char ** name)1702*fae548d3Szrj _bfd_archive_bsd44_construct_extended_name_table (bfd *abfd,
1703*fae548d3Szrj char **tabloc,
1704*fae548d3Szrj bfd_size_type *tablen,
1705*fae548d3Szrj const char **name)
1706*fae548d3Szrj {
1707*fae548d3Szrj unsigned int maxname = ar_maxnamelen (abfd);
1708*fae548d3Szrj bfd *current;
1709*fae548d3Szrj
1710*fae548d3Szrj *tablen = 0;
1711*fae548d3Szrj *tabloc = NULL;
1712*fae548d3Szrj *name = NULL;
1713*fae548d3Szrj
1714*fae548d3Szrj for (current = abfd->archive_head;
1715*fae548d3Szrj current != NULL;
1716*fae548d3Szrj current = current->archive_next)
1717*fae548d3Szrj {
1718*fae548d3Szrj const char *normal = normalize (abfd, current->filename);
1719*fae548d3Szrj int has_space = 0;
1720*fae548d3Szrj unsigned int len;
1721*fae548d3Szrj
1722*fae548d3Szrj if (normal == NULL)
1723*fae548d3Szrj return FALSE;
1724*fae548d3Szrj
1725*fae548d3Szrj for (len = 0; normal[len]; len++)
1726*fae548d3Szrj if (normal[len] == ' ')
1727*fae548d3Szrj has_space = 1;
1728*fae548d3Szrj
1729*fae548d3Szrj if (len > maxname || has_space)
1730*fae548d3Szrj {
1731*fae548d3Szrj struct ar_hdr *hdr = arch_hdr (current);
1732*fae548d3Szrj
1733*fae548d3Szrj len = (len + 3) & ~3;
1734*fae548d3Szrj arch_eltdata (current)->extra_size = len;
1735*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_name, maxname, "#1/%lu", len);
1736*fae548d3Szrj }
1737*fae548d3Szrj }
1738*fae548d3Szrj
1739*fae548d3Szrj return TRUE;
1740*fae548d3Szrj }
1741*fae548d3Szrj
1742*fae548d3Szrj /* Write an archive header. */
1743*fae548d3Szrj
1744*fae548d3Szrj bfd_boolean
_bfd_generic_write_ar_hdr(bfd * archive,bfd * abfd)1745*fae548d3Szrj _bfd_generic_write_ar_hdr (bfd *archive, bfd *abfd)
1746*fae548d3Szrj {
1747*fae548d3Szrj struct ar_hdr *hdr = arch_hdr (abfd);
1748*fae548d3Szrj
1749*fae548d3Szrj if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1750*fae548d3Szrj return FALSE;
1751*fae548d3Szrj return TRUE;
1752*fae548d3Szrj }
1753*fae548d3Szrj
1754*fae548d3Szrj /* Write an archive header using BSD4.4 convention. */
1755*fae548d3Szrj
1756*fae548d3Szrj bfd_boolean
_bfd_bsd44_write_ar_hdr(bfd * archive,bfd * abfd)1757*fae548d3Szrj _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
1758*fae548d3Szrj {
1759*fae548d3Szrj struct ar_hdr *hdr = arch_hdr (abfd);
1760*fae548d3Szrj
1761*fae548d3Szrj if (is_bsd44_extended_name (hdr->ar_name))
1762*fae548d3Szrj {
1763*fae548d3Szrj /* This is a BSD 4.4 extended name. */
1764*fae548d3Szrj const char *fullname = normalize (abfd, abfd->filename);
1765*fae548d3Szrj unsigned int len = strlen (fullname);
1766*fae548d3Szrj unsigned int padded_len = (len + 3) & ~3;
1767*fae548d3Szrj
1768*fae548d3Szrj BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
1769*fae548d3Szrj
1770*fae548d3Szrj if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
1771*fae548d3Szrj arch_eltdata (abfd)->parsed_size + padded_len))
1772*fae548d3Szrj return FALSE;
1773*fae548d3Szrj
1774*fae548d3Szrj if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1775*fae548d3Szrj return FALSE;
1776*fae548d3Szrj
1777*fae548d3Szrj if (bfd_bwrite (fullname, len, archive) != len)
1778*fae548d3Szrj return FALSE;
1779*fae548d3Szrj
1780*fae548d3Szrj if (len & 3)
1781*fae548d3Szrj {
1782*fae548d3Szrj static const char pad[3] = { 0, 0, 0 };
1783*fae548d3Szrj
1784*fae548d3Szrj len = 4 - (len & 3);
1785*fae548d3Szrj if (bfd_bwrite (pad, len, archive) != len)
1786*fae548d3Szrj return FALSE;
1787*fae548d3Szrj }
1788*fae548d3Szrj }
1789*fae548d3Szrj else
1790*fae548d3Szrj {
1791*fae548d3Szrj if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1792*fae548d3Szrj return FALSE;
1793*fae548d3Szrj }
1794*fae548d3Szrj return TRUE;
1795*fae548d3Szrj }
1796*fae548d3Szrj
1797*fae548d3Szrj bfd_boolean
_bfd_noarchive_write_ar_hdr(bfd * archive,bfd * abfd ATTRIBUTE_UNUSED)1798*fae548d3Szrj _bfd_noarchive_write_ar_hdr (bfd *archive, bfd *abfd ATTRIBUTE_UNUSED)
1799*fae548d3Szrj {
1800*fae548d3Szrj return _bfd_bool_bfd_false_error (archive);
1801*fae548d3Szrj }
1802*fae548d3Szrj
1803*fae548d3Szrj /* A couple of functions for creating ar_hdrs. */
1804*fae548d3Szrj
1805*fae548d3Szrj #ifdef HPUX_LARGE_AR_IDS
1806*fae548d3Szrj /* Function to encode large UID/GID values according to HP. */
1807*fae548d3Szrj
1808*fae548d3Szrj static void
hpux_uid_gid_encode(char str[6],long int id)1809*fae548d3Szrj hpux_uid_gid_encode (char str[6], long int id)
1810*fae548d3Szrj {
1811*fae548d3Szrj int cnt;
1812*fae548d3Szrj
1813*fae548d3Szrj str[5] = '@' + (id & 3);
1814*fae548d3Szrj id >>= 2;
1815*fae548d3Szrj
1816*fae548d3Szrj for (cnt = 4; cnt >= 0; --cnt, id >>= 6)
1817*fae548d3Szrj str[cnt] = ' ' + (id & 0x3f);
1818*fae548d3Szrj }
1819*fae548d3Szrj #endif /* HPUX_LARGE_AR_IDS */
1820*fae548d3Szrj
1821*fae548d3Szrj #ifndef HAVE_GETUID
1822*fae548d3Szrj #define getuid() 0
1823*fae548d3Szrj #endif
1824*fae548d3Szrj
1825*fae548d3Szrj #ifndef HAVE_GETGID
1826*fae548d3Szrj #define getgid() 0
1827*fae548d3Szrj #endif
1828*fae548d3Szrj
1829*fae548d3Szrj /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1830*fae548d3Szrj make one. The filename must refer to a filename in the filesystem.
1831*fae548d3Szrj The filename field of the ar_hdr will NOT be initialized. If member
1832*fae548d3Szrj is set, and it's an in-memory bfd, we fake it. */
1833*fae548d3Szrj
1834*fae548d3Szrj static struct areltdata *
bfd_ar_hdr_from_filesystem(bfd * abfd,const char * filename,bfd * member)1835*fae548d3Szrj bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
1836*fae548d3Szrj {
1837*fae548d3Szrj struct stat status;
1838*fae548d3Szrj struct areltdata *ared;
1839*fae548d3Szrj struct ar_hdr *hdr;
1840*fae548d3Szrj bfd_size_type amt;
1841*fae548d3Szrj
1842*fae548d3Szrj if (member && (member->flags & BFD_IN_MEMORY) != 0)
1843*fae548d3Szrj {
1844*fae548d3Szrj /* Assume we just "made" the member, and fake it. */
1845*fae548d3Szrj struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream;
1846*fae548d3Szrj time (&status.st_mtime);
1847*fae548d3Szrj status.st_uid = getuid ();
1848*fae548d3Szrj status.st_gid = getgid ();
1849*fae548d3Szrj status.st_mode = 0644;
1850*fae548d3Szrj status.st_size = bim->size;
1851*fae548d3Szrj }
1852*fae548d3Szrj else if (stat (filename, &status) != 0)
1853*fae548d3Szrj {
1854*fae548d3Szrj bfd_set_error (bfd_error_system_call);
1855*fae548d3Szrj return NULL;
1856*fae548d3Szrj }
1857*fae548d3Szrj
1858*fae548d3Szrj /* If the caller requested that the BFD generate deterministic output,
1859*fae548d3Szrj fake values for modification time, UID, GID, and file mode. */
1860*fae548d3Szrj if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
1861*fae548d3Szrj {
1862*fae548d3Szrj status.st_mtime = 0;
1863*fae548d3Szrj status.st_uid = 0;
1864*fae548d3Szrj status.st_gid = 0;
1865*fae548d3Szrj status.st_mode = 0644;
1866*fae548d3Szrj }
1867*fae548d3Szrj
1868*fae548d3Szrj amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
1869*fae548d3Szrj ared = (struct areltdata *) bfd_zmalloc (amt);
1870*fae548d3Szrj if (ared == NULL)
1871*fae548d3Szrj return NULL;
1872*fae548d3Szrj hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1873*fae548d3Szrj
1874*fae548d3Szrj /* ar headers are space padded, not null padded! */
1875*fae548d3Szrj memset (hdr, ' ', sizeof (struct ar_hdr));
1876*fae548d3Szrj
1877*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld",
1878*fae548d3Szrj status.st_mtime);
1879*fae548d3Szrj #ifdef HPUX_LARGE_AR_IDS
1880*fae548d3Szrj /* HP has a very "special" way to handle UID/GID's with numeric values
1881*fae548d3Szrj > 99999. */
1882*fae548d3Szrj if (status.st_uid > 99999)
1883*fae548d3Szrj hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid);
1884*fae548d3Szrj else
1885*fae548d3Szrj #endif
1886*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld",
1887*fae548d3Szrj status.st_uid);
1888*fae548d3Szrj #ifdef HPUX_LARGE_AR_IDS
1889*fae548d3Szrj /* HP has a very "special" way to handle UID/GID's with numeric values
1890*fae548d3Szrj > 99999. */
1891*fae548d3Szrj if (status.st_gid > 99999)
1892*fae548d3Szrj hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid);
1893*fae548d3Szrj else
1894*fae548d3Szrj #endif
1895*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld",
1896*fae548d3Szrj status.st_gid);
1897*fae548d3Szrj _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
1898*fae548d3Szrj status.st_mode);
1899*fae548d3Szrj if (status.st_size - (bfd_size_type) status.st_size != 0)
1900*fae548d3Szrj {
1901*fae548d3Szrj bfd_set_error (bfd_error_file_too_big);
1902*fae548d3Szrj free (ared);
1903*fae548d3Szrj return NULL;
1904*fae548d3Szrj }
1905*fae548d3Szrj if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
1906*fae548d3Szrj {
1907*fae548d3Szrj free (ared);
1908*fae548d3Szrj return NULL;
1909*fae548d3Szrj }
1910*fae548d3Szrj memcpy (hdr->ar_fmag, ARFMAG, 2);
1911*fae548d3Szrj ared->parsed_size = status.st_size;
1912*fae548d3Szrj ared->arch_header = (char *) hdr;
1913*fae548d3Szrj
1914*fae548d3Szrj return ared;
1915*fae548d3Szrj }
1916*fae548d3Szrj
1917*fae548d3Szrj /* Analogous to stat call. */
1918*fae548d3Szrj
1919*fae548d3Szrj int
bfd_generic_stat_arch_elt(bfd * abfd,struct stat * buf)1920*fae548d3Szrj bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
1921*fae548d3Szrj {
1922*fae548d3Szrj struct ar_hdr *hdr;
1923*fae548d3Szrj char *aloser;
1924*fae548d3Szrj
1925*fae548d3Szrj if (abfd->arelt_data == NULL)
1926*fae548d3Szrj {
1927*fae548d3Szrj bfd_set_error (bfd_error_invalid_operation);
1928*fae548d3Szrj return -1;
1929*fae548d3Szrj }
1930*fae548d3Szrj
1931*fae548d3Szrj hdr = arch_hdr (abfd);
1932*fae548d3Szrj /* PR 17512: file: 3d9e9fe9. */
1933*fae548d3Szrj if (hdr == NULL)
1934*fae548d3Szrj return -1;
1935*fae548d3Szrj #define foo(arelt, stelt, size) \
1936*fae548d3Szrj buf->stelt = strtol (hdr->arelt, &aloser, size); \
1937*fae548d3Szrj if (aloser == hdr->arelt) \
1938*fae548d3Szrj return -1;
1939*fae548d3Szrj
1940*fae548d3Szrj /* Some platforms support special notations for large IDs. */
1941*fae548d3Szrj #ifdef HPUX_LARGE_AR_IDS
1942*fae548d3Szrj # define foo2(arelt, stelt, size) \
1943*fae548d3Szrj if (hdr->arelt[5] == ' ') \
1944*fae548d3Szrj { \
1945*fae548d3Szrj foo (arelt, stelt, size); \
1946*fae548d3Szrj } \
1947*fae548d3Szrj else \
1948*fae548d3Szrj { \
1949*fae548d3Szrj int cnt; \
1950*fae548d3Szrj for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \
1951*fae548d3Szrj { \
1952*fae548d3Szrj if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \
1953*fae548d3Szrj return -1; \
1954*fae548d3Szrj buf->stelt <<= 6; \
1955*fae548d3Szrj buf->stelt += hdr->arelt[cnt] - ' '; \
1956*fae548d3Szrj } \
1957*fae548d3Szrj if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \
1958*fae548d3Szrj return -1; \
1959*fae548d3Szrj buf->stelt <<= 2; \
1960*fae548d3Szrj buf->stelt += hdr->arelt[5] - '@'; \
1961*fae548d3Szrj }
1962*fae548d3Szrj #else
1963*fae548d3Szrj # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1964*fae548d3Szrj #endif
1965*fae548d3Szrj
1966*fae548d3Szrj foo (ar_date, st_mtime, 10);
1967*fae548d3Szrj foo2 (ar_uid, st_uid, 10);
1968*fae548d3Szrj foo2 (ar_gid, st_gid, 10);
1969*fae548d3Szrj foo (ar_mode, st_mode, 8);
1970*fae548d3Szrj
1971*fae548d3Szrj buf->st_size = arch_eltdata (abfd)->parsed_size;
1972*fae548d3Szrj
1973*fae548d3Szrj return 0;
1974*fae548d3Szrj }
1975*fae548d3Szrj
1976*fae548d3Szrj void
bfd_dont_truncate_arname(bfd * abfd,const char * pathname,char * arhdr)1977*fae548d3Szrj bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1978*fae548d3Szrj {
1979*fae548d3Szrj /* FIXME: This interacts unpleasantly with ar's quick-append option.
1980*fae548d3Szrj Fortunately ic960 users will never use that option. Fixing this
1981*fae548d3Szrj is very hard; fortunately I know how to do it and will do so once
1982*fae548d3Szrj intel's release is out the door. */
1983*fae548d3Szrj
1984*fae548d3Szrj struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1985*fae548d3Szrj size_t length;
1986*fae548d3Szrj const char *filename;
1987*fae548d3Szrj size_t maxlen = ar_maxnamelen (abfd);
1988*fae548d3Szrj
1989*fae548d3Szrj if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1990*fae548d3Szrj {
1991*fae548d3Szrj bfd_bsd_truncate_arname (abfd, pathname, arhdr);
1992*fae548d3Szrj return;
1993*fae548d3Szrj }
1994*fae548d3Szrj
1995*fae548d3Szrj filename = normalize (abfd, pathname);
1996*fae548d3Szrj if (filename == NULL)
1997*fae548d3Szrj {
1998*fae548d3Szrj /* FIXME */
1999*fae548d3Szrj abort ();
2000*fae548d3Szrj }
2001*fae548d3Szrj
2002*fae548d3Szrj length = strlen (filename);
2003*fae548d3Szrj
2004*fae548d3Szrj if (length <= maxlen)
2005*fae548d3Szrj memcpy (hdr->ar_name, filename, length);
2006*fae548d3Szrj
2007*fae548d3Szrj /* Add the padding character if there is room for it. */
2008*fae548d3Szrj if (length < maxlen
2009*fae548d3Szrj || (length == maxlen && length < sizeof hdr->ar_name))
2010*fae548d3Szrj (hdr->ar_name)[length] = ar_padchar (abfd);
2011*fae548d3Szrj }
2012*fae548d3Szrj
2013*fae548d3Szrj void
bfd_bsd_truncate_arname(bfd * abfd,const char * pathname,char * arhdr)2014*fae548d3Szrj bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2015*fae548d3Szrj {
2016*fae548d3Szrj struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2017*fae548d3Szrj size_t length;
2018*fae548d3Szrj const char *filename = lbasename (pathname);
2019*fae548d3Szrj size_t maxlen = ar_maxnamelen (abfd);
2020*fae548d3Szrj
2021*fae548d3Szrj length = strlen (filename);
2022*fae548d3Szrj
2023*fae548d3Szrj if (length <= maxlen)
2024*fae548d3Szrj memcpy (hdr->ar_name, filename, length);
2025*fae548d3Szrj else
2026*fae548d3Szrj {
2027*fae548d3Szrj /* pathname: meet procrustes */
2028*fae548d3Szrj memcpy (hdr->ar_name, filename, maxlen);
2029*fae548d3Szrj length = maxlen;
2030*fae548d3Szrj }
2031*fae548d3Szrj
2032*fae548d3Szrj if (length < maxlen)
2033*fae548d3Szrj (hdr->ar_name)[length] = ar_padchar (abfd);
2034*fae548d3Szrj }
2035*fae548d3Szrj
2036*fae548d3Szrj /* Store name into ar header. Truncates the name to fit.
2037*fae548d3Szrj 1> strip pathname to be just the basename.
2038*fae548d3Szrj 2> if it's short enuf to fit, stuff it in.
2039*fae548d3Szrj 3> If it doesn't end with .o, truncate it to fit
2040*fae548d3Szrj 4> truncate it before the .o, append .o, stuff THAT in. */
2041*fae548d3Szrj
2042*fae548d3Szrj /* This is what gnu ar does. It's better but incompatible with the
2043*fae548d3Szrj bsd ar. */
2044*fae548d3Szrj
2045*fae548d3Szrj void
bfd_gnu_truncate_arname(bfd * abfd,const char * pathname,char * arhdr)2046*fae548d3Szrj bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2047*fae548d3Szrj {
2048*fae548d3Szrj struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2049*fae548d3Szrj size_t length;
2050*fae548d3Szrj const char *filename = lbasename (pathname);
2051*fae548d3Szrj size_t maxlen = ar_maxnamelen (abfd);
2052*fae548d3Szrj
2053*fae548d3Szrj length = strlen (filename);
2054*fae548d3Szrj
2055*fae548d3Szrj if (length <= maxlen)
2056*fae548d3Szrj memcpy (hdr->ar_name, filename, length);
2057*fae548d3Szrj else
2058*fae548d3Szrj {
2059*fae548d3Szrj /* pathname: meet procrustes. */
2060*fae548d3Szrj memcpy (hdr->ar_name, filename, maxlen);
2061*fae548d3Szrj if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
2062*fae548d3Szrj {
2063*fae548d3Szrj hdr->ar_name[maxlen - 2] = '.';
2064*fae548d3Szrj hdr->ar_name[maxlen - 1] = 'o';
2065*fae548d3Szrj }
2066*fae548d3Szrj length = maxlen;
2067*fae548d3Szrj }
2068*fae548d3Szrj
2069*fae548d3Szrj if (length < 16)
2070*fae548d3Szrj (hdr->ar_name)[length] = ar_padchar (abfd);
2071*fae548d3Szrj }
2072*fae548d3Szrj
2073*fae548d3Szrj void
_bfd_noarchive_truncate_arname(bfd * abfd ATTRIBUTE_UNUSED,const char * pathname ATTRIBUTE_UNUSED,char * arhdr ATTRIBUTE_UNUSED)2074*fae548d3Szrj _bfd_noarchive_truncate_arname (bfd *abfd ATTRIBUTE_UNUSED,
2075*fae548d3Szrj const char *pathname ATTRIBUTE_UNUSED,
2076*fae548d3Szrj char *arhdr ATTRIBUTE_UNUSED)
2077*fae548d3Szrj {
2078*fae548d3Szrj }
2079*fae548d3Szrj
2080*fae548d3Szrj /* The BFD is open for write and has its format set to bfd_archive. */
2081*fae548d3Szrj
2082*fae548d3Szrj bfd_boolean
_bfd_write_archive_contents(bfd * arch)2083*fae548d3Szrj _bfd_write_archive_contents (bfd *arch)
2084*fae548d3Szrj {
2085*fae548d3Szrj bfd *current;
2086*fae548d3Szrj char *etable = NULL;
2087*fae548d3Szrj bfd_size_type elength = 0;
2088*fae548d3Szrj const char *ename = NULL;
2089*fae548d3Szrj bfd_boolean makemap = bfd_has_map (arch);
2090*fae548d3Szrj /* If no .o's, don't bother to make a map. */
2091*fae548d3Szrj bfd_boolean hasobjects = FALSE;
2092*fae548d3Szrj bfd_size_type wrote;
2093*fae548d3Szrj int tries;
2094*fae548d3Szrj char *armag;
2095*fae548d3Szrj
2096*fae548d3Szrj /* Verify the viability of all entries; if any of them live in the
2097*fae548d3Szrj filesystem (as opposed to living in an archive open for input)
2098*fae548d3Szrj then construct a fresh ar_hdr for them. */
2099*fae548d3Szrj for (current = arch->archive_head;
2100*fae548d3Szrj current != NULL;
2101*fae548d3Szrj current = current->archive_next)
2102*fae548d3Szrj {
2103*fae548d3Szrj /* This check is checking the bfds for the objects we're reading
2104*fae548d3Szrj from (which are usually either an object file or archive on
2105*fae548d3Szrj disk), not the archive entries we're writing to. We don't
2106*fae548d3Szrj actually create bfds for the archive members, we just copy
2107*fae548d3Szrj them byte-wise when we write out the archive. */
2108*fae548d3Szrj if (bfd_write_p (current))
2109*fae548d3Szrj {
2110*fae548d3Szrj bfd_set_error (bfd_error_invalid_operation);
2111*fae548d3Szrj goto input_err;
2112*fae548d3Szrj }
2113*fae548d3Szrj if (!current->arelt_data)
2114*fae548d3Szrj {
2115*fae548d3Szrj current->arelt_data =
2116*fae548d3Szrj bfd_ar_hdr_from_filesystem (arch, current->filename, current);
2117*fae548d3Szrj if (!current->arelt_data)
2118*fae548d3Szrj goto input_err;
2119*fae548d3Szrj
2120*fae548d3Szrj /* Put in the file name. */
2121*fae548d3Szrj BFD_SEND (arch, _bfd_truncate_arname,
2122*fae548d3Szrj (arch, current->filename, (char *) arch_hdr (current)));
2123*fae548d3Szrj }
2124*fae548d3Szrj
2125*fae548d3Szrj if (makemap && ! hasobjects)
2126*fae548d3Szrj { /* Don't bother if we won't make a map! */
2127*fae548d3Szrj if ((bfd_check_format (current, bfd_object)))
2128*fae548d3Szrj hasobjects = TRUE;
2129*fae548d3Szrj }
2130*fae548d3Szrj }
2131*fae548d3Szrj
2132*fae548d3Szrj if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
2133*fae548d3Szrj (arch, &etable, &elength, &ename)))
2134*fae548d3Szrj return FALSE;
2135*fae548d3Szrj
2136*fae548d3Szrj if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
2137*fae548d3Szrj return FALSE;
2138*fae548d3Szrj armag = ARMAG;
2139*fae548d3Szrj if (bfd_is_thin_archive (arch))
2140*fae548d3Szrj armag = ARMAGT;
2141*fae548d3Szrj wrote = bfd_bwrite (armag, SARMAG, arch);
2142*fae548d3Szrj if (wrote != SARMAG)
2143*fae548d3Szrj return FALSE;
2144*fae548d3Szrj
2145*fae548d3Szrj if (makemap && hasobjects)
2146*fae548d3Szrj {
2147*fae548d3Szrj if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
2148*fae548d3Szrj return FALSE;
2149*fae548d3Szrj }
2150*fae548d3Szrj
2151*fae548d3Szrj if (elength != 0)
2152*fae548d3Szrj {
2153*fae548d3Szrj struct ar_hdr hdr;
2154*fae548d3Szrj
2155*fae548d3Szrj memset (&hdr, ' ', sizeof (struct ar_hdr));
2156*fae548d3Szrj memcpy (hdr.ar_name, ename, strlen (ename));
2157*fae548d3Szrj /* Round size up to even number in archive header. */
2158*fae548d3Szrj if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
2159*fae548d3Szrj (elength + 1) & ~(bfd_size_type) 1))
2160*fae548d3Szrj return FALSE;
2161*fae548d3Szrj memcpy (hdr.ar_fmag, ARFMAG, 2);
2162*fae548d3Szrj if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2163*fae548d3Szrj != sizeof (struct ar_hdr))
2164*fae548d3Szrj || bfd_bwrite (etable, elength, arch) != elength)
2165*fae548d3Szrj return FALSE;
2166*fae548d3Szrj if ((elength % 2) == 1)
2167*fae548d3Szrj {
2168*fae548d3Szrj if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2169*fae548d3Szrj return FALSE;
2170*fae548d3Szrj }
2171*fae548d3Szrj }
2172*fae548d3Szrj
2173*fae548d3Szrj for (current = arch->archive_head;
2174*fae548d3Szrj current != NULL;
2175*fae548d3Szrj current = current->archive_next)
2176*fae548d3Szrj {
2177*fae548d3Szrj char buffer[DEFAULT_BUFFERSIZE];
2178*fae548d3Szrj bfd_size_type remaining = arelt_size (current);
2179*fae548d3Szrj
2180*fae548d3Szrj /* Write ar header. */
2181*fae548d3Szrj if (!_bfd_write_ar_hdr (arch, current))
2182*fae548d3Szrj return FALSE;
2183*fae548d3Szrj if (bfd_is_thin_archive (arch))
2184*fae548d3Szrj continue;
2185*fae548d3Szrj if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
2186*fae548d3Szrj goto input_err;
2187*fae548d3Szrj
2188*fae548d3Szrj while (remaining)
2189*fae548d3Szrj {
2190*fae548d3Szrj unsigned int amt = DEFAULT_BUFFERSIZE;
2191*fae548d3Szrj
2192*fae548d3Szrj if (amt > remaining)
2193*fae548d3Szrj amt = remaining;
2194*fae548d3Szrj errno = 0;
2195*fae548d3Szrj if (bfd_bread (buffer, amt, current) != amt)
2196*fae548d3Szrj {
2197*fae548d3Szrj if (bfd_get_error () != bfd_error_system_call)
2198*fae548d3Szrj bfd_set_error (bfd_error_file_truncated);
2199*fae548d3Szrj goto input_err;
2200*fae548d3Szrj }
2201*fae548d3Szrj if (bfd_bwrite (buffer, amt, arch) != amt)
2202*fae548d3Szrj return FALSE;
2203*fae548d3Szrj remaining -= amt;
2204*fae548d3Szrj }
2205*fae548d3Szrj
2206*fae548d3Szrj if ((arelt_size (current) % 2) == 1)
2207*fae548d3Szrj {
2208*fae548d3Szrj if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2209*fae548d3Szrj return FALSE;
2210*fae548d3Szrj }
2211*fae548d3Szrj }
2212*fae548d3Szrj
2213*fae548d3Szrj if (makemap && hasobjects)
2214*fae548d3Szrj {
2215*fae548d3Szrj /* Verify the timestamp in the archive file. If it would not be
2216*fae548d3Szrj accepted by the linker, rewrite it until it would be. If
2217*fae548d3Szrj anything odd happens, break out and just return. (The
2218*fae548d3Szrj Berkeley linker checks the timestamp and refuses to read the
2219*fae548d3Szrj table-of-contents if it is >60 seconds less than the file's
2220*fae548d3Szrj modified-time. That painful hack requires this painful hack. */
2221*fae548d3Szrj tries = 1;
2222*fae548d3Szrj do
2223*fae548d3Szrj {
2224*fae548d3Szrj if (bfd_update_armap_timestamp (arch))
2225*fae548d3Szrj break;
2226*fae548d3Szrj _bfd_error_handler
2227*fae548d3Szrj (_("warning: writing archive was slow: rewriting timestamp"));
2228*fae548d3Szrj }
2229*fae548d3Szrj while (++tries < 6);
2230*fae548d3Szrj }
2231*fae548d3Szrj
2232*fae548d3Szrj return TRUE;
2233*fae548d3Szrj
2234*fae548d3Szrj input_err:
2235*fae548d3Szrj bfd_set_input_error (current, bfd_get_error ());
2236*fae548d3Szrj return FALSE;
2237*fae548d3Szrj }
2238*fae548d3Szrj
2239*fae548d3Szrj /* Note that the namidx for the first symbol is 0. */
2240*fae548d3Szrj
2241*fae548d3Szrj bfd_boolean
_bfd_compute_and_write_armap(bfd * arch,unsigned int elength)2242*fae548d3Szrj _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
2243*fae548d3Szrj {
2244*fae548d3Szrj char *first_name = NULL;
2245*fae548d3Szrj bfd *current;
2246*fae548d3Szrj file_ptr elt_no = 0;
2247*fae548d3Szrj struct orl *map = NULL;
2248*fae548d3Szrj unsigned int orl_max = 1024; /* Fine initial default. */
2249*fae548d3Szrj unsigned int orl_count = 0;
2250*fae548d3Szrj int stridx = 0;
2251*fae548d3Szrj asymbol **syms = NULL;
2252*fae548d3Szrj long syms_max = 0;
2253*fae548d3Szrj bfd_boolean ret;
2254*fae548d3Szrj bfd_size_type amt;
2255*fae548d3Szrj static bfd_boolean report_plugin_err = TRUE;
2256*fae548d3Szrj
2257*fae548d3Szrj /* Dunno if this is the best place for this info... */
2258*fae548d3Szrj if (elength != 0)
2259*fae548d3Szrj elength += sizeof (struct ar_hdr);
2260*fae548d3Szrj elength += elength % 2;
2261*fae548d3Szrj
2262*fae548d3Szrj amt = orl_max * sizeof (struct orl);
2263*fae548d3Szrj map = (struct orl *) bfd_malloc (amt);
2264*fae548d3Szrj if (map == NULL)
2265*fae548d3Szrj goto error_return;
2266*fae548d3Szrj
2267*fae548d3Szrj /* We put the symbol names on the arch objalloc, and then discard
2268*fae548d3Szrj them when done. */
2269*fae548d3Szrj first_name = (char *) bfd_alloc (arch, 1);
2270*fae548d3Szrj if (first_name == NULL)
2271*fae548d3Szrj goto error_return;
2272*fae548d3Szrj
2273*fae548d3Szrj /* Drop all the files called __.SYMDEF, we're going to make our own. */
2274*fae548d3Szrj while (arch->archive_head
2275*fae548d3Szrj && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
2276*fae548d3Szrj arch->archive_head = arch->archive_head->archive_next;
2277*fae548d3Szrj
2278*fae548d3Szrj /* Map over each element. */
2279*fae548d3Szrj for (current = arch->archive_head;
2280*fae548d3Szrj current != NULL;
2281*fae548d3Szrj current = current->archive_next, elt_no++)
2282*fae548d3Szrj {
2283*fae548d3Szrj if (bfd_check_format (current, bfd_object)
2284*fae548d3Szrj && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
2285*fae548d3Szrj {
2286*fae548d3Szrj long storage;
2287*fae548d3Szrj long symcount;
2288*fae548d3Szrj long src_count;
2289*fae548d3Szrj
2290*fae548d3Szrj if (current->lto_slim_object && report_plugin_err)
2291*fae548d3Szrj {
2292*fae548d3Szrj report_plugin_err = FALSE;
2293*fae548d3Szrj _bfd_error_handler
2294*fae548d3Szrj (_("%pB: plugin needed to handle lto object"),
2295*fae548d3Szrj current);
2296*fae548d3Szrj }
2297*fae548d3Szrj
2298*fae548d3Szrj storage = bfd_get_symtab_upper_bound (current);
2299*fae548d3Szrj if (storage < 0)
2300*fae548d3Szrj goto error_return;
2301*fae548d3Szrj
2302*fae548d3Szrj if (storage != 0)
2303*fae548d3Szrj {
2304*fae548d3Szrj if (storage > syms_max)
2305*fae548d3Szrj {
2306*fae548d3Szrj if (syms_max > 0)
2307*fae548d3Szrj free (syms);
2308*fae548d3Szrj syms_max = storage;
2309*fae548d3Szrj syms = (asymbol **) bfd_malloc (syms_max);
2310*fae548d3Szrj if (syms == NULL)
2311*fae548d3Szrj goto error_return;
2312*fae548d3Szrj }
2313*fae548d3Szrj symcount = bfd_canonicalize_symtab (current, syms);
2314*fae548d3Szrj if (symcount < 0)
2315*fae548d3Szrj goto error_return;
2316*fae548d3Szrj
2317*fae548d3Szrj /* Now map over all the symbols, picking out the ones we
2318*fae548d3Szrj want. */
2319*fae548d3Szrj for (src_count = 0; src_count < symcount; src_count++)
2320*fae548d3Szrj {
2321*fae548d3Szrj flagword flags = (syms[src_count])->flags;
2322*fae548d3Szrj asection *sec = syms[src_count]->section;
2323*fae548d3Szrj
2324*fae548d3Szrj if (((flags & (BSF_GLOBAL
2325*fae548d3Szrj | BSF_WEAK
2326*fae548d3Szrj | BSF_INDIRECT
2327*fae548d3Szrj | BSF_GNU_UNIQUE)) != 0
2328*fae548d3Szrj || bfd_is_com_section (sec))
2329*fae548d3Szrj && ! bfd_is_und_section (sec))
2330*fae548d3Szrj {
2331*fae548d3Szrj bfd_size_type namelen;
2332*fae548d3Szrj struct orl *new_map;
2333*fae548d3Szrj
2334*fae548d3Szrj /* This symbol will go into the archive header. */
2335*fae548d3Szrj if (orl_count == orl_max)
2336*fae548d3Szrj {
2337*fae548d3Szrj orl_max *= 2;
2338*fae548d3Szrj amt = orl_max * sizeof (struct orl);
2339*fae548d3Szrj new_map = (struct orl *) bfd_realloc (map, amt);
2340*fae548d3Szrj if (new_map == NULL)
2341*fae548d3Szrj goto error_return;
2342*fae548d3Szrj
2343*fae548d3Szrj map = new_map;
2344*fae548d3Szrj }
2345*fae548d3Szrj
2346*fae548d3Szrj if (syms[src_count]->name[0] == '_'
2347*fae548d3Szrj && syms[src_count]->name[1] == '_'
2348*fae548d3Szrj && strcmp (syms[src_count]->name
2349*fae548d3Szrj + (syms[src_count]->name[2] == '_'),
2350*fae548d3Szrj "__gnu_lto_slim") == 0
2351*fae548d3Szrj && report_plugin_err)
2352*fae548d3Szrj {
2353*fae548d3Szrj report_plugin_err = FALSE;
2354*fae548d3Szrj _bfd_error_handler
2355*fae548d3Szrj (_("%pB: plugin needed to handle lto object"),
2356*fae548d3Szrj current);
2357*fae548d3Szrj }
2358*fae548d3Szrj namelen = strlen (syms[src_count]->name);
2359*fae548d3Szrj amt = sizeof (char *);
2360*fae548d3Szrj map[orl_count].name = (char **) bfd_alloc (arch, amt);
2361*fae548d3Szrj if (map[orl_count].name == NULL)
2362*fae548d3Szrj goto error_return;
2363*fae548d3Szrj *(map[orl_count].name) = (char *) bfd_alloc (arch,
2364*fae548d3Szrj namelen + 1);
2365*fae548d3Szrj if (*(map[orl_count].name) == NULL)
2366*fae548d3Szrj goto error_return;
2367*fae548d3Szrj strcpy (*(map[orl_count].name), syms[src_count]->name);
2368*fae548d3Szrj map[orl_count].u.abfd = current;
2369*fae548d3Szrj map[orl_count].namidx = stridx;
2370*fae548d3Szrj
2371*fae548d3Szrj stridx += namelen + 1;
2372*fae548d3Szrj ++orl_count;
2373*fae548d3Szrj }
2374*fae548d3Szrj }
2375*fae548d3Szrj }
2376*fae548d3Szrj
2377*fae548d3Szrj /* Now ask the BFD to free up any cached information, so we
2378*fae548d3Szrj don't fill all of memory with symbol tables. */
2379*fae548d3Szrj if (! bfd_free_cached_info (current))
2380*fae548d3Szrj goto error_return;
2381*fae548d3Szrj }
2382*fae548d3Szrj }
2383*fae548d3Szrj
2384*fae548d3Szrj /* OK, now we have collected all the data, let's write them out. */
2385*fae548d3Szrj ret = BFD_SEND (arch, write_armap,
2386*fae548d3Szrj (arch, elength, map, orl_count, stridx));
2387*fae548d3Szrj
2388*fae548d3Szrj if (syms_max > 0)
2389*fae548d3Szrj free (syms);
2390*fae548d3Szrj if (map != NULL)
2391*fae548d3Szrj free (map);
2392*fae548d3Szrj if (first_name != NULL)
2393*fae548d3Szrj bfd_release (arch, first_name);
2394*fae548d3Szrj
2395*fae548d3Szrj return ret;
2396*fae548d3Szrj
2397*fae548d3Szrj error_return:
2398*fae548d3Szrj if (syms_max > 0)
2399*fae548d3Szrj free (syms);
2400*fae548d3Szrj if (map != NULL)
2401*fae548d3Szrj free (map);
2402*fae548d3Szrj if (first_name != NULL)
2403*fae548d3Szrj bfd_release (arch, first_name);
2404*fae548d3Szrj
2405*fae548d3Szrj return FALSE;
2406*fae548d3Szrj }
2407*fae548d3Szrj
2408*fae548d3Szrj bfd_boolean
_bfd_bsd_write_armap(bfd * arch,unsigned int elength,struct orl * map,unsigned int orl_count,int stridx)2409*fae548d3Szrj _bfd_bsd_write_armap (bfd *arch,
2410*fae548d3Szrj unsigned int elength,
2411*fae548d3Szrj struct orl *map,
2412*fae548d3Szrj unsigned int orl_count,
2413*fae548d3Szrj int stridx)
2414*fae548d3Szrj {
2415*fae548d3Szrj int padit = stridx & 1;
2416*fae548d3Szrj unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
2417*fae548d3Szrj unsigned int stringsize = stridx + padit;
2418*fae548d3Szrj /* Include 8 bytes to store ranlibsize and stringsize in output. */
2419*fae548d3Szrj unsigned int mapsize = ranlibsize + stringsize + 8;
2420*fae548d3Szrj file_ptr firstreal, first;
2421*fae548d3Szrj bfd *current;
2422*fae548d3Szrj bfd *last_elt;
2423*fae548d3Szrj bfd_byte temp[4];
2424*fae548d3Szrj unsigned int count;
2425*fae548d3Szrj struct ar_hdr hdr;
2426*fae548d3Szrj long uid, gid;
2427*fae548d3Szrj
2428*fae548d3Szrj first = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2429*fae548d3Szrj
2430*fae548d3Szrj #ifdef BFD64
2431*fae548d3Szrj firstreal = first;
2432*fae548d3Szrj current = arch->archive_head;
2433*fae548d3Szrj last_elt = current; /* Last element arch seen. */
2434*fae548d3Szrj for (count = 0; count < orl_count; count++)
2435*fae548d3Szrj {
2436*fae548d3Szrj unsigned int offset;
2437*fae548d3Szrj
2438*fae548d3Szrj if (map[count].u.abfd != last_elt)
2439*fae548d3Szrj {
2440*fae548d3Szrj do
2441*fae548d3Szrj {
2442*fae548d3Szrj struct areltdata *ared = arch_eltdata (current);
2443*fae548d3Szrj
2444*fae548d3Szrj firstreal += (ared->parsed_size + ared->extra_size
2445*fae548d3Szrj + sizeof (struct ar_hdr));
2446*fae548d3Szrj firstreal += firstreal % 2;
2447*fae548d3Szrj current = current->archive_next;
2448*fae548d3Szrj }
2449*fae548d3Szrj while (current != map[count].u.abfd);
2450*fae548d3Szrj }
2451*fae548d3Szrj
2452*fae548d3Szrj /* The archive file format only has 4 bytes to store the offset
2453*fae548d3Szrj of the member. Generate 64-bit archive if an archive is past
2454*fae548d3Szrj its 4Gb limit. */
2455*fae548d3Szrj offset = (unsigned int) firstreal;
2456*fae548d3Szrj if (firstreal != (file_ptr) offset)
2457*fae548d3Szrj return _bfd_archive_64_bit_write_armap (arch, elength, map,
2458*fae548d3Szrj orl_count, stridx);
2459*fae548d3Szrj
2460*fae548d3Szrj last_elt = current;
2461*fae548d3Szrj }
2462*fae548d3Szrj #endif
2463*fae548d3Szrj
2464*fae548d3Szrj /* If deterministic, we use 0 as the timestamp in the map.
2465*fae548d3Szrj Some linkers may require that the archive filesystem modification
2466*fae548d3Szrj time is less than (or near to) the archive map timestamp. Those
2467*fae548d3Szrj linkers should not be used with deterministic mode. (GNU ld and
2468*fae548d3Szrj Gold do not have this restriction.) */
2469*fae548d3Szrj bfd_ardata (arch)->armap_timestamp = 0;
2470*fae548d3Szrj uid = 0;
2471*fae548d3Szrj gid = 0;
2472*fae548d3Szrj if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
2473*fae548d3Szrj {
2474*fae548d3Szrj struct stat statbuf;
2475*fae548d3Szrj
2476*fae548d3Szrj if (stat (arch->filename, &statbuf) == 0)
2477*fae548d3Szrj bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
2478*fae548d3Szrj + ARMAP_TIME_OFFSET);
2479*fae548d3Szrj uid = getuid();
2480*fae548d3Szrj gid = getgid();
2481*fae548d3Szrj }
2482*fae548d3Szrj
2483*fae548d3Szrj memset (&hdr, ' ', sizeof (struct ar_hdr));
2484*fae548d3Szrj memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG));
2485*fae548d3Szrj bfd_ardata (arch)->armap_datepos = (SARMAG
2486*fae548d3Szrj + offsetof (struct ar_hdr, ar_date[0]));
2487*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2488*fae548d3Szrj bfd_ardata (arch)->armap_timestamp);
2489*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
2490*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
2491*fae548d3Szrj if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2492*fae548d3Szrj return FALSE;
2493*fae548d3Szrj memcpy (hdr.ar_fmag, ARFMAG, 2);
2494*fae548d3Szrj if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2495*fae548d3Szrj != sizeof (struct ar_hdr))
2496*fae548d3Szrj return FALSE;
2497*fae548d3Szrj H_PUT_32 (arch, ranlibsize, temp);
2498*fae548d3Szrj if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2499*fae548d3Szrj return FALSE;
2500*fae548d3Szrj
2501*fae548d3Szrj firstreal = first;
2502*fae548d3Szrj current = arch->archive_head;
2503*fae548d3Szrj last_elt = current; /* Last element arch seen. */
2504*fae548d3Szrj for (count = 0; count < orl_count; count++)
2505*fae548d3Szrj {
2506*fae548d3Szrj unsigned int offset;
2507*fae548d3Szrj bfd_byte buf[BSD_SYMDEF_SIZE];
2508*fae548d3Szrj
2509*fae548d3Szrj if (map[count].u.abfd != last_elt)
2510*fae548d3Szrj {
2511*fae548d3Szrj do
2512*fae548d3Szrj {
2513*fae548d3Szrj struct areltdata *ared = arch_eltdata (current);
2514*fae548d3Szrj
2515*fae548d3Szrj firstreal += (ared->parsed_size + ared->extra_size
2516*fae548d3Szrj + sizeof (struct ar_hdr));
2517*fae548d3Szrj firstreal += firstreal % 2;
2518*fae548d3Szrj current = current->archive_next;
2519*fae548d3Szrj }
2520*fae548d3Szrj while (current != map[count].u.abfd);
2521*fae548d3Szrj }
2522*fae548d3Szrj
2523*fae548d3Szrj /* The archive file format only has 4 bytes to store the offset
2524*fae548d3Szrj of the member. Check to make sure that firstreal has not grown
2525*fae548d3Szrj too big. */
2526*fae548d3Szrj offset = (unsigned int) firstreal;
2527*fae548d3Szrj if (firstreal != (file_ptr) offset)
2528*fae548d3Szrj {
2529*fae548d3Szrj bfd_set_error (bfd_error_file_truncated);
2530*fae548d3Szrj return FALSE;
2531*fae548d3Szrj }
2532*fae548d3Szrj
2533*fae548d3Szrj last_elt = current;
2534*fae548d3Szrj H_PUT_32 (arch, map[count].namidx, buf);
2535*fae548d3Szrj H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2536*fae548d3Szrj if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch)
2537*fae548d3Szrj != BSD_SYMDEF_SIZE)
2538*fae548d3Szrj return FALSE;
2539*fae548d3Szrj }
2540*fae548d3Szrj
2541*fae548d3Szrj /* Now write the strings themselves. */
2542*fae548d3Szrj H_PUT_32 (arch, stringsize, temp);
2543*fae548d3Szrj if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2544*fae548d3Szrj return FALSE;
2545*fae548d3Szrj for (count = 0; count < orl_count; count++)
2546*fae548d3Szrj {
2547*fae548d3Szrj size_t len = strlen (*map[count].name) + 1;
2548*fae548d3Szrj
2549*fae548d3Szrj if (bfd_bwrite (*map[count].name, len, arch) != len)
2550*fae548d3Szrj return FALSE;
2551*fae548d3Szrj }
2552*fae548d3Szrj
2553*fae548d3Szrj /* The spec sez this should be a newline. But in order to be
2554*fae548d3Szrj bug-compatible for sun's ar we use a null. */
2555*fae548d3Szrj if (padit)
2556*fae548d3Szrj {
2557*fae548d3Szrj if (bfd_bwrite ("", 1, arch) != 1)
2558*fae548d3Szrj return FALSE;
2559*fae548d3Szrj }
2560*fae548d3Szrj
2561*fae548d3Szrj return TRUE;
2562*fae548d3Szrj }
2563*fae548d3Szrj
2564*fae548d3Szrj /* At the end of archive file handling, update the timestamp in the
2565*fae548d3Szrj file, so the linker will accept it.
2566*fae548d3Szrj
2567*fae548d3Szrj Return TRUE if the timestamp was OK, or an unusual problem happened.
2568*fae548d3Szrj Return FALSE if we updated the timestamp. */
2569*fae548d3Szrj
2570*fae548d3Szrj bfd_boolean
_bfd_archive_bsd_update_armap_timestamp(bfd * arch)2571*fae548d3Szrj _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
2572*fae548d3Szrj {
2573*fae548d3Szrj struct stat archstat;
2574*fae548d3Szrj struct ar_hdr hdr;
2575*fae548d3Szrj
2576*fae548d3Szrj /* If creating deterministic archives, just leave the timestamp as-is. */
2577*fae548d3Szrj if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2578*fae548d3Szrj return TRUE;
2579*fae548d3Szrj
2580*fae548d3Szrj /* Flush writes, get last-write timestamp from file, and compare it
2581*fae548d3Szrj to the timestamp IN the file. */
2582*fae548d3Szrj bfd_flush (arch);
2583*fae548d3Szrj if (bfd_stat (arch, &archstat) == -1)
2584*fae548d3Szrj {
2585*fae548d3Szrj bfd_perror (_("Reading archive file mod timestamp"));
2586*fae548d3Szrj
2587*fae548d3Szrj /* Can't read mod time for some reason. */
2588*fae548d3Szrj return TRUE;
2589*fae548d3Szrj }
2590*fae548d3Szrj if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
2591*fae548d3Szrj /* OK by the linker's rules. */
2592*fae548d3Szrj return TRUE;
2593*fae548d3Szrj
2594*fae548d3Szrj /* Update the timestamp. */
2595*fae548d3Szrj bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2596*fae548d3Szrj
2597*fae548d3Szrj /* Prepare an ASCII version suitable for writing. */
2598*fae548d3Szrj memset (hdr.ar_date, ' ', sizeof (hdr.ar_date));
2599*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2600*fae548d3Szrj bfd_ardata (arch)->armap_timestamp);
2601*fae548d3Szrj
2602*fae548d3Szrj /* Write it into the file. */
2603*fae548d3Szrj bfd_ardata (arch)->armap_datepos = (SARMAG
2604*fae548d3Szrj + offsetof (struct ar_hdr, ar_date[0]));
2605*fae548d3Szrj if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2606*fae548d3Szrj || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch)
2607*fae548d3Szrj != sizeof (hdr.ar_date)))
2608*fae548d3Szrj {
2609*fae548d3Szrj bfd_perror (_("Writing updated armap timestamp"));
2610*fae548d3Szrj
2611*fae548d3Szrj /* Some error while writing. */
2612*fae548d3Szrj return TRUE;
2613*fae548d3Szrj }
2614*fae548d3Szrj
2615*fae548d3Szrj /* We updated the timestamp successfully. */
2616*fae548d3Szrj return FALSE;
2617*fae548d3Szrj }
2618*fae548d3Szrj
2619*fae548d3Szrj /* A coff armap looks like :
2620*fae548d3Szrj lARMAG
2621*fae548d3Szrj struct ar_hdr with name = '/'
2622*fae548d3Szrj number of symbols
2623*fae548d3Szrj offset of file for symbol 0
2624*fae548d3Szrj offset of file for symbol 1
2625*fae548d3Szrj
2626*fae548d3Szrj offset of file for symbol n-1
2627*fae548d3Szrj symbol name 0
2628*fae548d3Szrj symbol name 1
2629*fae548d3Szrj
2630*fae548d3Szrj symbol name n-1 */
2631*fae548d3Szrj
2632*fae548d3Szrj bfd_boolean
_bfd_coff_write_armap(bfd * arch,unsigned int elength,struct orl * map,unsigned int symbol_count,int stridx)2633*fae548d3Szrj _bfd_coff_write_armap (bfd *arch,
2634*fae548d3Szrj unsigned int elength,
2635*fae548d3Szrj struct orl *map,
2636*fae548d3Szrj unsigned int symbol_count,
2637*fae548d3Szrj int stridx)
2638*fae548d3Szrj {
2639*fae548d3Szrj /* The size of the ranlib is the number of exported symbols in the
2640*fae548d3Szrj archive * the number of bytes in an int, + an int for the count. */
2641*fae548d3Szrj unsigned int ranlibsize = (symbol_count * 4) + 4;
2642*fae548d3Szrj unsigned int stringsize = stridx;
2643*fae548d3Szrj unsigned int mapsize = stringsize + ranlibsize;
2644*fae548d3Szrj file_ptr archive_member_file_ptr;
2645*fae548d3Szrj file_ptr first_archive_member_file_ptr;
2646*fae548d3Szrj bfd *current = arch->archive_head;
2647*fae548d3Szrj unsigned int count;
2648*fae548d3Szrj struct ar_hdr hdr;
2649*fae548d3Szrj int padit = mapsize & 1;
2650*fae548d3Szrj
2651*fae548d3Szrj if (padit)
2652*fae548d3Szrj mapsize++;
2653*fae548d3Szrj
2654*fae548d3Szrj /* Work out where the first object file will go in the archive. */
2655*fae548d3Szrj first_archive_member_file_ptr = (mapsize
2656*fae548d3Szrj + elength
2657*fae548d3Szrj + sizeof (struct ar_hdr)
2658*fae548d3Szrj + SARMAG);
2659*fae548d3Szrj
2660*fae548d3Szrj #ifdef BFD64
2661*fae548d3Szrj current = arch->archive_head;
2662*fae548d3Szrj count = 0;
2663*fae548d3Szrj archive_member_file_ptr = first_archive_member_file_ptr;
2664*fae548d3Szrj while (current != NULL && count < symbol_count)
2665*fae548d3Szrj {
2666*fae548d3Szrj /* For each symbol which is used defined in this object, write
2667*fae548d3Szrj out the object file's address in the archive. */
2668*fae548d3Szrj
2669*fae548d3Szrj while (count < symbol_count && map[count].u.abfd == current)
2670*fae548d3Szrj {
2671*fae548d3Szrj unsigned int offset = (unsigned int) archive_member_file_ptr;
2672*fae548d3Szrj
2673*fae548d3Szrj /* Generate 64-bit archive if an archive is past its 4Gb
2674*fae548d3Szrj limit. */
2675*fae548d3Szrj if (archive_member_file_ptr != (file_ptr) offset)
2676*fae548d3Szrj return _bfd_archive_64_bit_write_armap (arch, elength, map,
2677*fae548d3Szrj symbol_count, stridx);
2678*fae548d3Szrj count++;
2679*fae548d3Szrj }
2680*fae548d3Szrj archive_member_file_ptr += sizeof (struct ar_hdr);
2681*fae548d3Szrj if (! bfd_is_thin_archive (arch))
2682*fae548d3Szrj {
2683*fae548d3Szrj /* Add size of this archive entry. */
2684*fae548d3Szrj archive_member_file_ptr += arelt_size (current);
2685*fae548d3Szrj /* Remember about the even alignment. */
2686*fae548d3Szrj archive_member_file_ptr += archive_member_file_ptr % 2;
2687*fae548d3Szrj }
2688*fae548d3Szrj current = current->archive_next;
2689*fae548d3Szrj }
2690*fae548d3Szrj #endif
2691*fae548d3Szrj
2692*fae548d3Szrj memset (&hdr, ' ', sizeof (struct ar_hdr));
2693*fae548d3Szrj hdr.ar_name[0] = '/';
2694*fae548d3Szrj if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2695*fae548d3Szrj return FALSE;
2696*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2697*fae548d3Szrj ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
2698*fae548d3Szrj ? time (NULL) : 0));
2699*fae548d3Szrj /* This, at least, is what Intel coff sets the values to. */
2700*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0);
2701*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0);
2702*fae548d3Szrj _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0);
2703*fae548d3Szrj memcpy (hdr.ar_fmag, ARFMAG, 2);
2704*fae548d3Szrj
2705*fae548d3Szrj /* Write the ar header for this item and the number of symbols. */
2706*fae548d3Szrj if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2707*fae548d3Szrj != sizeof (struct ar_hdr))
2708*fae548d3Szrj return FALSE;
2709*fae548d3Szrj
2710*fae548d3Szrj if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2711*fae548d3Szrj return FALSE;
2712*fae548d3Szrj
2713*fae548d3Szrj /* Two passes, first write the file offsets for each symbol -
2714*fae548d3Szrj remembering that each offset is on a two byte boundary. */
2715*fae548d3Szrj
2716*fae548d3Szrj /* Write out the file offset for the file associated with each
2717*fae548d3Szrj symbol, and remember to keep the offsets padded out. */
2718*fae548d3Szrj
2719*fae548d3Szrj current = arch->archive_head;
2720*fae548d3Szrj count = 0;
2721*fae548d3Szrj archive_member_file_ptr = first_archive_member_file_ptr;
2722*fae548d3Szrj while (current != NULL && count < symbol_count)
2723*fae548d3Szrj {
2724*fae548d3Szrj /* For each symbol which is used defined in this object, write
2725*fae548d3Szrj out the object file's address in the archive. */
2726*fae548d3Szrj
2727*fae548d3Szrj while (count < symbol_count && map[count].u.abfd == current)
2728*fae548d3Szrj {
2729*fae548d3Szrj unsigned int offset = (unsigned int) archive_member_file_ptr;
2730*fae548d3Szrj
2731*fae548d3Szrj /* Catch an attempt to grow an archive past its 4Gb limit. */
2732*fae548d3Szrj if (archive_member_file_ptr != (file_ptr) offset)
2733*fae548d3Szrj {
2734*fae548d3Szrj bfd_set_error (bfd_error_file_truncated);
2735*fae548d3Szrj return FALSE;
2736*fae548d3Szrj }
2737*fae548d3Szrj if (!bfd_write_bigendian_4byte_int (arch, offset))
2738*fae548d3Szrj return FALSE;
2739*fae548d3Szrj count++;
2740*fae548d3Szrj }
2741*fae548d3Szrj archive_member_file_ptr += sizeof (struct ar_hdr);
2742*fae548d3Szrj if (! bfd_is_thin_archive (arch))
2743*fae548d3Szrj {
2744*fae548d3Szrj /* Add size of this archive entry. */
2745*fae548d3Szrj archive_member_file_ptr += arelt_size (current);
2746*fae548d3Szrj /* Remember about the even alignment. */
2747*fae548d3Szrj archive_member_file_ptr += archive_member_file_ptr % 2;
2748*fae548d3Szrj }
2749*fae548d3Szrj current = current->archive_next;
2750*fae548d3Szrj }
2751*fae548d3Szrj
2752*fae548d3Szrj /* Now write the strings themselves. */
2753*fae548d3Szrj for (count = 0; count < symbol_count; count++)
2754*fae548d3Szrj {
2755*fae548d3Szrj size_t len = strlen (*map[count].name) + 1;
2756*fae548d3Szrj
2757*fae548d3Szrj if (bfd_bwrite (*map[count].name, len, arch) != len)
2758*fae548d3Szrj return FALSE;
2759*fae548d3Szrj }
2760*fae548d3Szrj
2761*fae548d3Szrj /* The spec sez this should be a newline. But in order to be
2762*fae548d3Szrj bug-compatible for arc960 we use a null. */
2763*fae548d3Szrj if (padit)
2764*fae548d3Szrj {
2765*fae548d3Szrj if (bfd_bwrite ("", 1, arch) != 1)
2766*fae548d3Szrj return FALSE;
2767*fae548d3Szrj }
2768*fae548d3Szrj
2769*fae548d3Szrj return TRUE;
2770*fae548d3Szrj }
2771*fae548d3Szrj
2772*fae548d3Szrj bfd_boolean
_bfd_noarchive_write_armap(bfd * arch ATTRIBUTE_UNUSED,unsigned int elength ATTRIBUTE_UNUSED,struct orl * map ATTRIBUTE_UNUSED,unsigned int orl_count ATTRIBUTE_UNUSED,int stridx ATTRIBUTE_UNUSED)2773*fae548d3Szrj _bfd_noarchive_write_armap
2774*fae548d3Szrj (bfd *arch ATTRIBUTE_UNUSED,
2775*fae548d3Szrj unsigned int elength ATTRIBUTE_UNUSED,
2776*fae548d3Szrj struct orl *map ATTRIBUTE_UNUSED,
2777*fae548d3Szrj unsigned int orl_count ATTRIBUTE_UNUSED,
2778*fae548d3Szrj int stridx ATTRIBUTE_UNUSED)
2779*fae548d3Szrj {
2780*fae548d3Szrj return TRUE;
2781*fae548d3Szrj }
2782*fae548d3Szrj
2783*fae548d3Szrj static int
archive_close_worker(void ** slot,void * inf ATTRIBUTE_UNUSED)2784*fae548d3Szrj archive_close_worker (void **slot, void *inf ATTRIBUTE_UNUSED)
2785*fae548d3Szrj {
2786*fae548d3Szrj struct ar_cache *ent = (struct ar_cache *) *slot;
2787*fae548d3Szrj
2788*fae548d3Szrj bfd_close_all_done (ent->arbfd);
2789*fae548d3Szrj return 1;
2790*fae548d3Szrj }
2791*fae548d3Szrj
2792*fae548d3Szrj void
_bfd_unlink_from_archive_parent(bfd * abfd)2793*fae548d3Szrj _bfd_unlink_from_archive_parent (bfd *abfd)
2794*fae548d3Szrj {
2795*fae548d3Szrj if (arch_eltdata (abfd) != NULL)
2796*fae548d3Szrj {
2797*fae548d3Szrj struct areltdata *ared = arch_eltdata (abfd);
2798*fae548d3Szrj htab_t htab = (htab_t) ared->parent_cache;
2799*fae548d3Szrj
2800*fae548d3Szrj if (htab)
2801*fae548d3Szrj {
2802*fae548d3Szrj struct ar_cache ent;
2803*fae548d3Szrj void **slot;
2804*fae548d3Szrj
2805*fae548d3Szrj ent.ptr = ared->key;
2806*fae548d3Szrj slot = htab_find_slot (htab, &ent, NO_INSERT);
2807*fae548d3Szrj if (slot != NULL)
2808*fae548d3Szrj {
2809*fae548d3Szrj BFD_ASSERT (((struct ar_cache *) *slot)->arbfd == abfd);
2810*fae548d3Szrj htab_clear_slot (htab, slot);
2811*fae548d3Szrj }
2812*fae548d3Szrj }
2813*fae548d3Szrj }
2814*fae548d3Szrj }
2815*fae548d3Szrj
2816*fae548d3Szrj bfd_boolean
_bfd_archive_close_and_cleanup(bfd * abfd)2817*fae548d3Szrj _bfd_archive_close_and_cleanup (bfd *abfd)
2818*fae548d3Szrj {
2819*fae548d3Szrj if (bfd_read_p (abfd) && abfd->format == bfd_archive)
2820*fae548d3Szrj {
2821*fae548d3Szrj bfd *nbfd;
2822*fae548d3Szrj bfd *next;
2823*fae548d3Szrj htab_t htab;
2824*fae548d3Szrj
2825*fae548d3Szrj /* Close nested archives (if this bfd is a thin archive). */
2826*fae548d3Szrj for (nbfd = abfd->nested_archives; nbfd; nbfd = next)
2827*fae548d3Szrj {
2828*fae548d3Szrj next = nbfd->archive_next;
2829*fae548d3Szrj bfd_close (nbfd);
2830*fae548d3Szrj }
2831*fae548d3Szrj
2832*fae548d3Szrj htab = bfd_ardata (abfd)->cache;
2833*fae548d3Szrj if (htab)
2834*fae548d3Szrj {
2835*fae548d3Szrj htab_traverse_noresize (htab, archive_close_worker, NULL);
2836*fae548d3Szrj htab_delete (htab);
2837*fae548d3Szrj bfd_ardata (abfd)->cache = NULL;
2838*fae548d3Szrj }
2839*fae548d3Szrj }
2840*fae548d3Szrj
2841*fae548d3Szrj _bfd_unlink_from_archive_parent (abfd);
2842*fae548d3Szrj
2843*fae548d3Szrj if (abfd->is_linker_output)
2844*fae548d3Szrj (*abfd->link.hash->hash_table_free) (abfd);
2845*fae548d3Szrj
2846*fae548d3Szrj return TRUE;
2847*fae548d3Szrj }
2848