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