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