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