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