Home | History | Annotate | Download | only in bfd
      1 /* BFD back-end for archive files (libraries).
      2    Copyright (C) 1990-2014 Free Software Foundation, Inc.
      3    Written by Cygnus Support.  Mostly Gumby Henkel-Wallace's fault.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     20 
     21 /*
     22 @setfilename archive-info
     23 SECTION
     24 	Archives
     25 
     26 DESCRIPTION
     27 	An archive (or library) is just another BFD.  It has a symbol
     28 	table, although there's not much a user program will do with it.
     29 
     30 	The big difference between an archive BFD and an ordinary BFD
     31 	is that the archive doesn't have sections.  Instead it has a
     32 	chain of BFDs that are considered its contents.  These BFDs can
     33 	be manipulated like any other.  The BFDs contained in an
     34 	archive opened for reading will all be opened for reading.  You
     35 	may put either input or output BFDs into an archive opened for
     36 	output; they will be handled correctly when the archive is closed.
     37 
     38 	Use <<bfd_openr_next_archived_file>> to step through
     39 	the contents of an archive opened for input.  You don't
     40 	have to read the entire archive if you don't want
     41 	to!  Read it until you find what you want.
     42 
     43 	A BFD returned by <<bfd_openr_next_archived_file>> can be
     44 	closed manually with <<bfd_close>>.  If you do not close it,
     45 	then a second iteration through the members of an archive may
     46 	return the same BFD.  If you close the archive BFD, then all
     47 	the member BFDs will automatically be closed as well.
     48 
     49 	Archive contents of output BFDs are chained through the
     50 	<<archive_next>> pointer in a BFD.  The first one is findable
     51 	through the <<archive_head>> slot of the archive.  Set it with
     52 	<<bfd_set_archive_head>> (q.v.).  A given BFD may be in only
     53 	one open output archive at a time.
     54 
     55 	As expected, the BFD archive code is more general than the
     56 	archive code of any given environment.  BFD archives may
     57 	contain files of different formats (e.g., a.out and coff) and
     58 	even different architectures.  You may even place archives
     59 	recursively into archives!
     60 
     61 	This can cause unexpected confusion, since some archive
     62 	formats are more expressive than others.  For instance, Intel
     63 	COFF archives can preserve long filenames; SunOS a.out archives
     64 	cannot.  If you move a file from the first to the second
     65 	format and back again, the filename may be truncated.
     66 	Likewise, different a.out environments have different
     67 	conventions as to how they truncate filenames, whether they
     68 	preserve directory names in filenames, etc.  When
     69 	interoperating with native tools, be sure your files are
     70 	homogeneous.
     71 
     72 	Beware: most of these formats do not react well to the
     73 	presence of spaces in filenames.  We do the best we can, but
     74 	can't always handle this case due to restrictions in the format of
     75 	archives.  Many Unix utilities are braindead in regards to
     76 	spaces and such in filenames anyway, so this shouldn't be much
     77 	of a restriction.
     78 
     79 	Archives are supported in BFD in <<archive.c>>.
     80 
     81 SUBSECTION
     82 	Archive functions
     83 */
     84 
     85 /* Assumes:
     86    o - all archive elements start on an even boundary, newline padded;
     87    o - all arch headers are char *;
     88    o - all arch headers are the same size (across architectures).
     89 */
     90 
     91 /* Some formats provide a way to cram a long filename into the short
     92    (16 chars) space provided by a BSD archive.  The trick is: make a
     93    special "file" in the front of the archive, sort of like the SYMDEF
     94    entry.  If the filename is too long to fit, put it in the extended
     95    name table, and use its index as the filename.  To prevent
     96    confusion prepend the index with a space.  This means you can't
     97    have filenames that start with a space, but then again, many Unix
     98    utilities can't handle that anyway.
     99 
    100    This scheme unfortunately requires that you stand on your head in
    101    order to write an archive since you need to put a magic file at the
    102    front, and need to touch every entry to do so.  C'est la vie.
    103 
    104    We support two variants of this idea:
    105    The SVR4 format (extended name table is named "//"),
    106    and an extended pseudo-BSD variant (extended name table is named
    107    "ARFILENAMES/").  The origin of the latter format is uncertain.
    108 
    109    BSD 4.4 uses a third scheme:  It writes a long filename
    110    directly after the header.  This allows 'ar q' to work.
    111 */
    112 
    113 /* Summary of archive member names:
    114 
    115  Symbol table (must be first):
    116  "__.SYMDEF       " - Symbol table, Berkeley style, produced by ranlib.
    117  "/               " - Symbol table, system 5 style.
    118 
    119  Long name table (must be before regular file members):
    120  "//              " - Long name table, System 5 R4 style.
    121  "ARFILENAMES/    " - Long name table, non-standard extended BSD (not BSD 4.4).
    122 
    123  Regular file members with short names:
    124  "filename.o/     " - Regular file, System 5 style (embedded spaces ok).
    125  "filename.o      " - Regular file, Berkeley style (no embedded spaces).
    126 
    127  Regular files with long names (or embedded spaces, for BSD variants):
    128  "/18             " - SVR4 style, name at offset 18 in name table.
    129  "#1/23           " - Long name (or embedded spaces) 23 characters long,
    130 		      BSD 4.4 style, full name follows header.
    131  " 18             " - Long name 18 characters long, extended pseudo-BSD.
    132  */
    133 
    134 #include "sysdep.h"
    135 #include "bfd.h"
    136 #include "libiberty.h"
    137 #include "libbfd.h"
    138 #include "aout/ar.h"
    139 #include "aout/ranlib.h"
    140 #include "safe-ctype.h"
    141 #include "hashtab.h"
    142 #include "filenames.h"
    143 #include "bfdlink.h"
    144 
    145 #ifndef errno
    146 extern int errno;
    147 #endif
    148 
    149 /* We keep a cache of archive filepointers to archive elements to
    150    speed up searching the archive by filepos.  We only add an entry to
    151    the cache when we actually read one.  We also don't sort the cache;
    152    it's generally short enough to search linearly.
    153    Note that the pointers here point to the front of the ar_hdr, not
    154    to the front of the contents!  */
    155 struct ar_cache
    156 {
    157   file_ptr ptr;
    158   bfd *arbfd;
    159 };
    160 
    161 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
    162 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
    163 
    164 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
    165 #define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header)
    166 
    167 /* True iff NAME designated a BSD 4.4 extended name.  */
    168 
    169 #define is_bsd44_extended_name(NAME) \
    170   (NAME[0] == '#'  && NAME[1] == '1' && NAME[2] == '/' && ISDIGIT (NAME[3]))
    171 
    172 void
    174 _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
    175 {
    176   static char buf[20];
    177   size_t len;
    178 
    179   snprintf (buf, sizeof (buf), fmt, val);
    180   len = strlen (buf);
    181   if (len < n)
    182     {
    183       memcpy (p, buf, len);
    184       memset (p + len, ' ', n - len);
    185     }
    186   else
    187     memcpy (p, buf, n);
    188 }
    189 
    190 bfd_boolean
    191 _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
    192 {
    193   static char buf[21];
    194   size_t len;
    195 
    196   snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
    197   len = strlen (buf);
    198   if (len > n)
    199     {
    200       bfd_set_error (bfd_error_file_too_big);
    201       return FALSE;
    202     }
    203   if (len < n)
    204     {
    205       memcpy (p, buf, len);
    206       memset (p + len, ' ', n - len);
    207     }
    208   else
    209     memcpy (p, buf, n);
    210   return TRUE;
    211 }
    212 
    213 bfd_boolean
    215 _bfd_generic_mkarchive (bfd *abfd)
    216 {
    217   bfd_size_type amt = sizeof (struct artdata);
    218 
    219   abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
    220   if (bfd_ardata (abfd) == NULL)
    221     return FALSE;
    222 
    223   /* Already cleared by bfd_zalloc above.
    224      bfd_ardata (abfd)->cache = NULL;
    225      bfd_ardata (abfd)->archive_head = NULL;
    226      bfd_ardata (abfd)->symdefs = NULL;
    227      bfd_ardata (abfd)->extended_names = NULL;
    228      bfd_ardata (abfd)->extended_names_size = 0;
    229      bfd_ardata (abfd)->tdata = NULL;  */
    230 
    231   return TRUE;
    232 }
    233 
    234 /*
    235 FUNCTION
    236 	bfd_get_next_mapent
    237 
    238 SYNOPSIS
    239 	symindex bfd_get_next_mapent
    240 	  (bfd *abfd, symindex previous, carsym **sym);
    241 
    242 DESCRIPTION
    243 	Step through archive @var{abfd}'s symbol table (if it
    244 	has one).  Successively update @var{sym} with the next symbol's
    245 	information, returning that symbol's (internal) index into the
    246 	symbol table.
    247 
    248 	Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
    249 	the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
    250 	got the last one.
    251 
    252 	A <<carsym>> is a canonical archive symbol.  The only
    253 	user-visible element is its name, a null-terminated string.
    254 */
    255 
    256 symindex
    257 bfd_get_next_mapent (bfd *abfd, symindex prev, carsym **entry)
    258 {
    259   if (!bfd_has_map (abfd))
    260     {
    261       bfd_set_error (bfd_error_invalid_operation);
    262       return BFD_NO_MORE_SYMBOLS;
    263     }
    264 
    265   if (prev == BFD_NO_MORE_SYMBOLS)
    266     prev = 0;
    267   else
    268     ++prev;
    269   if (prev >= bfd_ardata (abfd)->symdef_count)
    270     return BFD_NO_MORE_SYMBOLS;
    271 
    272   *entry = (bfd_ardata (abfd)->symdefs + prev);
    273   return prev;
    274 }
    275 
    276 /* To be called by backends only.  */
    277 
    278 bfd *
    279 _bfd_create_empty_archive_element_shell (bfd *obfd)
    280 {
    281   return _bfd_new_bfd_contained_in (obfd);
    282 }
    283 
    284 /*
    285 FUNCTION
    286 	bfd_set_archive_head
    287 
    288 SYNOPSIS
    289 	bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
    290 
    291 DESCRIPTION
    292 	Set the head of the chain of
    293 	BFDs contained in the archive @var{output} to @var{new_head}.
    294 */
    295 
    296 bfd_boolean
    297 bfd_set_archive_head (bfd *output_archive, bfd *new_head)
    298 {
    299   output_archive->archive_head = new_head;
    300   return TRUE;
    301 }
    302 
    303 bfd *
    304 _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
    305 {
    306   htab_t hash_table = bfd_ardata (arch_bfd)->cache;
    307   struct ar_cache m;
    308 
    309   m.ptr = filepos;
    310 
    311   if (hash_table)
    312     {
    313       struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m);
    314       if (!entry)
    315 	return NULL;
    316       else
    317 	return entry->arbfd;
    318     }
    319   else
    320     return NULL;
    321 }
    322 
    323 static hashval_t
    324 hash_file_ptr (const void * p)
    325 {
    326   return (hashval_t) (((struct ar_cache *) p)->ptr);
    327 }
    328 
    329 /* Returns non-zero if P1 and P2 are equal.  */
    330 
    331 static int
    332 eq_file_ptr (const void * p1, const void * p2)
    333 {
    334   struct ar_cache *arc1 = (struct ar_cache *) p1;
    335   struct ar_cache *arc2 = (struct ar_cache *) p2;
    336   return arc1->ptr == arc2->ptr;
    337 }
    338 
    339 /* The calloc function doesn't always take size_t (e.g. on VMS)
    340    so wrap it to avoid a compile time warning.   */
    341 
    342 static void *
    343 _bfd_calloc_wrapper (size_t a, size_t b)
    344 {
    345   return calloc (a, b);
    346 }
    347 
    348 /* Kind of stupid to call cons for each one, but we don't do too many.  */
    349 
    350 bfd_boolean
    351 _bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt)
    352 {
    353   struct ar_cache *cache;
    354   htab_t hash_table = bfd_ardata (arch_bfd)->cache;
    355 
    356   /* If the hash table hasn't been created, create it.  */
    357   if (hash_table == NULL)
    358     {
    359       hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr,
    360 				      NULL, _bfd_calloc_wrapper, free);
    361       if (hash_table == NULL)
    362 	return FALSE;
    363       bfd_ardata (arch_bfd)->cache = hash_table;
    364     }
    365 
    366   /* Insert new_elt into the hash table by filepos.  */
    367   cache = (struct ar_cache *) bfd_zalloc (arch_bfd, sizeof (struct ar_cache));
    368   cache->ptr = filepos;
    369   cache->arbfd = new_elt;
    370   *htab_find_slot (hash_table, (const void *) cache, INSERT) = cache;
    371 
    372   /* Provide a means of accessing this from child.  */
    373   arch_eltdata (new_elt)->parent_cache = hash_table;
    374   arch_eltdata (new_elt)->key = filepos;
    375 
    376   return TRUE;
    377 }
    378 
    379 static bfd *
    381 _bfd_find_nested_archive (bfd *arch_bfd, const char *filename)
    382 {
    383   bfd *abfd;
    384   const char *target;
    385 
    386   /* PR 15140: Don't allow a nested archive pointing to itself.  */
    387   if (filename_cmp (filename, arch_bfd->filename) == 0)
    388     {
    389       bfd_set_error (bfd_error_malformed_archive);
    390       return NULL;
    391     }
    392 
    393   for (abfd = arch_bfd->nested_archives;
    394        abfd != NULL;
    395        abfd = abfd->archive_next)
    396     {
    397       if (filename_cmp (filename, abfd->filename) == 0)
    398 	return abfd;
    399     }
    400   target = NULL;
    401   if (!arch_bfd->target_defaulted)
    402     target = arch_bfd->xvec->name;
    403   abfd = bfd_openr (filename, target);
    404   if (abfd)
    405     {
    406       abfd->archive_next = arch_bfd->nested_archives;
    407       arch_bfd->nested_archives = abfd;
    408     }
    409   return abfd;
    410 }
    411 
    412 /* The name begins with space.  Hence the rest of the name is an index into
    413    the string table.  */
    414 
    415 static char *
    416 get_extended_arelt_filename (bfd *arch, const char *name, file_ptr *originp)
    417 {
    418   unsigned long table_index = 0;
    419   const char *endp;
    420 
    421   /* Should extract string so that I can guarantee not to overflow into
    422      the next region, but I'm too lazy.  */
    423   errno = 0;
    424   /* Skip first char, which is '/' in SVR4 or ' ' in some other variants.  */
    425   table_index = strtol (name + 1, (char **) &endp, 10);
    426   if (errno != 0 || table_index >= bfd_ardata (arch)->extended_names_size)
    427     {
    428       bfd_set_error (bfd_error_malformed_archive);
    429       return NULL;
    430     }
    431   /* In a thin archive, a member of an archive-within-an-archive
    432      will have the offset in the inner archive encoded here.  */
    433   if (bfd_is_thin_archive (arch) && endp != NULL && *endp == ':')
    434     {
    435       file_ptr origin = strtol (endp + 1, NULL, 10);
    436 
    437       if (errno != 0)
    438 	{
    439 	  bfd_set_error (bfd_error_malformed_archive);
    440 	  return NULL;
    441 	}
    442       *originp = origin;
    443     }
    444   else
    445     *originp = 0;
    446 
    447   return bfd_ardata (arch)->extended_names + table_index;
    448 }
    449 
    450 /* This functions reads an arch header and returns an areltdata pointer, or
    451    NULL on error.
    452 
    453    Presumes the file pointer is already in the right place (ie pointing
    454    to the ar_hdr in the file).   Moves the file pointer; on success it
    455    should be pointing to the front of the file contents; on failure it
    456    could have been moved arbitrarily.  */
    457 
    458 void *
    459 _bfd_generic_read_ar_hdr (bfd *abfd)
    460 {
    461   return _bfd_generic_read_ar_hdr_mag (abfd, NULL);
    462 }
    463 
    464 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a
    465    variant of _bfd_generic_read_ar_hdr which accepts a magic string.  */
    466 
    467 void *
    468 _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
    469 {
    470   struct ar_hdr hdr;
    471   char *hdrp = (char *) &hdr;
    472   bfd_size_type parsed_size;
    473   struct areltdata *ared;
    474   char *filename = NULL;
    475   bfd_size_type namelen = 0;
    476   bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
    477   char *allocptr = 0;
    478   file_ptr origin = 0;
    479   unsigned int extra_size = 0;
    480   char fmag_save;
    481   int scan;
    482 
    483   if (bfd_bread (hdrp, sizeof (struct ar_hdr), abfd) != sizeof (struct ar_hdr))
    484     {
    485       if (bfd_get_error () != bfd_error_system_call)
    486 	bfd_set_error (bfd_error_no_more_archived_files);
    487       return NULL;
    488     }
    489   if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
    490       && (mag == NULL
    491 	  || strncmp (hdr.ar_fmag, mag, 2) != 0))
    492     {
    493       bfd_set_error (bfd_error_malformed_archive);
    494       return NULL;
    495     }
    496 
    497   errno = 0;
    498   fmag_save = hdr.ar_fmag[0];
    499   hdr.ar_fmag[0] = 0;
    500   scan = sscanf (hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size);
    501   hdr.ar_fmag[0] = fmag_save;
    502   if (scan != 1)
    503     {
    504       bfd_set_error (bfd_error_malformed_archive);
    505       return NULL;
    506     }
    507 
    508   /* Extract the filename from the archive - there are two ways to
    509      specify an extended name table, either the first char of the
    510      name is a space, or it's a slash.  */
    511   if ((hdr.ar_name[0] == '/'
    512        || (hdr.ar_name[0] == ' '
    513 	   && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
    514       && bfd_ardata (abfd)->extended_names != NULL)
    515     {
    516       filename = get_extended_arelt_filename (abfd, hdr.ar_name, &origin);
    517       if (filename == NULL)
    518 	return NULL;
    519     }
    520   /* BSD4.4-style long filename.  */
    521   else if (is_bsd44_extended_name (hdr.ar_name))
    522     {
    523       /* BSD-4.4 extended name */
    524       namelen = atoi (&hdr.ar_name[3]);
    525       allocsize += namelen + 1;
    526       parsed_size -= namelen;
    527       extra_size = namelen;
    528 
    529       allocptr = (char *) bfd_zmalloc (allocsize);
    530       if (allocptr == NULL)
    531 	return NULL;
    532       filename = (allocptr
    533 		  + sizeof (struct areltdata)
    534 		  + sizeof (struct ar_hdr));
    535       if (bfd_bread (filename, namelen, abfd) != namelen)
    536 	{
    537 	  free (allocptr);
    538 	  if (bfd_get_error () != bfd_error_system_call)
    539 	    bfd_set_error (bfd_error_no_more_archived_files);
    540 	  return NULL;
    541 	}
    542       filename[namelen] = '\0';
    543     }
    544   else
    545     {
    546       /* We judge the end of the name by looking for '/' or ' '.
    547 	 Note:  The SYSV format (terminated by '/') allows embedded
    548 	 spaces, so only look for ' ' if we don't find '/'.  */
    549 
    550       char *e;
    551       e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
    552       if (e == NULL)
    553 	{
    554 	  e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
    555 	  if (e == NULL)
    556 	    e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
    557 	}
    558 
    559       if (e != NULL)
    560 	namelen = e - hdr.ar_name;
    561       else
    562 	{
    563 	  /* If we didn't find a termination character, then the name
    564 	     must be the entire field.  */
    565 	  namelen = ar_maxnamelen (abfd);
    566 	}
    567 
    568       allocsize += namelen + 1;
    569     }
    570 
    571   if (!allocptr)
    572     {
    573       allocptr = (char *) bfd_zmalloc (allocsize);
    574       if (allocptr == NULL)
    575 	return NULL;
    576     }
    577 
    578   ared = (struct areltdata *) allocptr;
    579 
    580   ared->arch_header = allocptr + sizeof (struct areltdata);
    581   memcpy (ared->arch_header, &hdr, sizeof (struct ar_hdr));
    582   ared->parsed_size = parsed_size;
    583   ared->extra_size = extra_size;
    584   ared->origin = origin;
    585 
    586   if (filename != NULL)
    587     ared->filename = filename;
    588   else
    589     {
    590       ared->filename = allocptr + (sizeof (struct areltdata) +
    591 				   sizeof (struct ar_hdr));
    592       if (namelen)
    593 	memcpy (ared->filename, hdr.ar_name, namelen);
    594       ared->filename[namelen] = '\0';
    595     }
    596 
    597   return ared;
    598 }
    599 
    600 /* Append the relative pathname for a member of the thin archive
    602    to the pathname of the directory containing the archive.  */
    603 
    604 char *
    605 _bfd_append_relative_path (bfd *arch, char *elt_name)
    606 {
    607   const char *arch_name = arch->filename;
    608   const char *base_name = lbasename (arch_name);
    609   size_t prefix_len;
    610   char *filename;
    611 
    612   if (base_name == arch_name)
    613     return elt_name;
    614 
    615   prefix_len = base_name - arch_name;
    616   filename = (char *) bfd_alloc (arch, prefix_len + strlen (elt_name) + 1);
    617   if (filename == NULL)
    618     return NULL;
    619 
    620   strncpy (filename, arch_name, prefix_len);
    621   strcpy (filename + prefix_len, elt_name);
    622   return filename;
    623 }
    624 
    625 /* This is an internal function; it's mainly used when indexing
    626    through the archive symbol table, but also used to get the next
    627    element, since it handles the bookkeeping so nicely for us.  */
    628 
    629 bfd *
    630 _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
    631 {
    632   struct areltdata *new_areldata;
    633   bfd *n_nfd;
    634   char *filename;
    635 
    636   n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
    637   if (n_nfd)
    638     return n_nfd;
    639 
    640   if (0 > bfd_seek (archive, filepos, SEEK_SET))
    641     return NULL;
    642 
    643   if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
    644     return NULL;
    645 
    646   filename = new_areldata->filename;
    647 
    648   if (bfd_is_thin_archive (archive))
    649     {
    650       const char *target;
    651 
    652       /* This is a proxy entry for an external file.  */
    653       if (! IS_ABSOLUTE_PATH (filename))
    654 	{
    655 	  filename = _bfd_append_relative_path (archive, filename);
    656 	  if (filename == NULL)
    657 	    {
    658 	      free (new_areldata);
    659 	      return NULL;
    660 	    }
    661 	}
    662 
    663       if (new_areldata->origin > 0)
    664 	{
    665 	  /* This proxy entry refers to an element of a nested archive.
    666 	     Locate the member of that archive and return a bfd for it.  */
    667 	  bfd *ext_arch = _bfd_find_nested_archive (archive, filename);
    668 
    669 	  if (ext_arch == NULL
    670 	      || ! bfd_check_format (ext_arch, bfd_archive))
    671 	    {
    672 	      free (new_areldata);
    673 	      return NULL;
    674 	    }
    675 	  n_nfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
    676 	  if (n_nfd == NULL)
    677 	    {
    678 	      free (new_areldata);
    679 	      return NULL;
    680 	    }
    681 	  n_nfd->proxy_origin = bfd_tell (archive);
    682 	  return n_nfd;
    683 	}
    684       /* It's not an element of a nested archive;
    685 	 open the external file as a bfd.  */
    686       target = NULL;
    687       if (!archive->target_defaulted)
    688 	target = archive->xvec->name;
    689       n_nfd = bfd_openr (filename, target);
    690       if (n_nfd == NULL)
    691 	bfd_set_error (bfd_error_malformed_archive);
    692     }
    693   else
    694     {
    695       n_nfd = _bfd_create_empty_archive_element_shell (archive);
    696     }
    697 
    698   if (n_nfd == NULL)
    699     {
    700       free (new_areldata);
    701       return NULL;
    702     }
    703 
    704   n_nfd->proxy_origin = bfd_tell (archive);
    705 
    706   if (bfd_is_thin_archive (archive))
    707     {
    708       n_nfd->origin = 0;
    709     }
    710   else
    711     {
    712       n_nfd->origin = n_nfd->proxy_origin;
    713       n_nfd->filename = xstrdup (filename);
    714     }
    715 
    716   n_nfd->arelt_data = new_areldata;
    717 
    718   /* Copy BFD_COMPRESS and BFD_DECOMPRESS flags.  */
    719   n_nfd->flags |= archive->flags & (BFD_COMPRESS | BFD_DECOMPRESS);
    720 
    721   if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
    722     return n_nfd;
    723 
    724   free (new_areldata);
    725   n_nfd->arelt_data = NULL;
    726   return NULL;
    727 }
    728 
    729 /* Return the BFD which is referenced by the symbol in ABFD indexed by
    730    SYM_INDEX.  SYM_INDEX should have been returned by bfd_get_next_mapent.  */
    731 
    732 bfd *
    733 _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index)
    734 {
    735   carsym *entry;
    736 
    737   entry = bfd_ardata (abfd)->symdefs + sym_index;
    738   return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
    739 }
    740 
    741 /*
    742 FUNCTION
    743 	bfd_openr_next_archived_file
    744 
    745 SYNOPSIS
    746 	bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
    747 
    748 DESCRIPTION
    749 	Provided a BFD, @var{archive}, containing an archive and NULL, open
    750 	an input BFD on the first contained element and returns that.
    751 	Subsequent calls should pass
    752 	the archive and the previous return value to return a created
    753 	BFD to the next contained element. NULL is returned when there
    754 	are no more.
    755 */
    756 
    757 bfd *
    758 bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
    759 {
    760   if ((bfd_get_format (archive) != bfd_archive)
    761       || (archive->direction == write_direction))
    762     {
    763       bfd_set_error (bfd_error_invalid_operation);
    764       return NULL;
    765     }
    766 
    767   return BFD_SEND (archive,
    768 		   openr_next_archived_file, (archive, last_file));
    769 }
    770 
    771 bfd *
    772 bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
    773 {
    774   file_ptr filestart;
    775 
    776   if (!last_file)
    777     filestart = bfd_ardata (archive)->first_file_filepos;
    778   else
    779     {
    780       bfd_size_type size = arelt_size (last_file);
    781 
    782       filestart = last_file->proxy_origin;
    783       if (! bfd_is_thin_archive (archive))
    784 	filestart += size;
    785       /* Pad to an even boundary...
    786 	 Note that last_file->origin can be odd in the case of
    787 	 BSD-4.4-style element with a long odd size.  */
    788       filestart += filestart % 2;
    789     }
    790 
    791   return _bfd_get_elt_at_filepos (archive, filestart);
    792 }
    793 
    794 const bfd_target *
    795 bfd_generic_archive_p (bfd *abfd)
    796 {
    797   struct artdata *tdata_hold;
    798   char armag[SARMAG + 1];
    799   bfd_size_type amt;
    800 
    801   if (bfd_bread (armag, SARMAG, abfd) != SARMAG)
    802     {
    803       if (bfd_get_error () != bfd_error_system_call)
    804 	bfd_set_error (bfd_error_wrong_format);
    805       return NULL;
    806     }
    807 
    808   bfd_is_thin_archive (abfd) = (strncmp (armag, ARMAGT, SARMAG) == 0);
    809 
    810   if (strncmp (armag, ARMAG, SARMAG) != 0
    811       && strncmp (armag, ARMAGB, SARMAG) != 0
    812       && ! bfd_is_thin_archive (abfd))
    813     return NULL;
    814 
    815   tdata_hold = bfd_ardata (abfd);
    816 
    817   amt = sizeof (struct artdata);
    818   bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
    819   if (bfd_ardata (abfd) == NULL)
    820     {
    821       bfd_ardata (abfd) = tdata_hold;
    822       return NULL;
    823     }
    824 
    825   bfd_ardata (abfd)->first_file_filepos = SARMAG;
    826   /* Cleared by bfd_zalloc above.
    827      bfd_ardata (abfd)->cache = NULL;
    828      bfd_ardata (abfd)->archive_head = NULL;
    829      bfd_ardata (abfd)->symdefs = NULL;
    830      bfd_ardata (abfd)->extended_names = NULL;
    831      bfd_ardata (abfd)->extended_names_size = 0;
    832      bfd_ardata (abfd)->tdata = NULL;  */
    833 
    834   if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
    835       || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
    836     {
    837       if (bfd_get_error () != bfd_error_system_call)
    838 	bfd_set_error (bfd_error_wrong_format);
    839       bfd_release (abfd, bfd_ardata (abfd));
    840       bfd_ardata (abfd) = tdata_hold;
    841       return NULL;
    842     }
    843 
    844   if (abfd->target_defaulted && bfd_has_map (abfd))
    845     {
    846       bfd *first;
    847 
    848       /* This archive has a map, so we may presume that the contents
    849 	 are object files.  Make sure that if the first file in the
    850 	 archive can be recognized as an object file, it is for this
    851 	 target.  If not, assume that this is the wrong format.  If
    852 	 the first file is not an object file, somebody is doing
    853 	 something weird, and we permit it so that ar -t will work.
    854 
    855 	 This is done because any normal format will recognize any
    856 	 normal archive, regardless of the format of the object files.
    857 	 We do accept an empty archive.  */
    858 
    859       first = bfd_openr_next_archived_file (abfd, NULL);
    860       if (first != NULL)
    861 	{
    862 	  first->target_defaulted = FALSE;
    863 	  if (bfd_check_format (first, bfd_object)
    864 	      && first->xvec != abfd->xvec)
    865 	    bfd_set_error (bfd_error_wrong_object_format);
    866 	  /* And we ought to close `first' here too.  */
    867 	}
    868     }
    869 
    870   return abfd->xvec;
    871 }
    872 
    873 /* Some constants for a 32 bit BSD archive structure.  We do not
    874    support 64 bit archives presently; so far as I know, none actually
    875    exist.  Supporting them would require changing these constants, and
    876    changing some H_GET_32 to H_GET_64.  */
    877 
    878 /* The size of an external symdef structure.  */
    879 #define BSD_SYMDEF_SIZE 8
    880 
    881 /* The offset from the start of a symdef structure to the file offset.  */
    882 #define BSD_SYMDEF_OFFSET_SIZE 4
    883 
    884 /* The size of the symdef count.  */
    885 #define BSD_SYMDEF_COUNT_SIZE 4
    886 
    887 /* The size of the string count.  */
    888 #define BSD_STRING_COUNT_SIZE 4
    889 
    890 /* Read a BSD-style archive symbol table.  Returns FALSE on error,
    891    TRUE otherwise.  */
    892 
    893 static bfd_boolean
    894 do_slurp_bsd_armap (bfd *abfd)
    895 {
    896   struct areltdata *mapdata;
    897   unsigned int counter;
    898   bfd_byte *raw_armap, *rbase;
    899   struct artdata *ardata = bfd_ardata (abfd);
    900   char *stringbase;
    901   bfd_size_type parsed_size, amt;
    902   carsym *set;
    903 
    904   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
    905   if (mapdata == NULL)
    906     return FALSE;
    907   parsed_size = mapdata->parsed_size;
    908   free (mapdata);
    909 
    910   raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
    911   if (raw_armap == NULL)
    912     return FALSE;
    913 
    914   if (bfd_bread (raw_armap, parsed_size, abfd) != parsed_size)
    915     {
    916       if (bfd_get_error () != bfd_error_system_call)
    917 	bfd_set_error (bfd_error_malformed_archive);
    918     byebye:
    919       bfd_release (abfd, raw_armap);
    920       return FALSE;
    921     }
    922 
    923   ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
    924 
    925   if (ardata->symdef_count * BSD_SYMDEF_SIZE >
    926       parsed_size - BSD_SYMDEF_COUNT_SIZE)
    927     {
    928       /* Probably we're using the wrong byte ordering.  */
    929       bfd_set_error (bfd_error_wrong_format);
    930       goto byebye;
    931     }
    932 
    933   ardata->cache = 0;
    934   rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
    935   stringbase = ((char *) rbase
    936 		+ ardata->symdef_count * BSD_SYMDEF_SIZE
    937 		+ BSD_STRING_COUNT_SIZE);
    938   amt = ardata->symdef_count * sizeof (carsym);
    939   ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
    940   if (!ardata->symdefs)
    941     return FALSE;
    942 
    943   for (counter = 0, set = ardata->symdefs;
    944        counter < ardata->symdef_count;
    945        counter++, set++, rbase += BSD_SYMDEF_SIZE)
    946     {
    947       set->name = H_GET_32 (abfd, rbase) + stringbase;
    948       set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
    949     }
    950 
    951   ardata->first_file_filepos = bfd_tell (abfd);
    952   /* Pad to an even boundary if you have to.  */
    953   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
    954   /* FIXME, we should provide some way to free raw_ardata when
    955      we are done using the strings from it.  For now, it seems
    956      to be allocated on an objalloc anyway...  */
    957   bfd_has_map (abfd) = TRUE;
    958   return TRUE;
    959 }
    960 
    961 /* Read a COFF archive symbol table.  Returns FALSE on error, TRUE
    962    otherwise.  */
    963 
    964 static bfd_boolean
    965 do_slurp_coff_armap (bfd *abfd)
    966 {
    967   struct areltdata *mapdata;
    968   int *raw_armap, *rawptr;
    969   struct artdata *ardata = bfd_ardata (abfd);
    970   char *stringbase;
    971   bfd_size_type stringsize;
    972   bfd_size_type parsed_size;
    973   carsym *carsyms;
    974   bfd_size_type nsymz;		/* Number of symbols in armap.  */
    975   bfd_vma (*swap) (const void *);
    976   char int_buf[sizeof (long)];
    977   bfd_size_type carsym_size, ptrsize;
    978   unsigned int i;
    979 
    980   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
    981   if (mapdata == NULL)
    982     return FALSE;
    983   parsed_size = mapdata->parsed_size;
    984   free (mapdata);
    985 
    986   if (bfd_bread (int_buf, 4, abfd) != 4)
    987     {
    988       if (bfd_get_error () != bfd_error_system_call)
    989 	bfd_set_error (bfd_error_malformed_archive);
    990       return FALSE;
    991     }
    992   /* It seems that all numeric information in a coff archive is always
    993      in big endian format, nomatter the host or target.  */
    994   swap = bfd_getb32;
    995   nsymz = bfd_getb32 (int_buf);
    996   stringsize = parsed_size - (4 * nsymz) - 4;
    997 
    998   /* ... except that some archive formats are broken, and it may be our
    999      fault - the i960 little endian coff sometimes has big and sometimes
   1000      little, because our tools changed.  Here's a horrible hack to clean
   1001      up the crap.  */
   1002 
   1003   if (stringsize > 0xfffff
   1004       && bfd_get_arch (abfd) == bfd_arch_i960
   1005       && bfd_get_flavour (abfd) == bfd_target_coff_flavour)
   1006     {
   1007       /* This looks dangerous, let's do it the other way around.  */
   1008       nsymz = bfd_getl32 (int_buf);
   1009       stringsize = parsed_size - (4 * nsymz) - 4;
   1010       swap = bfd_getl32;
   1011     }
   1012 
   1013   /* The coff armap must be read sequentially.  So we construct a
   1014      bsd-style one in core all at once, for simplicity.  */
   1015 
   1016   if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym))
   1017     return FALSE;
   1018 
   1019   carsym_size = (nsymz * sizeof (carsym));
   1020   ptrsize = (4 * nsymz);
   1021 
   1022   if (carsym_size + stringsize + 1 <= carsym_size)
   1023     return FALSE;
   1024 
   1025   ardata->symdefs = (struct carsym *) bfd_zalloc (abfd,
   1026 						  carsym_size + stringsize + 1);
   1027   if (ardata->symdefs == NULL)
   1028     return FALSE;
   1029   carsyms = ardata->symdefs;
   1030   stringbase = ((char *) ardata->symdefs) + carsym_size;
   1031 
   1032   /* Allocate and read in the raw offsets.  */
   1033   raw_armap = (int *) bfd_alloc (abfd, ptrsize);
   1034   if (raw_armap == NULL)
   1035     goto release_symdefs;
   1036   if (bfd_bread (raw_armap, ptrsize, abfd) != ptrsize
   1037       || (bfd_bread (stringbase, stringsize, abfd) != stringsize))
   1038     {
   1039       if (bfd_get_error () != bfd_error_system_call)
   1040 	bfd_set_error (bfd_error_malformed_archive);
   1041       goto release_raw_armap;
   1042     }
   1043 
   1044   /* OK, build the carsyms.  */
   1045   for (i = 0; i < nsymz; i++)
   1046     {
   1047       rawptr = raw_armap + i;
   1048       carsyms->file_offset = swap ((bfd_byte *) rawptr);
   1049       carsyms->name = stringbase;
   1050       stringbase += strlen (stringbase) + 1;
   1051       carsyms++;
   1052     }
   1053   *stringbase = 0;
   1054 
   1055   ardata->symdef_count = nsymz;
   1056   ardata->first_file_filepos = bfd_tell (abfd);
   1057   /* Pad to an even boundary if you have to.  */
   1058   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
   1059 
   1060   bfd_has_map (abfd) = TRUE;
   1061   bfd_release (abfd, raw_armap);
   1062 
   1063   /* Check for a second archive header (as used by PE).  */
   1064   {
   1065     struct areltdata *tmp;
   1066 
   1067     bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
   1068     tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
   1069     if (tmp != NULL)
   1070       {
   1071 	if (tmp->arch_header[0] == '/'
   1072 	    && tmp->arch_header[1] == ' ')
   1073 	  {
   1074 	    ardata->first_file_filepos +=
   1075 	      (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
   1076 	  }
   1077 	free (tmp);
   1078       }
   1079   }
   1080 
   1081   return TRUE;
   1082 
   1083 release_raw_armap:
   1084   bfd_release (abfd, raw_armap);
   1085 release_symdefs:
   1086   bfd_release (abfd, (ardata)->symdefs);
   1087   return FALSE;
   1088 }
   1089 
   1090 /* This routine can handle either coff-style or bsd-style armaps
   1091    (archive symbol table).  Returns FALSE on error, TRUE otherwise */
   1092 
   1093 bfd_boolean
   1094 bfd_slurp_armap (bfd *abfd)
   1095 {
   1096   char nextname[17];
   1097   int i = bfd_bread (nextname, 16, abfd);
   1098 
   1099   if (i == 0)
   1100     return TRUE;
   1101   if (i != 16)
   1102     return FALSE;
   1103 
   1104   if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
   1105     return FALSE;
   1106 
   1107   if (CONST_STRNEQ (nextname, "__.SYMDEF       ")
   1108       || CONST_STRNEQ (nextname, "__.SYMDEF/      ")) /* Old Linux archives.  */
   1109     return do_slurp_bsd_armap (abfd);
   1110   else if (CONST_STRNEQ (nextname, "/               "))
   1111     return do_slurp_coff_armap (abfd);
   1112   else if (CONST_STRNEQ (nextname, "/SYM64/         "))
   1113     {
   1114       /* 64bit ELF (Irix 6) archive.  */
   1115 #ifdef BFD64
   1116       extern bfd_boolean bfd_elf64_archive_slurp_armap (bfd *);
   1117       return bfd_elf64_archive_slurp_armap (abfd);
   1118 #else
   1119       bfd_set_error (bfd_error_wrong_format);
   1120       return FALSE;
   1121 #endif
   1122     }
   1123   else if (CONST_STRNEQ (nextname, "#1/20           "))
   1124     {
   1125       /* Mach-O has a special name for armap when the map is sorted by name.
   1126 	 However because this name has a space it is slightly more difficult
   1127 	 to check it.  */
   1128       struct ar_hdr hdr;
   1129       char extname[21];
   1130 
   1131       if (bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
   1132 	return FALSE;
   1133       /* Read the extended name.  We know its length.  */
   1134       if (bfd_bread (extname, 20, abfd) != 20)
   1135 	return FALSE;
   1136       if (bfd_seek (abfd, -(file_ptr) (sizeof (hdr) + 20), SEEK_CUR) != 0)
   1137 	return FALSE;
   1138       if (CONST_STRNEQ (extname, "__.SYMDEF SORTED")
   1139 	  || CONST_STRNEQ (extname, "__.SYMDEF"))
   1140 	return do_slurp_bsd_armap (abfd);
   1141     }
   1142 
   1143   bfd_has_map (abfd) = FALSE;
   1144   return TRUE;
   1145 }
   1146 
   1147 /* Returns FALSE on error, TRUE otherwise.  */
   1149 /* Flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
   1150    header is in a slightly different order and the map name is '/'.
   1151    This flavour is used by hp300hpux.  */
   1152 
   1153 #define HPUX_SYMDEF_COUNT_SIZE 2
   1154 
   1155 bfd_boolean
   1156 bfd_slurp_bsd_armap_f2 (bfd *abfd)
   1157 {
   1158   struct areltdata *mapdata;
   1159   char nextname[17];
   1160   unsigned int counter;
   1161   bfd_byte *raw_armap, *rbase;
   1162   struct artdata *ardata = bfd_ardata (abfd);
   1163   char *stringbase;
   1164   unsigned int stringsize;
   1165   unsigned int left;
   1166   bfd_size_type amt;
   1167   carsym *set;
   1168   int i = bfd_bread (nextname, 16, abfd);
   1169 
   1170   if (i == 0)
   1171     return TRUE;
   1172   if (i != 16)
   1173     return FALSE;
   1174 
   1175   /* The archive has at least 16 bytes in it.  */
   1176   if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
   1177     return FALSE;
   1178 
   1179   if (CONST_STRNEQ (nextname, "__.SYMDEF       ")
   1180       || CONST_STRNEQ (nextname, "__.SYMDEF/      ")) /* Old Linux archives.  */
   1181     return do_slurp_bsd_armap (abfd);
   1182 
   1183   if (! CONST_STRNEQ (nextname, "/               "))
   1184     {
   1185       bfd_has_map (abfd) = FALSE;
   1186       return TRUE;
   1187     }
   1188 
   1189   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
   1190   if (mapdata == NULL)
   1191     return FALSE;
   1192 
   1193   if (mapdata->parsed_size < HPUX_SYMDEF_COUNT_SIZE + BSD_STRING_COUNT_SIZE)
   1194     {
   1195       free (mapdata);
   1196     wrong_format:
   1197       bfd_set_error (bfd_error_wrong_format);
   1198     byebye:
   1199       return FALSE;
   1200     }
   1201   left = mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE - BSD_STRING_COUNT_SIZE;
   1202 
   1203   amt = mapdata->parsed_size;
   1204   free (mapdata);
   1205 
   1206   raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
   1207   if (raw_armap == NULL)
   1208     goto byebye;
   1209 
   1210   if (bfd_bread (raw_armap, amt, abfd) != amt)
   1211     {
   1212       if (bfd_get_error () != bfd_error_system_call)
   1213 	bfd_set_error (bfd_error_malformed_archive);
   1214       goto byebye;
   1215     }
   1216 
   1217   ardata->symdef_count = H_GET_16 (abfd, raw_armap);
   1218 
   1219   ardata->cache = 0;
   1220 
   1221   stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
   1222   if (stringsize > left)
   1223     goto wrong_format;
   1224   left -= stringsize;
   1225 
   1226   /* Skip sym count and string sz.  */
   1227   stringbase = ((char *) raw_armap
   1228 		+ HPUX_SYMDEF_COUNT_SIZE
   1229 		+ BSD_STRING_COUNT_SIZE);
   1230   rbase = (bfd_byte *) stringbase + stringsize;
   1231   amt = ardata->symdef_count * BSD_SYMDEF_SIZE;
   1232   if (amt > left)
   1233     goto wrong_format;
   1234 
   1235   ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
   1236   if (!ardata->symdefs)
   1237     return FALSE;
   1238 
   1239   for (counter = 0, set = ardata->symdefs;
   1240        counter < ardata->symdef_count;
   1241        counter++, set++, rbase += BSD_SYMDEF_SIZE)
   1242     {
   1243       set->name = H_GET_32 (abfd, rbase) + stringbase;
   1244       set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
   1245     }
   1246 
   1247   ardata->first_file_filepos = bfd_tell (abfd);
   1248   /* Pad to an even boundary if you have to.  */
   1249   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
   1250   /* FIXME, we should provide some way to free raw_ardata when
   1251      we are done using the strings from it.  For now, it seems
   1252      to be allocated on an objalloc anyway...  */
   1253   bfd_has_map (abfd) = TRUE;
   1254   return TRUE;
   1255 }
   1256 
   1257 /** Extended name table.
   1259 
   1260   Normally archives support only 14-character filenames.
   1261 
   1262   Intel has extended the format: longer names are stored in a special
   1263   element (the first in the archive, or second if there is an armap);
   1264   the name in the ar_hdr is replaced by <space><index into filename
   1265   element>.  Index is the P.R. of an int (decimal).  Data General have
   1266   extended the format by using the prefix // for the special element.  */
   1267 
   1268 /* Returns FALSE on error, TRUE otherwise.  */
   1269 
   1270 bfd_boolean
   1271 _bfd_slurp_extended_name_table (bfd *abfd)
   1272 {
   1273   char nextname[17];
   1274   struct areltdata *namedata;
   1275   bfd_size_type amt;
   1276 
   1277   /* FIXME:  Formatting sucks here, and in case of failure of BFD_READ,
   1278      we probably don't want to return TRUE.  */
   1279   if (bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET) != 0)
   1280     return FALSE;
   1281 
   1282   if (bfd_bread (nextname, 16, abfd) == 16)
   1283     {
   1284       if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
   1285 	return FALSE;
   1286 
   1287       if (! CONST_STRNEQ (nextname, "ARFILENAMES/    ")
   1288 	  && ! CONST_STRNEQ (nextname, "//              "))
   1289 	{
   1290 	  bfd_ardata (abfd)->extended_names = NULL;
   1291 	  bfd_ardata (abfd)->extended_names_size = 0;
   1292 	  return TRUE;
   1293 	}
   1294 
   1295       namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
   1296       if (namedata == NULL)
   1297 	return FALSE;
   1298 
   1299       amt = namedata->parsed_size;
   1300       if (amt + 1 == 0)
   1301 	goto byebye;
   1302 
   1303       bfd_ardata (abfd)->extended_names_size = amt;
   1304       bfd_ardata (abfd)->extended_names = (char *) bfd_zalloc (abfd, amt + 1);
   1305       if (bfd_ardata (abfd)->extended_names == NULL)
   1306 	{
   1307 	byebye:
   1308 	  free (namedata);
   1309 	  bfd_ardata (abfd)->extended_names = NULL;
   1310 	  bfd_ardata (abfd)->extended_names_size = 0;
   1311 	  return FALSE;
   1312 	}
   1313 
   1314       if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
   1315 	{
   1316 	  if (bfd_get_error () != bfd_error_system_call)
   1317 	    bfd_set_error (bfd_error_malformed_archive);
   1318 	  bfd_release (abfd, (bfd_ardata (abfd)->extended_names));
   1319 	  bfd_ardata (abfd)->extended_names = NULL;
   1320 	  goto byebye;
   1321 	}
   1322 
   1323       /* Since the archive is supposed to be printable if it contains
   1324 	 text, the entries in the list are newline-padded, not null
   1325 	 padded. In SVR4-style archives, the names also have a
   1326 	 trailing '/'.  DOS/NT created archive often have \ in them
   1327 	 We'll fix all problems here.  */
   1328       {
   1329 	char *ext_names = bfd_ardata (abfd)->extended_names;
   1330 	char *temp = ext_names;
   1331 	char *limit = temp + namedata->parsed_size;
   1332 
   1333 	for (; temp < limit; ++temp)
   1334 	  {
   1335 	    if (*temp == ARFMAG[1])
   1336 	      temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
   1337 	    if (*temp == '\\')
   1338 	      *temp = '/';
   1339 	  }
   1340 	*limit = '\0';
   1341       }
   1342 
   1343       /* Pad to an even boundary if you have to.  */
   1344       bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
   1345       bfd_ardata (abfd)->first_file_filepos +=
   1346 	(bfd_ardata (abfd)->first_file_filepos) % 2;
   1347 
   1348       free (namedata);
   1349     }
   1350   return TRUE;
   1351 }
   1352 
   1353 #ifdef VMS
   1354 
   1355 /* Return a copy of the stuff in the filename between any :]> and a
   1356    semicolon.  */
   1357 
   1358 static const char *
   1359 normalize (bfd *abfd, const char *file)
   1360 {
   1361   const char *first;
   1362   const char *last;
   1363   char *copy;
   1364 
   1365   first = file + strlen (file) - 1;
   1366   last = first + 1;
   1367 
   1368   while (first != file)
   1369     {
   1370       if (*first == ';')
   1371 	last = first;
   1372       if (*first == ':' || *first == ']' || *first == '>')
   1373 	{
   1374 	  first++;
   1375 	  break;
   1376 	}
   1377       first--;
   1378     }
   1379 
   1380   copy = bfd_alloc (abfd, last - first + 1);
   1381   if (copy == NULL)
   1382     return NULL;
   1383 
   1384   memcpy (copy, first, last - first);
   1385   copy[last - first] = 0;
   1386 
   1387   return copy;
   1388 }
   1389 
   1390 #else
   1391 static const char *
   1392 normalize (bfd *abfd ATTRIBUTE_UNUSED, const char *file)
   1393 {
   1394   return lbasename (file);
   1395 }
   1396 #endif
   1397 
   1398 /* Adjust a relative path name based on the reference path.
   1399    For example:
   1400 
   1401      Relative path  Reference path  Result
   1402      -------------  --------------  ------
   1403      bar.o          lib.a           bar.o
   1404      foo/bar.o      lib.a           foo/bar.o
   1405      bar.o          foo/lib.a       ../bar.o
   1406      foo/bar.o      baz/lib.a       ../foo/bar.o
   1407      bar.o          ../lib.a        <parent of current dir>/bar.o
   1408    ; ../bar.o       ../lib.a        bar.o
   1409    ; ../bar.o       lib.a           ../bar.o
   1410      foo/bar.o      ../lib.a        <parent of current dir>/foo/bar.o
   1411      bar.o          ../../lib.a     <grandparent>/<parent>/bar.o
   1412      bar.o          foo/baz/lib.a   ../../bar.o
   1413 
   1414    Note - the semicolons above are there to prevent the BFD chew
   1415    utility from interpreting those lines as prototypes to put into
   1416    the autogenerated bfd.h header...
   1417 
   1418    Note - the string is returned in a static buffer.  */
   1419 
   1420 static const char *
   1421 adjust_relative_path (const char * path, const char * ref_path)
   1422 {
   1423   static char *pathbuf = NULL;
   1424   static unsigned int pathbuf_len = 0;
   1425   const char *pathp;
   1426   const char *refp;
   1427   char * lpath;
   1428   char * rpath;
   1429   unsigned int len;
   1430   unsigned int dir_up = 0;
   1431   unsigned int dir_down = 0;
   1432   char *newp;
   1433   char * pwd = getpwd ();
   1434   const char * down;
   1435 
   1436   /* Remove symlinks, '.' and '..' from the paths, if possible.  */
   1437   lpath = lrealpath (path);
   1438   pathp = lpath == NULL ? path : lpath;
   1439 
   1440   rpath = lrealpath (ref_path);
   1441   refp = rpath == NULL ? ref_path : rpath;
   1442 
   1443   /* Remove common leading path elements.  */
   1444   for (;;)
   1445     {
   1446       const char *e1 = pathp;
   1447       const char *e2 = refp;
   1448 
   1449       while (*e1 && ! IS_DIR_SEPARATOR (*e1))
   1450 	++e1;
   1451       while (*e2 && ! IS_DIR_SEPARATOR (*e2))
   1452 	++e2;
   1453       if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
   1454 	  || filename_ncmp (pathp, refp, e1 - pathp) != 0)
   1455 	break;
   1456       pathp = e1 + 1;
   1457       refp = e2 + 1;
   1458     }
   1459 
   1460   len = strlen (pathp) + 1;
   1461   /* For each leading path element in the reference path,
   1462      insert "../" into the path.  */
   1463   for (; *refp; ++refp)
   1464     if (IS_DIR_SEPARATOR (*refp))
   1465       {
   1466 	/* PR 12710:  If the path element is "../" then instead of
   1467 	   inserting "../" we need to insert the name of the directory
   1468 	   at the current level.  */
   1469 	if (refp > ref_path + 1
   1470 	    && refp[-1] == '.'
   1471 	    && refp[-2] == '.')
   1472 	  dir_down ++;
   1473 	else
   1474 	  dir_up ++;
   1475       }
   1476 
   1477   /* If the lrealpath calls above succeeded then we should never
   1478      see dir_up and dir_down both being non-zero.  */
   1479 
   1480   len += 3 * dir_up;
   1481 
   1482   if (dir_down)
   1483     {
   1484       down = pwd + strlen (pwd) - 1;
   1485 
   1486       while (dir_down && down > pwd)
   1487 	{
   1488 	  if (IS_DIR_SEPARATOR (*down))
   1489 	    --dir_down;
   1490 	}
   1491       BFD_ASSERT (dir_down == 0);
   1492       len += strlen (down) + 1;
   1493     }
   1494   else
   1495     down = NULL;
   1496 
   1497   if (len > pathbuf_len)
   1498     {
   1499       if (pathbuf != NULL)
   1500 	free (pathbuf);
   1501       pathbuf_len = 0;
   1502       pathbuf = (char *) bfd_malloc (len);
   1503       if (pathbuf == NULL)
   1504 	goto out;
   1505       pathbuf_len = len;
   1506     }
   1507 
   1508   newp = pathbuf;
   1509   while (dir_up-- > 0)
   1510     {
   1511       /* FIXME: Support Windows style path separators as well.  */
   1512       strcpy (newp, "../");
   1513       newp += 3;
   1514     }
   1515 
   1516   if (down)
   1517     sprintf (newp, "%s/%s", down, pathp);
   1518   else
   1519     strcpy (newp, pathp);
   1520 
   1521  out:
   1522   free (lpath);
   1523   free (rpath);
   1524   return pathbuf;
   1525 }
   1526 
   1527 /* Build a BFD style extended name table.  */
   1528 
   1529 bfd_boolean
   1530 _bfd_archive_bsd_construct_extended_name_table (bfd *abfd,
   1531 						char **tabloc,
   1532 						bfd_size_type *tablen,
   1533 						const char **name)
   1534 {
   1535   *name = "ARFILENAMES/";
   1536   return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
   1537 }
   1538 
   1539 /* Build an SVR4 style extended name table.  */
   1540 
   1541 bfd_boolean
   1542 _bfd_archive_coff_construct_extended_name_table (bfd *abfd,
   1543 						 char **tabloc,
   1544 						 bfd_size_type *tablen,
   1545 						 const char **name)
   1546 {
   1547   *name = "//";
   1548   return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
   1549 }
   1550 
   1551 /* Follows archive_head and produces an extended name table if
   1552    necessary.  Returns (in tabloc) a pointer to an extended name
   1553    table, and in tablen the length of the table.  If it makes an entry
   1554    it clobbers the filename so that the element may be written without
   1555    further massage.  Returns TRUE if it ran successfully, FALSE if
   1556    something went wrong.  A successful return may still involve a
   1557    zero-length tablen!  */
   1558 
   1559 bfd_boolean
   1560 _bfd_construct_extended_name_table (bfd *abfd,
   1561 				    bfd_boolean trailing_slash,
   1562 				    char **tabloc,
   1563 				    bfd_size_type *tablen)
   1564 {
   1565   unsigned int maxname = ar_maxnamelen (abfd);
   1566   bfd_size_type total_namelen = 0;
   1567   bfd *current;
   1568   char *strptr;
   1569   const char *last_filename;
   1570   long last_stroff;
   1571 
   1572   *tablen = 0;
   1573   last_filename = NULL;
   1574 
   1575   /* Figure out how long the table should be.  */
   1576   for (current = abfd->archive_head;
   1577        current != NULL;
   1578        current = current->archive_next)
   1579     {
   1580       const char *normal;
   1581       unsigned int thislen;
   1582 
   1583       if (bfd_is_thin_archive (abfd))
   1584 	{
   1585 	  const char *filename = current->filename;
   1586 
   1587 	  /* If the element being added is a member of another archive
   1588 	     (i.e., we are flattening), use the containing archive's name.  */
   1589 	  if (current->my_archive
   1590 	      && ! bfd_is_thin_archive (current->my_archive))
   1591 	    filename = current->my_archive->filename;
   1592 
   1593 	  /* If the path is the same as the previous path seen,
   1594 	     reuse it.  This can happen when flattening a thin
   1595 	     archive that contains other archives.  */
   1596 	  if (last_filename && filename_cmp (last_filename, filename) == 0)
   1597 	    continue;
   1598 
   1599 	  last_filename = filename;
   1600 
   1601 	  /* If the path is relative, adjust it relative to
   1602 	     the containing archive. */
   1603 	  if (! IS_ABSOLUTE_PATH (filename)
   1604 	      && ! IS_ABSOLUTE_PATH (abfd->filename))
   1605 	    normal = adjust_relative_path (filename, abfd->filename);
   1606 	  else
   1607 	    normal = filename;
   1608 
   1609 	  /* In a thin archive, always store the full pathname
   1610 	     in the extended name table.  */
   1611 	  total_namelen += strlen (normal) + 1;
   1612 	  if (trailing_slash)
   1613 	    /* Leave room for trailing slash.  */
   1614 	    ++total_namelen;
   1615 
   1616 	  continue;
   1617 	}
   1618 
   1619       normal = normalize (current, current->filename);
   1620       if (normal == NULL)
   1621 	return FALSE;
   1622 
   1623       thislen = strlen (normal);
   1624 
   1625       if (thislen > maxname
   1626 	  && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
   1627 	thislen = maxname;
   1628 
   1629       if (thislen > maxname)
   1630 	{
   1631 	  /* Add one to leave room for \n.  */
   1632 	  total_namelen += thislen + 1;
   1633 	  if (trailing_slash)
   1634 	    {
   1635 	      /* Leave room for trailing slash.  */
   1636 	      ++total_namelen;
   1637 	    }
   1638 	}
   1639       else
   1640 	{
   1641 	  struct ar_hdr *hdr = arch_hdr (current);
   1642 	  if (filename_ncmp (normal, hdr->ar_name, thislen) != 0
   1643 	      || (thislen < sizeof hdr->ar_name
   1644 		  && hdr->ar_name[thislen] != ar_padchar (current)))
   1645 	    {
   1646 	      /* Must have been using extended format even though it
   1647 		 didn't need to.  Fix it to use normal format.  */
   1648 	      memcpy (hdr->ar_name, normal, thislen);
   1649 	      if (thislen < maxname
   1650 		  || (thislen == maxname && thislen < sizeof hdr->ar_name))
   1651 		hdr->ar_name[thislen] = ar_padchar (current);
   1652 	    }
   1653 	}
   1654     }
   1655 
   1656   if (total_namelen == 0)
   1657     return TRUE;
   1658 
   1659   *tabloc = (char *) bfd_zalloc (abfd, total_namelen);
   1660   if (*tabloc == NULL)
   1661     return FALSE;
   1662 
   1663   *tablen = total_namelen;
   1664   strptr = *tabloc;
   1665 
   1666   last_filename = NULL;
   1667   last_stroff = 0;
   1668 
   1669   for (current = abfd->archive_head;
   1670        current != NULL;
   1671        current = current->archive_next)
   1672     {
   1673       const char *normal;
   1674       unsigned int thislen;
   1675       long stroff;
   1676       const char *filename = current->filename;
   1677 
   1678       if (bfd_is_thin_archive (abfd))
   1679 	{
   1680 	  /* If the element being added is a member of another archive
   1681 	     (i.e., we are flattening), use the containing archive's name.  */
   1682 	  if (current->my_archive
   1683 	      && ! bfd_is_thin_archive (current->my_archive))
   1684 	    filename = current->my_archive->filename;
   1685 	  /* If the path is the same as the previous path seen,
   1686 	     reuse it.  This can happen when flattening a thin
   1687 	     archive that contains other archives.
   1688 	     If the path is relative, adjust it relative to
   1689 	     the containing archive.  */
   1690 	  if (last_filename && filename_cmp (last_filename, filename) == 0)
   1691 	    normal = last_filename;
   1692 	  else if (! IS_ABSOLUTE_PATH (filename)
   1693 		   && ! IS_ABSOLUTE_PATH (abfd->filename))
   1694 	    normal = adjust_relative_path (filename, abfd->filename);
   1695 	  else
   1696 	    normal = filename;
   1697 	}
   1698       else
   1699 	{
   1700 	  normal = normalize (current, filename);
   1701 	  if (normal == NULL)
   1702 	    return FALSE;
   1703 	}
   1704 
   1705       thislen = strlen (normal);
   1706       if (thislen > maxname || bfd_is_thin_archive (abfd))
   1707 	{
   1708 	  /* Works for now; may need to be re-engineered if we
   1709 	     encounter an oddball archive format and want to
   1710 	     generalise this hack.  */
   1711 	  struct ar_hdr *hdr = arch_hdr (current);
   1712 	  if (normal == last_filename)
   1713 	    stroff = last_stroff;
   1714 	  else
   1715 	    {
   1716 	      strcpy (strptr, normal);
   1717 	      if (! trailing_slash)
   1718 		strptr[thislen] = ARFMAG[1];
   1719 	      else
   1720 		{
   1721 		  strptr[thislen] = '/';
   1722 		  strptr[thislen + 1] = ARFMAG[1];
   1723 		}
   1724 	      stroff = strptr - *tabloc;
   1725 	      last_stroff = stroff;
   1726 	    }
   1727 	  hdr->ar_name[0] = ar_padchar (current);
   1728 	  if (bfd_is_thin_archive (abfd) && current->origin > 0)
   1729 	    {
   1730 	      int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:",
   1731 				  stroff);
   1732 	      _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len,
   1733 				"%-ld",
   1734 				current->origin - sizeof (struct ar_hdr));
   1735 	    }
   1736 	  else
   1737 	    _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff);
   1738 	  if (normal != last_filename)
   1739 	    {
   1740 	      strptr += thislen + 1;
   1741 	      if (trailing_slash)
   1742 		++strptr;
   1743 	      last_filename = filename;
   1744 	    }
   1745 	}
   1746     }
   1747 
   1748   return TRUE;
   1749 }
   1750 
   1751 /* Do not construct an extended name table but transforms name field into
   1752    its extended form.  */
   1753 
   1754 bfd_boolean
   1755 _bfd_archive_bsd44_construct_extended_name_table (bfd *abfd,
   1756 						  char **tabloc,
   1757 						  bfd_size_type *tablen,
   1758 						  const char **name)
   1759 {
   1760   unsigned int maxname = ar_maxnamelen (abfd);
   1761   bfd *current;
   1762 
   1763   *tablen = 0;
   1764   *tabloc = NULL;
   1765   *name = NULL;
   1766 
   1767   for (current = abfd->archive_head;
   1768        current != NULL;
   1769        current = current->archive_next)
   1770     {
   1771       const char *normal = normalize (current, current->filename);
   1772       int has_space = 0;
   1773       unsigned int len;
   1774 
   1775       if (normal == NULL)
   1776 	return FALSE;
   1777 
   1778       for (len = 0; normal[len]; len++)
   1779 	if (normal[len] == ' ')
   1780 	  has_space = 1;
   1781 
   1782       if (len > maxname || has_space)
   1783 	{
   1784 	  struct ar_hdr *hdr = arch_hdr (current);
   1785 
   1786 	  len = (len + 3) & ~3;
   1787 	  arch_eltdata (current)->extra_size = len;
   1788 	  _bfd_ar_spacepad (hdr->ar_name, maxname, "#1/%lu", len);
   1789 	}
   1790     }
   1791 
   1792   return TRUE;
   1793 }
   1794 
   1795 /* Write an archive header.  */
   1797 
   1798 bfd_boolean
   1799 _bfd_generic_write_ar_hdr (bfd *archive, bfd *abfd)
   1800 {
   1801   struct ar_hdr *hdr = arch_hdr (abfd);
   1802 
   1803   if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
   1804     return FALSE;
   1805   return TRUE;
   1806 }
   1807 
   1808 /* Write an archive header using BSD4.4 convention.  */
   1809 
   1810 bfd_boolean
   1811 _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
   1812 {
   1813   struct ar_hdr *hdr = arch_hdr (abfd);
   1814 
   1815   if (is_bsd44_extended_name (hdr->ar_name))
   1816     {
   1817       /* This is a BSD 4.4 extended name.  */
   1818       const char *fullname = normalize (abfd, abfd->filename);
   1819       unsigned int len = strlen (fullname);
   1820       unsigned int padded_len = (len + 3) & ~3;
   1821 
   1822       BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
   1823 
   1824       if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
   1825 			    arch_eltdata (abfd)->parsed_size + padded_len))
   1826 	return FALSE;
   1827 
   1828       if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
   1829 	return FALSE;
   1830 
   1831       if (bfd_bwrite (fullname, len, archive) != len)
   1832 	return FALSE;
   1833 
   1834       if (len & 3)
   1835 	{
   1836 	  static const char pad[3] = { 0, 0, 0 };
   1837 
   1838 	  len = 4 - (len & 3);
   1839 	  if (bfd_bwrite (pad, len, archive) != len)
   1840 	    return FALSE;
   1841 	}
   1842     }
   1843   else
   1844     {
   1845       if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
   1846 	return FALSE;
   1847     }
   1848   return TRUE;
   1849 }
   1850 
   1851 /* A couple of functions for creating ar_hdrs.  */
   1853 
   1854 #ifdef HPUX_LARGE_AR_IDS
   1855 /* Function to encode large UID/GID values according to HP.  */
   1856 
   1857 static void
   1858 hpux_uid_gid_encode (char str[6], long int id)
   1859 {
   1860   int cnt;
   1861 
   1862   str[5] = '@' + (id & 3);
   1863   id >>= 2;
   1864 
   1865   for (cnt = 4; cnt >= 0; --cnt, id >>= 6)
   1866     str[cnt] = ' ' + (id & 0x3f);
   1867 }
   1868 #endif	/* HPUX_LARGE_AR_IDS */
   1869 
   1870 #ifndef HAVE_GETUID
   1871 #define getuid() 0
   1872 #endif
   1873 
   1874 #ifndef HAVE_GETGID
   1875 #define getgid() 0
   1876 #endif
   1877 
   1878 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
   1879    make one.  The filename must refer to a filename in the filesystem.
   1880    The filename field of the ar_hdr will NOT be initialized.  If member
   1881    is set, and it's an in-memory bfd, we fake it.  */
   1882 
   1883 static struct areltdata *
   1884 bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
   1885 {
   1886   struct stat status;
   1887   struct areltdata *ared;
   1888   struct ar_hdr *hdr;
   1889   bfd_size_type amt;
   1890 
   1891   if (member && (member->flags & BFD_IN_MEMORY) != 0)
   1892     {
   1893       /* Assume we just "made" the member, and fake it.  */
   1894       struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream;
   1895       time (&status.st_mtime);
   1896       status.st_uid = getuid ();
   1897       status.st_gid = getgid ();
   1898       status.st_mode = 0644;
   1899       status.st_size = bim->size;
   1900     }
   1901   else if (stat (filename, &status) != 0)
   1902     {
   1903       bfd_set_error (bfd_error_system_call);
   1904       return NULL;
   1905     }
   1906 
   1907   /* If the caller requested that the BFD generate deterministic output,
   1908      fake values for modification time, UID, GID, and file mode.  */
   1909   if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
   1910     {
   1911       status.st_mtime = 0;
   1912       status.st_uid = 0;
   1913       status.st_gid = 0;
   1914       status.st_mode = 0644;
   1915     }
   1916 
   1917   amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
   1918   ared = (struct areltdata *) bfd_zmalloc (amt);
   1919   if (ared == NULL)
   1920     return NULL;
   1921   hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
   1922 
   1923   /* ar headers are space padded, not null padded!  */
   1924   memset (hdr, ' ', sizeof (struct ar_hdr));
   1925 
   1926   _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld",
   1927 		    status.st_mtime);
   1928 #ifdef HPUX_LARGE_AR_IDS
   1929   /* HP has a very "special" way to handle UID/GID's with numeric values
   1930      > 99999.  */
   1931   if (status.st_uid > 99999)
   1932     hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid);
   1933   else
   1934 #endif
   1935     _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld",
   1936 		      status.st_uid);
   1937 #ifdef HPUX_LARGE_AR_IDS
   1938   /* HP has a very "special" way to handle UID/GID's with numeric values
   1939      > 99999.  */
   1940   if (status.st_gid > 99999)
   1941     hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid);
   1942   else
   1943 #endif
   1944     _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld",
   1945 		      status.st_gid);
   1946   _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
   1947 		    status.st_mode);
   1948   if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
   1949     {
   1950       free (ared);
   1951       return NULL;
   1952     }
   1953   memcpy (hdr->ar_fmag, ARFMAG, 2);
   1954   ared->parsed_size = status.st_size;
   1955   ared->arch_header = (char *) hdr;
   1956 
   1957   return ared;
   1958 }
   1959 
   1960 /* Analogous to stat call.  */
   1961 
   1962 int
   1963 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
   1964 {
   1965   struct ar_hdr *hdr;
   1966   char *aloser;
   1967 
   1968   if (abfd->arelt_data == NULL)
   1969     {
   1970       bfd_set_error (bfd_error_invalid_operation);
   1971       return -1;
   1972     }
   1973 
   1974   hdr = arch_hdr (abfd);
   1975 
   1976 #define foo(arelt, stelt, size)				\
   1977   buf->stelt = strtol (hdr->arelt, &aloser, size);	\
   1978   if (aloser == hdr->arelt)	      			\
   1979     return -1;
   1980 
   1981   /* Some platforms support special notations for large IDs.  */
   1982 #ifdef HPUX_LARGE_AR_IDS
   1983 # define foo2(arelt, stelt, size)					\
   1984   if (hdr->arelt[5] == ' ')						\
   1985     {									\
   1986       foo (arelt, stelt, size);						\
   1987     }									\
   1988   else									\
   1989     {									\
   1990       int cnt;								\
   1991       for (buf->stelt = cnt = 0; cnt < 5; ++cnt)			\
   1992 	{								\
   1993 	  if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f)	\
   1994 	    return -1;							\
   1995 	  buf->stelt <<= 6;						\
   1996 	  buf->stelt += hdr->arelt[cnt] - ' ';				\
   1997 	}								\
   1998       if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3)		\
   1999 	return -1;							\
   2000       buf->stelt <<= 2;							\
   2001       buf->stelt += hdr->arelt[5] - '@';				\
   2002     }
   2003 #else
   2004 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
   2005 #endif
   2006 
   2007   foo (ar_date, st_mtime, 10);
   2008   foo2 (ar_uid, st_uid, 10);
   2009   foo2 (ar_gid, st_gid, 10);
   2010   foo (ar_mode, st_mode, 8);
   2011 
   2012   buf->st_size = arch_eltdata (abfd)->parsed_size;
   2013 
   2014   return 0;
   2015 }
   2016 
   2017 void
   2018 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
   2019 {
   2020   /* FIXME: This interacts unpleasantly with ar's quick-append option.
   2021      Fortunately ic960 users will never use that option.  Fixing this
   2022      is very hard; fortunately I know how to do it and will do so once
   2023      intel's release is out the door.  */
   2024 
   2025   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
   2026   size_t length;
   2027   const char *filename;
   2028   size_t maxlen = ar_maxnamelen (abfd);
   2029 
   2030   if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
   2031     {
   2032       bfd_bsd_truncate_arname (abfd, pathname, arhdr);
   2033       return;
   2034     }
   2035 
   2036   filename = normalize (abfd, pathname);
   2037   if (filename == NULL)
   2038     {
   2039       /* FIXME */
   2040       abort ();
   2041     }
   2042 
   2043   length = strlen (filename);
   2044 
   2045   if (length <= maxlen)
   2046     memcpy (hdr->ar_name, filename, length);
   2047 
   2048   /* Add the padding character if there is room for it.  */
   2049   if (length < maxlen
   2050       || (length == maxlen && length < sizeof hdr->ar_name))
   2051     (hdr->ar_name)[length] = ar_padchar (abfd);
   2052 }
   2053 
   2054 void
   2055 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
   2056 {
   2057   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
   2058   size_t length;
   2059   const char *filename = lbasename (pathname);
   2060   size_t maxlen = ar_maxnamelen (abfd);
   2061 
   2062   length = strlen (filename);
   2063 
   2064   if (length <= maxlen)
   2065     memcpy (hdr->ar_name, filename, length);
   2066   else
   2067     {
   2068       /* pathname: meet procrustes */
   2069       memcpy (hdr->ar_name, filename, maxlen);
   2070       length = maxlen;
   2071     }
   2072 
   2073   if (length < maxlen)
   2074     (hdr->ar_name)[length] = ar_padchar (abfd);
   2075 }
   2076 
   2077 /* Store name into ar header.  Truncates the name to fit.
   2078    1> strip pathname to be just the basename.
   2079    2> if it's short enuf to fit, stuff it in.
   2080    3> If it doesn't end with .o, truncate it to fit
   2081    4> truncate it before the .o, append .o, stuff THAT in.  */
   2082 
   2083 /* This is what gnu ar does.  It's better but incompatible with the
   2084    bsd ar.  */
   2085 
   2086 void
   2087 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
   2088 {
   2089   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
   2090   size_t length;
   2091   const char *filename = lbasename (pathname);
   2092   size_t maxlen = ar_maxnamelen (abfd);
   2093 
   2094   length = strlen (filename);
   2095 
   2096   if (length <= maxlen)
   2097     memcpy (hdr->ar_name, filename, length);
   2098   else
   2099     {
   2100       /* pathname: meet procrustes.  */
   2101       memcpy (hdr->ar_name, filename, maxlen);
   2102       if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
   2103 	{
   2104 	  hdr->ar_name[maxlen - 2] = '.';
   2105 	  hdr->ar_name[maxlen - 1] = 'o';
   2106 	}
   2107       length = maxlen;
   2108     }
   2109 
   2110   if (length < 16)
   2111     (hdr->ar_name)[length] = ar_padchar (abfd);
   2112 }
   2113 
   2114 /* The BFD is open for write and has its format set to bfd_archive.  */
   2116 
   2117 bfd_boolean
   2118 _bfd_write_archive_contents (bfd *arch)
   2119 {
   2120   bfd *current;
   2121   char *etable = NULL;
   2122   bfd_size_type elength = 0;
   2123   const char *ename = NULL;
   2124   bfd_boolean makemap = bfd_has_map (arch);
   2125   /* If no .o's, don't bother to make a map.  */
   2126   bfd_boolean hasobjects = FALSE;
   2127   bfd_size_type wrote;
   2128   int tries;
   2129   char *armag;
   2130 
   2131   /* Verify the viability of all entries; if any of them live in the
   2132      filesystem (as opposed to living in an archive open for input)
   2133      then construct a fresh ar_hdr for them.  */
   2134   for (current = arch->archive_head;
   2135        current != NULL;
   2136        current = current->archive_next)
   2137     {
   2138       /* This check is checking the bfds for the objects we're reading
   2139 	 from (which are usually either an object file or archive on
   2140 	 disk), not the archive entries we're writing to.  We don't
   2141 	 actually create bfds for the archive members, we just copy
   2142 	 them byte-wise when we write out the archive.  */
   2143       if (bfd_write_p (current))
   2144 	{
   2145 	  bfd_set_error (bfd_error_invalid_operation);
   2146 	  goto input_err;
   2147 	}
   2148       if (!current->arelt_data)
   2149 	{
   2150 	  current->arelt_data =
   2151 	    bfd_ar_hdr_from_filesystem (arch, current->filename, current);
   2152 	  if (!current->arelt_data)
   2153 	    goto input_err;
   2154 
   2155 	  /* Put in the file name.  */
   2156 	  BFD_SEND (arch, _bfd_truncate_arname,
   2157 		    (arch, current->filename, (char *) arch_hdr (current)));
   2158 	}
   2159 
   2160       if (makemap && ! hasobjects)
   2161 	{			/* Don't bother if we won't make a map!  */
   2162 	  if ((bfd_check_format (current, bfd_object)))
   2163 	    hasobjects = TRUE;
   2164 	}
   2165     }
   2166 
   2167   if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
   2168 		 (arch, &etable, &elength, &ename)))
   2169     return FALSE;
   2170 
   2171   if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
   2172     return FALSE;
   2173   armag = ARMAG;
   2174   if (bfd_is_thin_archive (arch))
   2175     armag = ARMAGT;
   2176   wrote = bfd_bwrite (armag, SARMAG, arch);
   2177   if (wrote != SARMAG)
   2178     return FALSE;
   2179 
   2180   if (makemap && hasobjects)
   2181     {
   2182       if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
   2183 	return FALSE;
   2184     }
   2185 
   2186   if (elength != 0)
   2187     {
   2188       struct ar_hdr hdr;
   2189 
   2190       memset (&hdr, ' ', sizeof (struct ar_hdr));
   2191       memcpy (hdr.ar_name, ename, strlen (ename));
   2192       /* Round size up to even number in archive header.  */
   2193       if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
   2194 			    (elength + 1) & ~(bfd_size_type) 1))
   2195 	return FALSE;
   2196       memcpy (hdr.ar_fmag, ARFMAG, 2);
   2197       if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
   2198 	   != sizeof (struct ar_hdr))
   2199 	  || bfd_bwrite (etable, elength, arch) != elength)
   2200 	return FALSE;
   2201       if ((elength % 2) == 1)
   2202 	{
   2203 	  if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
   2204 	    return FALSE;
   2205 	}
   2206     }
   2207 
   2208   for (current = arch->archive_head;
   2209        current != NULL;
   2210        current = current->archive_next)
   2211     {
   2212       char buffer[DEFAULT_BUFFERSIZE];
   2213       bfd_size_type remaining = arelt_size (current);
   2214 
   2215       /* Write ar header.  */
   2216       if (!_bfd_write_ar_hdr (arch, current))
   2217 	return FALSE;
   2218       if (bfd_is_thin_archive (arch))
   2219 	continue;
   2220       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
   2221 	goto input_err;
   2222 
   2223       while (remaining)
   2224 	{
   2225 	  unsigned int amt = DEFAULT_BUFFERSIZE;
   2226 
   2227 	  if (amt > remaining)
   2228 	    amt = remaining;
   2229 	  errno = 0;
   2230 	  if (bfd_bread (buffer, amt, current) != amt)
   2231 	    {
   2232 	      if (bfd_get_error () != bfd_error_system_call)
   2233 		bfd_set_error (bfd_error_file_truncated);
   2234 	      goto input_err;
   2235 	    }
   2236 	  if (bfd_bwrite (buffer, amt, arch) != amt)
   2237 	    return FALSE;
   2238 	  remaining -= amt;
   2239 	}
   2240 
   2241       if ((arelt_size (current) % 2) == 1)
   2242 	{
   2243 	  if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
   2244 	    return FALSE;
   2245 	}
   2246     }
   2247 
   2248   if (makemap && hasobjects)
   2249     {
   2250       /* Verify the timestamp in the archive file.  If it would not be
   2251 	 accepted by the linker, rewrite it until it would be.  If
   2252 	 anything odd happens, break out and just return.  (The
   2253 	 Berkeley linker checks the timestamp and refuses to read the
   2254 	 table-of-contents if it is >60 seconds less than the file's
   2255 	 modified-time.  That painful hack requires this painful hack.  */
   2256       tries = 1;
   2257       do
   2258 	{
   2259 	  if (bfd_update_armap_timestamp (arch))
   2260 	    break;
   2261 	  (*_bfd_error_handler)
   2262 	    (_("Warning: writing archive was slow: rewriting timestamp\n"));
   2263 	}
   2264       while (++tries < 6);
   2265     }
   2266 
   2267   return TRUE;
   2268 
   2269  input_err:
   2270   bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
   2271   return FALSE;
   2272 }
   2273 
   2274 /* Note that the namidx for the first symbol is 0.  */
   2276 
   2277 bfd_boolean
   2278 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
   2279 {
   2280   char *first_name = NULL;
   2281   bfd *current;
   2282   file_ptr elt_no = 0;
   2283   struct orl *map = NULL;
   2284   unsigned int orl_max = 1024;		/* Fine initial default.  */
   2285   unsigned int orl_count = 0;
   2286   int stridx = 0;
   2287   asymbol **syms = NULL;
   2288   long syms_max = 0;
   2289   bfd_boolean ret;
   2290   bfd_size_type amt;
   2291 
   2292   /* Dunno if this is the best place for this info...  */
   2293   if (elength != 0)
   2294     elength += sizeof (struct ar_hdr);
   2295   elength += elength % 2;
   2296 
   2297   amt = orl_max * sizeof (struct orl);
   2298   map = (struct orl *) bfd_malloc (amt);
   2299   if (map == NULL)
   2300     goto error_return;
   2301 
   2302   /* We put the symbol names on the arch objalloc, and then discard
   2303      them when done.  */
   2304   first_name = (char *) bfd_alloc (arch, 1);
   2305   if (first_name == NULL)
   2306     goto error_return;
   2307 
   2308   /* Drop all the files called __.SYMDEF, we're going to make our own.  */
   2309   while (arch->archive_head
   2310 	 && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
   2311     arch->archive_head = arch->archive_head->archive_next;
   2312 
   2313   /* Map over each element.  */
   2314   for (current = arch->archive_head;
   2315        current != NULL;
   2316        current = current->archive_next, elt_no++)
   2317     {
   2318       if (bfd_check_format (current, bfd_object)
   2319 	  && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
   2320 	{
   2321 	  long storage;
   2322 	  long symcount;
   2323 	  long src_count;
   2324 
   2325 	  storage = bfd_get_symtab_upper_bound (current);
   2326 	  if (storage < 0)
   2327 	    goto error_return;
   2328 
   2329 	  if (storage != 0)
   2330 	    {
   2331 	      if (storage > syms_max)
   2332 		{
   2333 		  if (syms_max > 0)
   2334 		    free (syms);
   2335 		  syms_max = storage;
   2336 		  syms = (asymbol **) bfd_malloc (syms_max);
   2337 		  if (syms == NULL)
   2338 		    goto error_return;
   2339 		}
   2340 	      symcount = bfd_canonicalize_symtab (current, syms);
   2341 	      if (symcount < 0)
   2342 		goto error_return;
   2343 
   2344 	      /* Now map over all the symbols, picking out the ones we
   2345 		 want.  */
   2346 	      for (src_count = 0; src_count < symcount; src_count++)
   2347 		{
   2348 		  flagword flags = (syms[src_count])->flags;
   2349 		  asection *sec = syms[src_count]->section;
   2350 
   2351 		  if (((flags & (BSF_GLOBAL
   2352 				 | BSF_WEAK
   2353 				 | BSF_INDIRECT
   2354 				 | BSF_GNU_UNIQUE)) != 0
   2355 		       || bfd_is_com_section (sec))
   2356 		      && ! bfd_is_und_section (sec))
   2357 		    {
   2358 		      bfd_size_type namelen;
   2359 		      struct orl *new_map;
   2360 
   2361 		      /* This symbol will go into the archive header.  */
   2362 		      if (orl_count == orl_max)
   2363 			{
   2364 			  orl_max *= 2;
   2365 			  amt = orl_max * sizeof (struct orl);
   2366 			  new_map = (struct orl *) bfd_realloc (map, amt);
   2367 			  if (new_map == NULL)
   2368 			    goto error_return;
   2369 
   2370 			  map = new_map;
   2371 			}
   2372 
   2373 		      if (strcmp (syms[src_count]->name, "__gnu_lto_slim") == 0)
   2374 			(*_bfd_error_handler)
   2375 			  (_("%s: plugin needed to handle lto object"),
   2376 			   bfd_get_filename (current));
   2377 		      namelen = strlen (syms[src_count]->name);
   2378 		      amt = sizeof (char *);
   2379 		      map[orl_count].name = (char **) bfd_alloc (arch, amt);
   2380 		      if (map[orl_count].name == NULL)
   2381 			goto error_return;
   2382 		      *(map[orl_count].name) = (char *) bfd_alloc (arch,
   2383 								   namelen + 1);
   2384 		      if (*(map[orl_count].name) == NULL)
   2385 			goto error_return;
   2386 		      strcpy (*(map[orl_count].name), syms[src_count]->name);
   2387 		      map[orl_count].u.abfd = current;
   2388 		      map[orl_count].namidx = stridx;
   2389 
   2390 		      stridx += namelen + 1;
   2391 		      ++orl_count;
   2392 		    }
   2393 		}
   2394 	    }
   2395 
   2396 	  /* Now ask the BFD to free up any cached information, so we
   2397 	     don't fill all of memory with symbol tables.  */
   2398 	  if (! bfd_free_cached_info (current))
   2399 	    goto error_return;
   2400 	}
   2401     }
   2402 
   2403   /* OK, now we have collected all the data, let's write them out.  */
   2404   ret = BFD_SEND (arch, write_armap,
   2405 		  (arch, elength, map, orl_count, stridx));
   2406 
   2407   if (syms_max > 0)
   2408     free (syms);
   2409   if (map != NULL)
   2410     free (map);
   2411   if (first_name != NULL)
   2412     bfd_release (arch, first_name);
   2413 
   2414   return ret;
   2415 
   2416  error_return:
   2417   if (syms_max > 0)
   2418     free (syms);
   2419   if (map != NULL)
   2420     free (map);
   2421   if (first_name != NULL)
   2422     bfd_release (arch, first_name);
   2423 
   2424   return FALSE;
   2425 }
   2426 
   2427 bfd_boolean
   2428 bsd_write_armap (bfd *arch,
   2429 		 unsigned int elength,
   2430 		 struct orl *map,
   2431 		 unsigned int orl_count,
   2432 		 int stridx)
   2433 {
   2434   int padit = stridx & 1;
   2435   unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
   2436   unsigned int stringsize = stridx + padit;
   2437   /* Include 8 bytes to store ranlibsize and stringsize in output.  */
   2438   unsigned int mapsize = ranlibsize + stringsize + 8;
   2439   file_ptr firstreal;
   2440   bfd *current = arch->archive_head;
   2441   bfd *last_elt = current;	/* Last element arch seen.  */
   2442   bfd_byte temp[4];
   2443   unsigned int count;
   2444   struct ar_hdr hdr;
   2445   long uid, gid;
   2446 
   2447   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
   2448 
   2449   /* If deterministic, we use 0 as the timestamp in the map.
   2450      Some linkers may require that the archive filesystem modification
   2451      time is less than (or near to) the archive map timestamp.  Those
   2452      linkers should not be used with deterministic mode.  (GNU ld and
   2453      Gold do not have this restriction.)  */
   2454   bfd_ardata (arch)->armap_timestamp = 0;
   2455   uid = 0;
   2456   gid = 0;
   2457   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
   2458     {
   2459       struct stat statbuf;
   2460 
   2461       if (stat (arch->filename, &statbuf) == 0)
   2462 	bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
   2463 					      + ARMAP_TIME_OFFSET);
   2464       uid = getuid();
   2465       gid = getgid();
   2466     }
   2467 
   2468   memset (&hdr, ' ', sizeof (struct ar_hdr));
   2469   memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG));
   2470   bfd_ardata (arch)->armap_datepos = (SARMAG
   2471 				      + offsetof (struct ar_hdr, ar_date[0]));
   2472   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
   2473 		    bfd_ardata (arch)->armap_timestamp);
   2474   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
   2475   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
   2476   if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
   2477     return FALSE;
   2478   memcpy (hdr.ar_fmag, ARFMAG, 2);
   2479   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
   2480       != sizeof (struct ar_hdr))
   2481     return FALSE;
   2482   H_PUT_32 (arch, ranlibsize, temp);
   2483   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
   2484     return FALSE;
   2485 
   2486   for (count = 0; count < orl_count; count++)
   2487     {
   2488       unsigned int offset;
   2489       bfd_byte buf[BSD_SYMDEF_SIZE];
   2490 
   2491       if (map[count].u.abfd != last_elt)
   2492 	{
   2493 	  do
   2494 	    {
   2495 	      struct areltdata *ared = arch_eltdata (current);
   2496 
   2497 	      firstreal += (ared->parsed_size + ared->extra_size
   2498 			    + sizeof (struct ar_hdr));
   2499 	      firstreal += firstreal % 2;
   2500 	      current = current->archive_next;
   2501 	    }
   2502 	  while (current != map[count].u.abfd);
   2503 	}
   2504 
   2505       /* The archive file format only has 4 bytes to store the offset
   2506 	 of the member.  Check to make sure that firstreal has not grown
   2507 	 too big.  */
   2508       offset = (unsigned int) firstreal;
   2509       if (firstreal != (file_ptr) offset)
   2510 	{
   2511 	  bfd_set_error (bfd_error_file_truncated);
   2512 	  return FALSE;
   2513 	}
   2514 
   2515       last_elt = current;
   2516       H_PUT_32 (arch, map[count].namidx, buf);
   2517       H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
   2518       if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch)
   2519 	  != BSD_SYMDEF_SIZE)
   2520 	return FALSE;
   2521     }
   2522 
   2523   /* Now write the strings themselves.  */
   2524   H_PUT_32 (arch, stringsize, temp);
   2525   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
   2526     return FALSE;
   2527   for (count = 0; count < orl_count; count++)
   2528     {
   2529       size_t len = strlen (*map[count].name) + 1;
   2530 
   2531       if (bfd_bwrite (*map[count].name, len, arch) != len)
   2532 	return FALSE;
   2533     }
   2534 
   2535   /* The spec sez this should be a newline.  But in order to be
   2536      bug-compatible for sun's ar we use a null.  */
   2537   if (padit)
   2538     {
   2539       if (bfd_bwrite ("", 1, arch) != 1)
   2540 	return FALSE;
   2541     }
   2542 
   2543   return TRUE;
   2544 }
   2545 
   2546 /* At the end of archive file handling, update the timestamp in the
   2547    file, so the linker will accept it.
   2548 
   2549    Return TRUE if the timestamp was OK, or an unusual problem happened.
   2550    Return FALSE if we updated the timestamp.  */
   2551 
   2552 bfd_boolean
   2553 _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
   2554 {
   2555   struct stat archstat;
   2556   struct ar_hdr hdr;
   2557 
   2558   /* If creating deterministic archives, just leave the timestamp as-is.  */
   2559   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
   2560     return TRUE;
   2561 
   2562   /* Flush writes, get last-write timestamp from file, and compare it
   2563      to the timestamp IN the file.  */
   2564   bfd_flush (arch);
   2565   if (bfd_stat (arch, &archstat) == -1)
   2566     {
   2567       bfd_perror (_("Reading archive file mod timestamp"));
   2568 
   2569       /* Can't read mod time for some reason.  */
   2570       return TRUE;
   2571     }
   2572   if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
   2573     /* OK by the linker's rules.  */
   2574     return TRUE;
   2575 
   2576   /* Update the timestamp.  */
   2577   bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
   2578 
   2579   /* Prepare an ASCII version suitable for writing.  */
   2580   memset (hdr.ar_date, ' ', sizeof (hdr.ar_date));
   2581   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
   2582 		    bfd_ardata (arch)->armap_timestamp);
   2583 
   2584   /* Write it into the file.  */
   2585   bfd_ardata (arch)->armap_datepos = (SARMAG
   2586 				      + offsetof (struct ar_hdr, ar_date[0]));
   2587   if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
   2588       || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch)
   2589 	  != sizeof (hdr.ar_date)))
   2590     {
   2591       bfd_perror (_("Writing updated armap timestamp"));
   2592 
   2593       /* Some error while writing.  */
   2594       return TRUE;
   2595     }
   2596 
   2597   /* We updated the timestamp successfully.  */
   2598   return FALSE;
   2599 }
   2600 
   2601 /* A coff armap looks like :
   2603    lARMAG
   2604    struct ar_hdr with name = '/'
   2605    number of symbols
   2606    offset of file for symbol 0
   2607    offset of file for symbol 1
   2608 
   2609    offset of file for symbol n-1
   2610    symbol name 0
   2611    symbol name 1
   2612 
   2613    symbol name n-1  */
   2614 
   2615 bfd_boolean
   2616 coff_write_armap (bfd *arch,
   2617 		  unsigned int elength,
   2618 		  struct orl *map,
   2619 		  unsigned int symbol_count,
   2620 		  int stridx)
   2621 {
   2622   /* The size of the ranlib is the number of exported symbols in the
   2623      archive * the number of bytes in an int, + an int for the count.  */
   2624   unsigned int ranlibsize = (symbol_count * 4) + 4;
   2625   unsigned int stringsize = stridx;
   2626   unsigned int mapsize = stringsize + ranlibsize;
   2627   file_ptr archive_member_file_ptr;
   2628   bfd *current = arch->archive_head;
   2629   unsigned int count;
   2630   struct ar_hdr hdr;
   2631   int padit = mapsize & 1;
   2632 
   2633   if (padit)
   2634     mapsize++;
   2635 
   2636   /* Work out where the first object file will go in the archive.  */
   2637   archive_member_file_ptr = (mapsize
   2638 			     + elength
   2639 			     + sizeof (struct ar_hdr)
   2640 			     + SARMAG);
   2641 
   2642   memset (&hdr, ' ', sizeof (struct ar_hdr));
   2643   hdr.ar_name[0] = '/';
   2644   if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
   2645     return FALSE;
   2646   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
   2647 		    ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
   2648 		     ? time (NULL) : 0));
   2649   /* This, at least, is what Intel coff sets the values to.  */
   2650   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0);
   2651   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0);
   2652   _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0);
   2653   memcpy (hdr.ar_fmag, ARFMAG, 2);
   2654 
   2655   /* Write the ar header for this item and the number of symbols.  */
   2656   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
   2657       != sizeof (struct ar_hdr))
   2658     return FALSE;
   2659 
   2660   if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
   2661     return FALSE;
   2662 
   2663   /* Two passes, first write the file offsets for each symbol -
   2664      remembering that each offset is on a two byte boundary.  */
   2665 
   2666   /* Write out the file offset for the file associated with each
   2667      symbol, and remember to keep the offsets padded out.  */
   2668 
   2669   current = arch->archive_head;
   2670   count = 0;
   2671   while (current != NULL && count < symbol_count)
   2672     {
   2673       /* For each symbol which is used defined in this object, write
   2674 	 out the object file's address in the archive.  */
   2675 
   2676       while (count < symbol_count && map[count].u.abfd == current)
   2677 	{
   2678 	  unsigned int offset = (unsigned int) archive_member_file_ptr;
   2679 
   2680 	  /* Catch an attempt to grow an archive past its 4Gb limit.  */
   2681 	  if (archive_member_file_ptr != (file_ptr) offset)
   2682 	    {
   2683 	      bfd_set_error (bfd_error_file_truncated);
   2684 	      return FALSE;
   2685 	    }
   2686 	  if (!bfd_write_bigendian_4byte_int (arch, offset))
   2687 	    return FALSE;
   2688 	  count++;
   2689 	}
   2690       archive_member_file_ptr += sizeof (struct ar_hdr);
   2691       if (! bfd_is_thin_archive (arch))
   2692 	{
   2693 	  /* Add size of this archive entry.  */
   2694 	  archive_member_file_ptr += arelt_size (current);
   2695 	  /* Remember about the even alignment.  */
   2696 	  archive_member_file_ptr += archive_member_file_ptr % 2;
   2697 	}
   2698       current = current->archive_next;
   2699     }
   2700 
   2701   /* Now write the strings themselves.  */
   2702   for (count = 0; count < symbol_count; count++)
   2703     {
   2704       size_t len = strlen (*map[count].name) + 1;
   2705 
   2706       if (bfd_bwrite (*map[count].name, len, arch) != len)
   2707 	return FALSE;
   2708     }
   2709 
   2710   /* The spec sez this should be a newline.  But in order to be
   2711      bug-compatible for arc960 we use a null.  */
   2712   if (padit)
   2713     {
   2714       if (bfd_bwrite ("", 1, arch) != 1)
   2715 	return FALSE;
   2716     }
   2717 
   2718   return TRUE;
   2719 }
   2720 
   2721 static int
   2722 archive_close_worker (void **slot, void *inf ATTRIBUTE_UNUSED)
   2723 {
   2724   struct ar_cache *ent = (struct ar_cache *) *slot;
   2725 
   2726   bfd_close_all_done (ent->arbfd);
   2727   return 1;
   2728 }
   2729 
   2730 bfd_boolean
   2731 _bfd_archive_close_and_cleanup (bfd *abfd)
   2732 {
   2733   if (bfd_read_p (abfd) && abfd->format == bfd_archive)
   2734     {
   2735       bfd *nbfd;
   2736       bfd *next;
   2737       htab_t htab;
   2738 
   2739       /* Close nested archives (if this bfd is a thin archive).  */
   2740       for (nbfd = abfd->nested_archives; nbfd; nbfd = next)
   2741 	{
   2742 	  next = nbfd->archive_next;
   2743 	  bfd_close (nbfd);
   2744 	}
   2745 
   2746       htab = bfd_ardata (abfd)->cache;
   2747       if (htab)
   2748 	{
   2749 	  htab_traverse_noresize (htab, archive_close_worker, NULL);
   2750 	  htab_delete (htab);
   2751 	  bfd_ardata (abfd)->cache = NULL;
   2752 	}
   2753     }
   2754   if (arch_eltdata (abfd) != NULL)
   2755     {
   2756       struct areltdata *ared = arch_eltdata (abfd);
   2757       htab_t htab = (htab_t) ared->parent_cache;
   2758 
   2759       if (htab)
   2760 	{
   2761 	  struct ar_cache ent;
   2762 	  void **slot;
   2763 
   2764 	  ent.ptr = ared->key;
   2765 	  slot = htab_find_slot (htab, &ent, NO_INSERT);
   2766 	  if (slot != NULL)
   2767 	    {
   2768 	      BFD_ASSERT (((struct ar_cache *) *slot)->arbfd == abfd);
   2769 	      htab_clear_slot (htab, slot);
   2770 	    }
   2771 	}
   2772     }
   2773   if (abfd->is_linker_output)
   2774     (*abfd->link.hash->hash_table_free) (abfd);
   2775 
   2776   return TRUE;
   2777 }
   2778