Import binutils-2.17.
[dragonfly.git] / contrib / binutils-2.14 / 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, 2002
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
164   PARAMS ((bfd *arch, const char *name));
165 static bfd_boolean do_slurp_bsd_armap
166   PARAMS ((bfd *abfd));
167 static bfd_boolean do_slurp_coff_armap
168   PARAMS ((bfd *abfd));
169 bfd_boolean bfd_elf64_archive_slurp_armap
170   PARAMS ((bfd *abfd));
171 static const char *normalize
172   PARAMS ((bfd *, const char *file));
173 static struct areltdata *bfd_ar_hdr_from_filesystem
174   PARAMS ((bfd *abfd, const char *, bfd *member));
175 \f
176 bfd_boolean
177 _bfd_generic_mkarchive (abfd)
178      bfd *abfd;
179 {
180   bfd_size_type amt = sizeof (struct artdata);
181
182   abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
183   if (bfd_ardata (abfd) == NULL)
184     return FALSE;
185
186   bfd_ardata (abfd)->cache = NULL;
187   bfd_ardata (abfd)->archive_head = NULL;
188   bfd_ardata (abfd)->symdefs = NULL;
189   bfd_ardata (abfd)->extended_names = NULL;
190   bfd_ardata (abfd)->tdata = NULL;
191
192   return TRUE;
193 }
194
195 /*
196 FUNCTION
197         bfd_get_next_mapent
198
199 SYNOPSIS
200         symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym);
201
202 DESCRIPTION
203         Step through archive @var{abfd}'s symbol table (if it
204         has one).  Successively update @var{sym} with the next symbol's
205         information, returning that symbol's (internal) index into the
206         symbol table.
207
208         Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
209         the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
210         got the last one.
211
212         A <<carsym>> is a canonical archive symbol.  The only
213         user-visible element is its name, a null-terminated string.
214 */
215
216 symindex
217 bfd_get_next_mapent (abfd, prev, entry)
218      bfd *abfd;
219      symindex prev;
220      carsym **entry;
221 {
222   if (!bfd_has_map (abfd))
223     {
224       bfd_set_error (bfd_error_invalid_operation);
225       return BFD_NO_MORE_SYMBOLS;
226     }
227
228   if (prev == BFD_NO_MORE_SYMBOLS)
229     prev = 0;
230   else
231     ++prev;
232   if (prev >= bfd_ardata (abfd)->symdef_count)
233     return BFD_NO_MORE_SYMBOLS;
234
235   *entry = (bfd_ardata (abfd)->symdefs + prev);
236   return prev;
237 }
238
239 /* To be called by backends only */
240
241 bfd *
242 _bfd_create_empty_archive_element_shell (obfd)
243      bfd *obfd;
244 {
245   return _bfd_new_bfd_contained_in (obfd);
246 }
247
248 /*
249 FUNCTION
250         bfd_set_archive_head
251
252 SYNOPSIS
253         bfd_boolean bfd_set_archive_head(bfd *output, bfd *new_head);
254
255 DESCRIPTION
256         Set the head of the chain of
257         BFDs contained in the archive @var{output} to @var{new_head}.
258 */
259
260 bfd_boolean
261 bfd_set_archive_head (output_archive, new_head)
262      bfd *output_archive;
263      bfd *new_head;
264 {
265
266   output_archive->archive_head = new_head;
267   return TRUE;
268 }
269
270 bfd *
271 _bfd_look_for_bfd_in_cache (arch_bfd, filepos)
272      bfd *arch_bfd;
273      file_ptr filepos;
274 {
275   struct ar_cache *current;
276
277   for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
278        current = current->next)
279     if (current->ptr == filepos)
280       return current->arelt;
281
282   return NULL;
283 }
284
285 /* Kind of stupid to call cons for each one, but we don't do too many */
286 bfd_boolean
287 _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt)
288      bfd *arch_bfd, *new_elt;
289      file_ptr filepos;
290 {
291   bfd_size_type amt = sizeof (struct ar_cache);
292
293   struct ar_cache *new_cache = (struct ar_cache *) bfd_zalloc (arch_bfd, amt);
294   if (new_cache == NULL)
295     return FALSE;
296
297   new_cache->ptr = filepos;
298   new_cache->arelt = new_elt;
299   new_cache->next = (struct ar_cache *) NULL;
300   if (bfd_ardata (arch_bfd)->cache == NULL)
301     bfd_ardata (arch_bfd)->cache = new_cache;
302   else
303     {
304       struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
305
306       while (current->next != NULL)
307         current = current->next;
308       current->next = new_cache;
309     }
310
311   return TRUE;
312 }
313 \f
314 /* The name begins with space.  Hence the rest of the name is an index into
315    the string table.  */
316
317 static char *
318 get_extended_arelt_filename (arch, name)
319      bfd *arch;
320      const char *name;
321 {
322   unsigned long index = 0;
323
324   /* Should extract string so that I can guarantee not to overflow into
325      the next region, but I'm too lazy.  */
326   errno = 0;
327   /* Skip first char, which is '/' in SVR4 or ' ' in some other variants.  */
328   index = strtol (name + 1, NULL, 10);
329   if (errno != 0)
330     {
331       bfd_set_error (bfd_error_malformed_archive);
332       return NULL;
333     }
334
335   return bfd_ardata (arch)->extended_names + index;
336 }
337
338 /* This functions reads an arch header and returns an areltdata pointer, or
339    NULL on error.
340
341    Presumes the file pointer is already in the right place (ie pointing
342    to the ar_hdr in the file).   Moves the file pointer; on success it
343    should be pointing to the front of the file contents; on failure it
344    could have been moved arbitrarily.
345 */
346
347 PTR
348 _bfd_generic_read_ar_hdr (abfd)
349      bfd *abfd;
350 {
351   return _bfd_generic_read_ar_hdr_mag (abfd, (const char *) NULL);
352 }
353
354 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a
355    variant of _bfd_generic_read_ar_hdr which accepts a magic string.  */
356
357 PTR
358 _bfd_generic_read_ar_hdr_mag (abfd, mag)
359      bfd *abfd;
360      const char *mag;
361 {
362   struct ar_hdr hdr;
363   char *hdrp = (char *) &hdr;
364   size_t parsed_size;
365   struct areltdata *ared;
366   char *filename = NULL;
367   bfd_size_type namelen = 0;
368   bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
369   char *allocptr = 0;
370
371   if (bfd_bread ((PTR) hdrp, (bfd_size_type) sizeof (struct ar_hdr), abfd)
372       != sizeof (struct ar_hdr))
373     {
374       if (bfd_get_error () != bfd_error_system_call)
375         bfd_set_error (bfd_error_no_more_archived_files);
376       return NULL;
377     }
378   if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
379       && (mag == NULL
380           || strncmp (hdr.ar_fmag, mag, 2) != 0))
381     {
382       bfd_set_error (bfd_error_malformed_archive);
383       return NULL;
384     }
385
386   errno = 0;
387   parsed_size = strtol (hdr.ar_size, NULL, 10);
388   if (errno != 0)
389     {
390       bfd_set_error (bfd_error_malformed_archive);
391       return NULL;
392     }
393
394   /* Extract the filename from the archive - there are two ways to
395      specify an extended name table, either the first char of the
396      name is a space, or it's a slash.  */
397   if ((hdr.ar_name[0] == '/'
398        || (hdr.ar_name[0] == ' '
399            && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
400       && bfd_ardata (abfd)->extended_names != NULL)
401     {
402       filename = get_extended_arelt_filename (abfd, hdr.ar_name);
403       if (filename == NULL)
404         {
405           bfd_set_error (bfd_error_malformed_archive);
406           return NULL;
407         }
408     }
409   /* BSD4.4-style long filename.
410      Only implemented for reading, so far!  */
411   else if (hdr.ar_name[0] == '#'
412            && hdr.ar_name[1] == '1'
413            && hdr.ar_name[2] == '/'
414            && ISDIGIT (hdr.ar_name[3]))
415     {
416       /* BSD-4.4 extended name */
417       namelen = atoi (&hdr.ar_name[3]);
418       allocsize += namelen + 1;
419       parsed_size -= namelen;
420
421       allocptr = bfd_zalloc (abfd, allocsize);
422       if (allocptr == NULL)
423         return NULL;
424       filename = (allocptr
425                   + sizeof (struct areltdata)
426                   + sizeof (struct ar_hdr));
427       if (bfd_bread (filename, namelen, abfd) != namelen)
428         {
429           if (bfd_get_error () != bfd_error_system_call)
430             bfd_set_error (bfd_error_no_more_archived_files);
431           return NULL;
432         }
433       filename[namelen] = '\0';
434     }
435   else
436     {
437       /* We judge the end of the name by looking for '/' or ' '.
438          Note:  The SYSV format (terminated by '/') allows embedded
439          spaces, so only look for ' ' if we don't find '/'.  */
440
441       char *e;
442       e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
443       if (e == NULL)
444         {
445           e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
446           if (e == NULL)
447             e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
448         }
449
450       if (e != NULL)
451         namelen = e - hdr.ar_name;
452       else
453         {
454           /* If we didn't find a termination character, then the name
455              must be the entire field.  */
456           namelen = ar_maxnamelen (abfd);
457         }
458
459       allocsize += namelen + 1;
460     }
461
462   if (!allocptr)
463     {
464       allocptr = bfd_zalloc (abfd, allocsize);
465       if (allocptr == NULL)
466         return NULL;
467     }
468
469   ared = (struct areltdata *) allocptr;
470
471   ared->arch_header = allocptr + sizeof (struct areltdata);
472   memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr));
473   ared->parsed_size = parsed_size;
474
475   if (filename != NULL)
476     ared->filename = filename;
477   else
478     {
479       ared->filename = allocptr + (sizeof (struct areltdata) +
480                                    sizeof (struct ar_hdr));
481       if (namelen)
482         memcpy (ared->filename, hdr.ar_name, (size_t) namelen);
483       ared->filename[namelen] = '\0';
484     }
485
486   return (PTR) ared;
487 }
488 \f
489 /* This is an internal function; it's mainly used when indexing
490    through the archive symbol table, but also used to get the next
491    element, since it handles the bookkeeping so nicely for us.  */
492
493 bfd *
494 _bfd_get_elt_at_filepos (archive, filepos)
495      bfd *archive;
496      file_ptr filepos;
497 {
498   struct areltdata *new_areldata;
499   bfd *n_nfd;
500
501   n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
502   if (n_nfd)
503     return n_nfd;
504
505   if (0 > bfd_seek (archive, filepos, SEEK_SET))
506     return NULL;
507
508   if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
509     return NULL;
510
511   n_nfd = _bfd_create_empty_archive_element_shell (archive);
512   if (n_nfd == NULL)
513     {
514       bfd_release (archive, (PTR) new_areldata);
515       return NULL;
516     }
517
518   n_nfd->origin = bfd_tell (archive);
519   n_nfd->arelt_data = (PTR) new_areldata;
520   n_nfd->filename = new_areldata->filename;
521
522   if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
523     return n_nfd;
524
525   /* Huh?  */
526   bfd_release (archive, (PTR) n_nfd);
527   bfd_release (archive, (PTR) new_areldata);
528   return NULL;
529 }
530
531 /* Return the BFD which is referenced by the symbol in ABFD indexed by
532    INDEX.  INDEX should have been returned by bfd_get_next_mapent.  */
533
534 bfd *
535 _bfd_generic_get_elt_at_index (abfd, index)
536      bfd *abfd;
537      symindex index;
538 {
539   carsym *entry;
540
541   entry = bfd_ardata (abfd)->symdefs + index;
542   return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
543 }
544
545 /*
546 FUNCTION
547         bfd_openr_next_archived_file
548
549 SYNOPSIS
550         bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous);
551
552 DESCRIPTION
553         Provided a BFD, @var{archive}, containing an archive and NULL, open
554         an input BFD on the first contained element and returns that.
555         Subsequent calls should pass
556         the archive and the previous return value to return a created
557         BFD to the next contained element. NULL is returned when there
558         are no more.
559 */
560
561 bfd *
562 bfd_openr_next_archived_file (archive, last_file)
563      bfd *archive;
564      bfd *last_file;
565 {
566   if ((bfd_get_format (archive) != bfd_archive) ||
567       (archive->direction == write_direction))
568     {
569       bfd_set_error (bfd_error_invalid_operation);
570       return NULL;
571     }
572
573   return BFD_SEND (archive,
574                    openr_next_archived_file,
575                    (archive,
576                     last_file));
577 }
578
579 bfd *
580 bfd_generic_openr_next_archived_file (archive, last_file)
581      bfd *archive;
582      bfd *last_file;
583 {
584   file_ptr filestart;
585
586   if (!last_file)
587     filestart = bfd_ardata (archive)->first_file_filepos;
588   else
589     {
590       unsigned int size = arelt_size (last_file);
591       /* Pad to an even boundary...
592          Note that last_file->origin can be odd in the case of
593          BSD-4.4-style element with a long odd size.  */
594       filestart = last_file->origin + size;
595       filestart += filestart % 2;
596     }
597
598   return _bfd_get_elt_at_filepos (archive, filestart);
599 }
600
601 const bfd_target *
602 bfd_generic_archive_p (abfd)
603      bfd *abfd;
604 {
605   struct artdata *tdata_hold;
606   char armag[SARMAG + 1];
607   bfd_size_type amt;
608
609   if (bfd_bread ((PTR) armag, (bfd_size_type) SARMAG, abfd) != SARMAG)
610     {
611       if (bfd_get_error () != bfd_error_system_call)
612         bfd_set_error (bfd_error_wrong_format);
613       return NULL;
614     }
615
616 #ifdef GNU960
617   if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0)
618     return 0;
619 #else
620   if (strncmp (armag, ARMAG, SARMAG) != 0 &&
621       strncmp (armag, ARMAGB, SARMAG) != 0)
622     return 0;
623 #endif
624
625   tdata_hold = bfd_ardata (abfd);
626
627   amt = sizeof (struct artdata);
628   bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
629   if (bfd_ardata (abfd) == NULL)
630     {
631       bfd_ardata (abfd) = tdata_hold;
632       return NULL;
633     }
634
635   bfd_ardata (abfd)->first_file_filepos = SARMAG;
636   bfd_ardata (abfd)->cache = NULL;
637   bfd_ardata (abfd)->archive_head = NULL;
638   bfd_ardata (abfd)->symdefs = NULL;
639   bfd_ardata (abfd)->extended_names = NULL;
640   bfd_ardata (abfd)->tdata = NULL;
641
642   if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
643       || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
644     {
645       if (bfd_get_error () != bfd_error_system_call)
646         bfd_set_error (bfd_error_wrong_format);
647       bfd_release (abfd, bfd_ardata (abfd));
648       bfd_ardata (abfd) = tdata_hold;
649       return NULL;
650     }
651
652   if (bfd_has_map (abfd))
653     {
654       bfd *first;
655
656       /* This archive has a map, so we may presume that the contents
657          are object files.  Make sure that if the first file in the
658          archive can be recognized as an object file, it is for this
659          target.  If not, assume that this is the wrong format.  If
660          the first file is not an object file, somebody is doing
661          something weird, and we permit it so that ar -t will work.
662
663          This is done because any normal format will recognize any
664          normal archive, regardless of the format of the object files.
665          We do accept an empty archive.  */
666
667       first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
668       if (first != NULL)
669         {
670           bfd_boolean fail;
671
672           first->target_defaulted = FALSE;
673           fail = FALSE;
674           if (bfd_check_format (first, bfd_object)
675               && first->xvec != abfd->xvec)
676             {
677 #if 0
678               /* We ought to close `first' here, but we can't, because
679                  we have no way to remove it from the archive cache.
680                  It's close to impossible to figure out when we can
681                  release bfd_ardata.  FIXME.  */
682               (void) bfd_close (first);
683               bfd_release (abfd, bfd_ardata (abfd));
684 #endif
685               bfd_set_error (bfd_error_wrong_object_format);
686               bfd_ardata (abfd) = tdata_hold;
687               return NULL;
688             }
689           /* And we ought to close `first' here too.  */
690         }
691     }
692
693   return abfd->xvec;
694 }
695
696 /* Some constants for a 32 bit BSD archive structure.  We do not
697    support 64 bit archives presently; so far as I know, none actually
698    exist.  Supporting them would require changing these constants, and
699    changing some H_GET_32 to H_GET_64.  */
700
701 /* The size of an external symdef structure.  */
702 #define BSD_SYMDEF_SIZE 8
703
704 /* The offset from the start of a symdef structure to the file offset.  */
705 #define BSD_SYMDEF_OFFSET_SIZE 4
706
707 /* The size of the symdef count.  */
708 #define BSD_SYMDEF_COUNT_SIZE 4
709
710 /* The size of the string count.  */
711 #define BSD_STRING_COUNT_SIZE 4
712
713 /* Returns FALSE on error, TRUE otherwise */
714
715 static bfd_boolean
716 do_slurp_bsd_armap (abfd)
717      bfd *abfd;
718 {
719   struct areltdata *mapdata;
720   unsigned int counter;
721   bfd_byte *raw_armap, *rbase;
722   struct artdata *ardata = bfd_ardata (abfd);
723   char *stringbase;
724   bfd_size_type parsed_size, amt;
725   carsym *set;
726
727   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
728   if (mapdata == NULL)
729     return FALSE;
730   parsed_size = mapdata->parsed_size;
731   bfd_release (abfd, (PTR) mapdata);    /* Don't need it any more.  */
732
733   raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
734   if (raw_armap == (bfd_byte *) NULL)
735     return FALSE;
736
737   if (bfd_bread ((PTR) raw_armap, parsed_size, abfd) != parsed_size)
738     {
739       if (bfd_get_error () != bfd_error_system_call)
740         bfd_set_error (bfd_error_malformed_archive);
741     byebye:
742       bfd_release (abfd, (PTR) raw_armap);
743       return FALSE;
744     }
745
746   ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
747
748   if (ardata->symdef_count * BSD_SYMDEF_SIZE >
749       parsed_size - BSD_SYMDEF_COUNT_SIZE)
750     {
751       /* Probably we're using the wrong byte ordering.  */
752       bfd_set_error (bfd_error_wrong_format);
753       goto byebye;
754     }
755
756   ardata->cache = 0;
757   rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
758   stringbase = ((char *) rbase
759                 + ardata->symdef_count * BSD_SYMDEF_SIZE
760                 + BSD_STRING_COUNT_SIZE);
761   amt = (bfd_size_type) ardata->symdef_count * sizeof (carsym);
762   ardata->symdefs = (carsym *) bfd_alloc (abfd, amt);
763   if (!ardata->symdefs)
764     return FALSE;
765
766   for (counter = 0, set = ardata->symdefs;
767        counter < ardata->symdef_count;
768        counter++, set++, rbase += BSD_SYMDEF_SIZE)
769     {
770       set->name = H_GET_32 (abfd, rbase) + stringbase;
771       set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
772     }
773
774   ardata->first_file_filepos = bfd_tell (abfd);
775   /* Pad to an even boundary if you have to.  */
776   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
777   /* FIXME, we should provide some way to free raw_ardata when
778      we are done using the strings from it.  For now, it seems
779      to be allocated on an objalloc anyway...  */
780   bfd_has_map (abfd) = TRUE;
781   return TRUE;
782 }
783
784 /* Returns FALSE on error, TRUE otherwise.  */
785
786 static bfd_boolean
787 do_slurp_coff_armap (abfd)
788      bfd *abfd;
789 {
790   struct areltdata *mapdata;
791   int *raw_armap, *rawptr;
792   struct artdata *ardata = bfd_ardata (abfd);
793   char *stringbase;
794   bfd_size_type stringsize;
795   unsigned int parsed_size;
796   carsym *carsyms;
797   bfd_size_type nsymz;          /* Number of symbols in armap.  */
798   bfd_vma (*swap) PARAMS ((const bfd_byte *));
799   char int_buf[sizeof (long)];
800   bfd_size_type carsym_size, ptrsize;
801   unsigned int i;
802
803   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
804   if (mapdata == NULL)
805     return FALSE;
806   parsed_size = mapdata->parsed_size;
807   bfd_release (abfd, (PTR) mapdata);    /* Don't need it any more.  */
808
809   if (bfd_bread ((PTR) int_buf, (bfd_size_type) 4, abfd) != 4)
810     {
811       if (bfd_get_error () != bfd_error_system_call)
812         bfd_set_error (bfd_error_malformed_archive);
813       return FALSE;
814     }
815   /* It seems that all numeric information in a coff archive is always
816      in big endian format, nomatter the host or target.  */
817   swap = bfd_getb32;
818   nsymz = bfd_getb32 ((PTR) int_buf);
819   stringsize = parsed_size - (4 * nsymz) - 4;
820
821 #if 1
822   /* ... except that some archive formats are broken, and it may be our
823      fault - the i960 little endian coff sometimes has big and sometimes
824      little, because our tools changed.  Here's a horrible hack to clean
825      up the crap.  */
826
827   if (stringsize > 0xfffff
828       && bfd_get_arch (abfd) == bfd_arch_i960
829       && bfd_get_flavour (abfd) == bfd_target_coff_flavour)
830     {
831       /* This looks dangerous, let's do it the other way around.  */
832       nsymz = bfd_getl32 ((PTR) int_buf);
833       stringsize = parsed_size - (4 * nsymz) - 4;
834       swap = bfd_getl32;
835     }
836 #endif
837
838   /* The coff armap must be read sequentially.  So we construct a
839      bsd-style one in core all at once, for simplicity.  */
840
841   carsym_size = (nsymz * sizeof (carsym));
842   ptrsize = (4 * nsymz);
843
844   ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
845   if (ardata->symdefs == NULL)
846     return FALSE;
847   carsyms = ardata->symdefs;
848   stringbase = ((char *) ardata->symdefs) + carsym_size;
849
850   /* Allocate and read in the raw offsets.  */
851   raw_armap = (int *) bfd_alloc (abfd, ptrsize);
852   if (raw_armap == NULL)
853     goto release_symdefs;
854   if (bfd_bread ((PTR) raw_armap, ptrsize, abfd) != ptrsize
855       || (bfd_bread ((PTR) stringbase, stringsize, abfd) != stringsize))
856     {
857       if (bfd_get_error () != bfd_error_system_call)
858         bfd_set_error (bfd_error_malformed_archive);
859       goto release_raw_armap;
860     }
861
862   /* OK, build the carsyms.  */
863   for (i = 0; i < nsymz; i++)
864     {
865       rawptr = raw_armap + i;
866       carsyms->file_offset = swap ((PTR) rawptr);
867       carsyms->name = stringbase;
868       stringbase += strlen (stringbase) + 1;
869       carsyms++;
870     }
871   *stringbase = 0;
872
873   ardata->symdef_count = nsymz;
874   ardata->first_file_filepos = bfd_tell (abfd);
875   /* Pad to an even boundary if you have to.  */
876   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
877
878   bfd_has_map (abfd) = TRUE;
879   bfd_release (abfd, (PTR) raw_armap);
880
881   /* Check for a second archive header (as used by PE).  */
882   {
883     struct areltdata *tmp;
884
885     bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
886     tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
887     if (tmp != NULL)
888       {
889         if (tmp->arch_header[0] == '/'
890             && tmp->arch_header[1] == ' ')
891           {
892             ardata->first_file_filepos +=
893               (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
894           }
895         bfd_release (abfd, tmp);
896       }
897   }
898
899   return TRUE;
900
901 release_raw_armap:
902   bfd_release (abfd, (PTR) raw_armap);
903 release_symdefs:
904   bfd_release (abfd, (PTR) (ardata)->symdefs);
905   return FALSE;
906 }
907
908 /* This routine can handle either coff-style or bsd-style armaps.
909    Returns FALSE on error, TRUE otherwise */
910
911 bfd_boolean
912 bfd_slurp_armap (abfd)
913      bfd *abfd;
914 {
915   char nextname[17];
916   int i = bfd_bread ((PTR) nextname, (bfd_size_type) 16, abfd);
917
918   if (i == 0)
919     return TRUE;
920   if (i != 16)
921     return FALSE;
922
923   if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
924     return FALSE;
925
926   if (!strncmp (nextname, "__.SYMDEF       ", 16)
927       || !strncmp (nextname, "__.SYMDEF/      ", 16)) /* old Linux archives */
928     return do_slurp_bsd_armap (abfd);
929   else if (!strncmp (nextname, "/               ", 16))
930     return do_slurp_coff_armap (abfd);
931   else if (!strncmp (nextname, "/SYM64/         ", 16))
932     {
933       /* 64bit ELF (Irix 6) archive.  */
934 #ifdef BFD64
935       return bfd_elf64_archive_slurp_armap (abfd);
936 #else
937       bfd_set_error (bfd_error_wrong_format);
938       return FALSE;
939 #endif
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 bfd_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 bfd_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 bfd_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 bfd_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 bfd_boolean
1238 _bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen)
1239      bfd *abfd;
1240      bfd_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
1465   PARAMS ((bfd *, const char *));
1466
1467 struct ar_hdr *
1468 bfd_special_undocumented_glue (abfd, filename)
1469      bfd *abfd;
1470      const char *filename;
1471 {
1472   struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename, 0);
1473   if (ar_elt == NULL)
1474     return NULL;
1475   return (struct ar_hdr *) ar_elt->arch_header;
1476 }
1477
1478 /* Analogous to stat call.  */
1479
1480 int
1481 bfd_generic_stat_arch_elt (abfd, buf)
1482      bfd *abfd;
1483      struct stat *buf;
1484 {
1485   struct ar_hdr *hdr;
1486   char *aloser;
1487
1488   if (abfd->arelt_data == NULL)
1489     {
1490       bfd_set_error (bfd_error_invalid_operation);
1491       return -1;
1492     }
1493
1494   hdr = arch_hdr (abfd);
1495
1496 #define foo(arelt, stelt, size)                         \
1497   buf->stelt = strtol (hdr->arelt, &aloser, size);      \
1498   if (aloser == hdr->arelt)                             \
1499     return -1;
1500
1501   /* Some platforms support special notations for large IDs.  */
1502 #ifdef HPUX_LARGE_AR_IDS
1503 # define foo2(arelt, stelt, size)                                       \
1504   if (hdr->arelt[5] == ' ')                                             \
1505     {                                                                   \
1506       foo (arelt, stelt, size);                                         \
1507     }                                                                   \
1508   else                                                                  \
1509     {                                                                   \
1510       int cnt;                                                          \
1511       for (buf->stelt = cnt = 0; cnt < 5; ++cnt)                        \
1512         {                                                               \
1513           if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f)    \
1514             return -1;                                                  \
1515           buf->stelt <<= 6;                                             \
1516           buf->stelt += hdr->arelt[cnt] - ' ';                          \
1517         }                                                               \
1518       if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3)               \
1519         return -1;                                                      \
1520       buf->stelt <<= 2;                                                 \
1521       buf->stelt += hdr->arelt[5] - '@';                                \
1522     }
1523 #else
1524 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1525 #endif
1526
1527   foo (ar_date, st_mtime, 10);
1528   foo2 (ar_uid, st_uid, 10);
1529   foo2 (ar_gid, st_gid, 10);
1530   foo (ar_mode, st_mode, 8);
1531
1532   buf->st_size = arch_eltdata (abfd)->parsed_size;
1533
1534   return 0;
1535 }
1536
1537 void
1538 bfd_dont_truncate_arname (abfd, pathname, arhdr)
1539      bfd *abfd;
1540      const char *pathname;
1541      char *arhdr;
1542 {
1543   /* FIXME: This interacts unpleasantly with ar's quick-append option.
1544      Fortunately ic960 users will never use that option.  Fixing this
1545      is very hard; fortunately I know how to do it and will do so once
1546      intel's release is out the door.  */
1547
1548   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1549   size_t length;
1550   const char *filename;
1551   size_t maxlen = ar_maxnamelen (abfd);
1552
1553   if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1554     {
1555       bfd_bsd_truncate_arname (abfd, pathname, arhdr);
1556       return;
1557     }
1558
1559   filename = normalize (abfd, pathname);
1560   if (filename == NULL)
1561     {
1562       /* FIXME */
1563       abort ();
1564     }
1565
1566   length = strlen (filename);
1567
1568   if (length <= maxlen)
1569     memcpy (hdr->ar_name, filename, length);
1570
1571   /* Add the padding character if there is room for it.  */
1572   if (length < maxlen
1573       || (length == maxlen && length < sizeof hdr->ar_name))
1574     (hdr->ar_name)[length] = ar_padchar (abfd);
1575 }
1576
1577 void
1578 bfd_bsd_truncate_arname (abfd, pathname, arhdr)
1579      bfd *abfd;
1580      const char *pathname;
1581      char *arhdr;
1582 {
1583   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1584   size_t length;
1585   const char *filename = strrchr (pathname, '/');
1586   size_t maxlen = ar_maxnamelen (abfd);
1587
1588 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1589   {
1590     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
1591     char *bslash = strrchr (pathname, '\\');
1592     if (filename == NULL || (bslash != NULL && bslash > filename))
1593       filename = bslash;
1594     if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1595       filename = pathname + 1;
1596   }
1597 #endif
1598
1599   if (filename == NULL)
1600     filename = pathname;
1601   else
1602     ++filename;
1603
1604   length = strlen (filename);
1605
1606   if (length <= maxlen)
1607     memcpy (hdr->ar_name, filename, length);
1608   else
1609     {
1610       /* pathname: meet procrustes */
1611       memcpy (hdr->ar_name, filename, maxlen);
1612       length = maxlen;
1613     }
1614
1615   if (length < maxlen)
1616     (hdr->ar_name)[length] = ar_padchar (abfd);
1617 }
1618
1619 /* Store name into ar header.  Truncates the name to fit.
1620    1> strip pathname to be just the basename.
1621    2> if it's short enuf to fit, stuff it in.
1622    3> If it doesn't end with .o, truncate it to fit
1623    4> truncate it before the .o, append .o, stuff THAT in.  */
1624
1625 /* This is what gnu ar does.  It's better but incompatible with the
1626    bsd ar.  */
1627
1628 void
1629 bfd_gnu_truncate_arname (abfd, pathname, arhdr)
1630      bfd *abfd;
1631      const char *pathname;
1632      char *arhdr;
1633 {
1634   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1635   size_t length;
1636   const char *filename = strrchr (pathname, '/');
1637   size_t maxlen = ar_maxnamelen (abfd);
1638
1639 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1640   {
1641     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
1642     char *bslash = strrchr (pathname, '\\');
1643     if (filename == NULL || (bslash != NULL && bslash > filename))
1644       filename = bslash;
1645     if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1646       filename = pathname + 1;
1647   }
1648 #endif
1649
1650   if (filename == NULL)
1651     filename = pathname;
1652   else
1653     ++filename;
1654
1655   length = strlen (filename);
1656
1657   if (length <= maxlen)
1658     memcpy (hdr->ar_name, filename, length);
1659   else
1660     {                           /* pathname: meet procrustes */
1661       memcpy (hdr->ar_name, filename, maxlen);
1662       if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
1663         {
1664           hdr->ar_name[maxlen - 2] = '.';
1665           hdr->ar_name[maxlen - 1] = 'o';
1666         }
1667       length = maxlen;
1668     }
1669
1670   if (length < 16)
1671     (hdr->ar_name)[length] = ar_padchar (abfd);
1672 }
1673 \f
1674 /* The BFD is open for write and has its format set to bfd_archive.  */
1675
1676 bfd_boolean
1677 _bfd_write_archive_contents (arch)
1678      bfd *arch;
1679 {
1680   bfd *current;
1681   char *etable = NULL;
1682   bfd_size_type elength = 0;
1683   const char *ename = NULL;
1684   bfd_boolean makemap = bfd_has_map (arch);
1685   /* If no .o's, don't bother to make a map.  */
1686   bfd_boolean hasobjects = FALSE;
1687   bfd_size_type wrote;
1688   unsigned int i;
1689   int tries;
1690
1691   /* Verify the viability of all entries; if any of them live in the
1692      filesystem (as opposed to living in an archive open for input)
1693      then construct a fresh ar_hdr for them.  */
1694   for (current = arch->archive_head; current; current = current->next)
1695     {
1696       /* This check is checking the bfds for the objects we're reading
1697          from (which are usually either an object file or archive on
1698          disk), not the archive entries we're writing to.  We don't
1699          actually create bfds for the archive members, we just copy
1700          them byte-wise when we write out the archive.  */
1701       if (bfd_write_p (current))
1702         {
1703           bfd_set_error (bfd_error_invalid_operation);
1704           return FALSE;
1705         }
1706       if (!current->arelt_data)
1707         {
1708           current->arelt_data =
1709             (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename, current);
1710           if (!current->arelt_data)
1711             return FALSE;
1712
1713           /* Put in the file name.  */
1714           BFD_SEND (arch, _bfd_truncate_arname, (arch,
1715                                                  current->filename,
1716                                               (char *) arch_hdr (current)));
1717         }
1718
1719       if (makemap && ! hasobjects)
1720         {                       /* Don't bother if we won't make a map!  */
1721           if ((bfd_check_format (current, bfd_object))
1722 #if 0                           /* FIXME -- these are not set correctly */
1723               && ((bfd_get_file_flags (current) & HAS_SYMS))
1724 #endif
1725             )
1726             hasobjects = TRUE;
1727         }
1728     }
1729
1730   if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
1731                  (arch, &etable, &elength, &ename)))
1732     return FALSE;
1733
1734   if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
1735     return FALSE;
1736 #ifdef GNU960
1737   wrote = bfd_bwrite (BFD_GNU960_ARMAG (arch), (bfd_size_type) SARMAG, arch);
1738 #else
1739   wrote = bfd_bwrite (ARMAG, (bfd_size_type) SARMAG, arch);
1740 #endif
1741   if (wrote != SARMAG)
1742     return FALSE;
1743
1744   if (makemap && hasobjects)
1745     {
1746       if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
1747         return FALSE;
1748     }
1749
1750   if (elength != 0)
1751     {
1752       struct ar_hdr hdr;
1753
1754       memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1755       strcpy (hdr.ar_name, ename);
1756       /* Round size up to even number in archive header.  */
1757       sprintf (&(hdr.ar_size[0]), "%-10d",
1758                (int) ((elength + 1) & ~(bfd_size_type) 1));
1759       strncpy (hdr.ar_fmag, ARFMAG, 2);
1760       for (i = 0; i < sizeof (struct ar_hdr); i++)
1761         if (((char *) (&hdr))[i] == '\0')
1762           (((char *) (&hdr))[i]) = ' ';
1763       if ((bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
1764            != sizeof (struct ar_hdr))
1765           || bfd_bwrite (etable, elength, arch) != elength)
1766         return FALSE;
1767       if ((elength % 2) == 1)
1768         {
1769           if (bfd_bwrite ("\012", (bfd_size_type) 1, arch) != 1)
1770             return FALSE;
1771         }
1772     }
1773
1774   for (current = arch->archive_head; current; current = current->next)
1775     {
1776       char buffer[DEFAULT_BUFFERSIZE];
1777       unsigned int remaining = arelt_size (current);
1778       struct ar_hdr *hdr = arch_hdr (current);
1779
1780       /* Write ar header.  */
1781       if (bfd_bwrite ((PTR) hdr, (bfd_size_type) sizeof (*hdr), arch)
1782           != sizeof (*hdr))
1783         return FALSE;
1784       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
1785         return FALSE;
1786       while (remaining)
1787         {
1788           unsigned int amt = DEFAULT_BUFFERSIZE;
1789           if (amt > remaining)
1790             amt = remaining;
1791           errno = 0;
1792           if (bfd_bread (buffer, (bfd_size_type) amt, current) != amt)
1793             {
1794               if (bfd_get_error () != bfd_error_system_call)
1795                 bfd_set_error (bfd_error_malformed_archive);
1796               return FALSE;
1797             }
1798           if (bfd_bwrite (buffer, (bfd_size_type) amt, arch) != amt)
1799             return FALSE;
1800           remaining -= amt;
1801         }
1802       if ((arelt_size (current) % 2) == 1)
1803         {
1804           if (bfd_bwrite ("\012", (bfd_size_type) 1, arch) != 1)
1805             return FALSE;
1806         }
1807     }
1808
1809   if (makemap && hasobjects)
1810     {
1811       /* Verify the timestamp in the archive file.  If it would not be
1812          accepted by the linker, rewrite it until it would be.  If
1813          anything odd happens, break out and just return.  (The
1814          Berkeley linker checks the timestamp and refuses to read the
1815          table-of-contents if it is >60 seconds less than the file's
1816          modified-time.  That painful hack requires this painful hack.  */
1817       tries = 1;
1818       do
1819         {
1820           if (bfd_update_armap_timestamp (arch))
1821             break;
1822           (*_bfd_error_handler)
1823             (_("Warning: writing archive was slow: rewriting timestamp\n"));
1824         }
1825       while (++tries < 6);
1826     }
1827
1828   return TRUE;
1829 }
1830 \f
1831 /* Note that the namidx for the first symbol is 0.  */
1832
1833 bfd_boolean
1834 _bfd_compute_and_write_armap (arch, elength)
1835      bfd *arch;
1836      unsigned int elength;
1837 {
1838   char *first_name = NULL;
1839   bfd *current;
1840   file_ptr elt_no = 0;
1841   struct orl *map = NULL;
1842   unsigned int orl_max = 1024;          /* fine initial default */
1843   unsigned int orl_count = 0;
1844   int stridx = 0;               /* string index */
1845   asymbol **syms = NULL;
1846   long syms_max = 0;
1847   bfd_boolean ret;
1848   bfd_size_type amt;
1849
1850   /* Dunno if this is the best place for this info...  */
1851   if (elength != 0)
1852     elength += sizeof (struct ar_hdr);
1853   elength += elength % 2;
1854
1855   amt = (bfd_size_type) orl_max * sizeof (struct orl);
1856   map = (struct orl *) bfd_malloc (amt);
1857   if (map == NULL)
1858     goto error_return;
1859
1860   /* We put the symbol names on the arch objalloc, and then discard
1861      them when done.  */
1862   first_name = bfd_alloc (arch, (bfd_size_type) 1);
1863   if (first_name == NULL)
1864     goto error_return;
1865
1866   /* Drop all the files called __.SYMDEF, we're going to make our own.  */
1867   while (arch->archive_head &&
1868          strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
1869     arch->archive_head = arch->archive_head->next;
1870
1871   /* Map over each element.  */
1872   for (current = arch->archive_head;
1873        current != (bfd *) NULL;
1874        current = current->next, elt_no++)
1875     {
1876       if (bfd_check_format (current, bfd_object)
1877           && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
1878         {
1879           long storage;
1880           long symcount;
1881           long src_count;
1882
1883           storage = bfd_get_symtab_upper_bound (current);
1884           if (storage < 0)
1885             goto error_return;
1886
1887           if (storage != 0)
1888             {
1889               if (storage > syms_max)
1890                 {
1891                   if (syms_max > 0)
1892                     free (syms);
1893                   syms_max = storage;
1894                   syms = (asymbol **) bfd_malloc ((bfd_size_type) syms_max);
1895                   if (syms == NULL)
1896                     goto error_return;
1897                 }
1898               symcount = bfd_canonicalize_symtab (current, syms);
1899               if (symcount < 0)
1900                 goto error_return;
1901
1902               /* Now map over all the symbols, picking out the ones we
1903                  want.  */
1904               for (src_count = 0; src_count < symcount; src_count++)
1905                 {
1906                   flagword flags = (syms[src_count])->flags;
1907                   asection *sec = syms[src_count]->section;
1908
1909                   if ((flags & BSF_GLOBAL ||
1910                        flags & BSF_WEAK ||
1911                        flags & BSF_INDIRECT ||
1912                        bfd_is_com_section (sec))
1913                       && ! bfd_is_und_section (sec))
1914                     {
1915                       bfd_size_type namelen;
1916                       struct orl *new_map;
1917
1918                       /* This symbol will go into the archive header.  */
1919                       if (orl_count == orl_max)
1920                         {
1921                           orl_max *= 2;
1922                           amt = (bfd_size_type) orl_max * sizeof (struct orl);
1923                           new_map = (struct orl *) bfd_realloc (map, amt);
1924                           if (new_map == (struct orl *) NULL)
1925                             goto error_return;
1926
1927                           map = new_map;
1928                         }
1929
1930                       namelen = strlen (syms[src_count]->name);
1931                       amt = sizeof (char *);
1932                       map[orl_count].name = (char **) bfd_alloc (arch, amt);
1933                       if (map[orl_count].name == NULL)
1934                         goto error_return;
1935                       *(map[orl_count].name) = bfd_alloc (arch, namelen + 1);
1936                       if (*(map[orl_count].name) == NULL)
1937                         goto error_return;
1938                       strcpy (*(map[orl_count].name), syms[src_count]->name);
1939                       map[orl_count].u.abfd = current;
1940                       map[orl_count].namidx = stridx;
1941
1942                       stridx += namelen + 1;
1943                       ++orl_count;
1944                     }
1945                 }
1946             }
1947
1948           /* Now ask the BFD to free up any cached information, so we
1949              don't fill all of memory with symbol tables.  */
1950           if (! bfd_free_cached_info (current))
1951             goto error_return;
1952         }
1953     }
1954
1955   /* OK, now we have collected all the data, let's write them out.  */
1956   ret = BFD_SEND (arch, write_armap,
1957                   (arch, elength, map, orl_count, stridx));
1958
1959   if (syms_max > 0)
1960     free (syms);
1961   if (map != NULL)
1962     free (map);
1963   if (first_name != NULL)
1964     bfd_release (arch, first_name);
1965
1966   return ret;
1967
1968  error_return:
1969   if (syms_max > 0)
1970     free (syms);
1971   if (map != NULL)
1972     free (map);
1973   if (first_name != NULL)
1974     bfd_release (arch, first_name);
1975
1976   return FALSE;
1977 }
1978
1979 bfd_boolean
1980 bsd_write_armap (arch, elength, map, orl_count, stridx)
1981      bfd *arch;
1982      unsigned int elength;
1983      struct orl *map;
1984      unsigned int orl_count;
1985      int stridx;
1986 {
1987   int padit = stridx & 1;
1988   unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
1989   unsigned int stringsize = stridx + padit;
1990   /* Include 8 bytes to store ranlibsize and stringsize in output.  */
1991   unsigned int mapsize = ranlibsize + stringsize + 8;
1992   file_ptr firstreal;
1993   bfd *current = arch->archive_head;
1994   bfd *last_elt = current;      /* last element arch seen */
1995   bfd_byte temp[4];
1996   unsigned int count;
1997   struct ar_hdr hdr;
1998   struct stat statbuf;
1999   unsigned int i;
2000
2001   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2002
2003   stat (arch->filename, &statbuf);
2004   memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
2005   sprintf (hdr.ar_name, RANLIBMAG);
2006   /* Remember the timestamp, to keep it holy.  But fudge it a little.  */
2007   bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET;
2008   bfd_ardata (arch)->armap_datepos = (SARMAG
2009                                       + offsetof (struct ar_hdr, ar_date[0]));
2010   sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
2011   sprintf (hdr.ar_uid, "%ld", (long) getuid ());
2012   sprintf (hdr.ar_gid, "%ld", (long) getgid ());
2013   sprintf (hdr.ar_size, "%-10d", (int) mapsize);
2014   strncpy (hdr.ar_fmag, ARFMAG, 2);
2015   for (i = 0; i < sizeof (struct ar_hdr); i++)
2016     if (((char *) (&hdr))[i] == '\0')
2017       (((char *) (&hdr))[i]) = ' ';
2018   if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
2019       != sizeof (struct ar_hdr))
2020     return FALSE;
2021   H_PUT_32 (arch, ranlibsize, temp);
2022   if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), arch) != sizeof (temp))
2023     return FALSE;
2024
2025   for (count = 0; count < orl_count; count++)
2026     {
2027       bfd_byte buf[BSD_SYMDEF_SIZE];
2028
2029       if (map[count].u.abfd != last_elt)
2030         {
2031           do
2032             {
2033               firstreal += arelt_size (current) + sizeof (struct ar_hdr);
2034               firstreal += firstreal % 2;
2035               current = current->next;
2036             }
2037           while (current != map[count].u.abfd);
2038         }                       /* if new archive element */
2039
2040       last_elt = current;
2041       H_PUT_32 (arch, map[count].namidx, buf);
2042       H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2043       if (bfd_bwrite (buf, (bfd_size_type) BSD_SYMDEF_SIZE, arch)
2044           != BSD_SYMDEF_SIZE)
2045         return FALSE;
2046     }
2047
2048   /* Now write the strings themselves.  */
2049   H_PUT_32 (arch, stringsize, temp);
2050   if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), arch) != sizeof (temp))
2051     return FALSE;
2052   for (count = 0; count < orl_count; count++)
2053     {
2054       size_t len = strlen (*map[count].name) + 1;
2055
2056       if (bfd_bwrite (*map[count].name, (bfd_size_type) len, arch) != len)
2057         return FALSE;
2058     }
2059
2060   /* The spec sez this should be a newline.  But in order to be
2061      bug-compatible for sun's ar we use a null.  */
2062   if (padit)
2063     {
2064       if (bfd_bwrite ("", (bfd_size_type) 1, arch) != 1)
2065         return FALSE;
2066     }
2067
2068   return TRUE;
2069 }
2070
2071 /* At the end of archive file handling, update the timestamp in the
2072    file, so the linker will accept it.
2073
2074    Return TRUE if the timestamp was OK, or an unusual problem happened.
2075    Return FALSE if we updated the timestamp.  */
2076
2077 bfd_boolean
2078 _bfd_archive_bsd_update_armap_timestamp (arch)
2079      bfd *arch;
2080 {
2081   struct stat archstat;
2082   struct ar_hdr hdr;
2083   unsigned int i;
2084
2085   /* Flush writes, get last-write timestamp from file, and compare it
2086      to the timestamp IN the file.  */
2087   bfd_flush (arch);
2088   if (bfd_stat (arch, &archstat) == -1)
2089     {
2090       bfd_perror (_("Reading archive file mod timestamp"));
2091
2092       /* Can't read mod time for some reason.  */
2093       return TRUE;
2094     }
2095   if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp)
2096     /* OK by the linker's rules.  */
2097     return TRUE;
2098
2099   /* Update the timestamp.  */
2100   bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2101
2102   /* Prepare an ASCII version suitable for writing.  */
2103   memset (hdr.ar_date, 0, sizeof (hdr.ar_date));
2104   sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
2105   for (i = 0; i < sizeof (hdr.ar_date); i++)
2106     if (hdr.ar_date[i] == '\0')
2107       (hdr.ar_date)[i] = ' ';
2108
2109   /* Write it into the file.  */
2110   bfd_ardata (arch)->armap_datepos = (SARMAG
2111                                       + offsetof (struct ar_hdr, ar_date[0]));
2112   if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2113       || (bfd_bwrite (hdr.ar_date, (bfd_size_type) sizeof (hdr.ar_date), arch)
2114           != sizeof (hdr.ar_date)))
2115     {
2116       bfd_perror (_("Writing updated armap timestamp"));
2117
2118       /* Some error while writing.  */
2119       return TRUE;
2120     }
2121
2122   /* We updated the timestamp successfully.  */
2123   return FALSE;
2124 }
2125 \f
2126 /* A coff armap looks like :
2127    lARMAG
2128    struct ar_hdr with name = '/'
2129    number of symbols
2130    offset of file for symbol 0
2131    offset of file for symbol 1
2132
2133    offset of file for symbol n-1
2134    symbol name 0
2135    symbol name 1
2136
2137    symbol name n-1
2138 */
2139
2140 bfd_boolean
2141 coff_write_armap (arch, elength, map, symbol_count, stridx)
2142      bfd *arch;
2143      unsigned int elength;
2144      struct orl *map;
2145      unsigned int symbol_count;
2146      int stridx;
2147 {
2148   /* The size of the ranlib is the number of exported symbols in the
2149      archive * the number of bytes in an int, + an int for the count.  */
2150   unsigned int ranlibsize = (symbol_count * 4) + 4;
2151   unsigned int stringsize = stridx;
2152   unsigned int mapsize = stringsize + ranlibsize;
2153   unsigned int archive_member_file_ptr;
2154   bfd *current = arch->archive_head;
2155   unsigned int count;
2156   struct ar_hdr hdr;
2157   unsigned int i;
2158   int padit = mapsize & 1;
2159
2160   if (padit)
2161     mapsize++;
2162
2163   /* Work out where the first object file will go in the archive.  */
2164   archive_member_file_ptr = (mapsize
2165                              + elength
2166                              + sizeof (struct ar_hdr)
2167                              + SARMAG);
2168
2169   memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
2170   hdr.ar_name[0] = '/';
2171   sprintf (hdr.ar_size, "%-10d", (int) mapsize);
2172   sprintf (hdr.ar_date, "%ld", (long) time (NULL));
2173   /* This, at least, is what Intel coff sets the values to.  */
2174   sprintf ((hdr.ar_uid), "%d", 0);
2175   sprintf ((hdr.ar_gid), "%d", 0);
2176   sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);
2177   strncpy (hdr.ar_fmag, ARFMAG, 2);
2178
2179   for (i = 0; i < sizeof (struct ar_hdr); i++)
2180     if (((char *) (&hdr))[i] == '\0')
2181       (((char *) (&hdr))[i]) = ' ';
2182
2183   /* Write the ar header for this item and the number of symbols.  */
2184
2185   if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
2186       != sizeof (struct ar_hdr))
2187     return FALSE;
2188
2189   if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2190     return FALSE;
2191
2192   /* Two passes, first write the file offsets for each symbol -
2193      remembering that each offset is on a two byte boundary.  */
2194
2195   /* Write out the file offset for the file associated with each
2196      symbol, and remember to keep the offsets padded out.  */
2197
2198   current = arch->archive_head;
2199   count = 0;
2200   while (current != (bfd *) NULL && count < symbol_count)
2201     {
2202       /* For each symbol which is used defined in this object, write
2203          out the object file's address in the archive.  */
2204
2205       while (count < symbol_count && map[count].u.abfd == current)
2206         {
2207           if (!bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr))
2208             return FALSE;
2209           count++;
2210         }
2211       /* Add size of this archive entry.  */
2212       archive_member_file_ptr += (arelt_size (current)
2213                                   + sizeof (struct ar_hdr));
2214       /* Remember aboout the even alignment.  */
2215       archive_member_file_ptr += archive_member_file_ptr % 2;
2216       current = current->next;
2217     }
2218
2219   /* Now write the strings themselves.  */
2220   for (count = 0; count < symbol_count; count++)
2221     {
2222       size_t len = strlen (*map[count].name) + 1;
2223
2224       if (bfd_bwrite (*map[count].name, (bfd_size_type) len, arch) != len)
2225         return FALSE;
2226     }
2227
2228   /* The spec sez this should be a newline.  But in order to be
2229      bug-compatible for arc960 we use a null.  */
2230   if (padit)
2231     {
2232       if (bfd_bwrite ("", (bfd_size_type) 1, arch) != 1)
2233         return FALSE;
2234     }
2235
2236   return TRUE;
2237 }