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