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