OSDN Git Service

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