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