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