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