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