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