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