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.
7 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
24 @setfilename archive-info
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.
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.
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.
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.
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!
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
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
75 Archives are supported in BFD in <<archive.c>>.
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).
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.
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.
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.
105 BSD 4.4 uses a third scheme: It writes a long filename
106 directly after the header. This allows 'ar q' to work.
109 /* Summary of archive member names:
111 Symbol table (must be first):
112 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib.
113 "/ " - Symbol table, system 5 style.
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).
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).
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.
132 #include "libiberty.h"
135 #include "aout/ranlib.h"
136 #include "safe-ctype.h"
138 #include "filenames.h"
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! */
156 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
157 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
159 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
160 #define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header)
162 /* True iff NAME designated a BSD 4.4 extended name. */
164 #define is_bsd44_extended_name(NAME) \
165 (NAME[0] == '#' && NAME[1] == '1' && NAME[2] == '/' && ISDIGIT (NAME[3]))
168 _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
173 snprintf (buf, sizeof (buf), fmt, val);
177 memcpy (p, buf, len);
178 memset (p + len, ' ', n - len);
185 _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
190 snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
194 bfd_set_error (bfd_error_file_too_big);
199 memcpy (p, buf, len);
200 memset (p + len, ' ', n - len);
208 _bfd_generic_mkarchive (bfd *abfd)
210 bfd_size_type amt = sizeof (struct artdata);
212 abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
213 if (bfd_ardata (abfd) == NULL)
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; */
232 symindex bfd_get_next_mapent
233 (bfd *abfd, symindex previous, carsym **sym);
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
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
245 A <<carsym>> is a canonical archive symbol. The only
246 user-visible element is its name, a null-terminated string.
250 bfd_get_next_mapent (bfd *abfd, symindex prev, carsym **entry)
252 if (!bfd_has_map (abfd))
254 bfd_set_error (bfd_error_invalid_operation);
255 return BFD_NO_MORE_SYMBOLS;
258 if (prev == BFD_NO_MORE_SYMBOLS)
262 if (prev >= bfd_ardata (abfd)->symdef_count)
263 return BFD_NO_MORE_SYMBOLS;
265 *entry = (bfd_ardata (abfd)->symdefs + prev);
269 /* To be called by backends only. */
272 _bfd_create_empty_archive_element_shell (bfd *obfd)
274 return _bfd_new_bfd_contained_in (obfd);
282 bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
285 Set the head of the chain of
286 BFDs contained in the archive @var{output} to @var{new_head}.
290 bfd_set_archive_head (bfd *output_archive, bfd *new_head)
292 output_archive->archive_head = new_head;
297 _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
299 htab_t hash_table = bfd_ardata (arch_bfd)->cache;
306 struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m);
317 hash_file_ptr (const void * p)
319 return (hashval_t) (((struct ar_cache *) p)->ptr);
322 /* Returns non-zero if P1 and P2 are equal. */
325 eq_file_ptr (const void * p1, const void * p2)
327 struct ar_cache *arc1 = (struct ar_cache *) p1;
328 struct ar_cache *arc2 = (struct ar_cache *) p2;
329 return arc1->ptr == arc2->ptr;
332 /* The calloc function doesn't always take size_t (e.g. on VMS)
333 so wrap it to avoid a compile time warning. */
336 _bfd_calloc_wrapper (size_t a, size_t b)
338 return calloc (a, b);
341 /* Kind of stupid to call cons for each one, but we don't do too many. */
344 _bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt)
346 struct ar_cache *cache;
347 htab_t hash_table = bfd_ardata (arch_bfd)->cache;
349 /* If the hash table hasn't been created, create it. */
350 if (hash_table == NULL)
352 hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr,
353 NULL, _bfd_calloc_wrapper, free);
354 if (hash_table == NULL)
356 bfd_ardata (arch_bfd)->cache = hash_table;
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;
369 _bfd_find_nested_archive (bfd *arch_bfd, const char *filename)
374 for (abfd = arch_bfd->nested_archives;
376 abfd = abfd->archive_next)
378 if (filename_cmp (filename, abfd->filename) == 0)
382 if (!arch_bfd->target_defaulted)
383 target = arch_bfd->xvec->name;
384 abfd = bfd_openr (filename, target);
387 abfd->archive_next = arch_bfd->nested_archives;
388 arch_bfd->nested_archives = abfd;
393 /* The name begins with space. Hence the rest of the name is an index into
397 get_extended_arelt_filename (bfd *arch, const char *name, file_ptr *originp)
399 unsigned long table_index = 0;
402 /* Should extract string so that I can guarantee not to overflow into
403 the next region, but I'm too lazy. */
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)
409 bfd_set_error (bfd_error_malformed_archive);
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 == ':')
416 file_ptr origin = strtol (endp + 1, NULL, 10);
420 bfd_set_error (bfd_error_malformed_archive);
428 return bfd_ardata (arch)->extended_names + table_index;
431 /* This functions reads an arch header and returns an areltdata pointer, or
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. */
440 _bfd_generic_read_ar_hdr (bfd *abfd)
442 return _bfd_generic_read_ar_hdr_mag (abfd, NULL);
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. */
449 _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
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);
460 unsigned int extra_size = 0;
464 if (bfd_bread (hdrp, sizeof (struct ar_hdr), abfd) != sizeof (struct ar_hdr))
466 if (bfd_get_error () != bfd_error_system_call)
467 bfd_set_error (bfd_error_no_more_archived_files);
470 if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
472 || strncmp (hdr.ar_fmag, mag, 2) != 0))
474 bfd_set_error (bfd_error_malformed_archive);
479 fmag_save = hdr.ar_fmag[0];
481 scan = sscanf (hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size);
482 hdr.ar_fmag[0] = fmag_save;
485 bfd_set_error (bfd_error_malformed_archive);
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)
497 filename = get_extended_arelt_filename (abfd, hdr.ar_name, &origin);
498 if (filename == NULL)
501 /* BSD4.4-style long filename. */
502 else if (is_bsd44_extended_name (hdr.ar_name))
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;
510 allocptr = (char *) bfd_zalloc (abfd, allocsize);
511 if (allocptr == NULL)
514 + sizeof (struct areltdata)
515 + sizeof (struct ar_hdr));
516 if (bfd_bread (filename, namelen, abfd) != namelen)
518 if (bfd_get_error () != bfd_error_system_call)
519 bfd_set_error (bfd_error_no_more_archived_files);
522 filename[namelen] = '\0';
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 '/'. */
531 e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
534 e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
536 e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
540 namelen = e - hdr.ar_name;
543 /* If we didn't find a termination character, then the name
544 must be the entire field. */
545 namelen = ar_maxnamelen (abfd);
548 allocsize += namelen + 1;
553 allocptr = (char *) bfd_zalloc (abfd, allocsize);
554 if (allocptr == NULL)
558 ared = (struct areltdata *) allocptr;
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;
566 if (filename != NULL)
567 ared->filename = filename;
570 ared->filename = allocptr + (sizeof (struct areltdata) +
571 sizeof (struct ar_hdr));
573 memcpy (ared->filename, hdr.ar_name, namelen);
574 ared->filename[namelen] = '\0';
580 /* Append the relative pathname for a member of the thin archive
581 to the pathname of the directory containing the archive. */
584 _bfd_append_relative_path (bfd *arch, char *elt_name)
586 const char *arch_name = arch->filename;
587 const char *base_name = lbasename (arch_name);
591 if (base_name == arch_name)
594 prefix_len = base_name - arch_name;
595 filename = (char *) bfd_alloc (arch, prefix_len + strlen (elt_name) + 1);
596 if (filename == NULL)
599 strncpy (filename, arch_name, prefix_len);
600 strcpy (filename + prefix_len, elt_name);
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. */
609 _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
611 struct areltdata *new_areldata;
615 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
619 if (0 > bfd_seek (archive, filepos, SEEK_SET))
622 if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
625 filename = new_areldata->filename;
627 if (bfd_is_thin_archive (archive))
631 /* This is a proxy entry for an external file. */
632 if (! IS_ABSOLUTE_PATH (filename))
634 filename = _bfd_append_relative_path (archive, filename);
635 if (filename == NULL)
639 if (new_areldata->origin > 0)
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);
646 || ! bfd_check_format (ext_arch, bfd_archive))
648 bfd_release (archive, new_areldata);
651 n_nfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
654 bfd_release (archive, new_areldata);
657 n_nfd->proxy_origin = bfd_tell (archive);
660 /* It's not an element of a nested archive;
661 open the external file as a bfd. */
663 if (!archive->target_defaulted)
664 target = archive->xvec->name;
665 n_nfd = bfd_openr (filename, target);
667 bfd_set_error (bfd_error_malformed_archive);
671 n_nfd = _bfd_create_empty_archive_element_shell (archive);
676 bfd_release (archive, new_areldata);
680 n_nfd->proxy_origin = bfd_tell (archive);
682 if (bfd_is_thin_archive (archive))
688 n_nfd->origin = n_nfd->proxy_origin;
689 n_nfd->filename = filename;
692 n_nfd->arelt_data = new_areldata;
694 /* Copy BFD_COMPRESS and BFD_DECOMPRESS flags. */
695 n_nfd->flags |= archive->flags & (BFD_COMPRESS | BFD_DECOMPRESS);
697 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
700 bfd_release (archive, new_areldata);
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. */
708 _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index)
712 entry = bfd_ardata (abfd)->symdefs + sym_index;
713 return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
718 bfd_openr_next_archived_file
721 bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
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
733 bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
735 if ((bfd_get_format (archive) != bfd_archive)
736 || (archive->direction == write_direction))
738 bfd_set_error (bfd_error_invalid_operation);
742 return BFD_SEND (archive,
743 openr_next_archived_file, (archive, last_file));
747 bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
752 filestart = bfd_ardata (archive)->first_file_filepos;
755 bfd_size_type size = arelt_size (last_file);
757 filestart = last_file->proxy_origin;
758 if (! bfd_is_thin_archive (archive))
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;
766 return _bfd_get_elt_at_filepos (archive, filestart);
770 bfd_generic_archive_p (bfd *abfd)
772 struct artdata *tdata_hold;
773 char armag[SARMAG + 1];
776 if (bfd_bread (armag, SARMAG, abfd) != SARMAG)
778 if (bfd_get_error () != bfd_error_system_call)
779 bfd_set_error (bfd_error_wrong_format);
783 bfd_is_thin_archive (abfd) = (strncmp (armag, ARMAGT, SARMAG) == 0);
785 if (strncmp (armag, ARMAG, SARMAG) != 0
786 && strncmp (armag, ARMAGB, SARMAG) != 0
787 && ! bfd_is_thin_archive (abfd))
790 tdata_hold = bfd_ardata (abfd);
792 amt = sizeof (struct artdata);
793 bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
794 if (bfd_ardata (abfd) == NULL)
796 bfd_ardata (abfd) = tdata_hold;
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; */
809 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
810 || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
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;
819 if (abfd->target_defaulted && bfd_has_map (abfd))
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.
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. */
834 first = bfd_openr_next_archived_file (abfd, NULL);
837 first->target_defaulted = FALSE;
838 if (bfd_check_format (first, bfd_object)
839 && first->xvec != abfd->xvec)
841 bfd_set_error (bfd_error_wrong_object_format);
842 bfd_ardata (abfd) = tdata_hold;
845 /* And we ought to close `first' here too. */
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. */
857 /* The size of an external symdef structure. */
858 #define BSD_SYMDEF_SIZE 8
860 /* The offset from the start of a symdef structure to the file offset. */
861 #define BSD_SYMDEF_OFFSET_SIZE 4
863 /* The size of the symdef count. */
864 #define BSD_SYMDEF_COUNT_SIZE 4
866 /* The size of the string count. */
867 #define BSD_STRING_COUNT_SIZE 4
869 /* Read a BSD-style archive symbol table. Returns FALSE on error,
873 do_slurp_bsd_armap (bfd *abfd)
875 struct areltdata *mapdata;
876 unsigned int counter;
877 bfd_byte *raw_armap, *rbase;
878 struct artdata *ardata = bfd_ardata (abfd);
880 bfd_size_type parsed_size, amt;
883 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
886 parsed_size = mapdata->parsed_size;
887 bfd_release (abfd, mapdata); /* Don't need it any more. */
889 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
890 if (raw_armap == NULL)
893 if (bfd_bread (raw_armap, parsed_size, abfd) != parsed_size)
895 if (bfd_get_error () != bfd_error_system_call)
896 bfd_set_error (bfd_error_malformed_archive);
898 bfd_release (abfd, raw_armap);
902 ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
904 if (ardata->symdef_count * BSD_SYMDEF_SIZE >
905 parsed_size - BSD_SYMDEF_COUNT_SIZE)
907 /* Probably we're using the wrong byte ordering. */
908 bfd_set_error (bfd_error_wrong_format);
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)
922 for (counter = 0, set = ardata->symdefs;
923 counter < ardata->symdef_count;
924 counter++, set++, rbase += BSD_SYMDEF_SIZE)
926 set->name = H_GET_32 (abfd, rbase) + stringbase;
927 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
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;
940 /* Read a COFF archive symbol table. Returns FALSE on error, TRUE
944 do_slurp_coff_armap (bfd *abfd)
946 struct areltdata *mapdata;
947 int *raw_armap, *rawptr;
948 struct artdata *ardata = bfd_ardata (abfd);
950 bfd_size_type stringsize;
951 bfd_size_type parsed_size;
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;
959 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
962 parsed_size = mapdata->parsed_size;
963 bfd_release (abfd, mapdata); /* Don't need it any more. */
965 if (bfd_bread (int_buf, 4, abfd) != 4)
967 if (bfd_get_error () != bfd_error_system_call)
968 bfd_set_error (bfd_error_malformed_archive);
971 /* It seems that all numeric information in a coff archive is always
972 in big endian format, nomatter the host or target. */
974 nsymz = bfd_getb32 (int_buf);
975 stringsize = parsed_size - (4 * nsymz) - 4;
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
982 if (stringsize > 0xfffff
983 && bfd_get_arch (abfd) == bfd_arch_i960
984 && bfd_get_flavour (abfd) == bfd_target_coff_flavour)
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;
992 /* The coff armap must be read sequentially. So we construct a
993 bsd-style one in core all at once, for simplicity. */
995 if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym))
998 carsym_size = (nsymz * sizeof (carsym));
999 ptrsize = (4 * nsymz);
1001 if (carsym_size + stringsize + 1 <= carsym_size)
1004 ardata->symdefs = (struct carsym *) bfd_zalloc (abfd,
1005 carsym_size + stringsize + 1);
1006 if (ardata->symdefs == NULL)
1008 carsyms = ardata->symdefs;
1009 stringbase = ((char *) ardata->symdefs) + carsym_size;
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))
1018 if (bfd_get_error () != bfd_error_system_call)
1019 bfd_set_error (bfd_error_malformed_archive);
1020 goto release_raw_armap;
1023 /* OK, build the carsyms. */
1024 for (i = 0; i < nsymz; i++)
1026 rawptr = raw_armap + i;
1027 carsyms->file_offset = swap ((bfd_byte *) rawptr);
1028 carsyms->name = stringbase;
1029 stringbase += strlen (stringbase) + 1;
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;
1039 bfd_has_map (abfd) = TRUE;
1040 bfd_release (abfd, raw_armap);
1042 /* Check for a second archive header (as used by PE). */
1044 struct areltdata *tmp;
1046 bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
1047 tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1050 if (tmp->arch_header[0] == '/'
1051 && tmp->arch_header[1] == ' ')
1053 ardata->first_file_filepos +=
1054 (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
1056 bfd_release (abfd, tmp);
1063 bfd_release (abfd, raw_armap);
1065 bfd_release (abfd, (ardata)->symdefs);
1069 /* This routine can handle either coff-style or bsd-style armaps
1070 (archive symbol table). Returns FALSE on error, TRUE otherwise */
1073 bfd_slurp_armap (bfd *abfd)
1076 int i = bfd_bread (nextname, 16, abfd);
1083 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
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/ "))
1093 /* 64bit ELF (Irix 6) archive. */
1095 extern bfd_boolean bfd_elf64_archive_slurp_armap (bfd *);
1096 return bfd_elf64_archive_slurp_armap (abfd);
1098 bfd_set_error (bfd_error_wrong_format);
1102 else if (CONST_STRNEQ (nextname, "#1/20 "))
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
1110 if (bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
1112 /* Read the extended name. We know its length. */
1113 if (bfd_bread (extname, 20, abfd) != 20)
1115 if (bfd_seek (abfd, -(file_ptr) (sizeof (hdr) + 20), SEEK_CUR) != 0)
1117 if (CONST_STRNEQ (extname, "__.SYMDEF SORTED")
1118 || CONST_STRNEQ (extname, "__.SYMDEF"))
1119 return do_slurp_bsd_armap (abfd);
1122 bfd_has_map (abfd) = FALSE;
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. */
1131 #define HPUX_SYMDEF_COUNT_SIZE 2
1134 bfd_slurp_bsd_armap_f2 (bfd *abfd)
1136 struct areltdata *mapdata;
1138 unsigned int counter;
1139 bfd_byte *raw_armap, *rbase;
1140 struct artdata *ardata = bfd_ardata (abfd);
1142 unsigned int stringsize;
1146 int i = bfd_bread (nextname, 16, abfd);
1153 /* The archive has at least 16 bytes in it. */
1154 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1157 if (CONST_STRNEQ (nextname, "__.SYMDEF ")
1158 || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */
1159 return do_slurp_bsd_armap (abfd);
1161 if (! CONST_STRNEQ (nextname, "/ "))
1163 bfd_has_map (abfd) = FALSE;
1167 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1168 if (mapdata == NULL)
1171 if (mapdata->parsed_size < HPUX_SYMDEF_COUNT_SIZE + BSD_STRING_COUNT_SIZE)
1174 bfd_set_error (bfd_error_wrong_format);
1176 bfd_release (abfd, mapdata);
1179 left = mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE - BSD_STRING_COUNT_SIZE;
1181 amt = mapdata->parsed_size;
1182 raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
1183 if (raw_armap == NULL)
1186 if (bfd_bread (raw_armap, amt, abfd) != amt)
1188 if (bfd_get_error () != bfd_error_system_call)
1189 bfd_set_error (bfd_error_malformed_archive);
1193 ardata->symdef_count = H_GET_16 (abfd, raw_armap);
1197 stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
1198 if (stringsize > left)
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;
1211 ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
1212 if (!ardata->symdefs)
1215 for (counter = 0, set = ardata->symdefs;
1216 counter < ardata->symdef_count;
1217 counter++, set++, rbase += BSD_SYMDEF_SIZE)
1219 set->name = H_GET_32 (abfd, rbase) + stringbase;
1220 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
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;
1233 /** Extended name table.
1235 Normally archives support only 14-character filenames.
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. */
1243 /* Returns FALSE on error, TRUE otherwise. */
1246 _bfd_slurp_extended_name_table (bfd *abfd)
1249 struct areltdata *namedata;
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)
1257 if (bfd_bread (nextname, 16, abfd) == 16)
1259 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1262 if (! CONST_STRNEQ (nextname, "ARFILENAMES/ ")
1263 && ! CONST_STRNEQ (nextname, "// "))
1265 bfd_ardata (abfd)->extended_names = NULL;
1266 bfd_ardata (abfd)->extended_names_size = 0;
1270 namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1271 if (namedata == NULL)
1274 amt = namedata->parsed_size;
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)
1283 bfd_release (abfd, namedata);
1287 if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
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;
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.. */
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)
1307 if (*temp == ARFMAG[1])
1308 temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
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;
1320 /* FIXME, we can't release namedata here because it was allocated
1321 below extended_names on the objalloc... */
1328 /* Return a copy of the stuff in the filename between any :]> and a
1332 normalize (bfd *abfd, const char *file)
1338 first = file + strlen (file) - 1;
1341 while (first != file)
1345 if (*first == ':' || *first == ']' || *first == '>')
1353 copy = bfd_alloc (abfd, last - first + 1);
1357 memcpy (copy, first, last - first);
1358 copy[last - first] = 0;
1365 normalize (bfd *abfd ATTRIBUTE_UNUSED, const char *file)
1367 return lbasename (file);
1371 /* Adjust a relative path name based on the reference path.
1374 Relative path Reference path Result
1375 ------------- -------------- ------
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
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...
1391 Note - the string is returned in a static buffer. */
1394 adjust_relative_path (const char * path, const char * ref_path)
1396 static char *pathbuf = NULL;
1397 static unsigned int pathbuf_len = 0;
1403 unsigned int dir_up = 0;
1404 unsigned int dir_down = 0;
1406 char * pwd = getpwd ();
1409 /* Remove symlinks, '.' and '..' from the paths, if possible. */
1410 lpath = lrealpath (path);
1411 pathp = lpath == NULL ? path : lpath;
1413 rpath = lrealpath (ref_path);
1414 refp = rpath == NULL ? ref_path : rpath;
1416 /* Remove common leading path elements. */
1419 const char *e1 = pathp;
1420 const char *e2 = refp;
1422 while (*e1 && ! IS_DIR_SEPARATOR (*e1))
1424 while (*e2 && ! IS_DIR_SEPARATOR (*e2))
1426 if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
1427 || filename_ncmp (pathp, refp, e1 - pathp) != 0)
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))
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
1450 /* If the lrealpath calls above succeeded then we should never
1451 see dir_up and dir_down both being non-zero. */
1457 down = pwd + strlen (pwd) - 1;
1459 while (dir_down && down > pwd)
1461 if (IS_DIR_SEPARATOR (*down))
1464 BFD_ASSERT (dir_down == 0);
1465 len += strlen (down) + 1;
1470 if (len > pathbuf_len)
1472 if (pathbuf != NULL)
1475 pathbuf = (char *) bfd_malloc (len);
1476 if (pathbuf == NULL)
1482 while (dir_up-- > 0)
1484 /* FIXME: Support Windows style path separators as well. */
1485 strcpy (newp, "../");
1490 sprintf (newp, "%s/%s", down, pathp);
1492 strcpy (newp, pathp);
1500 /* Build a BFD style extended name table. */
1503 _bfd_archive_bsd_construct_extended_name_table (bfd *abfd,
1505 bfd_size_type *tablen,
1508 *name = "ARFILENAMES/";
1509 return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
1512 /* Build an SVR4 style extended name table. */
1515 _bfd_archive_coff_construct_extended_name_table (bfd *abfd,
1517 bfd_size_type *tablen,
1521 return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
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! */
1533 _bfd_construct_extended_name_table (bfd *abfd,
1534 bfd_boolean trailing_slash,
1536 bfd_size_type *tablen)
1538 unsigned int maxname = ar_maxnamelen (abfd);
1539 bfd_size_type total_namelen = 0;
1542 const char *last_filename;
1546 last_filename = NULL;
1548 /* Figure out how long the table should be. */
1549 for (current = abfd->archive_head;
1551 current = current->archive_next)
1554 unsigned int thislen;
1556 if (bfd_is_thin_archive (abfd))
1558 const char *filename = current->filename;
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;
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)
1572 last_filename = filename;
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);
1582 /* In a thin archive, always store the full pathname
1583 in the extended name table. */
1584 total_namelen += strlen (normal) + 1;
1586 /* Leave room for trailing slash. */
1592 normal = normalize (current, current->filename);
1596 thislen = strlen (normal);
1598 if (thislen > maxname
1599 && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1602 if (thislen > maxname)
1604 /* Add one to leave room for \n. */
1605 total_namelen += thislen + 1;
1608 /* Leave room for trailing slash. */
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)))
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);
1629 if (total_namelen == 0)
1632 *tabloc = (char *) bfd_zalloc (abfd, total_namelen);
1633 if (*tabloc == NULL)
1636 *tablen = total_namelen;
1639 last_filename = NULL;
1642 for (current = abfd->archive_head;
1644 current = current->archive_next)
1647 unsigned int thislen;
1649 const char *filename = current->filename;
1651 if (bfd_is_thin_archive (abfd))
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);
1673 normal = normalize (current, filename);
1678 thislen = strlen (normal);
1679 if (thislen > maxname || bfd_is_thin_archive (abfd))
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;
1689 strcpy (strptr, normal);
1690 if (! trailing_slash)
1691 strptr[thislen] = ARFMAG[1];
1694 strptr[thislen] = '/';
1695 strptr[thislen + 1] = ARFMAG[1];
1697 stroff = strptr - *tabloc;
1698 last_stroff = stroff;
1700 hdr->ar_name[0] = ar_padchar (current);
1701 if (bfd_is_thin_archive (abfd) && current->origin > 0)
1703 int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:",
1705 _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len,
1707 current->origin - sizeof (struct ar_hdr));
1710 _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff);
1711 if (normal != last_filename)
1713 strptr += thislen + 1;
1716 last_filename = filename;
1724 /* Do not construct an extended name table but transforms name field into
1725 its extended form. */
1728 _bfd_archive_bsd44_construct_extended_name_table (bfd *abfd,
1730 bfd_size_type *tablen,
1733 unsigned int maxname = ar_maxnamelen (abfd);
1740 for (current = abfd->archive_head;
1742 current = current->archive_next)
1744 const char *normal = normalize (current, current->filename);
1751 for (len = 0; normal[len]; len++)
1752 if (normal[len] == ' ')
1755 if (len > maxname || has_space)
1757 struct ar_hdr *hdr = arch_hdr (current);
1759 len = (len + 3) & ~3;
1760 arch_eltdata (current)->extra_size = len;
1761 _bfd_ar_spacepad (hdr->ar_name, maxname, "#1/%lu", len);
1768 /* Write an archive header. */
1771 _bfd_generic_write_ar_hdr (bfd *archive, bfd *abfd)
1773 struct ar_hdr *hdr = arch_hdr (abfd);
1775 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1780 /* Write an archive header using BSD4.4 convention. */
1783 _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
1785 struct ar_hdr *hdr = arch_hdr (abfd);
1787 if (is_bsd44_extended_name (hdr->ar_name))
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;
1794 BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
1796 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
1797 arch_eltdata (abfd)->parsed_size + padded_len))
1800 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1803 if (bfd_bwrite (fullname, len, archive) != len)
1808 static const char pad[3] = { 0, 0, 0 };
1810 len = 4 - (len & 3);
1811 if (bfd_bwrite (pad, len, archive) != len)
1817 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1823 /* A couple of functions for creating ar_hdrs. */
1825 #ifdef HPUX_LARGE_AR_IDS
1826 /* Function to encode large UID/GID values according to HP. */
1829 hpux_uid_gid_encode (char str[6], long int id)
1833 str[5] = '@' + (id & 3);
1836 for (cnt = 4; cnt >= 0; --cnt, id >>= 6)
1837 str[cnt] = ' ' + (id & 0x3f);
1839 #endif /* HPUX_LARGE_AR_IDS */
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. */
1854 static struct areltdata *
1855 bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
1858 struct areltdata *ared;
1862 if (member && (member->flags & BFD_IN_MEMORY) != 0)
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;
1872 else if (stat (filename, &status) != 0)
1874 bfd_set_error (bfd_error_system_call);
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)
1882 status.st_mtime = 0;
1885 status.st_mode = 0644;
1888 amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
1889 ared = (struct areltdata *) bfd_zalloc (abfd, amt);
1892 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1894 /* ar headers are space padded, not null padded! */
1895 memset (hdr, ' ', sizeof (struct ar_hdr));
1897 _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld",
1899 #ifdef HPUX_LARGE_AR_IDS
1900 /* HP has a very "special" way to handle UID/GID's with numeric values
1902 if (status.st_uid > 99999)
1903 hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid);
1906 _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld",
1908 #ifdef HPUX_LARGE_AR_IDS
1909 /* HP has a very "special" way to handle UID/GID's with numeric values
1911 if (status.st_gid > 99999)
1912 hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid);
1915 _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld",
1917 _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
1919 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
1924 memcpy (hdr->ar_fmag, ARFMAG, 2);
1925 ared->parsed_size = status.st_size;
1926 ared->arch_header = (char *) hdr;
1931 /* Analogous to stat call. */
1934 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
1939 if (abfd->arelt_data == NULL)
1941 bfd_set_error (bfd_error_invalid_operation);
1945 hdr = arch_hdr (abfd);
1947 #define foo(arelt, stelt, size) \
1948 buf->stelt = strtol (hdr->arelt, &aloser, size); \
1949 if (aloser == hdr->arelt) \
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] == ' ') \
1957 foo (arelt, stelt, size); \
1962 for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \
1964 if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \
1967 buf->stelt += hdr->arelt[cnt] - ' '; \
1969 if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \
1972 buf->stelt += hdr->arelt[5] - '@'; \
1975 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
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);
1983 buf->st_size = arch_eltdata (abfd)->parsed_size;
1989 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
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. */
1996 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1998 const char *filename;
1999 size_t maxlen = ar_maxnamelen (abfd);
2001 if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
2003 bfd_bsd_truncate_arname (abfd, pathname, arhdr);
2007 filename = normalize (abfd, pathname);
2008 if (filename == NULL)
2014 length = strlen (filename);
2016 if (length <= maxlen)
2017 memcpy (hdr->ar_name, filename, length);
2019 /* Add the padding character if there is room for it. */
2021 || (length == maxlen && length < sizeof hdr->ar_name))
2022 (hdr->ar_name)[length] = ar_padchar (abfd);
2026 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2028 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2030 const char *filename = lbasename (pathname);
2031 size_t maxlen = ar_maxnamelen (abfd);
2033 length = strlen (filename);
2035 if (length <= maxlen)
2036 memcpy (hdr->ar_name, filename, length);
2039 /* pathname: meet procrustes */
2040 memcpy (hdr->ar_name, filename, maxlen);
2044 if (length < maxlen)
2045 (hdr->ar_name)[length] = ar_padchar (abfd);
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. */
2054 /* This is what gnu ar does. It's better but incompatible with the
2058 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2060 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2062 const char *filename = lbasename (pathname);
2063 size_t maxlen = ar_maxnamelen (abfd);
2065 length = strlen (filename);
2067 if (length <= maxlen)
2068 memcpy (hdr->ar_name, filename, length);
2071 /* pathname: meet procrustes. */
2072 memcpy (hdr->ar_name, filename, maxlen);
2073 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
2075 hdr->ar_name[maxlen - 2] = '.';
2076 hdr->ar_name[maxlen - 1] = 'o';
2082 (hdr->ar_name)[length] = ar_padchar (abfd);
2085 /* The BFD is open for write and has its format set to bfd_archive. */
2088 _bfd_write_archive_contents (bfd *arch)
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;
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;
2106 current = current->archive_next)
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))
2115 bfd_set_error (bfd_error_invalid_operation);
2118 if (!current->arelt_data)
2120 current->arelt_data =
2121 bfd_ar_hdr_from_filesystem (arch, current->filename, current);
2122 if (!current->arelt_data)
2125 /* Put in the file name. */
2126 BFD_SEND (arch, _bfd_truncate_arname,
2127 (arch, current->filename, (char *) arch_hdr (current)));
2130 if (makemap && ! hasobjects)
2131 { /* Don't bother if we won't make a map! */
2132 if ((bfd_check_format (current, bfd_object)))
2137 if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
2138 (arch, &etable, &elength, &ename)))
2141 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
2144 if (bfd_is_thin_archive (arch))
2146 wrote = bfd_bwrite (armag, SARMAG, arch);
2147 if (wrote != SARMAG)
2150 if (makemap && hasobjects)
2152 if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
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))
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)
2171 if ((elength % 2) == 1)
2173 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2178 for (current = arch->archive_head;
2180 current = current->archive_next)
2182 char buffer[DEFAULT_BUFFERSIZE];
2183 bfd_size_type remaining = arelt_size (current);
2185 /* Write ar header. */
2186 if (!_bfd_write_ar_hdr (arch, current))
2188 if (bfd_is_thin_archive (arch))
2190 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
2195 unsigned int amt = DEFAULT_BUFFERSIZE;
2197 if (amt > remaining)
2200 if (bfd_bread (buffer, amt, current) != amt)
2202 if (bfd_get_error () != bfd_error_system_call)
2203 bfd_set_error (bfd_error_file_truncated);
2206 if (bfd_bwrite (buffer, amt, arch) != amt)
2211 if ((arelt_size (current) % 2) == 1)
2213 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2218 if (makemap && hasobjects)
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. */
2229 if (bfd_update_armap_timestamp (arch))
2231 (*_bfd_error_handler)
2232 (_("Warning: writing archive was slow: rewriting timestamp\n"));
2234 while (++tries < 6);
2240 bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
2244 /* Note that the namidx for the first symbol is 0. */
2247 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
2249 char *first_name = NULL;
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;
2256 asymbol **syms = NULL;
2261 /* Dunno if this is the best place for this info... */
2263 elength += sizeof (struct ar_hdr);
2264 elength += elength % 2;
2266 amt = orl_max * sizeof (struct orl);
2267 map = (struct orl *) bfd_malloc (amt);
2271 /* We put the symbol names on the arch objalloc, and then discard
2273 first_name = (char *) bfd_alloc (arch, 1);
2274 if (first_name == NULL)
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;
2282 /* Map over each element. */
2283 for (current = arch->archive_head;
2285 current = current->archive_next, elt_no++)
2287 if (bfd_check_format (current, bfd_object)
2288 && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
2294 storage = bfd_get_symtab_upper_bound (current);
2300 if (storage > syms_max)
2305 syms = (asymbol **) bfd_malloc (syms_max);
2309 symcount = bfd_canonicalize_symtab (current, syms);
2313 /* Now map over all the symbols, picking out the ones we
2315 for (src_count = 0; src_count < symcount; src_count++)
2317 flagword flags = (syms[src_count])->flags;
2318 asection *sec = syms[src_count]->section;
2320 if (((flags & (BSF_GLOBAL
2323 | BSF_GNU_UNIQUE)) != 0
2324 || bfd_is_com_section (sec))
2325 && ! bfd_is_und_section (sec))
2327 bfd_size_type namelen;
2328 struct orl *new_map;
2330 /* This symbol will go into the archive header. */
2331 if (orl_count == orl_max)
2334 amt = orl_max * sizeof (struct orl);
2335 new_map = (struct orl *) bfd_realloc (map, amt);
2336 if (new_map == NULL)
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)
2347 *(map[orl_count].name) = (char *) bfd_alloc (arch,
2349 if (*(map[orl_count].name) == NULL)
2351 strcpy (*(map[orl_count].name), syms[src_count]->name);
2352 map[orl_count].u.abfd = current;
2353 map[orl_count].namidx = stridx;
2355 stridx += namelen + 1;
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))
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));
2376 if (first_name != NULL)
2377 bfd_release (arch, first_name);
2386 if (first_name != NULL)
2387 bfd_release (arch, first_name);
2393 bsd_write_armap (bfd *arch,
2394 unsigned int elength,
2396 unsigned int orl_count,
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;
2405 bfd *current = arch->archive_head;
2406 bfd *last_elt = current; /* Last element arch seen. */
2411 file_ptr max_first_real = 1;
2413 max_first_real <<= 31;
2415 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
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;
2425 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
2427 struct stat statbuf;
2429 if (stat (arch->filename, &statbuf) == 0)
2430 bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
2431 + ARMAP_TIME_OFFSET);
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))
2446 memcpy (hdr.ar_fmag, ARFMAG, 2);
2447 if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2448 != sizeof (struct ar_hdr))
2450 H_PUT_32 (arch, ranlibsize, temp);
2451 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2454 for (count = 0; count < orl_count; count++)
2456 bfd_byte buf[BSD_SYMDEF_SIZE];
2458 if (map[count].u.abfd != last_elt)
2462 struct areltdata *ared = arch_eltdata (current);
2464 firstreal += (ared->parsed_size + ared->extra_size
2465 + sizeof (struct ar_hdr));
2466 firstreal += firstreal % 2;
2467 current = current->archive_next;
2469 while (current != map[count].u.abfd);
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
2475 if (firstreal >= max_first_real)
2477 bfd_set_error (bfd_error_file_truncated);
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)
2489 /* Now write the strings themselves. */
2490 H_PUT_32 (arch, stringsize, temp);
2491 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2493 for (count = 0; count < orl_count; count++)
2495 size_t len = strlen (*map[count].name) + 1;
2497 if (bfd_bwrite (*map[count].name, len, arch) != len)
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. */
2505 if (bfd_bwrite ("", 1, arch) != 1)
2512 /* At the end of archive file handling, update the timestamp in the
2513 file, so the linker will accept it.
2515 Return TRUE if the timestamp was OK, or an unusual problem happened.
2516 Return FALSE if we updated the timestamp. */
2519 _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
2521 struct stat archstat;
2524 /* If creating deterministic archives, just leave the timestamp as-is. */
2525 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2528 /* Flush writes, get last-write timestamp from file, and compare it
2529 to the timestamp IN the file. */
2531 if (bfd_stat (arch, &archstat) == -1)
2533 bfd_perror (_("Reading archive file mod timestamp"));
2535 /* Can't read mod time for some reason. */
2538 if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
2539 /* OK by the linker's rules. */
2542 /* Update the timestamp. */
2543 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
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);
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)))
2557 bfd_perror (_("Writing updated armap timestamp"));
2559 /* Some error while writing. */
2563 /* We updated the timestamp successfully. */
2567 /* A coff armap looks like :
2569 struct ar_hdr with name = '/'
2571 offset of file for symbol 0
2572 offset of file for symbol 1
2574 offset of file for symbol n-1
2581 coff_write_armap (bfd *arch,
2582 unsigned int elength,
2584 unsigned int symbol_count,
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;
2596 int padit = mapsize & 1;
2601 /* Work out where the first object file will go in the archive. */
2602 archive_member_file_ptr = (mapsize
2604 + sizeof (struct ar_hdr)
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))
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);
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))
2625 if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2628 /* Two passes, first write the file offsets for each symbol -
2629 remembering that each offset is on a two byte boundary. */
2631 /* Write out the file offset for the file associated with each
2632 symbol, and remember to keep the offsets padded out. */
2634 current = arch->archive_head;
2636 while (current != NULL && count < symbol_count)
2638 /* For each symbol which is used defined in this object, write
2639 out the object file's address in the archive. */
2641 while (count < symbol_count && map[count].u.abfd == current)
2643 unsigned int offset = (unsigned int) archive_member_file_ptr;
2645 /* Catch an attempt to grow an archive past its 4Gb limit. */
2646 if (archive_member_file_ptr != (file_ptr) offset)
2648 bfd_set_error (bfd_error_file_truncated);
2651 if (!bfd_write_bigendian_4byte_int (arch, offset))
2655 archive_member_file_ptr += sizeof (struct ar_hdr);
2656 if (! bfd_is_thin_archive (arch))
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;
2663 current = current->archive_next;
2666 /* Now write the strings themselves. */
2667 for (count = 0; count < symbol_count; count++)
2669 size_t len = strlen (*map[count].name) + 1;
2671 if (bfd_bwrite (*map[count].name, len, arch) != len)
2675 /* The spec sez this should be a newline. But in order to be
2676 bug-compatible for arc960 we use a null. */
2679 if (bfd_bwrite ("", 1, arch) != 1)