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