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