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