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