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