* archive.c (bfd_generic_archive_p): Check the first object file
[external/binutils.git] / bfd / archive.c
1 /* BFD back-end for archive files (libraries).
2    Copyright 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
3    Written by Cygnus Support.  Mostly Gumby Henkel-Wallace's fault.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /*
22 @setfilename archive-info
23 SECTION
24         Archives
25
26 DESCRIPTION
27         An archive (or library) is just another BFD.  It has a symbol
28         table, although there's not much a user program will do with it.
29
30         The big difference between an archive BFD and an ordinary BFD
31         is that the archive doesn't have sections.  Instead it has a
32         chain of BFDs that are considered its contents.  These BFDs can
33         be manipulated like any other.  The BFDs contained in an
34         archive opened for reading will all be opened for reading.  You
35         may put either input or output BFDs into an archive opened for
36         output; they will be handled correctly when the archive is closed.
37
38         Use <<bfd_openr_next_archived_file>> to step through
39         the contents of an archive opened for input.  You don't
40         have to read the entire archive if you don't want
41         to!  Read it until you find what you want.
42
43         Archive contents of output BFDs are chained through the
44         <<next>> pointer in a BFD.  The first one is findable through
45         the <<archive_head>> slot of the archive.  Set it with
46         <<bfd_set_archive_head>> (q.v.).  A given BFD may be in only one
47         open output archive at a time.
48
49         As expected, the BFD archive code is more general than the
50         archive code of any given environment.  BFD archives may
51         contain files of different formats (e.g., a.out and coff) and
52         even different architectures.  You may even place archives
53         recursively into archives!
54
55         This can cause unexpected confusion, since some archive
56         formats are more expressive than others.  For instance, Intel
57         COFF archives can preserve long filenames; SunOS a.out archives
58         cannot.  If you move a file from the first to the second
59         format and back again, the filename may be truncated.
60         Likewise, different a.out environments have different
61         conventions as to how they truncate filenames, whether they
62         preserve directory names in filenames, etc.  When
63         interoperating with native tools, be sure your files are
64         homogeneous.
65
66         Beware: most of these formats do not react well to the
67         presence of spaces in filenames.  We do the best we can, but
68         can't always handle this case due to restrictions in the format of
69         archives.  Many Unix utilities are braindead in regards to
70         spaces and such in filenames anyway, so this shouldn't be much
71         of a restriction.
72
73         Archives are supported in BFD in <<archive.c>>.
74
75 */
76
77 /* Assumes:
78    o - all archive elements start on an even boundary, newline padded;
79    o - all arch headers are char *;
80    o - all arch headers are the same size (across architectures).
81 */
82
83 /* Some formats provide a way to cram a long filename into the short
84    (16 chars) space provided by a BSD archive.  The trick is: make a
85    special "file" in the front of the archive, sort of like the SYMDEF
86    entry.  If the filename is too long to fit, put it in the extended
87    name table, and use its index as the filename.  To prevent
88    confusion prepend the index with a space.  This means you can't
89    have filenames that start with a space, but then again, many Unix
90    utilities can't handle that anyway.
91
92    This scheme unfortunately requires that you stand on your head in
93    order to write an archive since you need to put a magic file at the
94    front, and need to touch every entry to do so.  C'est la vie.
95
96    We support two variants of this idea:
97    The SVR4 format (extended name table is named "//"),
98    and an extended pseudo-BSD variant (extended name table is named
99    "ARFILENAMES/").  The origin of the latter format is uncertain.
100
101    BSD 4.4 uses a third scheme:  It writes a long filename
102    directly after the header.  This allows 'ar q' to work.
103    We currently can read BSD 4.4 archives, but not write them.
104 */
105
106 /* Summary of archive member names:
107
108  Symbol table (must be first):
109  "__.SYMDEF       " - Symbol table, Berkeley style, produced by ranlib.
110  "/               " - Symbol table, system 5 style.
111
112  Long name table (must be before regular file members):
113  "//              " - Long name table, System 5 R4 style.
114  "ARFILENAMES/    " - Long name table, non-standard extended BSD (not BSD 4.4).
115
116  Regular file members with short names:
117  "filename.o/     " - Regular file, System 5 style (embedded spaces ok).
118  "filename.o      " - Regular file, Berkeley style (no embedded spaces).
119
120  Regular files with long names (or embedded spaces, for BSD variants):
121  "/18             " - SVR4 style, name at offset 18 in name table.
122  "#1/23           " - Long name (or embedded paces) 23 characters long,
123                       BSD 4.4 style, full name follows header.
124                       Implemented for reading, not writing.
125  " 18             " - Long name 18 characters long, extended pseudo-BSD.
126  */
127
128 #include "bfd.h"
129 #include "sysdep.h"
130 #include "libbfd.h"
131 #include "aout/ar.h"
132 #include "aout/ranlib.h"
133 #include <errno.h>
134 #include <string.h>             /* For memchr, strrchr and friends */
135 #include <ctype.h>
136
137 #ifndef errno
138 extern int errno;
139 #endif
140
141 #ifdef GNU960
142 #define BFD_GNU960_ARMAG(abfd)  (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
143 #endif
144
145 /* Can't define this in hosts/foo.h, because (e.g. in gprof) the hosts file
146    is included, then obstack.h, which thinks if offsetof is defined, it
147    doesn't need to include stddef.h.  */
148 /* Define offsetof for those systems which lack it */
149
150 #if !defined (offsetof)
151 #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
152 #endif
153
154 /* We keep a cache of archive filepointers to archive elements to
155    speed up searching the archive by filepos.  We only add an entry to
156    the cache when we actually read one.  We also don't sort the cache;
157    it's generally short enough to search linearly.
158    Note that the pointers here point to the front of the ar_hdr, not
159    to the front of the contents!
160 */
161 struct ar_cache
162 {
163   file_ptr ptr;
164   bfd *arelt;
165   struct ar_cache *next;
166 };
167
168 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
169 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
170
171 #define arch_eltdata(bfd) ((struct areltdata *)((bfd)->arelt_data))
172 #define arch_hdr(bfd) ((struct ar_hdr *)arch_eltdata(bfd)->arch_header)
173
174 static char *get_extended_arelt_filename PARAMS ((bfd *arch,
175                                                   const char *name));
176 static boolean do_slurp_bsd_armap PARAMS ((bfd *abfd));
177 static boolean do_slurp_coff_armap PARAMS ((bfd *abfd));
178 static const char *normalize PARAMS ((bfd *, const char *file));
179 static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd,
180                                                              const char *));
181 \f
182 boolean
183 _bfd_generic_mkarchive (abfd)
184      bfd *abfd;
185 {
186   abfd->tdata.aout_ar_data = ((struct artdata *)
187                               bfd_zalloc (abfd, sizeof (struct artdata)));
188
189   if (bfd_ardata (abfd) == NULL)
190     {
191       bfd_set_error (bfd_error_no_memory);
192       return false;
193     }
194
195   bfd_ardata (abfd)->cache = NULL;
196   bfd_ardata (abfd)->archive_head = NULL;
197   bfd_ardata (abfd)->symdefs = NULL;
198   bfd_ardata (abfd)->extended_names = NULL;
199   bfd_ardata (abfd)->tdata = NULL;
200
201   return true;
202 }
203
204 /*
205 FUNCTION
206         bfd_get_next_mapent
207
208 SYNOPSIS
209         symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym);
210
211 DESCRIPTION
212         Step through archive @var{abfd}'s symbol table (if it
213         has one).  Successively update @var{sym} with the next symbol's
214         information, returning that symbol's (internal) index into the
215         symbol table.
216
217         Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
218         the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
219         got the last one.
220
221         A <<carsym>> is a canonical archive symbol.  The only
222         user-visible element is its name, a null-terminated string.
223 */
224
225 symindex
226 bfd_get_next_mapent (abfd, prev, entry)
227      bfd *abfd;
228      symindex prev;
229      carsym **entry;
230 {
231   if (!bfd_has_map (abfd))
232     {
233       bfd_set_error (bfd_error_invalid_operation);
234       return BFD_NO_MORE_SYMBOLS;
235     }
236
237   if (prev == BFD_NO_MORE_SYMBOLS)
238     prev = 0;
239   else
240     ++prev;
241   if (prev >= bfd_ardata (abfd)->symdef_count)
242     return BFD_NO_MORE_SYMBOLS;
243
244   *entry = (bfd_ardata (abfd)->symdefs + prev);
245   return prev;
246 }
247
248 /* To be called by backends only */
249
250 bfd *
251 _bfd_create_empty_archive_element_shell (obfd)
252      bfd *obfd;
253 {
254   bfd *nbfd;
255
256   nbfd = _bfd_new_bfd_contained_in (obfd);
257   if (nbfd == NULL)
258     {
259       bfd_set_error (bfd_error_no_memory);
260       return NULL;
261     }
262   return nbfd;
263 }
264
265 /*
266 FUNCTION
267         bfd_set_archive_head
268
269 SYNOPSIS
270         boolean bfd_set_archive_head(bfd *output, bfd *new_head);
271
272 DESCRIPTION
273         Set the head of the chain of
274         BFDs contained in the archive @var{output} to @var{new_head}.
275 */
276
277 boolean
278 bfd_set_archive_head (output_archive, new_head)
279      bfd *output_archive;
280      bfd *new_head;
281 {
282
283   output_archive->archive_head = new_head;
284   return true;
285 }
286
287 bfd *
288 _bfd_look_for_bfd_in_cache (arch_bfd, filepos)
289      bfd *arch_bfd;
290      file_ptr filepos;
291 {
292   struct ar_cache *current;
293
294   for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
295        current = current->next)
296     if (current->ptr == filepos)
297       return current->arelt;
298
299   return NULL;
300 }
301
302 /* Kind of stupid to call cons for each one, but we don't do too many */
303 boolean
304 _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt)
305      bfd *arch_bfd, *new_elt;
306      file_ptr filepos;
307 {
308   struct ar_cache *new_cache = ((struct ar_cache *)
309                                 bfd_zalloc (arch_bfd,
310                                             sizeof (struct ar_cache)));
311
312   if (new_cache == NULL)
313     {
314       bfd_set_error (bfd_error_no_memory);
315       return false;
316     }
317
318   new_cache->ptr = filepos;
319   new_cache->arelt = new_elt;
320   new_cache->next = (struct ar_cache *) NULL;
321   if (bfd_ardata (arch_bfd)->cache == NULL)
322     bfd_ardata (arch_bfd)->cache = new_cache;
323   else
324     {
325       struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
326
327       while (current->next != NULL)
328         current = current->next;
329       current->next = new_cache;
330     }
331
332   return true;
333 }
334 \f
335 /* The name begins with space.  Hence the rest of the name is an index into
336    the string table. */
337
338 static char *
339 get_extended_arelt_filename (arch, name)
340      bfd *arch;
341      const char *name;
342 {
343   unsigned long index = 0;
344
345   /* Should extract string so that I can guarantee not to overflow into
346      the next region, but I'm too lazy. */
347   errno = 0;
348   /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
349   index = strtol (name + 1, NULL, 10);
350   if (errno != 0)
351     {
352       bfd_set_error (bfd_error_malformed_archive);
353       return NULL;
354     }
355
356   return bfd_ardata (arch)->extended_names + index;
357 }
358
359 /* This functions reads an arch header and returns an areltdata pointer, or
360    NULL on error.
361
362    Presumes the file pointer is already in the right place (ie pointing
363    to the ar_hdr in the file).   Moves the file pointer; on success it
364    should be pointing to the front of the file contents; on failure it
365    could have been moved arbitrarily.
366 */
367
368 PTR
369 _bfd_generic_read_ar_hdr (abfd)
370      bfd *abfd;
371 {
372 #ifndef errno
373   extern int errno;
374 #endif
375
376   struct ar_hdr hdr;
377   char *hdrp = (char *) &hdr;
378   unsigned int parsed_size;
379   struct areltdata *ared;
380   char *filename = NULL;
381   unsigned int namelen = 0;
382   unsigned int allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
383   char *allocptr = 0;
384
385   if (bfd_read ((PTR) hdrp, 1, sizeof (struct ar_hdr), abfd)
386       != sizeof (struct ar_hdr))
387     {
388       if (bfd_get_error () != bfd_error_system_call)
389         bfd_set_error (bfd_error_no_more_archived_files);
390       return NULL;
391     }
392   if (strncmp (hdr.ar_fmag, ARFMAG, 2))
393     {
394       bfd_set_error (bfd_error_malformed_archive);
395       return NULL;
396     }
397
398   errno = 0;
399   parsed_size = strtol (hdr.ar_size, NULL, 10);
400   if (errno != 0)
401     {
402       bfd_set_error (bfd_error_malformed_archive);
403       return NULL;
404     }
405
406   /* Extract the filename from the archive - there are two ways to
407      specify an extendend name table, either the first char of the
408      name is a space, or it's a slash.  */
409   if ((hdr.ar_name[0] == '/'
410        || (hdr.ar_name[0] == ' '
411            && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
412       && bfd_ardata (abfd)->extended_names != NULL)
413     {
414       filename = get_extended_arelt_filename (abfd, hdr.ar_name);
415       if (filename == NULL)
416         {
417           bfd_set_error (bfd_error_malformed_archive);
418           return NULL;
419         }
420     }
421   /* BSD4.4-style long filename.
422      Only implemented for reading, so far! */
423   else if (hdr.ar_name[0] == '#' && hdr.ar_name[1] == '1'
424            && hdr.ar_name[2] == '/' && isdigit (hdr.ar_name[3]))
425     {
426       /* BSD-4.4 extended name */
427       namelen = atoi (&hdr.ar_name[3]);
428       allocsize += namelen + 1;
429       parsed_size -= namelen;
430
431       allocptr = bfd_zalloc (abfd, allocsize);
432       if (allocptr == NULL)
433         {
434           bfd_set_error (bfd_error_no_memory);
435           return NULL;
436         }
437       filename = (allocptr
438                   + sizeof (struct areltdata)
439                   + sizeof (struct ar_hdr));
440       if (bfd_read (filename, 1, namelen, abfd) != namelen)
441         {
442           if (bfd_get_error () != bfd_error_system_call)
443             bfd_set_error (bfd_error_no_more_archived_files);
444           return NULL;
445         }
446       filename[namelen] = '\0';
447     }
448   else
449     {
450       /* We judge the end of the name by looking for '/' or ' '.
451          Note:  The SYSV format (terminated by '/') allows embedded
452          spaces, so only look for ' ' if we don't find '/'. */
453
454       namelen = 0;
455       while (hdr.ar_name[namelen] != '\0' &&
456              hdr.ar_name[namelen] != '/')
457         {
458           namelen++;
459           if (namelen == (unsigned) ar_maxnamelen (abfd))
460             {
461               namelen = 0;
462               while (hdr.ar_name[namelen] != ' '
463                      && namelen < (unsigned) ar_maxnamelen (abfd))
464                 namelen++;
465               break;
466             }
467         }
468
469       allocsize += namelen + 1;
470     }
471
472   if (!allocptr)
473     {
474       allocptr = bfd_zalloc (abfd, allocsize);
475       if (allocptr == NULL)
476         {
477           bfd_set_error (bfd_error_no_memory);
478           return NULL;
479         }
480     }
481
482   ared = (struct areltdata *) allocptr;
483
484   ared->arch_header = allocptr + sizeof (struct areltdata);
485   memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr));
486   ared->parsed_size = parsed_size;
487
488   if (filename != NULL)
489     ared->filename = filename;
490   else
491     {
492       ared->filename = allocptr + (sizeof (struct areltdata) +
493                                    sizeof (struct ar_hdr));
494       if (namelen)
495         memcpy (ared->filename, hdr.ar_name, namelen);
496       ared->filename[namelen] = '\0';
497     }
498
499   return (PTR) ared;
500 }
501 \f
502 /* This is an internal function; it's mainly used when indexing
503    through the archive symbol table, but also used to get the next
504    element, since it handles the bookkeeping so nicely for us.  */
505
506 bfd *
507 _bfd_get_elt_at_filepos (archive, filepos)
508      bfd *archive;
509      file_ptr filepos;
510 {
511   struct areltdata *new_areldata;
512   bfd *n_nfd;
513
514   n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
515   if (n_nfd)
516     return n_nfd;
517
518   if (0 > bfd_seek (archive, filepos, SEEK_SET))
519     return NULL;
520
521   if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
522     return NULL;
523
524   n_nfd = _bfd_create_empty_archive_element_shell (archive);
525   if (n_nfd == NULL)
526     {
527       bfd_release (archive, (PTR) new_areldata);
528       return NULL;
529     }
530
531   n_nfd->origin = bfd_tell (archive);
532   n_nfd->arelt_data = (PTR) new_areldata;
533   n_nfd->filename = new_areldata->filename;
534
535   if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
536     return n_nfd;
537
538   /* huh? */
539   bfd_release (archive, (PTR) n_nfd);
540   bfd_release (archive, (PTR) new_areldata);
541   return NULL;
542 }
543
544 /*
545 FUNCTION
546         bfd_get_elt_at_index
547
548 SYNOPSIS
549         bfd *bfd_get_elt_at_index(bfd *archive, int index);
550
551 DESCRIPTION
552         Return the BFD which is referenced by the symbol in @var{archive}
553         indexed by @var{index}.  @var{index} should have been returned by
554         <<bfd_get_next_mapent>> (q.v.).
555
556 */
557 bfd *
558 bfd_get_elt_at_index (abfd, index)
559      bfd *abfd;
560      int index;
561 {
562   carsym *entry;
563
564   entry = bfd_ardata (abfd)->symdefs + index;
565   return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
566 }
567
568 /*
569 FUNCTION
570         bfd_openr_next_archived_file
571
572 SYNOPSIS
573         bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous);
574
575 DESCRIPTION
576         Provided a BFD, @var{archive}, containing an archive and NULL, open
577         an input BFD on the first contained element and returns that.
578         Subsequent calls should pass
579         the archive and the previous return value to return a created
580         BFD to the next contained element. NULL is returned when there
581         are no more.
582
583 */
584
585 bfd *
586 bfd_openr_next_archived_file (archive, last_file)
587      bfd *archive;
588      bfd *last_file;
589 {
590   if ((bfd_get_format (archive) != bfd_archive) ||
591       (archive->direction == write_direction))
592     {
593       bfd_set_error (bfd_error_invalid_operation);
594       return NULL;
595     }
596
597   return BFD_SEND (archive,
598                    openr_next_archived_file,
599                    (archive,
600                     last_file));
601 }
602
603 bfd *
604 bfd_generic_openr_next_archived_file (archive, last_file)
605      bfd *archive;
606      bfd *last_file;
607 {
608   file_ptr filestart;
609
610   if (!last_file)
611     filestart = bfd_ardata (archive)->first_file_filepos;
612   else
613     {
614       unsigned int size = arelt_size (last_file);
615       /* Pad to an even boundary...
616          Note that last_file->origin can be odd in the case of
617          BSD-4.4-style element with a long odd size. */
618       filestart = last_file->origin + size;
619       filestart += filestart % 2;
620     }
621
622   return _bfd_get_elt_at_filepos (archive, filestart);
623 }
624
625
626 const bfd_target *
627 bfd_generic_archive_p (abfd)
628      bfd *abfd;
629 {
630   char armag[SARMAG + 1];
631
632   if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG)
633     {
634       if (bfd_get_error () != bfd_error_system_call)
635         bfd_set_error (bfd_error_wrong_format);
636       return NULL;
637     }
638
639 #ifdef GNU960
640   if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0)
641     return 0;
642 #else
643   if (strncmp (armag, ARMAG, SARMAG) != 0 &&
644       strncmp (armag, ARMAGB, SARMAG) != 0)
645     return 0;
646 #endif
647
648   /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
649      involves a cast, we can't do it as the left operand of assignment. */
650   abfd->tdata.aout_ar_data = ((struct artdata *)
651                               bfd_zalloc (abfd, sizeof (struct artdata)));
652
653   if (bfd_ardata (abfd) == NULL)
654     {
655       bfd_set_error (bfd_error_no_memory);
656       return NULL;
657     }
658
659   bfd_ardata (abfd)->first_file_filepos = SARMAG;
660   bfd_ardata (abfd)->cache = NULL;
661   bfd_ardata (abfd)->archive_head = NULL;
662   bfd_ardata (abfd)->symdefs = NULL;
663   bfd_ardata (abfd)->extended_names = NULL;
664   bfd_ardata (abfd)->tdata = NULL;
665
666   if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd)))
667     {
668       bfd_release (abfd, bfd_ardata (abfd));
669       abfd->tdata.aout_ar_data = NULL;
670       return NULL;
671     }
672
673   if (!BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
674     {
675       bfd_release (abfd, bfd_ardata (abfd));
676       abfd->tdata.aout_ar_data = NULL;
677       return NULL;
678     }
679
680   if (bfd_has_map (abfd))
681     {
682       bfd *first;
683
684       /* This archive has a map, so we may presume that the contents
685          are object files.  Make sure that the first file in the
686          archive can be recognized as an object file for this target.
687          If not, assume that this is the wrong format.
688
689          This is done because any normal format will recognize any
690          normal archive, regardless of the format of the object files.
691          We do accept an empty archive.  */
692
693       first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
694       if (first != NULL)
695         {
696           boolean fail;
697
698           first->target_defaulted = false;
699           fail = false;
700           if (! bfd_check_format (first, bfd_object))
701             fail = true;
702           else if (first->xvec != abfd->xvec)
703             {
704               bfd_set_error (bfd_error_wrong_format);
705               fail = true;
706             }
707           if (fail)
708             {
709               bfd_error_type err;
710
711               err = bfd_get_error ();
712               (void) bfd_close (first);
713               bfd_release (abfd, bfd_ardata (abfd));
714               abfd->tdata.aout_ar_data = NULL;
715               bfd_set_error (err);
716               return NULL;
717             }
718
719           /* We ought to close first here, but we can't, because we
720              have no way to remove it from the archive cache.  FIXME.  */
721         }
722     }
723
724   return abfd->xvec;
725 }
726
727 /* Some constants for a 32 bit BSD archive structure.  We do not
728    support 64 bit archives presently; so far as I know, none actually
729    exist.  Supporting them would require changing these constants, and
730    changing some bfd_h_get_32 to bfd_h_get_64.  */
731
732 /* The size of an external symdef structure.  */
733 #define BSD_SYMDEF_SIZE 8
734
735 /* The offset from the start of a symdef structure to the file offset.  */
736 #define BSD_SYMDEF_OFFSET_SIZE 4
737
738 /* The size of the symdef count.  */
739 #define BSD_SYMDEF_COUNT_SIZE 4
740
741 /* The size of the string count.  */
742 #define BSD_STRING_COUNT_SIZE 4
743
744 /* Returns false on error, true otherwise */
745
746 static boolean
747 do_slurp_bsd_armap (abfd)
748      bfd *abfd;
749 {
750   struct areltdata *mapdata;
751   unsigned int counter;
752   bfd_byte *raw_armap, *rbase;
753   struct artdata *ardata = bfd_ardata (abfd);
754   char *stringbase;
755   unsigned int parsed_size;
756   carsym *set;
757
758   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
759   if (mapdata == NULL)
760     return false;
761   parsed_size = mapdata->parsed_size;
762   bfd_release (abfd, (PTR) mapdata);    /* Don't need it any more. */
763
764   raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
765   if (raw_armap == (bfd_byte *) NULL)
766     {
767       bfd_set_error (bfd_error_no_memory);
768       return false;
769     }
770
771   if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
772     {
773       if (bfd_get_error () != bfd_error_system_call)
774         bfd_set_error (bfd_error_malformed_archive);
775     byebye:
776       bfd_release (abfd, (PTR) raw_armap);
777       return false;
778     }
779
780   ardata->symdef_count = bfd_h_get_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
781
782   if (ardata->symdef_count * BSD_SYMDEF_SIZE >
783       parsed_size - BSD_SYMDEF_COUNT_SIZE)
784     {
785       /* Probably we're using the wrong byte ordering.  */
786       bfd_set_error (bfd_error_wrong_format);
787       goto byebye;
788     }
789
790   ardata->cache = 0;
791   rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
792   stringbase = ((char *) rbase
793                 + ardata->symdef_count * BSD_SYMDEF_SIZE
794                 + BSD_STRING_COUNT_SIZE);
795   ardata->symdefs = (carsym *) bfd_alloc (abfd,
796                                           (ardata->symdef_count
797                                            * sizeof (carsym)));
798   if (!ardata->symdefs)
799     {
800       bfd_set_error (bfd_error_no_memory);
801       return false;
802     }
803
804   for (counter = 0, set = ardata->symdefs;
805        counter < ardata->symdef_count;
806        counter++, set++, rbase += BSD_SYMDEF_SIZE)
807     {
808       set->name = bfd_h_get_32 (abfd, rbase) + stringbase;
809       set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
810     }
811
812   ardata->first_file_filepos = bfd_tell (abfd);
813   /* Pad to an even boundary if you have to */
814   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
815   /* FIXME, we should provide some way to free raw_ardata when
816      we are done using the strings from it.  For now, it seems
817      to be allocated on an obstack anyway... */
818   bfd_has_map (abfd) = true;
819   return true;
820 }
821
822 /* Returns false on error, true otherwise */
823 static boolean
824 do_slurp_coff_armap (abfd)
825      bfd *abfd;
826 {
827   struct areltdata *mapdata;
828   int *raw_armap, *rawptr;
829   struct artdata *ardata = bfd_ardata (abfd);
830   char *stringbase;
831   unsigned int stringsize;
832   unsigned int parsed_size;
833   carsym *carsyms;
834   unsigned int nsymz;           /* Number of symbols in armap. */
835   bfd_vma (*swap) PARAMS ((const bfd_byte *));
836   char int_buf[sizeof (long)];
837   unsigned int carsym_size, ptrsize, i;
838
839   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
840   if (mapdata == NULL)
841     return false;
842   parsed_size = mapdata->parsed_size;
843   bfd_release (abfd, (PTR) mapdata);    /* Don't need it any more. */
844
845   if (bfd_read ((PTR) int_buf, 1, 4, abfd) != 4)
846     {
847       if (bfd_get_error () != bfd_error_system_call)
848         bfd_set_error (bfd_error_malformed_archive);
849       return false;
850     }
851   /* It seems that all numeric information in a coff archive is always
852      in big endian format, nomatter the host or target. */
853   swap = bfd_getb32;
854   nsymz = bfd_getb32 ((PTR) int_buf);
855   stringsize = parsed_size - (4 * nsymz) - 4;
856
857 #if 1
858   /* ... except that some archive formats are broken, and it may be our
859      fault - the i960 little endian coff sometimes has big and sometimes
860      little, because our tools changed.  Here's a horrible hack to clean
861      up the crap.  */
862
863   if (stringsize > 0xfffff)
864     {
865       /* This looks dangerous, let's do it the other way around */
866       nsymz = bfd_getl32 ((PTR) int_buf);
867       stringsize = parsed_size - (4 * nsymz) - 4;
868       swap = bfd_getl32;
869     }
870 #endif
871
872   /* The coff armap must be read sequentially.  So we construct a
873      bsd-style one in core all at once, for simplicity. */
874
875   carsym_size = (nsymz * sizeof (carsym));
876   ptrsize = (4 * nsymz);
877
878   ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
879   if (ardata->symdefs == NULL)
880     {
881       bfd_set_error (bfd_error_no_memory);
882       return false;
883     }
884   carsyms = ardata->symdefs;
885   stringbase = ((char *) ardata->symdefs) + carsym_size;
886
887   /* Allocate and read in the raw offsets. */
888   raw_armap = (int *) bfd_alloc (abfd, ptrsize);
889   if (raw_armap == NULL)
890     {
891       bfd_set_error (bfd_error_no_memory);
892       goto release_symdefs;
893     }
894   if (bfd_read ((PTR) raw_armap, 1, ptrsize, abfd) != ptrsize
895       || bfd_read ((PTR) stringbase, 1, stringsize, abfd) != stringsize)
896     {
897       if (bfd_get_error () != bfd_error_system_call)
898         bfd_set_error (bfd_error_malformed_archive);
899       goto release_raw_armap;
900     }
901
902   /* OK, build the carsyms */
903   for (i = 0; i < nsymz; i++)
904     {
905       rawptr = raw_armap + i;
906       carsyms->file_offset = swap ((PTR) rawptr);
907       carsyms->name = stringbase;
908       stringbase += strlen (stringbase) + 1;
909       carsyms++;
910     }
911   *stringbase = 0;
912
913   ardata->symdef_count = nsymz;
914   ardata->first_file_filepos = bfd_tell (abfd);
915   /* Pad to an even boundary if you have to */
916   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
917
918
919   bfd_has_map (abfd) = true;
920   bfd_release (abfd, (PTR) raw_armap);
921
922
923   /* Check for a second archive header (as used by PE) */
924   {
925     struct areltdata *tmp;
926
927     bfd_seek (abfd,   ardata->first_file_filepos, SEEK_SET);
928     tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
929     if (tmp != NULL) 
930       {
931         if (tmp->arch_header[0] == '/'
932             && tmp->arch_header[1] == ' ') 
933           {
934             ardata->first_file_filepos +=
935               (tmp->parsed_size + sizeof(struct ar_hdr) + 1) & ~1;
936           }
937         bfd_release (abfd, tmp);
938       }
939   }
940
941   return true;
942
943 release_raw_armap:
944   bfd_release (abfd, (PTR) raw_armap);
945 release_symdefs:
946   bfd_release (abfd, (PTR) (ardata)->symdefs);
947   return false;
948 }
949
950 /* This routine can handle either coff-style or bsd-style armaps.
951    Returns false on error, true otherwise */
952
953 boolean
954 bfd_slurp_armap (abfd)
955      bfd *abfd;
956 {
957   char nextname[17];
958   int i = bfd_read ((PTR) nextname, 1, 16, abfd);
959
960   if (i == 0)
961     return true;
962   if (i != 16)
963     return false;
964
965   if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)
966     return false;
967
968   if (!strncmp (nextname, "__.SYMDEF       ", 16)
969       || !strncmp (nextname, "__.SYMDEF/      ", 16)) /* old Linux archives */
970     return do_slurp_bsd_armap (abfd);
971   else if (!strncmp (nextname, "/               ", 16))
972     return do_slurp_coff_armap (abfd);
973
974   bfd_has_map (abfd) = false;
975   return true;
976 }
977 \f
978 /* Returns false on error, true otherwise */
979 /* flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
980    header is in a slightly different order and the map name is '/'.
981    This flavour is used by hp300hpux. */
982
983 #define HPUX_SYMDEF_COUNT_SIZE 2
984
985 boolean
986 bfd_slurp_bsd_armap_f2 (abfd)
987      bfd *abfd;
988 {
989   struct areltdata *mapdata;
990   char nextname[17];
991   unsigned int counter;
992   bfd_byte *raw_armap, *rbase;
993   struct artdata *ardata = bfd_ardata (abfd);
994   char *stringbase;
995   unsigned int stringsize;
996   carsym *set;
997   int i = bfd_read ((PTR) nextname, 1, 16, abfd);
998
999   if (i == 0)
1000     return true;
1001   if (i != 16)
1002     return false;
1003
1004   /* The archive has at least 16 bytes in it */
1005   if (bfd_seek (abfd, -16L, SEEK_CUR) != 0)
1006     return false;
1007
1008   if (!strncmp (nextname, "__.SYMDEF       ", 16)
1009       || !strncmp (nextname, "__.SYMDEF/      ", 16)) /* old Linux archives */
1010     return do_slurp_bsd_armap (abfd);
1011
1012   if (strncmp (nextname, "/               ", 16))
1013     {
1014       bfd_has_map (abfd) = false;
1015       return true;
1016     }
1017
1018   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1019   if (mapdata == NULL)
1020     return false;
1021
1022   raw_armap = (bfd_byte *) bfd_zalloc (abfd, mapdata->parsed_size);
1023   if (raw_armap == NULL)
1024     {
1025       bfd_set_error (bfd_error_no_memory);
1026     byebye:
1027       bfd_release (abfd, (PTR) mapdata);
1028       return false;
1029     }
1030
1031   if (bfd_read ((PTR) raw_armap, 1, mapdata->parsed_size, abfd) !=
1032       mapdata->parsed_size)
1033     {
1034       if (bfd_get_error () != bfd_error_system_call)
1035         bfd_set_error (bfd_error_malformed_archive);
1036     byebyebye:
1037       bfd_release (abfd, (PTR) raw_armap);
1038       goto byebye;
1039     }
1040
1041   ardata->symdef_count = bfd_h_get_16 (abfd, (PTR) raw_armap);
1042
1043   if (ardata->symdef_count * BSD_SYMDEF_SIZE
1044       > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE)
1045     {
1046       /* Probably we're using the wrong byte ordering.  */
1047       bfd_set_error (bfd_error_wrong_format);
1048       goto byebyebye;
1049     }
1050
1051   ardata->cache = 0;
1052
1053   stringsize = bfd_h_get_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
1054   /* skip sym count and string sz */
1055   stringbase = ((char *) raw_armap
1056                 + HPUX_SYMDEF_COUNT_SIZE
1057                 + BSD_STRING_COUNT_SIZE);
1058   rbase = (bfd_byte *) stringbase + stringsize;
1059   ardata->symdefs = (carsym *) bfd_alloc (abfd,
1060                                           (ardata->symdef_count
1061                                            * BSD_SYMDEF_SIZE));
1062   if (!ardata->symdefs)
1063     {
1064       bfd_set_error (bfd_error_no_memory);
1065       return false;
1066     }
1067
1068   for (counter = 0, set = ardata->symdefs;
1069        counter < ardata->symdef_count;
1070        counter++, set++, rbase += BSD_SYMDEF_SIZE)
1071     {
1072       set->name = bfd_h_get_32 (abfd, rbase) + stringbase;
1073       set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1074     }
1075
1076   ardata->first_file_filepos = bfd_tell (abfd);
1077   /* Pad to an even boundary if you have to */
1078   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1079   /* FIXME, we should provide some way to free raw_ardata when
1080      we are done using the strings from it.  For now, it seems
1081      to be allocated on an obstack anyway... */
1082   bfd_has_map (abfd) = true;
1083   return true;
1084 }
1085 \f
1086 /** Extended name table.
1087
1088   Normally archives support only 14-character filenames.
1089
1090   Intel has extended the format: longer names are stored in a special
1091   element (the first in the archive, or second if there is an armap);
1092   the name in the ar_hdr is replaced by <space><index into filename
1093   element>.  Index is the P.R. of an int (decimal).  Data General have
1094   extended the format by using the prefix // for the special element */
1095
1096 /* Returns false on error, true otherwise */
1097 boolean
1098 _bfd_slurp_extended_name_table (abfd)
1099      bfd *abfd;
1100 {
1101   char nextname[17];
1102   struct areltdata *namedata;
1103
1104   /* FIXME:  Formatting sucks here, and in case of failure of BFD_READ,
1105      we probably don't want to return true.  */
1106   bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET);
1107   if (bfd_read ((PTR) nextname, 1, 16, abfd) == 16)
1108     {
1109       if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)
1110         return false;
1111
1112       if (strncmp (nextname, "ARFILENAMES/    ", 16) != 0 &&
1113           strncmp (nextname, "//              ", 16) != 0)
1114         {
1115           bfd_ardata (abfd)->extended_names = NULL;
1116           return true;
1117         }
1118
1119       namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1120       if (namedata == NULL)
1121         return false;
1122
1123       bfd_ardata (abfd)->extended_names =
1124         bfd_zalloc (abfd, namedata->parsed_size);
1125       if (bfd_ardata (abfd)->extended_names == NULL)
1126         {
1127           bfd_set_error (bfd_error_no_memory);
1128         byebye:
1129           bfd_release (abfd, (PTR) namedata);
1130           return false;
1131         }
1132
1133       if (bfd_read ((PTR) bfd_ardata (abfd)->extended_names, 1,
1134                     namedata->parsed_size, abfd) != namedata->parsed_size)
1135         {
1136           if (bfd_get_error () != bfd_error_system_call)
1137             bfd_set_error (bfd_error_malformed_archive);
1138           bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names));
1139           bfd_ardata (abfd)->extended_names = NULL;
1140           goto byebye;
1141         }
1142
1143       /* Since the archive is supposed to be printable if it contains
1144          text, the entries in the list are newline-padded, not null
1145          padded. In SVR4-style archives, the names also have a
1146          trailing '/'.  DOS/NT created archive often have \ in them
1147          We'll fix all problems here..  */
1148       {
1149         char *temp = bfd_ardata (abfd)->extended_names;
1150         char *limit = temp + namedata->parsed_size;
1151         for (; temp < limit; ++temp) {
1152           if (*temp == '\012')
1153             temp[temp[-1] == '/' ? -1 : 0] = '\0';
1154           if (*temp == '\\')
1155             *temp = '/';
1156         }
1157       }
1158
1159       /* Pad to an even boundary if you have to */
1160       bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1161       bfd_ardata (abfd)->first_file_filepos +=
1162         (bfd_ardata (abfd)->first_file_filepos) % 2;
1163
1164       /* FIXME, we can't release namedata here because it was allocated
1165          below extended_names on the obstack... */
1166       /* bfd_release (abfd, namedata); */
1167     }
1168   return true;
1169 }
1170
1171 #ifdef VMS
1172
1173 /* Return a copy of the stuff in the filename between any :]> and a
1174    semicolon */
1175 static const char *
1176 normalize (abfd, file)
1177      bfd *abfd;
1178      const char *file;
1179 {
1180   CONST char *first;
1181   CONST char *last;
1182   char *copy;
1183
1184   first = file + strlen (file) - 1;
1185   last = first + 1;
1186
1187   while (first != file)
1188     {
1189       if (*first == ';')
1190         last = first;
1191       if (*first == ':' || *first == ']' || *first == '>')
1192         {
1193           first++;
1194           break;
1195         }
1196       first--;
1197     }
1198
1199   copy = (char *) bfd_alloc (abfd, last - first + 1);
1200   if (copy == NULL)
1201     {
1202       bfd_set_error (bfd_error_no_memory);
1203       return NULL;
1204     }
1205
1206   memcpy (copy, first, last - first);
1207   copy[last - first] = 0;
1208
1209   return copy;
1210 }
1211
1212 #else
1213 static const char *
1214 normalize (abfd, file)
1215      bfd *abfd;
1216      const char *file;
1217 {
1218   const char *filename = strrchr (file, '/');
1219
1220   if (filename != (char *) NULL)
1221     filename++;
1222   else
1223     filename = file;
1224   return filename;
1225 }
1226 #endif
1227
1228 /* Build a BFD style extended name table.  */
1229
1230 boolean
1231 _bfd_archive_bsd_construct_extended_name_table (abfd, tabloc, tablen, name)
1232      bfd *abfd;
1233      char **tabloc;
1234      bfd_size_type *tablen;
1235      const char **name;
1236 {
1237   *name = "ARFILENAMES/";
1238   return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen);
1239 }
1240
1241 /* Build an SVR4 style extended name table.  */
1242
1243 boolean
1244 _bfd_archive_coff_construct_extended_name_table (abfd, tabloc, tablen, name)
1245      bfd *abfd;
1246      char **tabloc;
1247      bfd_size_type *tablen;
1248      const char **name;
1249 {
1250   *name = "//";
1251   return _bfd_construct_extended_name_table (abfd, true, tabloc, tablen);
1252 }
1253
1254 /* Follows archive_head and produces an extended name table if
1255    necessary.  Returns (in tabloc) a pointer to an extended name
1256    table, and in tablen the length of the table.  If it makes an entry
1257    it clobbers the filename so that the element may be written without
1258    further massage.  Returns true if it ran successfully, false if
1259    something went wrong.  A successful return may still involve a
1260    zero-length tablen!  */
1261
1262 boolean
1263 _bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen)
1264      bfd *abfd;
1265      boolean trailing_slash;
1266      char **tabloc;
1267      bfd_size_type *tablen;
1268 {
1269   unsigned int maxname = abfd->xvec->ar_max_namelen;
1270   unsigned int total_namelen = 0;
1271   bfd *current;
1272   char *strptr;
1273
1274   *tablen = 0;
1275
1276   /* Figure out how long the table should be */
1277   for (current = abfd->archive_head; current != NULL; current = current->next)
1278     {
1279       const char *normal;
1280       unsigned int thislen;
1281
1282       normal = normalize (current, current->filename);
1283       if (normal == NULL)
1284         return false;
1285
1286       thislen = strlen (normal);
1287
1288       if (thislen > maxname
1289           && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1290         thislen = maxname;
1291
1292       if (thislen > maxname)
1293         {
1294           /* Add one to leave room for \n.  */
1295           total_namelen += thislen + 1;
1296           if (trailing_slash)
1297             {
1298               /* Leave room for trailing slash.  */
1299               ++total_namelen;
1300             }
1301         }
1302       else
1303         {
1304           struct ar_hdr *hdr = arch_hdr (current);
1305           if (strncmp (normal, hdr->ar_name, thislen) != 0
1306               || (thislen < sizeof hdr->ar_name
1307                   && hdr->ar_name[thislen] != ar_padchar (current)))
1308             {
1309               /* Must have been using extended format even though it
1310                  didn't need to.  Fix it to use normal format.  */
1311               memcpy (hdr->ar_name, normal, thislen);
1312               if (thislen < maxname
1313                   || (thislen == maxname && thislen < sizeof hdr->ar_name))
1314                 hdr->ar_name[thislen] = ar_padchar (current);
1315             }
1316         }
1317     }
1318
1319   if (total_namelen == 0)
1320     return true;
1321
1322   *tabloc = bfd_zalloc (abfd, total_namelen);
1323   if (*tabloc == NULL)
1324     {
1325       bfd_set_error (bfd_error_no_memory);
1326       return false;
1327     }
1328
1329   *tablen = total_namelen;
1330   strptr = *tabloc;
1331
1332   for (current = abfd->archive_head; current != NULL; current =
1333        current->next)
1334     {
1335       const char *normal;
1336       unsigned int thislen;
1337
1338       normal = normalize (current, current->filename);
1339       if (normal == NULL)
1340         return false;
1341
1342       thislen = strlen (normal);
1343       if (thislen > maxname)
1344         {
1345           /* Works for now; may need to be re-engineered if we
1346              encounter an oddball archive format and want to
1347              generalise this hack. */
1348           struct ar_hdr *hdr = arch_hdr (current);
1349           strcpy (strptr, normal);
1350           if (! trailing_slash)
1351             strptr[thislen] = '\012';
1352           else
1353             {
1354               strptr[thislen] = '/';
1355               strptr[thislen + 1] = '\012';
1356             }
1357           hdr->ar_name[0] = ar_padchar (current);
1358           /* We know there will always be enough room (one of the few
1359              cases where you may safely use sprintf). */
1360           sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc));
1361           /* Kinda Kludgy.  We should just use the returned value of
1362              sprintf but not all implementations get this right */
1363           {
1364             char *temp = hdr->ar_name + 2;
1365             for (; temp < hdr->ar_name + maxname; temp++)
1366               if (*temp == '\0')
1367                 *temp = ' ';
1368           }
1369           strptr += thislen + 1;
1370           if (trailing_slash)
1371             ++strptr;
1372         }
1373     }
1374
1375   return true;
1376 }
1377 \f
1378 /** A couple of functions for creating ar_hdrs */
1379
1380 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1381    make one.  The filename must refer to a filename in the filesystem.
1382    The filename field of the ar_hdr will NOT be initialized */
1383
1384 static struct areltdata *
1385 bfd_ar_hdr_from_filesystem (abfd, filename)
1386      bfd *abfd;
1387      const char *filename;
1388 {
1389   struct stat status;
1390   struct areltdata *ared;
1391   struct ar_hdr *hdr;
1392   char *temp, *temp1;
1393
1394   if (stat (filename, &status) != 0)
1395     {
1396       bfd_set_error (bfd_error_system_call);
1397       return NULL;
1398     }
1399
1400   ared = (struct areltdata *) bfd_zalloc (abfd, sizeof (struct ar_hdr) +
1401                                           sizeof (struct areltdata));
1402   if (ared == NULL)
1403     {
1404       bfd_set_error (bfd_error_no_memory);
1405       return NULL;
1406     }
1407   hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1408
1409   /* ar headers are space padded, not null padded! */
1410   memset ((PTR) hdr, ' ', sizeof (struct ar_hdr));
1411
1412   strncpy (hdr->ar_fmag, ARFMAG, 2);
1413
1414   /* Goddamned sprintf doesn't permit MAXIMUM field lengths */
1415   sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime);
1416   sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid);
1417   sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid);
1418   sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode);
1419   sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size);
1420   /* Correct for a lossage in sprintf whereby it null-terminates.  I cannot
1421      understand how these C losers could design such a ramshackle bunch of
1422      IO operations */
1423   temp = (char *) hdr;
1424   temp1 = temp + sizeof (struct ar_hdr) - 2;
1425   for (; temp < temp1; temp++)
1426     {
1427       if (*temp == '\0')
1428         *temp = ' ';
1429     }
1430   strncpy (hdr->ar_fmag, ARFMAG, 2);
1431   ared->parsed_size = status.st_size;
1432   ared->arch_header = (char *) hdr;
1433
1434   return ared;
1435 }
1436
1437 /* This is magic required by the "ar" program.  Since it's
1438     undocumented, it's undocumented.  You may think that it would take
1439     a strong stomach to write this, and it does, but it takes even a
1440     stronger stomach to try to code around such a thing!  */
1441
1442 struct ar_hdr *
1443 bfd_special_undocumented_glue (abfd, filename)
1444      bfd *abfd;
1445      char *filename;
1446 {
1447   struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename);
1448   if (ar_elt == NULL)
1449     return NULL;
1450   return (struct ar_hdr *) ar_elt->arch_header;
1451 }
1452
1453
1454 /* Analogous to stat call */
1455 int
1456 bfd_generic_stat_arch_elt (abfd, buf)
1457      bfd *abfd;
1458      struct stat *buf;
1459 {
1460   struct ar_hdr *hdr;
1461   char *aloser;
1462
1463   if (abfd->arelt_data == NULL)
1464     {
1465       bfd_set_error (bfd_error_invalid_operation);
1466       return -1;
1467     }
1468
1469   hdr = arch_hdr (abfd);
1470
1471 #define foo(arelt, stelt, size)  \
1472   buf->stelt = strtol (hdr->arelt, &aloser, size); \
1473   if (aloser == hdr->arelt) return -1;
1474
1475   foo (ar_date, st_mtime, 10);
1476   foo (ar_uid, st_uid, 10);
1477   foo (ar_gid, st_gid, 10);
1478   foo (ar_mode, st_mode, 8);
1479
1480   buf->st_size = arch_eltdata (abfd)->parsed_size;
1481
1482   return 0;
1483 }
1484
1485 void
1486 bfd_dont_truncate_arname (abfd, pathname, arhdr)
1487      bfd *abfd;
1488      CONST char *pathname;
1489      char *arhdr;
1490 {
1491   /* FIXME: This interacts unpleasantly with ar's quick-append option.
1492      Fortunately ic960 users will never use that option.  Fixing this
1493      is very hard; fortunately I know how to do it and will do so once
1494      intel's release is out the door. */
1495
1496   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1497   size_t length;
1498   const char *filename;
1499   size_t maxlen = ar_maxnamelen (abfd);
1500
1501   if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1502     {
1503       bfd_bsd_truncate_arname (abfd, pathname, arhdr);
1504       return;
1505     }
1506
1507   filename = normalize (abfd, pathname);
1508   if (filename == NULL)
1509     {
1510       /* FIXME */
1511       abort ();
1512     }
1513
1514   length = strlen (filename);
1515
1516   if (length <= maxlen)
1517     memcpy (hdr->ar_name, filename, length);
1518
1519   /* Add the padding character if there is room for it.  */
1520   if (length < maxlen
1521       || (length == maxlen && length < sizeof hdr->ar_name))
1522     (hdr->ar_name)[length] = ar_padchar (abfd);
1523 }
1524
1525 void
1526 bfd_bsd_truncate_arname (abfd, pathname, arhdr)
1527      bfd *abfd;
1528      CONST char *pathname;
1529      char *arhdr;
1530 {
1531   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1532   int length;
1533   CONST char *filename = strrchr (pathname, '/');
1534   int maxlen = ar_maxnamelen (abfd);
1535
1536   if (filename == NULL)
1537     filename = pathname;
1538   else
1539     ++filename;
1540
1541   length = strlen (filename);
1542
1543   if (length <= maxlen)
1544     memcpy (hdr->ar_name, filename, length);
1545   else
1546     {
1547       /* pathname: meet procrustes */
1548       memcpy (hdr->ar_name, filename, maxlen);
1549       length = maxlen;
1550     }
1551
1552   if (length < maxlen)
1553     (hdr->ar_name)[length] = ar_padchar (abfd);
1554 }
1555
1556 /* Store name into ar header.  Truncates the name to fit.
1557    1> strip pathname to be just the basename.
1558    2> if it's short enuf to fit, stuff it in.
1559    3> If it doesn't end with .o, truncate it to fit
1560    4> truncate it before the .o, append .o, stuff THAT in.  */
1561
1562 /* This is what gnu ar does.  It's better but incompatible with the
1563    bsd ar. */
1564
1565 void
1566 bfd_gnu_truncate_arname (abfd, pathname, arhdr)
1567      bfd *abfd;
1568      CONST char *pathname;
1569      char *arhdr;
1570 {
1571   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1572   int length;
1573   CONST char *filename = strrchr (pathname, '/');
1574   int maxlen = ar_maxnamelen (abfd);
1575
1576   if (filename == NULL)
1577     filename = pathname;
1578   else
1579     ++filename;
1580
1581   length = strlen (filename);
1582
1583   if (length <= maxlen)
1584     memcpy (hdr->ar_name, filename, length);
1585   else
1586     {                           /* pathname: meet procrustes */
1587       memcpy (hdr->ar_name, filename, maxlen);
1588       if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
1589         {
1590           hdr->ar_name[maxlen - 2] = '.';
1591           hdr->ar_name[maxlen - 1] = 'o';
1592         }
1593       length = maxlen;
1594     }
1595
1596   if (length < 16)
1597     (hdr->ar_name)[length] = ar_padchar (abfd);
1598 }
1599 \f
1600 /* The BFD is open for write and has its format set to bfd_archive */
1601
1602 boolean
1603 _bfd_write_archive_contents (arch)
1604      bfd *arch;
1605 {
1606   bfd *current;
1607   char *etable = NULL;
1608   bfd_size_type elength = 0;
1609   const char *ename = NULL;
1610   boolean makemap = bfd_has_map (arch);
1611   boolean hasobjects = false;   /* if no .o's, don't bother to make a map */
1612   bfd_size_type wrote;
1613   unsigned int i;
1614   int tries;
1615
1616   /* Verify the viability of all entries; if any of them live in the
1617      filesystem (as opposed to living in an archive open for input)
1618      then construct a fresh ar_hdr for them.  */
1619   for (current = arch->archive_head; current; current = current->next)
1620     {
1621       if (bfd_write_p (current))
1622         {
1623           bfd_set_error (bfd_error_invalid_operation);
1624           return false;
1625         }
1626       if (!current->arelt_data)
1627         {
1628           current->arelt_data =
1629             (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename);
1630           if (!current->arelt_data)
1631             return false;
1632
1633           /* Put in the file name */
1634           BFD_SEND (arch, _bfd_truncate_arname, (arch,
1635                                                  current->filename,
1636                                               (char *) arch_hdr (current)));
1637         }
1638
1639       if (makemap && ! hasobjects)
1640         {                       /* don't bother if we won't make a map! */
1641           if ((bfd_check_format (current, bfd_object))
1642 #if 0                           /* FIXME -- these are not set correctly */
1643               && ((bfd_get_file_flags (current) & HAS_SYMS))
1644 #endif
1645             )
1646             hasobjects = true;
1647         }
1648     }
1649
1650   if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
1651                  (arch, &etable, &elength, &ename)))
1652     return false;
1653
1654   if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
1655     return false;
1656 #ifdef GNU960
1657   wrote = bfd_write (BFD_GNU960_ARMAG (arch), 1, SARMAG, arch);
1658 #else
1659   wrote = bfd_write (ARMAG, 1, SARMAG, arch);
1660 #endif
1661   if (wrote != SARMAG)
1662     return false;
1663
1664   if (makemap && hasobjects)
1665     {
1666       if (_bfd_compute_and_write_armap (arch, elength) != true)
1667         return false;
1668     }
1669
1670   if (elength != 0)
1671     {
1672       struct ar_hdr hdr;
1673
1674       memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1675       strcpy (hdr.ar_name, ename);
1676       /* Round size up to even number in archive header.  */
1677       sprintf (&(hdr.ar_size[0]), "%-10d",
1678                (int) ((elength + 1) & ~1));
1679       strncpy (hdr.ar_fmag, ARFMAG, 2);
1680       for (i = 0; i < sizeof (struct ar_hdr); i++)
1681         if (((char *) (&hdr))[i] == '\0')
1682           (((char *) (&hdr))[i]) = ' ';
1683       if ((bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch)
1684            != sizeof (struct ar_hdr))
1685           || bfd_write (etable, 1, elength, arch) != elength)
1686         return false;
1687       if ((elength % 2) == 1)
1688         {
1689           if (bfd_write ("\012", 1, 1, arch) != 1)
1690             return false;
1691         }
1692     }
1693
1694   for (current = arch->archive_head; current; current = current->next)
1695     {
1696       char buffer[DEFAULT_BUFFERSIZE];
1697       unsigned int remaining = arelt_size (current);
1698       struct ar_hdr *hdr = arch_hdr (current);
1699
1700       /* write ar header */
1701       if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr))
1702         return false;
1703       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
1704         return false;
1705       while (remaining)
1706         {
1707           unsigned int amt = DEFAULT_BUFFERSIZE;
1708           if (amt > remaining)
1709             amt = remaining;
1710           errno = 0;
1711           if (bfd_read (buffer, amt, 1, current) != amt)
1712             {
1713               if (bfd_get_error () != bfd_error_system_call)
1714                 bfd_set_error (bfd_error_malformed_archive);
1715               return false;
1716             }
1717           if (bfd_write (buffer, amt, 1, arch) != amt)
1718             return false;
1719           remaining -= amt;
1720         }
1721       if ((arelt_size (current) % 2) == 1)
1722         {
1723           if (bfd_write ("\012", 1, 1, arch) != 1)
1724             return false;
1725         }
1726     }
1727
1728   if (makemap && hasobjects)
1729     {
1730       /* Verify the timestamp in the archive file.  If it would not be
1731          accepted by the linker, rewrite it until it would be.  If
1732          anything odd happens, break out and just return.  (The
1733          Berkeley linker checks the timestamp and refuses to read the
1734          table-of-contents if it is >60 seconds less than the file's
1735          modified-time.  That painful hack requires this painful hack.  */
1736       tries = 1;
1737       do
1738         {
1739           if (bfd_update_armap_timestamp (arch))
1740             break;
1741           (*_bfd_error_handler)
1742             ("Warning: writing archive was slow: rewriting timestamp\n");
1743         }
1744       while (++tries < 6);
1745     }
1746
1747   return true;
1748 }
1749 \f
1750 /* Note that the namidx for the first symbol is 0 */
1751
1752 boolean
1753 _bfd_compute_and_write_armap (arch, elength)
1754      bfd *arch;
1755      unsigned int elength;
1756 {
1757   char *first_name = NULL;
1758   bfd *current;
1759   file_ptr elt_no = 0;
1760   struct orl *map = NULL;
1761   int orl_max = 1024;           /* fine initial default */
1762   int orl_count = 0;
1763   int stridx = 0;               /* string index */
1764   asymbol **syms = NULL;
1765   long syms_max = 0;
1766   boolean ret;
1767
1768   /* Dunno if this is the best place for this info... */
1769   if (elength != 0)
1770     elength += sizeof (struct ar_hdr);
1771   elength += elength % 2;
1772
1773   map = (struct orl *) malloc (orl_max * sizeof (struct orl));
1774   if (map == NULL)
1775     goto no_memory_return;
1776
1777   /* We put the symbol names on the arch obstack, and then discard
1778      them when done.  */
1779   first_name = bfd_alloc (arch, 1);
1780   if (first_name == NULL)
1781     goto no_memory_return;
1782
1783   /* Drop all the files called __.SYMDEF, we're going to make our
1784      own */
1785   while (arch->archive_head &&
1786          strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
1787     arch->archive_head = arch->archive_head->next;
1788
1789   /* Map over each element */
1790   for (current = arch->archive_head;
1791        current != (bfd *) NULL;
1792        current = current->next, elt_no++)
1793     {
1794       if ((bfd_check_format (current, bfd_object) == true)
1795           && ((bfd_get_file_flags (current) & HAS_SYMS)))
1796         {
1797           long storage;
1798           long symcount;
1799           long src_count;
1800
1801           storage = bfd_get_symtab_upper_bound (current);
1802           if (storage < 0)
1803             goto error_return;
1804
1805           if (storage != 0)
1806             {
1807               if (storage > syms_max)
1808                 {
1809                   if (syms_max > 0)
1810                     free (syms);
1811                   syms_max = storage;
1812                   syms = (asymbol **) malloc ((size_t) syms_max);
1813                   if (syms == NULL)
1814                     goto no_memory_return;
1815                 }
1816               symcount = bfd_canonicalize_symtab (current, syms);
1817               if (symcount < 0)
1818                 goto error_return;
1819
1820               /* Now map over all the symbols, picking out the ones we want */
1821               for (src_count = 0; src_count < symcount; src_count++)
1822                 {
1823                   flagword flags = (syms[src_count])->flags;
1824                   asection *sec = syms[src_count]->section;
1825
1826                   if ((flags & BSF_GLOBAL ||
1827                        flags & BSF_WEAK ||
1828                        flags & BSF_INDIRECT ||
1829                        bfd_is_com_section (sec))
1830                       && ! bfd_is_und_section (sec))
1831                     {
1832                       size_t namelen;
1833                       struct orl *new_map;
1834
1835                       /* This symbol will go into the archive header */
1836                       if (orl_count == orl_max)
1837                         {
1838                           orl_max *= 2;
1839                           new_map = ((struct orl *)
1840                                      realloc ((PTR) map,
1841                                               orl_max * sizeof (struct orl)));
1842                           if (new_map == (struct orl *) NULL)
1843                             goto no_memory_return;
1844
1845                           map = new_map;
1846                         }
1847
1848                       namelen = strlen (syms[src_count]->name);
1849                       map[orl_count].name = ((char **)
1850                                              bfd_alloc (arch,
1851                                                         sizeof (char *)));
1852                       if (map[orl_count].name == NULL)
1853                         goto no_memory_return;
1854                       *(map[orl_count].name) = bfd_alloc (arch, namelen + 1);
1855                       if (*(map[orl_count].name) == NULL)
1856                         goto no_memory_return;
1857                       strcpy (*(map[orl_count].name), syms[src_count]->name);
1858                       (map[orl_count]).pos = (file_ptr) current;
1859                       (map[orl_count]).namidx = stridx;
1860
1861                       stridx += namelen + 1;
1862                       ++orl_count;
1863                     }
1864                 }
1865             }
1866
1867           /* Now ask the BFD to free up any cached information, so we
1868              don't fill all of memory with symbol tables.  */
1869           if (! bfd_free_cached_info (current))
1870             goto error_return;
1871         }
1872     }
1873
1874   /* OK, now we have collected all the data, let's write them out */
1875   ret = BFD_SEND (arch, write_armap,
1876                   (arch, elength, map, orl_count, stridx));
1877
1878   if (syms_max > 0)
1879     free (syms);
1880   if (map != NULL)
1881     free (map);
1882   if (first_name != NULL)
1883     bfd_release (arch, first_name);
1884
1885   return ret;
1886
1887  no_memory_return:
1888   bfd_set_error (bfd_error_no_memory);
1889
1890  error_return:
1891   if (syms_max > 0)
1892     free (syms);
1893   if (map != NULL)
1894     free (map);
1895   if (first_name != NULL)
1896     bfd_release (arch, first_name);
1897
1898   return false;
1899 }
1900
1901 boolean
1902 bsd_write_armap (arch, elength, map, orl_count, stridx)
1903      bfd *arch;
1904      unsigned int elength;
1905      struct orl *map;
1906      unsigned int orl_count;
1907      int stridx;
1908 {
1909   int padit = stridx & 1;
1910   unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
1911   unsigned int stringsize = stridx + padit;
1912   /* Include 8 bytes to store ranlibsize and stringsize in output. */
1913   unsigned int mapsize = ranlibsize + stringsize + 8;
1914   file_ptr firstreal;
1915   bfd *current = arch->archive_head;
1916   bfd *last_elt = current;      /* last element arch seen */
1917   bfd_byte temp[4];
1918   unsigned int count;
1919   struct ar_hdr hdr;
1920   struct stat statbuf;
1921   unsigned int i;
1922
1923   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
1924
1925   stat (arch->filename, &statbuf);
1926   memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1927   sprintf (hdr.ar_name, RANLIBMAG);
1928   /* Remember the timestamp, to keep it holy.  But fudge it a little.  */
1929   bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET;
1930   bfd_ardata (arch)->armap_datepos = (SARMAG
1931                                       + offsetof (struct ar_hdr, ar_date[0]));
1932   sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
1933   sprintf (hdr.ar_uid, "%ld", (long) getuid ());
1934   sprintf (hdr.ar_gid, "%ld", (long) getgid ());
1935   sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1936   strncpy (hdr.ar_fmag, ARFMAG, 2);
1937   for (i = 0; i < sizeof (struct ar_hdr); i++)
1938     if (((char *) (&hdr))[i] == '\0')
1939       (((char *) (&hdr))[i]) = ' ';
1940   if (bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch)
1941       != sizeof (struct ar_hdr))
1942     return false;
1943   bfd_h_put_32 (arch, (bfd_vma) ranlibsize, temp);
1944   if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp))
1945     return false;
1946
1947   for (count = 0; count < orl_count; count++)
1948     {
1949       bfd_byte buf[BSD_SYMDEF_SIZE];
1950
1951       if (((bfd *) (map[count]).pos) != last_elt)
1952         {
1953           do
1954             {
1955               firstreal += arelt_size (current) + sizeof (struct ar_hdr);
1956               firstreal += firstreal % 2;
1957               current = current->next;
1958             }
1959           while (current != (bfd *) (map[count]).pos);
1960         }                       /* if new archive element */
1961
1962       last_elt = current;
1963       bfd_h_put_32 (arch, map[count].namidx, buf);
1964       bfd_h_put_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
1965       if (bfd_write (buf, BSD_SYMDEF_SIZE, 1, arch) != BSD_SYMDEF_SIZE)
1966         return false;
1967     }
1968
1969   /* now write the strings themselves */
1970   bfd_h_put_32 (arch, stringsize, temp);
1971   if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp))
1972     return false;
1973   for (count = 0; count < orl_count; count++)
1974     {
1975       size_t len = strlen (*map[count].name) + 1;
1976
1977       if (bfd_write (*map[count].name, 1, len, arch) != len)
1978         return false;
1979     }
1980
1981   /* The spec sez this should be a newline.  But in order to be
1982      bug-compatible for sun's ar we use a null. */
1983   if (padit)
1984     {
1985       if (bfd_write ("", 1, 1, arch) != 1)
1986         return false;
1987     }
1988
1989   return true;
1990 }
1991
1992 /* At the end of archive file handling, update the timestamp in the
1993    file, so the linker will accept it.
1994
1995    Return true if the timestamp was OK, or an unusual problem happened.
1996    Return false if we updated the timestamp.  */
1997
1998 boolean
1999 _bfd_archive_bsd_update_armap_timestamp (arch)
2000      bfd *arch;
2001 {
2002   struct stat archstat;
2003   struct ar_hdr hdr;
2004   unsigned int i;
2005
2006   /* Flush writes, get last-write timestamp from file, and compare it
2007      to the timestamp IN the file.  */
2008   bfd_flush (arch);
2009   if (bfd_stat (arch, &archstat) == -1)
2010     {
2011       perror ("Reading archive file mod timestamp");
2012       return true;              /* Can't read mod time for some reason */
2013     }
2014   if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp)
2015     return true;                /* OK by the linker's rules */
2016
2017   /* Update the timestamp.  */
2018   bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2019
2020   /* Prepare an ASCII version suitable for writing.  */
2021   memset (hdr.ar_date, 0, sizeof (hdr.ar_date));
2022   sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
2023   for (i = 0; i < sizeof (hdr.ar_date); i++)
2024     if (hdr.ar_date[i] == '\0')
2025       (hdr.ar_date)[i] = ' ';
2026
2027   /* Write it into the file.  */
2028   bfd_ardata (arch)->armap_datepos = (SARMAG
2029                                       + offsetof (struct ar_hdr, ar_date[0]));
2030   if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2031       || (bfd_write (hdr.ar_date, sizeof (hdr.ar_date), 1, arch)
2032           != sizeof (hdr.ar_date)))
2033     {
2034       /* FIXME: bfd can't call perror.  */
2035       perror ("Writing updated armap timestamp");
2036       return true;              /* Some error while writing */
2037     }
2038
2039   return false;                 /* We updated the timestamp successfully.  */
2040 }
2041 \f
2042 /* A coff armap looks like :
2043    lARMAG
2044    struct ar_hdr with name = '/'
2045    number of symbols
2046    offset of file for symbol 0
2047    offset of file for symbol 1
2048
2049    offset of file for symbol n-1
2050    symbol name 0
2051    symbol name 1
2052
2053    symbol name n-1
2054 */
2055
2056 boolean
2057 coff_write_armap (arch, elength, map, symbol_count, stridx)
2058      bfd *arch;
2059      unsigned int elength;
2060      struct orl *map;
2061      unsigned int symbol_count;
2062      int stridx;
2063 {
2064   /* The size of the ranlib is the number of exported symbols in the
2065      archive * the number of bytes in a int, + an int for the count */
2066   unsigned int ranlibsize = (symbol_count * 4) + 4;
2067   unsigned int stringsize = stridx;
2068   unsigned int mapsize = stringsize + ranlibsize;
2069   file_ptr archive_member_file_ptr;
2070   bfd *current = arch->archive_head;
2071   unsigned int count;
2072   struct ar_hdr hdr;
2073   unsigned int i;
2074   int padit = mapsize & 1;
2075
2076   if (padit)
2077     mapsize++;
2078
2079   /* work out where the first object file will go in the archive */
2080   archive_member_file_ptr = (mapsize
2081                              + elength
2082                              + sizeof (struct ar_hdr)
2083                              + SARMAG);
2084
2085   memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
2086   hdr.ar_name[0] = '/';
2087   sprintf (hdr.ar_size, "%-10d", (int) mapsize);
2088   sprintf (hdr.ar_date, "%ld", (long) time (NULL));
2089   /* This, at least, is what Intel coff sets the values to.: */
2090   sprintf ((hdr.ar_uid), "%d", 0);
2091   sprintf ((hdr.ar_gid), "%d", 0);
2092   sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);
2093   strncpy (hdr.ar_fmag, ARFMAG, 2);
2094
2095   for (i = 0; i < sizeof (struct ar_hdr); i++)
2096     if (((char *) (&hdr))[i] == '\0')
2097       (((char *) (&hdr))[i]) = ' ';
2098
2099   /* Write the ar header for this item and the number of symbols */
2100
2101   if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch)
2102       != sizeof (struct ar_hdr))
2103     return false;
2104
2105   bfd_write_bigendian_4byte_int (arch, symbol_count);
2106
2107   /* Two passes, first write the file offsets for each symbol -
2108      remembering that each offset is on a two byte boundary.  */
2109
2110   /* Write out the file offset for the file associated with each
2111      symbol, and remember to keep the offsets padded out.  */
2112
2113   current = arch->archive_head;
2114   count = 0;
2115   while (current != (bfd *) NULL && count < symbol_count)
2116     {
2117       /* For each symbol which is used defined in this object, write out
2118          the object file's address in the archive */
2119
2120       while (((bfd *) (map[count]).pos) == current)
2121         {
2122           bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr);
2123           count++;
2124         }
2125       /* Add size of this archive entry */
2126       archive_member_file_ptr += (arelt_size (current)
2127                                   + sizeof (struct ar_hdr));
2128       /* remember aboout the even alignment */
2129       archive_member_file_ptr += archive_member_file_ptr % 2;
2130       current = current->next;
2131     }
2132
2133   /* now write the strings themselves */
2134   for (count = 0; count < symbol_count; count++)
2135     {
2136       size_t len = strlen (*map[count].name) + 1;
2137
2138       if (bfd_write (*map[count].name, 1, len, arch) != len)
2139         return false;
2140     }
2141
2142   /* The spec sez this should be a newline.  But in order to be
2143      bug-compatible for arc960 we use a null. */
2144   if (padit)
2145     {
2146       if (bfd_write ("", 1, 1, arch) != 1)
2147         return false;
2148     }
2149
2150   return true;
2151 }