2010-01-08 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
1058   bfd_has_map (abfd) = FALSE;
1059   return TRUE;
1060 }
1061 \f
1062 /* Returns FALSE on error, TRUE otherwise.  */
1063 /* Flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
1064    header is in a slightly different order and the map name is '/'.
1065    This flavour is used by hp300hpux.  */
1066
1067 #define HPUX_SYMDEF_COUNT_SIZE 2
1068
1069 bfd_boolean
1070 bfd_slurp_bsd_armap_f2 (bfd *abfd)
1071 {
1072   struct areltdata *mapdata;
1073   char nextname[17];
1074   unsigned int counter;
1075   bfd_byte *raw_armap, *rbase;
1076   struct artdata *ardata = bfd_ardata (abfd);
1077   char *stringbase;
1078   unsigned int stringsize;
1079   bfd_size_type amt;
1080   carsym *set;
1081   int i = bfd_bread (nextname, 16, abfd);
1082
1083   if (i == 0)
1084     return TRUE;
1085   if (i != 16)
1086     return FALSE;
1087
1088   /* The archive has at least 16 bytes in it.  */
1089   if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1090     return FALSE;
1091
1092   if (CONST_STRNEQ (nextname, "__.SYMDEF       ")
1093       || CONST_STRNEQ (nextname, "__.SYMDEF/      ")) /* Old Linux archives.  */
1094     return do_slurp_bsd_armap (abfd);
1095
1096   if (! CONST_STRNEQ (nextname, "/               "))
1097     {
1098       bfd_has_map (abfd) = FALSE;
1099       return TRUE;
1100     }
1101
1102   mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1103   if (mapdata == NULL)
1104     return FALSE;
1105
1106   amt = mapdata->parsed_size;
1107   raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
1108   if (raw_armap == NULL)
1109     {
1110     byebye:
1111       bfd_release (abfd, mapdata);
1112       return FALSE;
1113     }
1114
1115   if (bfd_bread (raw_armap, amt, abfd) != amt)
1116     {
1117       if (bfd_get_error () != bfd_error_system_call)
1118         bfd_set_error (bfd_error_malformed_archive);
1119     byebyebye:
1120       bfd_release (abfd, raw_armap);
1121       goto byebye;
1122     }
1123
1124   ardata->symdef_count = H_GET_16 (abfd, raw_armap);
1125
1126   if (ardata->symdef_count * BSD_SYMDEF_SIZE
1127       > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE)
1128     {
1129       /* Probably we're using the wrong byte ordering.  */
1130       bfd_set_error (bfd_error_wrong_format);
1131       goto byebyebye;
1132     }
1133
1134   ardata->cache = 0;
1135
1136   stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
1137   /* Skip sym count and string sz.  */
1138   stringbase = ((char *) raw_armap
1139                 + HPUX_SYMDEF_COUNT_SIZE
1140                 + BSD_STRING_COUNT_SIZE);
1141   rbase = (bfd_byte *) stringbase + stringsize;
1142   amt = ardata->symdef_count * BSD_SYMDEF_SIZE;
1143   ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
1144   if (!ardata->symdefs)
1145     return FALSE;
1146
1147   for (counter = 0, set = ardata->symdefs;
1148        counter < ardata->symdef_count;
1149        counter++, set++, rbase += BSD_SYMDEF_SIZE)
1150     {
1151       set->name = H_GET_32 (abfd, rbase) + stringbase;
1152       set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1153     }
1154
1155   ardata->first_file_filepos = bfd_tell (abfd);
1156   /* Pad to an even boundary if you have to.  */
1157   ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1158   /* FIXME, we should provide some way to free raw_ardata when
1159      we are done using the strings from it.  For now, it seems
1160      to be allocated on an objalloc anyway...  */
1161   bfd_has_map (abfd) = TRUE;
1162   return TRUE;
1163 }
1164 \f
1165 /** Extended name table.
1166
1167   Normally archives support only 14-character filenames.
1168
1169   Intel has extended the format: longer names are stored in a special
1170   element (the first in the archive, or second if there is an armap);
1171   the name in the ar_hdr is replaced by <space><index into filename
1172   element>.  Index is the P.R. of an int (decimal).  Data General have
1173   extended the format by using the prefix // for the special element.  */
1174
1175 /* Returns FALSE on error, TRUE otherwise.  */
1176
1177 bfd_boolean
1178 _bfd_slurp_extended_name_table (bfd *abfd)
1179 {
1180   char nextname[17];
1181   struct areltdata *namedata;
1182   bfd_size_type amt;
1183
1184   /* FIXME:  Formatting sucks here, and in case of failure of BFD_READ,
1185      we probably don't want to return TRUE.  */
1186   bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET);
1187   if (bfd_bread (nextname, 16, abfd) == 16)
1188     {
1189       if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1190         return FALSE;
1191
1192       if (! CONST_STRNEQ (nextname, "ARFILENAMES/    ")
1193           && ! CONST_STRNEQ (nextname, "//              "))
1194         {
1195           bfd_ardata (abfd)->extended_names = NULL;
1196           bfd_ardata (abfd)->extended_names_size = 0;
1197           return TRUE;
1198         }
1199
1200       namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1201       if (namedata == NULL)
1202         return FALSE;
1203
1204       amt = namedata->parsed_size;
1205       if (amt + 1 == 0)
1206         goto byebye;
1207
1208       bfd_ardata (abfd)->extended_names_size = amt;
1209       bfd_ardata (abfd)->extended_names = (char *) bfd_zalloc (abfd, amt + 1);
1210       if (bfd_ardata (abfd)->extended_names == NULL)
1211         {
1212         byebye:
1213           bfd_release (abfd, namedata);
1214           return FALSE;
1215         }
1216
1217       if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
1218         {
1219           if (bfd_get_error () != bfd_error_system_call)
1220             bfd_set_error (bfd_error_malformed_archive);
1221           bfd_release (abfd, (bfd_ardata (abfd)->extended_names));
1222           bfd_ardata (abfd)->extended_names = NULL;
1223           goto byebye;
1224         }
1225
1226       /* Since the archive is supposed to be printable if it contains
1227          text, the entries in the list are newline-padded, not null
1228          padded. In SVR4-style archives, the names also have a
1229          trailing '/'.  DOS/NT created archive often have \ in them
1230          We'll fix all problems here..  */
1231       {
1232         char *ext_names = bfd_ardata (abfd)->extended_names;
1233         char *temp = ext_names;
1234         char *limit = temp + namedata->parsed_size;
1235         for (; temp < limit; ++temp)
1236           {
1237             if (*temp == ARFMAG[1])
1238               temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
1239             if (*temp == '\\')
1240               *temp = '/';
1241           }
1242         *limit = '\0';
1243       }
1244
1245       /* Pad to an even boundary if you have to.  */
1246       bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1247       bfd_ardata (abfd)->first_file_filepos +=
1248         (bfd_ardata (abfd)->first_file_filepos) % 2;
1249
1250       /* FIXME, we can't release namedata here because it was allocated
1251          below extended_names on the objalloc...  */
1252     }
1253   return TRUE;
1254 }
1255
1256 #ifdef VMS
1257
1258 /* Return a copy of the stuff in the filename between any :]> and a
1259    semicolon.  */
1260
1261 static const char *
1262 normalize (bfd *abfd, const char *file)
1263 {
1264   const char *first;
1265   const char *last;
1266   char *copy;
1267
1268   first = file + strlen (file) - 1;
1269   last = first + 1;
1270
1271   while (first != file)
1272     {
1273       if (*first == ';')
1274         last = first;
1275       if (*first == ':' || *first == ']' || *first == '>')
1276         {
1277           first++;
1278           break;
1279         }
1280       first--;
1281     }
1282
1283   copy = bfd_alloc (abfd, last - first + 1);
1284   if (copy == NULL)
1285     return NULL;
1286
1287   memcpy (copy, first, last - first);
1288   copy[last - first] = 0;
1289
1290   return copy;
1291 }
1292
1293 #else
1294 static const char *
1295 normalize (bfd *abfd ATTRIBUTE_UNUSED, const char *file)
1296 {
1297   const char *filename = strrchr (file, '/');
1298
1299 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1300   {
1301     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
1302     char *bslash = strrchr (file, '\\');
1303     if (filename == NULL || (bslash != NULL && bslash > filename))
1304       filename = bslash;
1305     if (filename == NULL && file[0] != '\0' && file[1] == ':')
1306       filename = file + 1;
1307   }
1308 #endif
1309   if (filename != NULL)
1310     filename++;
1311   else
1312     filename = file;
1313   return filename;
1314 }
1315 #endif
1316
1317 /* Adjust a relative path name based on the reference path.  */
1318
1319 static const char *
1320 adjust_relative_path (const char * path, const char * ref_path)
1321 {
1322   static char *pathbuf = NULL;
1323   static int pathbuf_len = 0;
1324   const char *pathp = path;
1325   const char *refp = ref_path;
1326   int element_count = 0;
1327   int len;
1328   char *newp;
1329
1330   /* Remove common leading path elements.  */
1331   for (;;)
1332     {
1333       const char *e1 = pathp;
1334       const char *e2 = refp;
1335
1336       while (*e1 && ! IS_DIR_SEPARATOR (*e1))
1337         ++e1;
1338       while (*e2 && ! IS_DIR_SEPARATOR (*e2))
1339         ++e2;
1340       if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
1341           || strncmp (pathp, refp, e1 - pathp) != 0)
1342         break;
1343       pathp = e1 + 1;
1344       refp = e2 + 1;
1345     }
1346
1347   /* For each leading path element in the reference path,
1348      insert "../" into the path.  */
1349   for (; *refp; ++refp)
1350     if (IS_DIR_SEPARATOR (*refp))
1351       ++element_count;
1352   len = 3 * element_count + strlen (path) + 1;
1353
1354   if (len > pathbuf_len)
1355     {
1356       if (pathbuf != NULL)
1357         free (pathbuf);
1358       pathbuf_len = 0;
1359       pathbuf = (char *) bfd_malloc (len);
1360       if (pathbuf == NULL)
1361         return path;
1362       pathbuf_len = len;
1363     }
1364
1365   newp = pathbuf;
1366   while (element_count-- > 0)
1367     {
1368       /* FIXME: Support Windows style path separators as well.  */
1369       strcpy (newp, "../");
1370       newp += 3;
1371     }
1372   strcpy (newp, pathp);
1373
1374   return pathbuf;
1375 }
1376
1377 /* Build a BFD style extended name table.  */
1378
1379 bfd_boolean
1380 _bfd_archive_bsd_construct_extended_name_table (bfd *abfd,
1381                                                 char **tabloc,
1382                                                 bfd_size_type *tablen,
1383                                                 const char **name)
1384 {
1385   *name = "ARFILENAMES/";
1386   return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
1387 }
1388
1389 /* Build an SVR4 style extended name table.  */
1390
1391 bfd_boolean
1392 _bfd_archive_coff_construct_extended_name_table (bfd *abfd,
1393                                                  char **tabloc,
1394                                                  bfd_size_type *tablen,
1395                                                  const char **name)
1396 {
1397   *name = "//";
1398   return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
1399 }
1400
1401 /* Follows archive_head and produces an extended name table if
1402    necessary.  Returns (in tabloc) a pointer to an extended name
1403    table, and in tablen the length of the table.  If it makes an entry
1404    it clobbers the filename so that the element may be written without
1405    further massage.  Returns TRUE if it ran successfully, FALSE if
1406    something went wrong.  A successful return may still involve a
1407    zero-length tablen!  */
1408
1409 bfd_boolean
1410 _bfd_construct_extended_name_table (bfd *abfd,
1411                                     bfd_boolean trailing_slash,
1412                                     char **tabloc,
1413                                     bfd_size_type *tablen)
1414 {
1415   unsigned int maxname = abfd->xvec->ar_max_namelen;
1416   bfd_size_type total_namelen = 0;
1417   bfd *current;
1418   char *strptr;
1419   const char *last_filename;
1420   long last_stroff;
1421
1422   *tablen = 0;
1423   last_filename = NULL;
1424
1425   /* Figure out how long the table should be.  */
1426   for (current = abfd->archive_head;
1427        current != NULL;
1428        current = current->archive_next)
1429     {
1430       const char *normal;
1431       unsigned int thislen;
1432
1433       if (bfd_is_thin_archive (abfd))
1434         {
1435           const char *filename = current->filename;
1436
1437           /* If the element being added is a member of another archive
1438              (i.e., we are flattening), use the containing archive's name.  */
1439           if (current->my_archive
1440               && ! bfd_is_thin_archive (current->my_archive))
1441             filename = current->my_archive->filename;
1442
1443           /* If the path is the same as the previous path seen,
1444              reuse it.  This can happen when flattening a thin
1445              archive that contains other archives.  */
1446           if (last_filename && strcmp (last_filename, filename) == 0)
1447             continue;
1448
1449           last_filename = filename;
1450
1451           /* If the path is relative, adjust it relative to
1452              the containing archive. */
1453           if (! IS_ABSOLUTE_PATH (filename)
1454               && ! IS_ABSOLUTE_PATH (abfd->filename))
1455             normal = adjust_relative_path (filename, abfd->filename);
1456           else
1457             normal = filename;
1458
1459           /* In a thin archive, always store the full pathname
1460              in the extended name table.  */
1461           total_namelen += strlen (normal) + 1;
1462           if (trailing_slash)
1463             /* Leave room for trailing slash.  */
1464             ++total_namelen;
1465
1466           continue;
1467         }
1468
1469       normal = normalize (current, current->filename);
1470       if (normal == NULL)
1471         return FALSE;
1472
1473       thislen = strlen (normal);
1474
1475       if (thislen > maxname
1476           && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1477         thislen = maxname;
1478
1479       if (thislen > maxname)
1480         {
1481           /* Add one to leave room for \n.  */
1482           total_namelen += thislen + 1;
1483           if (trailing_slash)
1484             {
1485               /* Leave room for trailing slash.  */
1486               ++total_namelen;
1487             }
1488         }
1489       else
1490         {
1491           struct ar_hdr *hdr = arch_hdr (current);
1492           if (strncmp (normal, hdr->ar_name, thislen) != 0
1493               || (thislen < sizeof hdr->ar_name
1494                   && hdr->ar_name[thislen] != ar_padchar (current)))
1495             {
1496               /* Must have been using extended format even though it
1497                  didn't need to.  Fix it to use normal format.  */
1498               memcpy (hdr->ar_name, normal, thislen);
1499               if (thislen < maxname
1500                   || (thislen == maxname && thislen < sizeof hdr->ar_name))
1501                 hdr->ar_name[thislen] = ar_padchar (current);
1502             }
1503         }
1504     }
1505
1506   if (total_namelen == 0)
1507     return TRUE;
1508
1509   *tabloc = (char *) bfd_zalloc (abfd, total_namelen);
1510   if (*tabloc == NULL)
1511     return FALSE;
1512
1513   *tablen = total_namelen;
1514   strptr = *tabloc;
1515
1516   last_filename = NULL;
1517   last_stroff = 0;
1518
1519   for (current = abfd->archive_head;
1520        current != NULL;
1521        current = current->archive_next)
1522     {
1523       const char *normal;
1524       unsigned int thislen;
1525       long stroff;
1526       const char *filename = current->filename;
1527
1528       if (bfd_is_thin_archive (abfd))
1529         {
1530           /* If the element being added is a member of another archive
1531              (i.e., we are flattening), use the containing archive's name.  */
1532           if (current->my_archive
1533               && ! bfd_is_thin_archive (current->my_archive))
1534             filename = current->my_archive->filename;
1535           /* If the path is the same as the previous path seen,
1536              reuse it.  This can happen when flattening a thin
1537              archive that contains other archives.
1538              If the path is relative, adjust it relative to
1539              the containing archive.  */
1540           if (last_filename && strcmp (last_filename, filename) == 0)
1541             normal = last_filename;
1542           else if (! IS_ABSOLUTE_PATH (filename)
1543                    && ! IS_ABSOLUTE_PATH (abfd->filename))
1544             normal = adjust_relative_path (filename, abfd->filename);
1545           else
1546             normal = filename;
1547         }
1548       else
1549         {
1550           normal = normalize (current, filename);
1551           if (normal == NULL)
1552             return FALSE;
1553         }
1554
1555       thislen = strlen (normal);
1556       if (thislen > maxname || bfd_is_thin_archive (abfd))
1557         {
1558           /* Works for now; may need to be re-engineered if we
1559              encounter an oddball archive format and want to
1560              generalise this hack.  */
1561           struct ar_hdr *hdr = arch_hdr (current);
1562           if (normal == last_filename)
1563             stroff = last_stroff;
1564           else
1565             {
1566               strcpy (strptr, normal);
1567               if (! trailing_slash)
1568                 strptr[thislen] = ARFMAG[1];
1569               else
1570                 {
1571                   strptr[thislen] = '/';
1572                   strptr[thislen + 1] = ARFMAG[1];
1573                 }
1574               stroff = strptr - *tabloc;
1575               last_stroff = stroff;
1576             }
1577           hdr->ar_name[0] = ar_padchar (current);
1578           if (bfd_is_thin_archive (abfd) && current->origin > 0)
1579             {
1580               int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:",
1581                                   stroff);
1582               _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len,
1583                                 "%-ld",
1584                                 current->origin - sizeof (struct ar_hdr));
1585             }
1586           else
1587             _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff);
1588           if (normal != last_filename)
1589             {
1590               strptr += thislen + 1;
1591               if (trailing_slash)
1592                 ++strptr;
1593               last_filename = filename;
1594             }
1595         }
1596     }
1597
1598   return TRUE;
1599 }
1600 \f
1601 /* A couple of functions for creating ar_hdrs.  */
1602
1603 #ifdef HPUX_LARGE_AR_IDS
1604 /* Function to encode large UID/GID values according to HP.  */
1605
1606 static void
1607 hpux_uid_gid_encode (char str[6], long int id)
1608 {
1609   int cnt;
1610
1611   str[5] = '@' + (id & 3);
1612   id >>= 2;
1613
1614   for (cnt = 4; cnt >= 0; --cnt, id >>= 6)
1615     str[cnt] = ' ' + (id & 0x3f);
1616 }
1617 #endif  /* HPUX_LARGE_AR_IDS */
1618
1619 #ifndef HAVE_GETUID
1620 #define getuid() 0
1621 #endif
1622
1623 #ifndef HAVE_GETGID
1624 #define getgid() 0
1625 #endif
1626
1627 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1628    make one.  The filename must refer to a filename in the filesystem.
1629    The filename field of the ar_hdr will NOT be initialized.  If member
1630    is set, and it's an in-memory bfd, we fake it.  */
1631
1632 static struct areltdata *
1633 bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
1634 {
1635   struct stat status;
1636   struct areltdata *ared;
1637   struct ar_hdr *hdr;
1638   bfd_size_type amt;
1639
1640   if (member && (member->flags & BFD_IN_MEMORY) != 0)
1641     {
1642       /* Assume we just "made" the member, and fake it.  */
1643       struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream;
1644       time (&status.st_mtime);
1645       status.st_uid = getuid ();
1646       status.st_gid = getgid ();
1647       status.st_mode = 0644;
1648       status.st_size = bim->size;
1649     }
1650   else if (stat (filename, &status) != 0)
1651     {
1652       bfd_set_error (bfd_error_system_call);
1653       return NULL;
1654     }
1655
1656   /* If the caller requested that the BFD generate deterministic output,
1657      fake values for modification time, UID, GID, and file mode.  */
1658   if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
1659     {
1660       status.st_mtime = 0;
1661       status.st_uid = 0;
1662       status.st_gid = 0;
1663       status.st_mode = 0644;
1664     }
1665
1666   amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
1667   ared = (struct areltdata *) bfd_zalloc (abfd, amt);
1668   if (ared == NULL)
1669     return NULL;
1670   hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1671
1672   /* ar headers are space padded, not null padded!  */
1673   memset (hdr, ' ', sizeof (struct ar_hdr));
1674
1675   _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld",
1676                     status.st_mtime);
1677 #ifdef HPUX_LARGE_AR_IDS
1678   /* HP has a very "special" way to handle UID/GID's with numeric values
1679      > 99999.  */
1680   if (status.st_uid > 99999)
1681     hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid);
1682   else
1683 #endif
1684     _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld",
1685                       status.st_uid);
1686 #ifdef HPUX_LARGE_AR_IDS
1687   /* HP has a very "special" way to handle UID/GID's with numeric values
1688      > 99999.  */
1689   if (status.st_gid > 99999)
1690     hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid);
1691   else
1692 #endif
1693     _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld",
1694                       status.st_gid);
1695   _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
1696                     status.st_mode);
1697   _bfd_ar_spacepad (hdr->ar_size, sizeof (hdr->ar_size), "%-10ld",
1698                     status.st_size);
1699   memcpy (hdr->ar_fmag, ARFMAG, 2);
1700   ared->parsed_size = status.st_size;
1701   ared->arch_header = (char *) hdr;
1702
1703   return ared;
1704 }
1705
1706 /* Analogous to stat call.  */
1707
1708 int
1709 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
1710 {
1711   struct ar_hdr *hdr;
1712   char *aloser;
1713
1714   if (abfd->arelt_data == NULL)
1715     {
1716       bfd_set_error (bfd_error_invalid_operation);
1717       return -1;
1718     }
1719
1720   hdr = arch_hdr (abfd);
1721
1722 #define foo(arelt, stelt, size)                         \
1723   buf->stelt = strtol (hdr->arelt, &aloser, size);      \
1724   if (aloser == hdr->arelt)                             \
1725     return -1;
1726
1727   /* Some platforms support special notations for large IDs.  */
1728 #ifdef HPUX_LARGE_AR_IDS
1729 # define foo2(arelt, stelt, size)                                       \
1730   if (hdr->arelt[5] == ' ')                                             \
1731     {                                                                   \
1732       foo (arelt, stelt, size);                                         \
1733     }                                                                   \
1734   else                                                                  \
1735     {                                                                   \
1736       int cnt;                                                          \
1737       for (buf->stelt = cnt = 0; cnt < 5; ++cnt)                        \
1738         {                                                               \
1739           if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f)    \
1740             return -1;                                                  \
1741           buf->stelt <<= 6;                                             \
1742           buf->stelt += hdr->arelt[cnt] - ' ';                          \
1743         }                                                               \
1744       if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3)               \
1745         return -1;                                                      \
1746       buf->stelt <<= 2;                                                 \
1747       buf->stelt += hdr->arelt[5] - '@';                                \
1748     }
1749 #else
1750 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1751 #endif
1752
1753   foo (ar_date, st_mtime, 10);
1754   foo2 (ar_uid, st_uid, 10);
1755   foo2 (ar_gid, st_gid, 10);
1756   foo (ar_mode, st_mode, 8);
1757
1758   buf->st_size = arch_eltdata (abfd)->parsed_size;
1759
1760   return 0;
1761 }
1762
1763 void
1764 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1765 {
1766   /* FIXME: This interacts unpleasantly with ar's quick-append option.
1767      Fortunately ic960 users will never use that option.  Fixing this
1768      is very hard; fortunately I know how to do it and will do so once
1769      intel's release is out the door.  */
1770
1771   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1772   size_t length;
1773   const char *filename;
1774   size_t maxlen = ar_maxnamelen (abfd);
1775
1776   if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1777     {
1778       bfd_bsd_truncate_arname (abfd, pathname, arhdr);
1779       return;
1780     }
1781
1782   filename = normalize (abfd, pathname);
1783   if (filename == NULL)
1784     {
1785       /* FIXME */
1786       abort ();
1787     }
1788
1789   length = strlen (filename);
1790
1791   if (length <= maxlen)
1792     memcpy (hdr->ar_name, filename, length);
1793
1794   /* Add the padding character if there is room for it.  */
1795   if (length < maxlen
1796       || (length == maxlen && length < sizeof hdr->ar_name))
1797     (hdr->ar_name)[length] = ar_padchar (abfd);
1798 }
1799
1800 void
1801 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1802 {
1803   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1804   size_t length;
1805   const char *filename = strrchr (pathname, '/');
1806   size_t maxlen = ar_maxnamelen (abfd);
1807
1808 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1809   {
1810     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
1811     char *bslash = strrchr (pathname, '\\');
1812     if (filename == NULL || (bslash != NULL && bslash > filename))
1813       filename = bslash;
1814     if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1815       filename = pathname + 1;
1816   }
1817 #endif
1818
1819   if (filename == NULL)
1820     filename = pathname;
1821   else
1822     ++filename;
1823
1824   length = strlen (filename);
1825
1826   if (length <= maxlen)
1827     memcpy (hdr->ar_name, filename, length);
1828   else
1829     {
1830       /* pathname: meet procrustes */
1831       memcpy (hdr->ar_name, filename, maxlen);
1832       length = maxlen;
1833     }
1834
1835   if (length < maxlen)
1836     (hdr->ar_name)[length] = ar_padchar (abfd);
1837 }
1838
1839 /* Store name into ar header.  Truncates the name to fit.
1840    1> strip pathname to be just the basename.
1841    2> if it's short enuf to fit, stuff it in.
1842    3> If it doesn't end with .o, truncate it to fit
1843    4> truncate it before the .o, append .o, stuff THAT in.  */
1844
1845 /* This is what gnu ar does.  It's better but incompatible with the
1846    bsd ar.  */
1847
1848 void
1849 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1850 {
1851   struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1852   size_t length;
1853   const char *filename = strrchr (pathname, '/');
1854   size_t maxlen = ar_maxnamelen (abfd);
1855
1856 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1857   {
1858     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
1859     char *bslash = strrchr (pathname, '\\');
1860
1861     if (filename == NULL || (bslash != NULL && bslash > filename))
1862       filename = bslash;
1863     if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1864       filename = pathname + 1;
1865   }
1866 #endif
1867
1868   if (filename == NULL)
1869     filename = pathname;
1870   else
1871     ++filename;
1872
1873   length = strlen (filename);
1874
1875   if (length <= maxlen)
1876     memcpy (hdr->ar_name, filename, length);
1877   else
1878     {
1879       /* pathname: meet procrustes.  */
1880       memcpy (hdr->ar_name, filename, maxlen);
1881       if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
1882         {
1883           hdr->ar_name[maxlen - 2] = '.';
1884           hdr->ar_name[maxlen - 1] = 'o';
1885         }
1886       length = maxlen;
1887     }
1888
1889   if (length < 16)
1890     (hdr->ar_name)[length] = ar_padchar (abfd);
1891 }
1892 \f
1893 /* The BFD is open for write and has its format set to bfd_archive.  */
1894
1895 bfd_boolean
1896 _bfd_write_archive_contents (bfd *arch)
1897 {
1898   bfd *current;
1899   char *etable = NULL;
1900   bfd_size_type elength = 0;
1901   const char *ename = NULL;
1902   bfd_boolean makemap = bfd_has_map (arch);
1903   /* If no .o's, don't bother to make a map.  */
1904   bfd_boolean hasobjects = FALSE;
1905   bfd_size_type wrote;
1906   int tries;
1907   char *armag;
1908
1909   /* Verify the viability of all entries; if any of them live in the
1910      filesystem (as opposed to living in an archive open for input)
1911      then construct a fresh ar_hdr for them.  */
1912   for (current = arch->archive_head;
1913        current != NULL;
1914        current = current->archive_next)
1915     {
1916       /* This check is checking the bfds for the objects we're reading
1917          from (which are usually either an object file or archive on
1918          disk), not the archive entries we're writing to.  We don't
1919          actually create bfds for the archive members, we just copy
1920          them byte-wise when we write out the archive.  */
1921       if (bfd_write_p (current))
1922         {
1923           bfd_set_error (bfd_error_invalid_operation);
1924           goto input_err;
1925         }
1926       if (!current->arelt_data)
1927         {
1928           current->arelt_data =
1929             bfd_ar_hdr_from_filesystem (arch, current->filename, current);
1930           if (!current->arelt_data)
1931             goto input_err;
1932
1933           /* Put in the file name.  */
1934           BFD_SEND (arch, _bfd_truncate_arname,
1935                     (arch, current->filename, (char *) arch_hdr (current)));
1936         }
1937
1938       if (makemap && ! hasobjects)
1939         {                       /* Don't bother if we won't make a map!  */
1940           if ((bfd_check_format (current, bfd_object)))
1941             hasobjects = TRUE;
1942         }
1943     }
1944
1945   if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
1946                  (arch, &etable, &elength, &ename)))
1947     return FALSE;
1948
1949   if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
1950     return FALSE;
1951   armag = ARMAG;
1952   if (bfd_is_thin_archive (arch))
1953     armag = ARMAGT;
1954   wrote = bfd_bwrite (armag, SARMAG, arch);
1955   if (wrote != SARMAG)
1956     return FALSE;
1957
1958   if (makemap && hasobjects)
1959     {
1960       if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
1961         return FALSE;
1962     }
1963
1964   if (elength != 0)
1965     {
1966       struct ar_hdr hdr;
1967
1968       memset (&hdr, ' ', sizeof (struct ar_hdr));
1969       memcpy (hdr.ar_name, ename, strlen (ename));
1970       /* Round size up to even number in archive header.  */
1971       _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld",
1972                         (elength + 1) & ~(bfd_size_type) 1);
1973       memcpy (hdr.ar_fmag, ARFMAG, 2);
1974       if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
1975            != sizeof (struct ar_hdr))
1976           || bfd_bwrite (etable, elength, arch) != elength)
1977         return FALSE;
1978       if ((elength % 2) == 1)
1979         {
1980           if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
1981             return FALSE;
1982         }
1983     }
1984
1985   for (current = arch->archive_head;
1986        current != NULL;
1987        current = current->archive_next)
1988     {
1989       char buffer[DEFAULT_BUFFERSIZE];
1990       unsigned int remaining = arelt_size (current);
1991       struct ar_hdr *hdr = arch_hdr (current);
1992
1993       /* Write ar header.  */
1994       if (bfd_bwrite (hdr, sizeof (*hdr), arch)
1995           != sizeof (*hdr))
1996         return FALSE;
1997       if (bfd_is_thin_archive (arch))
1998         continue;
1999       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
2000         goto input_err;
2001
2002       while (remaining)
2003         {
2004           unsigned int amt = DEFAULT_BUFFERSIZE;
2005
2006           if (amt > remaining)
2007             amt = remaining;
2008           errno = 0;
2009           if (bfd_bread (buffer, amt, current) != amt)
2010             {
2011               if (bfd_get_error () != bfd_error_system_call)
2012                 bfd_set_error (bfd_error_file_truncated);
2013               goto input_err;
2014             }
2015           if (bfd_bwrite (buffer, amt, arch) != amt)
2016             return FALSE;
2017           remaining -= amt;
2018         }
2019
2020       if ((arelt_size (current) % 2) == 1)
2021         {
2022           if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2023             return FALSE;
2024         }
2025     }
2026
2027   if (makemap && hasobjects)
2028     {
2029       /* Verify the timestamp in the archive file.  If it would not be
2030          accepted by the linker, rewrite it until it would be.  If
2031          anything odd happens, break out and just return.  (The
2032          Berkeley linker checks the timestamp and refuses to read the
2033          table-of-contents if it is >60 seconds less than the file's
2034          modified-time.  That painful hack requires this painful hack.  */
2035       tries = 1;
2036       do
2037         {
2038           if (bfd_update_armap_timestamp (arch))
2039             break;
2040           (*_bfd_error_handler)
2041             (_("Warning: writing archive was slow: rewriting timestamp\n"));
2042         }
2043       while (++tries < 6);
2044     }
2045
2046   return TRUE;
2047
2048  input_err:
2049   bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
2050   return FALSE;
2051 }
2052 \f
2053 /* Note that the namidx for the first symbol is 0.  */
2054
2055 bfd_boolean
2056 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
2057 {
2058   char *first_name = NULL;
2059   bfd *current;
2060   file_ptr elt_no = 0;
2061   struct orl *map = NULL;
2062   unsigned int orl_max = 1024;          /* Fine initial default.  */
2063   unsigned int orl_count = 0;
2064   int stridx = 0;
2065   asymbol **syms = NULL;
2066   long syms_max = 0;
2067   bfd_boolean ret;
2068   bfd_size_type amt;
2069
2070   /* Dunno if this is the best place for this info...  */
2071   if (elength != 0)
2072     elength += sizeof (struct ar_hdr);
2073   elength += elength % 2;
2074
2075   amt = orl_max * sizeof (struct orl);
2076   map = (struct orl *) bfd_malloc (amt);
2077   if (map == NULL)
2078     goto error_return;
2079
2080   /* We put the symbol names on the arch objalloc, and then discard
2081      them when done.  */
2082   first_name = (char *) bfd_alloc (arch, 1);
2083   if (first_name == NULL)
2084     goto error_return;
2085
2086   /* Drop all the files called __.SYMDEF, we're going to make our own.  */
2087   while (arch->archive_head
2088          && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
2089     arch->archive_head = arch->archive_head->archive_next;
2090
2091   /* Map over each element.  */
2092   for (current = arch->archive_head;
2093        current != NULL;
2094        current = current->archive_next, elt_no++)
2095     {
2096       if (bfd_check_format (current, bfd_object)
2097           && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
2098         {
2099           long storage;
2100           long symcount;
2101           long src_count;
2102
2103           storage = bfd_get_symtab_upper_bound (current);
2104           if (storage < 0)
2105             goto error_return;
2106
2107           if (storage != 0)
2108             {
2109               if (storage > syms_max)
2110                 {
2111                   if (syms_max > 0)
2112                     free (syms);
2113                   syms_max = storage;
2114                   syms = (asymbol **) bfd_malloc (syms_max);
2115                   if (syms == NULL)
2116                     goto error_return;
2117                 }
2118               symcount = bfd_canonicalize_symtab (current, syms);
2119               if (symcount < 0)
2120                 goto error_return;
2121
2122               /* Now map over all the symbols, picking out the ones we
2123                  want.  */
2124               for (src_count = 0; src_count < symcount; src_count++)
2125                 {
2126                   flagword flags = (syms[src_count])->flags;
2127                   asection *sec = syms[src_count]->section;
2128
2129                   if ((flags & BSF_GLOBAL
2130                        || flags & BSF_WEAK
2131                        || flags & BSF_INDIRECT
2132                        || bfd_is_com_section (sec))
2133                       && ! bfd_is_und_section (sec))
2134                     {
2135                       bfd_size_type namelen;
2136                       struct orl *new_map;
2137
2138                       /* This symbol will go into the archive header.  */
2139                       if (orl_count == orl_max)
2140                         {
2141                           orl_max *= 2;
2142                           amt = orl_max * sizeof (struct orl);
2143                           new_map = (struct orl *) bfd_realloc (map, amt);
2144                           if (new_map == NULL)
2145                             goto error_return;
2146
2147                           map = new_map;
2148                         }
2149
2150                       namelen = strlen (syms[src_count]->name);
2151                       amt = sizeof (char *);
2152                       map[orl_count].name = (char **) bfd_alloc (arch, amt);
2153                       if (map[orl_count].name == NULL)
2154                         goto error_return;
2155                       *(map[orl_count].name) = (char *) bfd_alloc (arch,
2156                                                                    namelen + 1);
2157                       if (*(map[orl_count].name) == NULL)
2158                         goto error_return;
2159                       strcpy (*(map[orl_count].name), syms[src_count]->name);
2160                       map[orl_count].u.abfd = current;
2161                       map[orl_count].namidx = stridx;
2162
2163                       stridx += namelen + 1;
2164                       ++orl_count;
2165                     }
2166                 }
2167             }
2168
2169           /* Now ask the BFD to free up any cached information, so we
2170              don't fill all of memory with symbol tables.  */
2171           if (! bfd_free_cached_info (current))
2172             goto error_return;
2173         }
2174     }
2175
2176   /* OK, now we have collected all the data, let's write them out.  */
2177   ret = BFD_SEND (arch, write_armap,
2178                   (arch, elength, map, orl_count, stridx));
2179
2180   if (syms_max > 0)
2181     free (syms);
2182   if (map != NULL)
2183     free (map);
2184   if (first_name != NULL)
2185     bfd_release (arch, first_name);
2186
2187   return ret;
2188
2189  error_return:
2190   if (syms_max > 0)
2191     free (syms);
2192   if (map != NULL)
2193     free (map);
2194   if (first_name != NULL)
2195     bfd_release (arch, first_name);
2196
2197   return FALSE;
2198 }
2199
2200 bfd_boolean
2201 bsd_write_armap (bfd *arch,
2202                  unsigned int elength,
2203                  struct orl *map,
2204                  unsigned int orl_count,
2205                  int stridx)
2206 {
2207   int padit = stridx & 1;
2208   unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
2209   unsigned int stringsize = stridx + padit;
2210   /* Include 8 bytes to store ranlibsize and stringsize in output.  */
2211   unsigned int mapsize = ranlibsize + stringsize + 8;
2212   file_ptr firstreal;
2213   bfd *current = arch->archive_head;
2214   bfd *last_elt = current;      /* Last element arch seen.  */
2215   bfd_byte temp[4];
2216   unsigned int count;
2217   struct ar_hdr hdr;
2218   struct stat statbuf;
2219   long uid, gid;
2220
2221   firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2222
2223   stat (arch->filename, &statbuf);
2224   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
2225     {
2226       /* Remember the timestamp, to keep it holy.  But fudge it a little.  */
2227       bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
2228                                             + ARMAP_TIME_OFFSET);
2229       uid = getuid();
2230       gid = getgid();
2231     }
2232   else
2233     {
2234       /* If deterministic, we use 0 as the timestamp in the map.
2235          Some linkers may require that the archive filesystem modification
2236          time is less than (or near to) the archive map timestamp.  Those
2237          linkers should not be used with deterministic mode.  (GNU ld and
2238          Gold do not have this restriction.)  */
2239       bfd_ardata (arch)->armap_timestamp = 0;
2240       uid = 0;
2241       gid = 0;
2242     }
2243
2244   memset (&hdr, ' ', sizeof (struct ar_hdr));
2245   memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG));
2246   bfd_ardata (arch)->armap_datepos = (SARMAG
2247                                       + offsetof (struct ar_hdr, ar_date[0]));
2248   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2249                     bfd_ardata (arch)->armap_timestamp);
2250   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
2251   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
2252   _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
2253   memcpy (hdr.ar_fmag, ARFMAG, 2);
2254   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2255       != sizeof (struct ar_hdr))
2256     return FALSE;
2257   H_PUT_32 (arch, ranlibsize, temp);
2258   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2259     return FALSE;
2260
2261   for (count = 0; count < orl_count; count++)
2262     {
2263       bfd_byte buf[BSD_SYMDEF_SIZE];
2264
2265       if (map[count].u.abfd != last_elt)
2266         {
2267           do
2268             {
2269               firstreal += arelt_size (current) + sizeof (struct ar_hdr);
2270               firstreal += firstreal % 2;
2271               current = current->archive_next;
2272             }
2273           while (current != map[count].u.abfd);
2274         }
2275
2276       last_elt = current;
2277       H_PUT_32 (arch, map[count].namidx, buf);
2278       H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2279       if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch)
2280           != BSD_SYMDEF_SIZE)
2281         return FALSE;
2282     }
2283
2284   /* Now write the strings themselves.  */
2285   H_PUT_32 (arch, stringsize, temp);
2286   if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2287     return FALSE;
2288   for (count = 0; count < orl_count; count++)
2289     {
2290       size_t len = strlen (*map[count].name) + 1;
2291
2292       if (bfd_bwrite (*map[count].name, len, arch) != len)
2293         return FALSE;
2294     }
2295
2296   /* The spec sez this should be a newline.  But in order to be
2297      bug-compatible for sun's ar we use a null.  */
2298   if (padit)
2299     {
2300       if (bfd_bwrite ("", 1, arch) != 1)
2301         return FALSE;
2302     }
2303
2304   return TRUE;
2305 }
2306
2307 /* At the end of archive file handling, update the timestamp in the
2308    file, so the linker will accept it.
2309
2310    Return TRUE if the timestamp was OK, or an unusual problem happened.
2311    Return FALSE if we updated the timestamp.  */
2312
2313 bfd_boolean
2314 _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
2315 {
2316   struct stat archstat;
2317   struct ar_hdr hdr;
2318
2319   /* If creating deterministic archives, just leave the timestamp as-is.  */
2320   if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2321     return TRUE;
2322
2323   /* Flush writes, get last-write timestamp from file, and compare it
2324      to the timestamp IN the file.  */
2325   bfd_flush (arch);
2326   if (bfd_stat (arch, &archstat) == -1)
2327     {
2328       bfd_perror (_("Reading archive file mod timestamp"));
2329
2330       /* Can't read mod time for some reason.  */
2331       return TRUE;
2332     }
2333   if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
2334     /* OK by the linker's rules.  */
2335     return TRUE;
2336
2337   /* Update the timestamp.  */
2338   bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2339
2340   /* Prepare an ASCII version suitable for writing.  */
2341   memset (hdr.ar_date, ' ', sizeof (hdr.ar_date));
2342   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2343                     bfd_ardata (arch)->armap_timestamp);
2344
2345   /* Write it into the file.  */
2346   bfd_ardata (arch)->armap_datepos = (SARMAG
2347                                       + offsetof (struct ar_hdr, ar_date[0]));
2348   if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2349       || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch)
2350           != sizeof (hdr.ar_date)))
2351     {
2352       bfd_perror (_("Writing updated armap timestamp"));
2353
2354       /* Some error while writing.  */
2355       return TRUE;
2356     }
2357
2358   /* We updated the timestamp successfully.  */
2359   return FALSE;
2360 }
2361 \f
2362 /* A coff armap looks like :
2363    lARMAG
2364    struct ar_hdr with name = '/'
2365    number of symbols
2366    offset of file for symbol 0
2367    offset of file for symbol 1
2368
2369    offset of file for symbol n-1
2370    symbol name 0
2371    symbol name 1
2372
2373    symbol name n-1  */
2374
2375 bfd_boolean
2376 coff_write_armap (bfd *arch,
2377                   unsigned int elength,
2378                   struct orl *map,
2379                   unsigned int symbol_count,
2380                   int stridx)
2381 {
2382   /* The size of the ranlib is the number of exported symbols in the
2383      archive * the number of bytes in an int, + an int for the count.  */
2384   unsigned int ranlibsize = (symbol_count * 4) + 4;
2385   unsigned int stringsize = stridx;
2386   unsigned int mapsize = stringsize + ranlibsize;
2387   unsigned int archive_member_file_ptr;
2388   bfd *current = arch->archive_head;
2389   unsigned int count;
2390   struct ar_hdr hdr;
2391   int padit = mapsize & 1;
2392
2393   if (padit)
2394     mapsize++;
2395
2396   /* Work out where the first object file will go in the archive.  */
2397   archive_member_file_ptr = (mapsize
2398                              + elength
2399                              + sizeof (struct ar_hdr)
2400                              + SARMAG);
2401
2402   memset (&hdr, ' ', sizeof (struct ar_hdr));
2403   hdr.ar_name[0] = '/';
2404   _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld",
2405                     mapsize);
2406   _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2407                     ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
2408                      ? time (NULL) : 0));
2409   /* This, at least, is what Intel coff sets the values to.  */
2410   _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0);
2411   _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0);
2412   _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0);
2413   memcpy (hdr.ar_fmag, ARFMAG, 2);
2414
2415   /* Write the ar header for this item and the number of symbols.  */
2416   if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2417       != sizeof (struct ar_hdr))
2418     return FALSE;
2419
2420   if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2421     return FALSE;
2422
2423   /* Two passes, first write the file offsets for each symbol -
2424      remembering that each offset is on a two byte boundary.  */
2425
2426   /* Write out the file offset for the file associated with each
2427      symbol, and remember to keep the offsets padded out.  */
2428
2429   current = arch->archive_head;
2430   count = 0;
2431   while (current != NULL && count < symbol_count)
2432     {
2433       /* For each symbol which is used defined in this object, write
2434          out the object file's address in the archive.  */
2435
2436       while (count < symbol_count && map[count].u.abfd == current)
2437         {
2438           if (!bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr))
2439             return FALSE;
2440           count++;
2441         }
2442       archive_member_file_ptr += sizeof (struct ar_hdr);
2443       if (! bfd_is_thin_archive (arch))
2444         {
2445           /* Add size of this archive entry.  */
2446           archive_member_file_ptr += arelt_size (current);
2447           /* Remember about the even alignment.  */
2448           archive_member_file_ptr += archive_member_file_ptr % 2;
2449         }
2450       current = current->archive_next;
2451     }
2452
2453   /* Now write the strings themselves.  */
2454   for (count = 0; count < symbol_count; count++)
2455     {
2456       size_t len = strlen (*map[count].name) + 1;
2457
2458       if (bfd_bwrite (*map[count].name, len, arch) != len)
2459         return FALSE;
2460     }
2461
2462   /* The spec sez this should be a newline.  But in order to be
2463      bug-compatible for arc960 we use a null.  */
2464   if (padit)
2465     {
2466       if (bfd_bwrite ("", 1, arch) != 1)
2467         return FALSE;
2468     }
2469
2470   return TRUE;
2471 }