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