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