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