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_zalloc (member, 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     return NULL;
1931   memcpy (hdr->ar_fmag, ARFMAG, 2);
1932   ared->parsed_size = status.st_size;
1933   ared->arch_header = (char *) hdr;
1934
1935   return ared;
1936 }
1937
1938 /* Analogous to stat call.  */
1939
1940 int
1941 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
1942 {
1943   struct ar_hdr *hdr;
1944   char *aloser;
1945
1946   if (abfd->arelt_data == NULL)
1947     {
1948       bfd_set_error (bfd_error_invalid_operation);
1949       return -1;
1950     }
1951
1952   hdr = arch_hdr (abfd);
1953
1954 #define foo(arelt, stelt, size)                         \
1955   buf->stelt = strtol (hdr->arelt, &aloser, size);      \
1956   if (aloser == hdr->arelt)                             \
1957     return -1;
1958
1959   /* Some platforms support special notations for large IDs.  */
1960 #ifdef HPUX_LARGE_AR_IDS
1961 # define foo2(arelt, stelt, size)                                       \
1962   if (hdr->arelt[5] == ' ')                                             \
1963     {                                                                   \
1964       foo (arelt, stelt, size);                                         \
1965     }                                                                   \
1966   else                                                                  \
1967     {                                                                   \
1968       int cnt;                                                          \
1969       for (buf->stelt = cnt = 0; cnt < 5; ++cnt)                        \
1970         {                                                               \
1971           if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f)    \
1972             return -1;                                                  \
1973           buf->stelt <<= 6;                                             \
1974           buf->stelt += hdr->arelt[cnt] - ' ';                          \
1975         }                                                               \
1976       if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3)               \
1977         return -1;                                                      \
1978       buf->stelt <<= 2;                                                 \
1979       buf->stelt += hdr->arelt[5] - '@';                                \
1980     }
1981 #else
1982 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1983 #endif
1984
1985   foo (ar_date, st_mtime, 10);
1986   foo2 (ar_uid, st_uid, 10);
1987   foo2 (ar_gid, st_gid, 10);
1988   foo (ar_mode, st_mode, 8);
1989
1990   buf->st_size = arch_eltdata (abfd)->parsed_size;
1991
1992   return 0;
1993 }
1994
1995 void
1996 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1997 {
1998   /* FIXME: This interacts unpleasantly with ar's quick-append option.
1999      Fortunately ic960 users will never use that option.  Fixing this
2000      is very hard; fortunately I know how to do it and will do so once
2001      intel's release is out the door.  */
2002
2003   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2004   size_t length;
2005   const char *filename;
2006   size_t maxlen = ar_maxnamelen (abfd);
2007
2008   if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
2009     {
2010       bfd_bsd_truncate_arname (abfd, pathname, arhdr);
2011       return;
2012     }
2013
2014   filename = normalize (abfd, pathname);
2015   if (filename == NULL)
2016     {
2017       /* FIXME */
2018       abort ();
2019     }
2020
2021   length = strlen (filename);
2022
2023   if (length <= maxlen)
2024     memcpy (hdr->ar_name, filename, length);
2025
2026   /* Add the padding character if there is room for it.  */
2027   if (length < maxlen
2028       || (length == maxlen && length < sizeof hdr->ar_name))
2029     (hdr->ar_name)[length] = ar_padchar (abfd);
2030 }
2031
2032 void
2033 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2034 {
2035   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2036   size_t length;
2037   const char *filename = lbasename (pathname);
2038   size_t maxlen = ar_maxnamelen (abfd);
2039
2040   length = strlen (filename);
2041
2042   if (length <= maxlen)
2043     memcpy (hdr->ar_name, filename, length);
2044   else
2045     {
2046       /* pathname: meet procrustes */
2047       memcpy (hdr->ar_name, filename, maxlen);
2048       length = maxlen;
2049     }
2050
2051   if (length < maxlen)
2052     (hdr->ar_name)[length] = ar_padchar (abfd);
2053 }
2054
2055 /* Store name into ar header.  Truncates the name to fit.
2056    1> strip pathname to be just the basename.
2057    2> if it's short enuf to fit, stuff it in.
2058    3> If it doesn't end with .o, truncate it to fit
2059    4> truncate it before the .o, append .o, stuff THAT in.  */
2060
2061 /* This is what gnu ar does.  It's better but incompatible with the
2062    bsd ar.  */
2063
2064 void
2065 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2066 {
2067   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2068   size_t length;
2069   const char *filename = lbasename (pathname);
2070   size_t maxlen = ar_maxnamelen (abfd);
2071
2072   length = strlen (filename);
2073
2074   if (length <= maxlen)
2075     memcpy (hdr->ar_name, filename, length);
2076   else
2077     {
2078       /* pathname: meet procrustes.  */
2079       memcpy (hdr->ar_name, filename, maxlen);
2080       if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
2081         {
2082           hdr->ar_name[maxlen - 2] = '.';
2083           hdr->ar_name[maxlen - 1] = 'o';
2084         }
2085       length = maxlen;
2086     }
2087
2088   if (length < 16)
2089     (hdr->ar_name)[length] = ar_padchar (abfd);
2090 }
2091 \f
2092 /* The BFD is open for write and has its format set to bfd_archive.  */
2093
2094 bfd_boolean
2095 _bfd_write_archive_contents (bfd *arch)
2096 {
2097   bfd *current;
2098   char *etable = NULL;
2099   bfd_size_type elength = 0;
2100   const char *ename = NULL;
2101   bfd_boolean makemap = bfd_has_map (arch);
2102   /* If no .o's, don't bother to make a map.  */
2103   bfd_boolean hasobjects = FALSE;
2104   bfd_size_type wrote;
2105   int tries;
2106   char *armag;
2107
2108   /* Verify the viability of all entries; if any of them live in the
2109      filesystem (as opposed to living in an archive open for input)
2110      then construct a fresh ar_hdr for them.  */
2111   for (current = arch->archive_head;
2112        current != NULL;
2113        current = current->archive_next)
2114     {
2115       /* This check is checking the bfds for the objects we're reading
2116          from (which are usually either an object file or archive on
2117          disk), not the archive entries we're writing to.  We don't
2118          actually create bfds for the archive members, we just copy
2119          them byte-wise when we write out the archive.  */
2120       if (bfd_write_p (current))
2121         {
2122           bfd_set_error (bfd_error_invalid_operation);
2123           goto input_err;
2124         }
2125       if (!current->arelt_data)
2126         {
2127           current->arelt_data =
2128             bfd_ar_hdr_from_filesystem (arch, current->filename, current);
2129           if (!current->arelt_data)
2130             goto input_err;
2131
2132           /* Put in the file name.  */
2133           BFD_SEND (arch, _bfd_truncate_arname,
2134                     (arch, current->filename, (char *) arch_hdr (current)));
2135         }
2136
2137       if (makemap && ! hasobjects)
2138         {                       /* Don't bother if we won't make a map!  */
2139           if ((bfd_check_format (current, bfd_object)))
2140             hasobjects = TRUE;
2141         }
2142     }
2143
2144   if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
2145                  (arch, &etable, &elength, &ename)))
2146     return FALSE;
2147
2148   if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
2149     return FALSE;
2150   armag = ARMAG;
2151   if (bfd_is_thin_archive (arch))
2152     armag = ARMAGT;
2153   wrote = bfd_bwrite (armag, SARMAG, arch);
2154   if (wrote != SARMAG)
2155     return FALSE;
2156
2157   if (makemap && hasobjects)
2158     {
2159       if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
2160         return FALSE;
2161     }
2162
2163   if (elength != 0)
2164     {
2165       struct ar_hdr hdr;
2166
2167       memset (&hdr, ' ', sizeof (struct ar_hdr));
2168       memcpy (hdr.ar_name, ename, strlen (ename));
2169       /* Round size up to even number in archive header.  */
2170       if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
2171                             (elength + 1) & ~(bfd_size_type) 1))
2172         return FALSE;
2173       memcpy (hdr.ar_fmag, ARFMAG, 2);
2174       if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2175            != sizeof (struct ar_hdr))
2176           || bfd_bwrite (etable, elength, arch) != elength)
2177         return FALSE;
2178       if ((elength % 2) == 1)
2179         {
2180           if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2181             return FALSE;
2182         }
2183     }
2184
2185   for (current = arch->archive_head;
2186        current != NULL;
2187        current = current->archive_next)
2188     {
2189       char buffer[DEFAULT_BUFFERSIZE];
2190       bfd_size_type remaining = arelt_size (current);
2191
2192       /* Write ar header.  */
2193       if (!_bfd_write_ar_hdr (arch, current))
2194         return FALSE;
2195       if (bfd_is_thin_archive (arch))
2196         continue;
2197       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
2198         goto input_err;
2199
2200       while (remaining)
2201         {
2202           unsigned int amt = DEFAULT_BUFFERSIZE;
2203
2204           if (amt > remaining)
2205             amt = remaining;
2206           errno = 0;
2207           if (bfd_bread (buffer, amt, current) != amt)
2208             {
2209               if (bfd_get_error () != bfd_error_system_call)
2210                 bfd_set_error (bfd_error_file_truncated);
2211               goto input_err;
2212             }
2213           if (bfd_bwrite (buffer, amt, arch) != amt)
2214             return FALSE;
2215           remaining -= amt;
2216         }
2217
2218       if ((arelt_size (current) % 2) == 1)
2219         {
2220           if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2221             return FALSE;
2222         }
2223     }
2224
2225   if (makemap && hasobjects)
2226     {
2227       /* Verify the timestamp in the archive file.  If it would not be
2228          accepted by the linker, rewrite it until it would be.  If
2229          anything odd happens, break out and just return.  (The
2230          Berkeley linker checks the timestamp and refuses to read the
2231          table-of-contents if it is >60 seconds less than the file's
2232          modified-time.  That painful hack requires this painful hack.  */
2233       tries = 1;
2234       do
2235         {
2236           if (bfd_update_armap_timestamp (arch))
2237             break;
2238           (*_bfd_error_handler)
2239             (_("Warning: writing archive was slow: rewriting timestamp\n"));
2240         }
2241       while (++tries < 6);
2242     }
2243
2244   return TRUE;
2245
2246  input_err:
2247   bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
2248   return FALSE;
2249 }
2250 \f
2251 /* Note that the namidx for the first symbol is 0.  */
2252
2253 bfd_boolean
2254 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
2255 {
2256   char *first_name = NULL;
2257   bfd *current;
2258   file_ptr elt_no = 0;
2259   struct orl *map = NULL;
2260   unsigned int orl_max = 1024;          /* Fine initial default.  */
2261   unsigned int orl_count = 0;
2262   int stridx = 0;
2263   asymbol **syms = NULL;
2264   long syms_max = 0;
2265   bfd_boolean ret;
2266   bfd_size_type amt;
2267
2268   /* Dunno if this is the best place for this info...  */
2269   if (elength != 0)
2270     elength += sizeof (struct ar_hdr);
2271   elength += elength % 2;
2272
2273   amt = orl_max * sizeof (struct orl);
2274   map = (struct orl *) bfd_malloc (amt);
2275   if (map == NULL)
2276     goto error_return;
2277
2278   /* We put the symbol names on the arch objalloc, and then discard
2279      them when done.  */
2280   first_name = (char *) bfd_alloc (arch, 1);
2281   if (first_name == NULL)
2282     goto error_return;
2283
2284   /* Drop all the files called __.SYMDEF, we're going to make our own.  */
2285   while (arch->archive_head
2286          && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
2287     arch->archive_head = arch->archive_head->archive_next;
2288
2289   /* Map over each element.  */
2290   for (current = arch->archive_head;
2291        current != NULL;
2292        current = current->archive_next, elt_no++)
2293     {
2294       if (bfd_check_format (current, bfd_object)
2295           && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
2296         {
2297           long storage;
2298           long symcount;
2299           long src_count;
2300
2301           storage = bfd_get_symtab_upper_bound (current);
2302           if (storage < 0)
2303             goto error_return;
2304
2305           if (storage != 0)
2306             {
2307               if (storage > syms_max)
2308                 {
2309                   if (syms_max > 0)
2310                     free (syms);
2311                   syms_max = storage;
2312                   syms = (asymbol **) bfd_malloc (syms_max);
2313                   if (syms == NULL)
2314                     goto error_return;
2315                 }
2316               symcount = bfd_canonicalize_symtab (current, syms);
2317               if (symcount < 0)
2318                 goto error_return;
2319
2320               /* Now map over all the symbols, picking out the ones we
2321                  want.  */
2322               for (src_count = 0; src_count < symcount; src_count++)
2323                 {
2324                   flagword flags = (syms[src_count])->flags;
2325                   asection *sec = syms[src_count]->section;
2326
2327                   if (((flags & (BSF_GLOBAL
2328                                  | BSF_WEAK
2329                                  | BSF_INDIRECT
2330                                  | BSF_GNU_UNIQUE)) != 0
2331                        || bfd_is_com_section (sec))
2332                       && ! bfd_is_und_section (sec))
2333                     {
2334                       bfd_size_type namelen;
2335                       struct orl *new_map;
2336
2337                       /* This symbol will go into the archive header.  */
2338                       if (orl_count == orl_max)
2339                         {
2340                           orl_max *= 2;
2341                           amt = orl_max * sizeof (struct orl);
2342                           new_map = (struct orl *) bfd_realloc (map, amt);
2343                           if (new_map == NULL)
2344                             goto error_return;
2345
2346                           map = new_map;
2347                         }
2348
2349                       namelen = strlen (syms[src_count]->name);
2350                       amt = sizeof (char *);
2351                       map[orl_count].name = (char **) bfd_alloc (arch, amt);
2352                       if (map[orl_count].name == NULL)
2353                         goto error_return;
2354                       *(map[orl_count].name) = (char *) bfd_alloc (arch,
2355                                                                    namelen + 1);
2356                       if (*(map[orl_count].name) == NULL)
2357                         goto error_return;
2358                       strcpy (*(map[orl_count].name), syms[src_count]->name);
2359                       map[orl_count].u.abfd = current;
2360                       map[orl_count].namidx = stridx;
2361
2362                       stridx += namelen + 1;
2363                       ++orl_count;
2364                     }
2365                 }
2366             }
2367
2368           /* Now ask the BFD to free up any cached information, so we
2369              don't fill all of memory with symbol tables.  */
2370           if (! bfd_free_cached_info (current))
2371             goto error_return;
2372         }
2373     }
2374
2375   /* OK, now we have collected all the data, let's write them out.  */
2376   ret = BFD_SEND (arch, write_armap,
2377                   (arch, elength, map, orl_count, stridx));
2378
2379   if (syms_max > 0)
2380     free (syms);
2381   if (map != NULL)
2382     free (map);
2383   if (first_name != NULL)
2384     bfd_release (arch, first_name);
2385
2386   return ret;
2387
2388  error_return:
2389   if (syms_max > 0)
2390     free (syms);
2391   if (map != NULL)
2392     free (map);
2393   if (first_name != NULL)
2394     bfd_release (arch, first_name);
2395
2396   return FALSE;
2397 }
2398
2399 bfd_boolean
2400 bsd_write_armap (bfd *arch,
2401                  unsigned int elength,
2402                  struct orl *map,
2403                  unsigned int orl_count,
2404                  int stridx)
2405 {
2406   int padit = stridx & 1;
2407   unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
2408   unsigned int stringsize = stridx + padit;
2409   /* Include 8 bytes to store ranlibsize and stringsize in output.  */
2410   unsigned int mapsize = ranlibsize + stringsize + 8;
2411   file_ptr firstreal;
2412   bfd *current = arch->archive_head;
2413   bfd *last_elt = current;      /* Last element arch seen.  */
2414   bfd_byte temp[4];
2415   unsigned int count;
2416   struct ar_hdr hdr;
2417   long uid, gid;
2418   file_ptr max_first_real = 1;
2419
2420   max_first_real <<= 31;
2421
2422   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2423
2424   /* If deterministic, we use 0 as the timestamp in the map.
2425      Some linkers may require that the archive filesystem modification
2426      time is less than (or near to) the archive map timestamp.  Those
2427      linkers should not be used with deterministic mode.  (GNU ld and
2428      Gold do not have this restriction.)  */
2429   bfd_ardata (arch)->armap_timestamp = 0;
2430   uid = 0;
2431   gid = 0;
2432   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
2433     {
2434       struct stat statbuf;
2435
2436       if (stat (arch->filename, &statbuf) == 0)
2437         bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
2438                                               + ARMAP_TIME_OFFSET);
2439       uid = getuid();
2440       gid = getgid();
2441     }
2442
2443   memset (&hdr, ' ', sizeof (struct ar_hdr));
2444   memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG));
2445   bfd_ardata (arch)->armap_datepos = (SARMAG
2446                                       + offsetof (struct ar_hdr, ar_date[0]));
2447   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2448                     bfd_ardata (arch)->armap_timestamp);
2449   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
2450   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
2451   if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2452     return FALSE;
2453   memcpy (hdr.ar_fmag, ARFMAG, 2);
2454   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2455       != sizeof (struct ar_hdr))
2456     return FALSE;
2457   H_PUT_32 (arch, ranlibsize, temp);
2458   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2459     return FALSE;
2460
2461   for (count = 0; count < orl_count; count++)
2462     {
2463       bfd_byte buf[BSD_SYMDEF_SIZE];
2464
2465       if (map[count].u.abfd != last_elt)
2466         {
2467           do
2468             {
2469               struct areltdata *ared = arch_eltdata (current);
2470
2471               firstreal += (ared->parsed_size + ared->extra_size
2472                             + sizeof (struct ar_hdr));
2473               firstreal += firstreal % 2;
2474               current = current->archive_next;
2475             }
2476           while (current != map[count].u.abfd);
2477         }
2478
2479       /* The archive file format only has 4 bytes to store the offset
2480          of the member.  Check to make sure that firstreal has not grown
2481          too big.  */
2482       if (firstreal >= max_first_real)
2483         {
2484           bfd_set_error (bfd_error_file_truncated);
2485           return FALSE;
2486         }
2487       
2488       last_elt = current;
2489       H_PUT_32 (arch, map[count].namidx, buf);
2490       H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2491       if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch)
2492           != BSD_SYMDEF_SIZE)
2493         return FALSE;
2494     }
2495
2496   /* Now write the strings themselves.  */
2497   H_PUT_32 (arch, stringsize, temp);
2498   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2499     return FALSE;
2500   for (count = 0; count < orl_count; count++)
2501     {
2502       size_t len = strlen (*map[count].name) + 1;
2503
2504       if (bfd_bwrite (*map[count].name, len, arch) != len)
2505         return FALSE;
2506     }
2507
2508   /* The spec sez this should be a newline.  But in order to be
2509      bug-compatible for sun's ar we use a null.  */
2510   if (padit)
2511     {
2512       if (bfd_bwrite ("", 1, arch) != 1)
2513         return FALSE;
2514     }
2515
2516   return TRUE;
2517 }
2518
2519 /* At the end of archive file handling, update the timestamp in the
2520    file, so the linker will accept it.
2521
2522    Return TRUE if the timestamp was OK, or an unusual problem happened.
2523    Return FALSE if we updated the timestamp.  */
2524
2525 bfd_boolean
2526 _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
2527 {
2528   struct stat archstat;
2529   struct ar_hdr hdr;
2530
2531   /* If creating deterministic archives, just leave the timestamp as-is.  */
2532   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2533     return TRUE;
2534
2535   /* Flush writes, get last-write timestamp from file, and compare it
2536      to the timestamp IN the file.  */
2537   bfd_flush (arch);
2538   if (bfd_stat (arch, &archstat) == -1)
2539     {
2540       bfd_perror (_("Reading archive file mod timestamp"));
2541
2542       /* Can't read mod time for some reason.  */
2543       return TRUE;
2544     }
2545   if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
2546     /* OK by the linker's rules.  */
2547     return TRUE;
2548
2549   /* Update the timestamp.  */
2550   bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2551
2552   /* Prepare an ASCII version suitable for writing.  */
2553   memset (hdr.ar_date, ' ', sizeof (hdr.ar_date));
2554   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2555                     bfd_ardata (arch)->armap_timestamp);
2556
2557   /* Write it into the file.  */
2558   bfd_ardata (arch)->armap_datepos = (SARMAG
2559                                       + offsetof (struct ar_hdr, ar_date[0]));
2560   if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2561       || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch)
2562           != sizeof (hdr.ar_date)))
2563     {
2564       bfd_perror (_("Writing updated armap timestamp"));
2565
2566       /* Some error while writing.  */
2567       return TRUE;
2568     }
2569
2570   /* We updated the timestamp successfully.  */
2571   return FALSE;
2572 }
2573 \f
2574 /* A coff armap looks like :
2575    lARMAG
2576    struct ar_hdr with name = '/'
2577    number of symbols
2578    offset of file for symbol 0
2579    offset of file for symbol 1
2580
2581    offset of file for symbol n-1
2582    symbol name 0
2583    symbol name 1
2584
2585    symbol name n-1  */
2586
2587 bfd_boolean
2588 coff_write_armap (bfd *arch,
2589                   unsigned int elength,
2590                   struct orl *map,
2591                   unsigned int symbol_count,
2592                   int stridx)
2593 {
2594   /* The size of the ranlib is the number of exported symbols in the
2595      archive * the number of bytes in an int, + an int for the count.  */
2596   unsigned int ranlibsize = (symbol_count * 4) + 4;
2597   unsigned int stringsize = stridx;
2598   unsigned int mapsize = stringsize + ranlibsize;
2599   file_ptr archive_member_file_ptr;
2600   bfd *current = arch->archive_head;
2601   unsigned int count;
2602   struct ar_hdr hdr;
2603   int padit = mapsize & 1;
2604
2605   if (padit)
2606     mapsize++;
2607
2608   /* Work out where the first object file will go in the archive.  */
2609   archive_member_file_ptr = (mapsize
2610                              + elength
2611                              + sizeof (struct ar_hdr)
2612                              + SARMAG);
2613
2614   memset (&hdr, ' ', sizeof (struct ar_hdr));
2615   hdr.ar_name[0] = '/';
2616   if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2617     return FALSE;
2618   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2619                     ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
2620                      ? time (NULL) : 0));
2621   /* This, at least, is what Intel coff sets the values to.  */
2622   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0);
2623   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0);
2624   _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0);
2625   memcpy (hdr.ar_fmag, ARFMAG, 2);
2626
2627   /* Write the ar header for this item and the number of symbols.  */
2628   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2629       != sizeof (struct ar_hdr))
2630     return FALSE;
2631
2632   if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2633     return FALSE;
2634
2635   /* Two passes, first write the file offsets for each symbol -
2636      remembering that each offset is on a two byte boundary.  */
2637
2638   /* Write out the file offset for the file associated with each
2639      symbol, and remember to keep the offsets padded out.  */
2640
2641   current = arch->archive_head;
2642   count = 0;
2643   while (current != NULL && count < symbol_count)
2644     {
2645       /* For each symbol which is used defined in this object, write
2646          out the object file's address in the archive.  */
2647
2648       while (count < symbol_count && map[count].u.abfd == current)
2649         {
2650           unsigned int offset = (unsigned int) archive_member_file_ptr;
2651
2652           /* Catch an attempt to grow an archive past its 4Gb limit.  */
2653           if (archive_member_file_ptr != (file_ptr) offset)
2654             {
2655               bfd_set_error (bfd_error_file_truncated);
2656               return FALSE;
2657             }
2658           if (!bfd_write_bigendian_4byte_int (arch, offset))
2659             return FALSE;
2660           count++;
2661         }
2662       archive_member_file_ptr += sizeof (struct ar_hdr);
2663       if (! bfd_is_thin_archive (arch))
2664         {
2665           /* Add size of this archive entry.  */
2666           archive_member_file_ptr += arelt_size (current);
2667           /* Remember about the even alignment.  */
2668           archive_member_file_ptr += archive_member_file_ptr % 2;
2669         }
2670       current = current->archive_next;
2671     }
2672
2673   /* Now write the strings themselves.  */
2674   for (count = 0; count < symbol_count; count++)
2675     {
2676       size_t len = strlen (*map[count].name) + 1;
2677
2678       if (bfd_bwrite (*map[count].name, len, arch) != len)
2679         return FALSE;
2680     }
2681
2682   /* The spec sez this should be a newline.  But in order to be
2683      bug-compatible for arc960 we use a null.  */
2684   if (padit)
2685     {
2686       if (bfd_bwrite ("", 1, arch) != 1)
2687         return FALSE;
2688     }
2689
2690   return TRUE;
2691 }
2692
2693 static int
2694 archive_close_worker (void **slot, void *inf ATTRIBUTE_UNUSED)
2695 {
2696   struct ar_cache *ent = (struct ar_cache *) *slot;
2697
2698   bfd_close_all_done (ent->arbfd);
2699   return 1;
2700 }
2701
2702 bfd_boolean
2703 _bfd_archive_close_and_cleanup (bfd *abfd)
2704 {
2705   if (bfd_read_p (abfd) && abfd->format == bfd_archive)
2706     {
2707       bfd *nbfd;
2708       bfd *next;
2709       htab_t htab;
2710
2711       /* Close nested archives (if this bfd is a thin archive).  */
2712       for (nbfd = abfd->nested_archives; nbfd; nbfd = next)
2713         {
2714           next = nbfd->archive_next;
2715           bfd_close (nbfd);
2716         }
2717
2718       htab = bfd_ardata (abfd)->cache;
2719       if (htab)
2720         {
2721           htab_traverse_noresize (htab, archive_close_worker, NULL);
2722           htab_delete (htab);
2723           bfd_ardata (abfd)->cache = NULL;
2724         }
2725     }
2726   else if (arch_eltdata (abfd) != NULL)
2727     {
2728       struct areltdata *ared = arch_eltdata (abfd);
2729       htab_t htab = (htab_t) ared->parent_cache;
2730
2731       if (htab)
2732         {
2733           struct ar_cache ent;
2734           void **slot;
2735
2736           ent.ptr = ared->key;
2737           slot = htab_find_slot (htab, &ent, NO_INSERT);
2738           if (slot != NULL)
2739             {
2740               BFD_ASSERT (((struct ar_cache *) *slot)->arbfd == abfd);
2741               htab_clear_slot (htab, slot);
2742             }
2743         }
2744     }
2745   return TRUE;
2746 }