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