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