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