* config/tc-mn10200.c (md_parse_option <c, arg>): Add ATTRIBUTE_UNUSED.
[binutils.git] / bfd / archive.c
blobffb0bd4c8756afc7e67c353007a2bd2fc4b73b8b
1 /* BFD back-end for archive files (libraries).
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002
4 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 @setfilename archive-info
25 SECTION
26 Archives
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.
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
66 homogeneous.
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.
75 Archives are supported in BFD in <<archive.c>>.
79 /* Assumes:
80 o - all archive elements start on an even boundary, newline padded;
81 o - all arch headers are char *;
82 o - all arch headers are the same size (across architectures).
85 /* Some formats provide a way to cram a long filename into the short
86 (16 chars) space provided by a BSD archive. The trick is: make a
87 special "file" in the front of the archive, sort of like the SYMDEF
88 entry. If the filename is too long to fit, put it in the extended
89 name table, and use its index as the filename. To prevent
90 confusion prepend the index with a space. This means you can't
91 have filenames that start with a space, but then again, many Unix
92 utilities can't handle that anyway.
94 This scheme unfortunately requires that you stand on your head in
95 order to write an archive since you need to put a magic file at the
96 front, and need to touch every entry to do so. C'est la vie.
98 We support two variants of this idea:
99 The SVR4 format (extended name table is named "//"),
100 and an extended pseudo-BSD variant (extended name table is named
101 "ARFILENAMES/"). The origin of the latter format is uncertain.
103 BSD 4.4 uses a third scheme: It writes a long filename
104 directly after the header. This allows 'ar q' to work.
105 We currently can read BSD 4.4 archives, but not write them.
108 /* Summary of archive member names:
110 Symbol table (must be first):
111 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib.
112 "/ " - Symbol table, system 5 style.
114 Long name table (must be before regular file members):
115 "// " - Long name table, System 5 R4 style.
116 "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4).
118 Regular file members with short names:
119 "filename.o/ " - Regular file, System 5 style (embedded spaces ok).
120 "filename.o " - Regular file, Berkeley style (no embedded spaces).
122 Regular files with long names (or embedded spaces, for BSD variants):
123 "/18 " - SVR4 style, name at offset 18 in name table.
124 "#1/23 " - Long name (or embedded paces) 23 characters long,
125 BSD 4.4 style, full name follows header.
126 Implemented for reading, not writing.
127 " 18 " - Long name 18 characters long, extended pseudo-BSD.
130 #include "bfd.h"
131 #include "sysdep.h"
132 #include "libbfd.h"
133 #include "aout/ar.h"
134 #include "aout/ranlib.h"
135 #include "safe-ctype.h"
137 #ifndef errno
138 extern int errno;
139 #endif
141 #ifdef GNU960
142 #define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
143 #endif
145 /* We keep a cache of archive filepointers to archive elements to
146 speed up searching the archive by filepos. We only add an entry to
147 the cache when we actually read one. We also don't sort the cache;
148 it's generally short enough to search linearly.
149 Note that the pointers here point to the front of the ar_hdr, not
150 to the front of the contents! */
151 struct ar_cache {
152 file_ptr ptr;
153 bfd *arelt;
154 struct ar_cache *next;
157 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
158 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
160 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
161 #define arch_hdr(bfd) ((struct ar_hdr *)arch_eltdata(bfd)->arch_header)
163 static char *get_extended_arelt_filename
164 PARAMS ((bfd *arch, const char *name));
165 static bfd_boolean do_slurp_bsd_armap
166 PARAMS ((bfd *abfd));
167 static bfd_boolean do_slurp_coff_armap
168 PARAMS ((bfd *abfd));
169 bfd_boolean bfd_elf64_archive_slurp_armap
170 PARAMS ((bfd *abfd));
171 static const char *normalize
172 PARAMS ((bfd *, const char *file));
173 static struct areltdata *bfd_ar_hdr_from_filesystem
174 PARAMS ((bfd *abfd, const char *, bfd *member));
176 bfd_boolean
177 _bfd_generic_mkarchive (abfd)
178 bfd *abfd;
180 bfd_size_type amt = sizeof (struct artdata);
182 abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
183 if (bfd_ardata (abfd) == NULL)
184 return FALSE;
186 bfd_ardata (abfd)->cache = NULL;
187 bfd_ardata (abfd)->archive_head = NULL;
188 bfd_ardata (abfd)->symdefs = NULL;
189 bfd_ardata (abfd)->extended_names = NULL;
190 bfd_ardata (abfd)->tdata = NULL;
192 return TRUE;
196 FUNCTION
197 bfd_get_next_mapent
199 SYNOPSIS
200 symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym);
202 DESCRIPTION
203 Step through archive @var{abfd}'s symbol table (if it
204 has one). Successively update @var{sym} with the next symbol's
205 information, returning that symbol's (internal) index into the
206 symbol table.
208 Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
209 the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
210 got the last one.
212 A <<carsym>> is a canonical archive symbol. The only
213 user-visible element is its name, a null-terminated string.
216 symindex
217 bfd_get_next_mapent (abfd, prev, entry)
218 bfd *abfd;
219 symindex prev;
220 carsym **entry;
222 if (!bfd_has_map (abfd))
224 bfd_set_error (bfd_error_invalid_operation);
225 return BFD_NO_MORE_SYMBOLS;
228 if (prev == BFD_NO_MORE_SYMBOLS)
229 prev = 0;
230 else
231 ++prev;
232 if (prev >= bfd_ardata (abfd)->symdef_count)
233 return BFD_NO_MORE_SYMBOLS;
235 *entry = (bfd_ardata (abfd)->symdefs + prev);
236 return prev;
239 /* To be called by backends only */
241 bfd *
242 _bfd_create_empty_archive_element_shell (obfd)
243 bfd *obfd;
245 return _bfd_new_bfd_contained_in (obfd);
249 FUNCTION
250 bfd_set_archive_head
252 SYNOPSIS
253 bfd_boolean bfd_set_archive_head(bfd *output, bfd *new_head);
255 DESCRIPTION
256 Set the head of the chain of
257 BFDs contained in the archive @var{output} to @var{new_head}.
260 bfd_boolean
261 bfd_set_archive_head (output_archive, new_head)
262 bfd *output_archive;
263 bfd *new_head;
266 output_archive->archive_head = new_head;
267 return TRUE;
270 bfd *
271 _bfd_look_for_bfd_in_cache (arch_bfd, filepos)
272 bfd *arch_bfd;
273 file_ptr filepos;
275 struct ar_cache *current;
277 for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
278 current = current->next)
279 if (current->ptr == filepos)
280 return current->arelt;
282 return NULL;
285 /* Kind of stupid to call cons for each one, but we don't do too many */
286 bfd_boolean
287 _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt)
288 bfd *arch_bfd, *new_elt;
289 file_ptr filepos;
291 bfd_size_type amt = sizeof (struct ar_cache);
293 struct ar_cache *new_cache = (struct ar_cache *) bfd_zalloc (arch_bfd, amt);
294 if (new_cache == NULL)
295 return FALSE;
297 new_cache->ptr = filepos;
298 new_cache->arelt = new_elt;
299 new_cache->next = (struct ar_cache *) NULL;
300 if (bfd_ardata (arch_bfd)->cache == NULL)
301 bfd_ardata (arch_bfd)->cache = new_cache;
302 else
304 struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
306 while (current->next != NULL)
307 current = current->next;
308 current->next = new_cache;
311 return TRUE;
314 /* The name begins with space. Hence the rest of the name is an index into
315 the string table. */
317 static char *
318 get_extended_arelt_filename (arch, name)
319 bfd *arch;
320 const char *name;
322 unsigned long index = 0;
324 /* Should extract string so that I can guarantee not to overflow into
325 the next region, but I'm too lazy. */
326 errno = 0;
327 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
328 index = strtol (name + 1, NULL, 10);
329 if (errno != 0)
331 bfd_set_error (bfd_error_malformed_archive);
332 return NULL;
335 return bfd_ardata (arch)->extended_names + index;
338 /* This functions reads an arch header and returns an areltdata pointer, or
339 NULL on error.
341 Presumes the file pointer is already in the right place (ie pointing
342 to the ar_hdr in the file). Moves the file pointer; on success it
343 should be pointing to the front of the file contents; on failure it
344 could have been moved arbitrarily.
348 _bfd_generic_read_ar_hdr (abfd)
349 bfd *abfd;
351 return _bfd_generic_read_ar_hdr_mag (abfd, (const char *) NULL);
354 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a
355 variant of _bfd_generic_read_ar_hdr which accepts a magic string. */
358 _bfd_generic_read_ar_hdr_mag (abfd, mag)
359 bfd *abfd;
360 const char *mag;
362 struct ar_hdr hdr;
363 char *hdrp = (char *) &hdr;
364 size_t parsed_size;
365 struct areltdata *ared;
366 char *filename = NULL;
367 bfd_size_type namelen = 0;
368 bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
369 char *allocptr = 0;
371 if (bfd_bread ((PTR) hdrp, (bfd_size_type) sizeof (struct ar_hdr), abfd)
372 != sizeof (struct ar_hdr))
374 if (bfd_get_error () != bfd_error_system_call)
375 bfd_set_error (bfd_error_no_more_archived_files);
376 return NULL;
378 if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
379 && (mag == NULL
380 || strncmp (hdr.ar_fmag, mag, 2) != 0))
382 bfd_set_error (bfd_error_malformed_archive);
383 return NULL;
386 errno = 0;
387 parsed_size = strtol (hdr.ar_size, NULL, 10);
388 if (errno != 0)
390 bfd_set_error (bfd_error_malformed_archive);
391 return NULL;
394 /* Extract the filename from the archive - there are two ways to
395 specify an extended name table, either the first char of the
396 name is a space, or it's a slash. */
397 if ((hdr.ar_name[0] == '/'
398 || (hdr.ar_name[0] == ' '
399 && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
400 && bfd_ardata (abfd)->extended_names != NULL)
402 filename = get_extended_arelt_filename (abfd, hdr.ar_name);
403 if (filename == NULL)
405 bfd_set_error (bfd_error_malformed_archive);
406 return NULL;
409 /* BSD4.4-style long filename.
410 Only implemented for reading, so far! */
411 else if (hdr.ar_name[0] == '#'
412 && hdr.ar_name[1] == '1'
413 && hdr.ar_name[2] == '/'
414 && ISDIGIT (hdr.ar_name[3]))
416 /* BSD-4.4 extended name */
417 namelen = atoi (&hdr.ar_name[3]);
418 allocsize += namelen + 1;
419 parsed_size -= namelen;
421 allocptr = bfd_zalloc (abfd, allocsize);
422 if (allocptr == NULL)
423 return NULL;
424 filename = (allocptr
425 + sizeof (struct areltdata)
426 + sizeof (struct ar_hdr));
427 if (bfd_bread (filename, namelen, abfd) != namelen)
429 if (bfd_get_error () != bfd_error_system_call)
430 bfd_set_error (bfd_error_no_more_archived_files);
431 return NULL;
433 filename[namelen] = '\0';
435 else
437 /* We judge the end of the name by looking for '/' or ' '.
438 Note: The SYSV format (terminated by '/') allows embedded
439 spaces, so only look for ' ' if we don't find '/'. */
441 char *e;
442 e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
443 if (e == NULL)
445 e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
446 if (e == NULL)
447 e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
450 if (e != NULL)
451 namelen = e - hdr.ar_name;
452 else
454 /* If we didn't find a termination character, then the name
455 must be the entire field. */
456 namelen = ar_maxnamelen (abfd);
459 allocsize += namelen + 1;
462 if (!allocptr)
464 allocptr = bfd_zalloc (abfd, allocsize);
465 if (allocptr == NULL)
466 return NULL;
469 ared = (struct areltdata *) allocptr;
471 ared->arch_header = allocptr + sizeof (struct areltdata);
472 memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr));
473 ared->parsed_size = parsed_size;
475 if (filename != NULL)
476 ared->filename = filename;
477 else
479 ared->filename = allocptr + (sizeof (struct areltdata) +
480 sizeof (struct ar_hdr));
481 if (namelen)
482 memcpy (ared->filename, hdr.ar_name, (size_t) namelen);
483 ared->filename[namelen] = '\0';
486 return (PTR) ared;
489 /* This is an internal function; it's mainly used when indexing
490 through the archive symbol table, but also used to get the next
491 element, since it handles the bookkeeping so nicely for us. */
493 bfd *
494 _bfd_get_elt_at_filepos (archive, filepos)
495 bfd *archive;
496 file_ptr filepos;
498 struct areltdata *new_areldata;
499 bfd *n_nfd;
501 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
502 if (n_nfd)
503 return n_nfd;
505 if (0 > bfd_seek (archive, filepos, SEEK_SET))
506 return NULL;
508 if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
509 return NULL;
511 n_nfd = _bfd_create_empty_archive_element_shell (archive);
512 if (n_nfd == NULL)
514 bfd_release (archive, (PTR) new_areldata);
515 return NULL;
518 n_nfd->origin = bfd_tell (archive);
519 n_nfd->arelt_data = (PTR) new_areldata;
520 n_nfd->filename = new_areldata->filename;
522 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
523 return n_nfd;
525 /* Huh? */
526 bfd_release (archive, (PTR) n_nfd);
527 bfd_release (archive, (PTR) new_areldata);
528 return NULL;
531 /* Return the BFD which is referenced by the symbol in ABFD indexed by
532 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
534 bfd *
535 _bfd_generic_get_elt_at_index (abfd, index)
536 bfd *abfd;
537 symindex index;
539 carsym *entry;
541 entry = bfd_ardata (abfd)->symdefs + index;
542 return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
546 FUNCTION
547 bfd_openr_next_archived_file
549 SYNOPSIS
550 bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous);
552 DESCRIPTION
553 Provided a BFD, @var{archive}, containing an archive and NULL, open
554 an input BFD on the first contained element and returns that.
555 Subsequent calls should pass
556 the archive and the previous return value to return a created
557 BFD to the next contained element. NULL is returned when there
558 are no more.
561 bfd *
562 bfd_openr_next_archived_file (archive, last_file)
563 bfd *archive;
564 bfd *last_file;
566 if ((bfd_get_format (archive) != bfd_archive) ||
567 (archive->direction == write_direction))
569 bfd_set_error (bfd_error_invalid_operation);
570 return NULL;
573 return BFD_SEND (archive,
574 openr_next_archived_file,
575 (archive,
576 last_file));
579 bfd *
580 bfd_generic_openr_next_archived_file (archive, last_file)
581 bfd *archive;
582 bfd *last_file;
584 file_ptr filestart;
586 if (!last_file)
587 filestart = bfd_ardata (archive)->first_file_filepos;
588 else
590 unsigned int size = arelt_size (last_file);
591 /* Pad to an even boundary...
592 Note that last_file->origin can be odd in the case of
593 BSD-4.4-style element with a long odd size. */
594 filestart = last_file->origin + size;
595 filestart += filestart % 2;
598 return _bfd_get_elt_at_filepos (archive, filestart);
601 const bfd_target *
602 bfd_generic_archive_p (abfd)
603 bfd *abfd;
605 struct artdata *tdata_hold;
606 char armag[SARMAG + 1];
607 bfd_size_type amt;
609 if (bfd_bread ((PTR) armag, (bfd_size_type) SARMAG, abfd) != SARMAG)
611 if (bfd_get_error () != bfd_error_system_call)
612 bfd_set_error (bfd_error_wrong_format);
613 return NULL;
616 #ifdef GNU960
617 if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0)
618 return 0;
619 #else
620 if (strncmp (armag, ARMAG, SARMAG) != 0 &&
621 strncmp (armag, ARMAGB, SARMAG) != 0)
622 return 0;
623 #endif
625 tdata_hold = bfd_ardata (abfd);
627 amt = sizeof (struct artdata);
628 bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
629 if (bfd_ardata (abfd) == NULL)
631 bfd_ardata (abfd) = tdata_hold;
632 return NULL;
635 bfd_ardata (abfd)->first_file_filepos = SARMAG;
636 bfd_ardata (abfd)->cache = NULL;
637 bfd_ardata (abfd)->archive_head = NULL;
638 bfd_ardata (abfd)->symdefs = NULL;
639 bfd_ardata (abfd)->extended_names = NULL;
640 bfd_ardata (abfd)->tdata = NULL;
642 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
643 || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
645 if (bfd_get_error () != bfd_error_system_call)
646 bfd_set_error (bfd_error_wrong_format);
647 bfd_release (abfd, bfd_ardata (abfd));
648 bfd_ardata (abfd) = tdata_hold;
649 return NULL;
652 if (bfd_has_map (abfd))
654 bfd *first;
656 /* This archive has a map, so we may presume that the contents
657 are object files. Make sure that if the first file in the
658 archive can be recognized as an object file, it is for this
659 target. If not, assume that this is the wrong format. If
660 the first file is not an object file, somebody is doing
661 something weird, and we permit it so that ar -t will work.
663 This is done because any normal format will recognize any
664 normal archive, regardless of the format of the object files.
665 We do accept an empty archive. */
667 first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
668 if (first != NULL)
670 bfd_boolean fail;
672 first->target_defaulted = FALSE;
673 fail = FALSE;
674 if (bfd_check_format (first, bfd_object)
675 && first->xvec != abfd->xvec)
677 #if 0
678 /* We ought to close `first' here, but we can't, because
679 we have no way to remove it from the archive cache.
680 It's close to impossible to figure out when we can
681 release bfd_ardata. FIXME. */
682 (void) bfd_close (first);
683 bfd_release (abfd, bfd_ardata (abfd));
684 #endif
685 bfd_set_error (bfd_error_wrong_object_format);
686 bfd_ardata (abfd) = tdata_hold;
687 return NULL;
689 /* And we ought to close `first' here too. */
693 return abfd->xvec;
696 /* Some constants for a 32 bit BSD archive structure. We do not
697 support 64 bit archives presently; so far as I know, none actually
698 exist. Supporting them would require changing these constants, and
699 changing some H_GET_32 to H_GET_64. */
701 /* The size of an external symdef structure. */
702 #define BSD_SYMDEF_SIZE 8
704 /* The offset from the start of a symdef structure to the file offset. */
705 #define BSD_SYMDEF_OFFSET_SIZE 4
707 /* The size of the symdef count. */
708 #define BSD_SYMDEF_COUNT_SIZE 4
710 /* The size of the string count. */
711 #define BSD_STRING_COUNT_SIZE 4
713 /* Returns FALSE on error, TRUE otherwise */
715 static bfd_boolean
716 do_slurp_bsd_armap (abfd)
717 bfd *abfd;
719 struct areltdata *mapdata;
720 unsigned int counter;
721 bfd_byte *raw_armap, *rbase;
722 struct artdata *ardata = bfd_ardata (abfd);
723 char *stringbase;
724 bfd_size_type parsed_size, amt;
725 carsym *set;
727 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
728 if (mapdata == NULL)
729 return FALSE;
730 parsed_size = mapdata->parsed_size;
731 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */
733 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
734 if (raw_armap == (bfd_byte *) NULL)
735 return FALSE;
737 if (bfd_bread ((PTR) raw_armap, parsed_size, abfd) != parsed_size)
739 if (bfd_get_error () != bfd_error_system_call)
740 bfd_set_error (bfd_error_malformed_archive);
741 byebye:
742 bfd_release (abfd, (PTR) raw_armap);
743 return FALSE;
746 ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
748 if (ardata->symdef_count * BSD_SYMDEF_SIZE >
749 parsed_size - BSD_SYMDEF_COUNT_SIZE)
751 /* Probably we're using the wrong byte ordering. */
752 bfd_set_error (bfd_error_wrong_format);
753 goto byebye;
756 ardata->cache = 0;
757 rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
758 stringbase = ((char *) rbase
759 + ardata->symdef_count * BSD_SYMDEF_SIZE
760 + BSD_STRING_COUNT_SIZE);
761 amt = (bfd_size_type) ardata->symdef_count * sizeof (carsym);
762 ardata->symdefs = (carsym *) bfd_alloc (abfd, amt);
763 if (!ardata->symdefs)
764 return FALSE;
766 for (counter = 0, set = ardata->symdefs;
767 counter < ardata->symdef_count;
768 counter++, set++, rbase += BSD_SYMDEF_SIZE)
770 set->name = H_GET_32 (abfd, rbase) + stringbase;
771 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
774 ardata->first_file_filepos = bfd_tell (abfd);
775 /* Pad to an even boundary if you have to. */
776 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
777 /* FIXME, we should provide some way to free raw_ardata when
778 we are done using the strings from it. For now, it seems
779 to be allocated on an objalloc anyway... */
780 bfd_has_map (abfd) = TRUE;
781 return TRUE;
784 /* Returns FALSE on error, TRUE otherwise. */
786 static bfd_boolean
787 do_slurp_coff_armap (abfd)
788 bfd *abfd;
790 struct areltdata *mapdata;
791 int *raw_armap, *rawptr;
792 struct artdata *ardata = bfd_ardata (abfd);
793 char *stringbase;
794 bfd_size_type stringsize;
795 unsigned int parsed_size;
796 carsym *carsyms;
797 bfd_size_type nsymz; /* Number of symbols in armap. */
798 bfd_vma (*swap) PARAMS ((const bfd_byte *));
799 char int_buf[sizeof (long)];
800 bfd_size_type carsym_size, ptrsize;
801 unsigned int i;
803 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
804 if (mapdata == NULL)
805 return FALSE;
806 parsed_size = mapdata->parsed_size;
807 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */
809 if (bfd_bread ((PTR) int_buf, (bfd_size_type) 4, abfd) != 4)
811 if (bfd_get_error () != bfd_error_system_call)
812 bfd_set_error (bfd_error_malformed_archive);
813 return FALSE;
815 /* It seems that all numeric information in a coff archive is always
816 in big endian format, nomatter the host or target. */
817 swap = bfd_getb32;
818 nsymz = bfd_getb32 ((PTR) int_buf);
819 stringsize = parsed_size - (4 * nsymz) - 4;
821 #if 1
822 /* ... except that some archive formats are broken, and it may be our
823 fault - the i960 little endian coff sometimes has big and sometimes
824 little, because our tools changed. Here's a horrible hack to clean
825 up the crap. */
827 if (stringsize > 0xfffff
828 && bfd_get_arch (abfd) == bfd_arch_i960
829 && bfd_get_flavour (abfd) == bfd_target_coff_flavour)
831 /* This looks dangerous, let's do it the other way around. */
832 nsymz = bfd_getl32 ((PTR) int_buf);
833 stringsize = parsed_size - (4 * nsymz) - 4;
834 swap = bfd_getl32;
836 #endif
838 /* The coff armap must be read sequentially. So we construct a
839 bsd-style one in core all at once, for simplicity. */
841 carsym_size = (nsymz * sizeof (carsym));
842 ptrsize = (4 * nsymz);
844 ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
845 if (ardata->symdefs == NULL)
846 return FALSE;
847 carsyms = ardata->symdefs;
848 stringbase = ((char *) ardata->symdefs) + carsym_size;
850 /* Allocate and read in the raw offsets. */
851 raw_armap = (int *) bfd_alloc (abfd, ptrsize);
852 if (raw_armap == NULL)
853 goto release_symdefs;
854 if (bfd_bread ((PTR) raw_armap, ptrsize, abfd) != ptrsize
855 || (bfd_bread ((PTR) stringbase, stringsize, abfd) != stringsize))
857 if (bfd_get_error () != bfd_error_system_call)
858 bfd_set_error (bfd_error_malformed_archive);
859 goto release_raw_armap;
862 /* OK, build the carsyms. */
863 for (i = 0; i < nsymz; i++)
865 rawptr = raw_armap + i;
866 carsyms->file_offset = swap ((PTR) rawptr);
867 carsyms->name = stringbase;
868 stringbase += strlen (stringbase) + 1;
869 carsyms++;
871 *stringbase = 0;
873 ardata->symdef_count = nsymz;
874 ardata->first_file_filepos = bfd_tell (abfd);
875 /* Pad to an even boundary if you have to. */
876 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
878 bfd_has_map (abfd) = TRUE;
879 bfd_release (abfd, (PTR) raw_armap);
881 /* Check for a second archive header (as used by PE). */
883 struct areltdata *tmp;
885 bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
886 tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
887 if (tmp != NULL)
889 if (tmp->arch_header[0] == '/'
890 && tmp->arch_header[1] == ' ')
892 ardata->first_file_filepos +=
893 (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
895 bfd_release (abfd, tmp);
899 return TRUE;
901 release_raw_armap:
902 bfd_release (abfd, (PTR) raw_armap);
903 release_symdefs:
904 bfd_release (abfd, (PTR) (ardata)->symdefs);
905 return FALSE;
908 /* This routine can handle either coff-style or bsd-style armaps.
909 Returns FALSE on error, TRUE otherwise */
911 bfd_boolean
912 bfd_slurp_armap (abfd)
913 bfd *abfd;
915 char nextname[17];
916 int i = bfd_bread ((PTR) nextname, (bfd_size_type) 16, abfd);
918 if (i == 0)
919 return TRUE;
920 if (i != 16)
921 return FALSE;
923 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
924 return FALSE;
926 if (!strncmp (nextname, "__.SYMDEF ", 16)
927 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */
928 return do_slurp_bsd_armap (abfd);
929 else if (!strncmp (nextname, "/ ", 16))
930 return do_slurp_coff_armap (abfd);
931 else if (!strncmp (nextname, "/SYM64/ ", 16))
933 /* 64bit ELF (Irix 6) archive. */
934 #ifdef BFD64
935 return bfd_elf64_archive_slurp_armap (abfd);
936 #else
937 bfd_set_error (bfd_error_wrong_format);
938 return FALSE;
939 #endif
942 bfd_has_map (abfd) = FALSE;
943 return TRUE;
946 /* Returns FALSE on error, TRUE otherwise */
947 /* flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
948 header is in a slightly different order and the map name is '/'.
949 This flavour is used by hp300hpux. */
951 #define HPUX_SYMDEF_COUNT_SIZE 2
953 bfd_boolean
954 bfd_slurp_bsd_armap_f2 (abfd)
955 bfd *abfd;
957 struct areltdata *mapdata;
958 char nextname[17];
959 unsigned int counter;
960 bfd_byte *raw_armap, *rbase;
961 struct artdata *ardata = bfd_ardata (abfd);
962 char *stringbase;
963 unsigned int stringsize;
964 bfd_size_type amt;
965 carsym *set;
966 int i = bfd_bread ((PTR) nextname, (bfd_size_type) 16, abfd);
968 if (i == 0)
969 return TRUE;
970 if (i != 16)
971 return FALSE;
973 /* The archive has at least 16 bytes in it. */
974 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
975 return FALSE;
977 if (!strncmp (nextname, "__.SYMDEF ", 16)
978 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */
979 return do_slurp_bsd_armap (abfd);
981 if (strncmp (nextname, "/ ", 16))
983 bfd_has_map (abfd) = FALSE;
984 return TRUE;
987 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
988 if (mapdata == NULL)
989 return FALSE;
991 amt = mapdata->parsed_size;
992 raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
993 if (raw_armap == NULL)
995 byebye:
996 bfd_release (abfd, (PTR) mapdata);
997 return FALSE;
1000 if (bfd_bread ((PTR) raw_armap, amt, abfd) != amt)
1002 if (bfd_get_error () != bfd_error_system_call)
1003 bfd_set_error (bfd_error_malformed_archive);
1004 byebyebye:
1005 bfd_release (abfd, (PTR) raw_armap);
1006 goto byebye;
1009 ardata->symdef_count = H_GET_16 (abfd, (PTR) raw_armap);
1011 if (ardata->symdef_count * BSD_SYMDEF_SIZE
1012 > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE)
1014 /* Probably we're using the wrong byte ordering. */
1015 bfd_set_error (bfd_error_wrong_format);
1016 goto byebyebye;
1019 ardata->cache = 0;
1021 stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
1022 /* Skip sym count and string sz. */
1023 stringbase = ((char *) raw_armap
1024 + HPUX_SYMDEF_COUNT_SIZE
1025 + BSD_STRING_COUNT_SIZE);
1026 rbase = (bfd_byte *) stringbase + stringsize;
1027 amt = (bfd_size_type) ardata->symdef_count * BSD_SYMDEF_SIZE;
1028 ardata->symdefs = (carsym *) bfd_alloc (abfd, amt);
1029 if (!ardata->symdefs)
1030 return FALSE;
1032 for (counter = 0, set = ardata->symdefs;
1033 counter < ardata->symdef_count;
1034 counter++, set++, rbase += BSD_SYMDEF_SIZE)
1036 set->name = H_GET_32 (abfd, rbase) + stringbase;
1037 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1040 ardata->first_file_filepos = bfd_tell (abfd);
1041 /* Pad to an even boundary if you have to. */
1042 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1043 /* FIXME, we should provide some way to free raw_ardata when
1044 we are done using the strings from it. For now, it seems
1045 to be allocated on an objalloc anyway... */
1046 bfd_has_map (abfd) = TRUE;
1047 return TRUE;
1050 /** Extended name table.
1052 Normally archives support only 14-character filenames.
1054 Intel has extended the format: longer names are stored in a special
1055 element (the first in the archive, or second if there is an armap);
1056 the name in the ar_hdr is replaced by <space><index into filename
1057 element>. Index is the P.R. of an int (decimal). Data General have
1058 extended the format by using the prefix // for the special element. */
1060 /* Returns FALSE on error, TRUE otherwise. */
1062 bfd_boolean
1063 _bfd_slurp_extended_name_table (abfd)
1064 bfd *abfd;
1066 char nextname[17];
1067 struct areltdata *namedata;
1068 bfd_size_type amt;
1070 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ,
1071 we probably don't want to return TRUE. */
1072 bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET);
1073 if (bfd_bread ((PTR) nextname, (bfd_size_type) 16, abfd) == 16)
1075 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1076 return FALSE;
1078 if (strncmp (nextname, "ARFILENAMES/ ", 16) != 0 &&
1079 strncmp (nextname, "// ", 16) != 0)
1081 bfd_ardata (abfd)->extended_names = NULL;
1082 return TRUE;
1085 namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1086 if (namedata == NULL)
1087 return FALSE;
1089 amt = namedata->parsed_size;
1090 bfd_ardata (abfd)->extended_names = bfd_zalloc (abfd, amt);
1091 if (bfd_ardata (abfd)->extended_names == NULL)
1093 byebye:
1094 bfd_release (abfd, (PTR) namedata);
1095 return FALSE;
1098 if (bfd_bread ((PTR) bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
1100 if (bfd_get_error () != bfd_error_system_call)
1101 bfd_set_error (bfd_error_malformed_archive);
1102 bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names));
1103 bfd_ardata (abfd)->extended_names = NULL;
1104 goto byebye;
1107 /* Since the archive is supposed to be printable if it contains
1108 text, the entries in the list are newline-padded, not null
1109 padded. In SVR4-style archives, the names also have a
1110 trailing '/'. DOS/NT created archive often have \ in them
1111 We'll fix all problems here.. */
1113 char *temp = bfd_ardata (abfd)->extended_names;
1114 char *limit = temp + namedata->parsed_size;
1115 for (; temp < limit; ++temp)
1117 if (*temp == '\012')
1118 temp[temp[-1] == '/' ? -1 : 0] = '\0';
1119 if (*temp == '\\')
1120 *temp = '/';
1124 /* Pad to an even boundary if you have to. */
1125 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1126 bfd_ardata (abfd)->first_file_filepos +=
1127 (bfd_ardata (abfd)->first_file_filepos) % 2;
1129 /* FIXME, we can't release namedata here because it was allocated
1130 below extended_names on the objalloc... */
1131 #if 0
1132 bfd_release (abfd, namedata);
1133 #endif
1135 return TRUE;
1138 #ifdef VMS
1140 /* Return a copy of the stuff in the filename between any :]> and a
1141 semicolon. */
1143 static const char *
1144 normalize (abfd, file)
1145 bfd *abfd;
1146 const char *file;
1148 const char *first;
1149 const char *last;
1150 char *copy;
1152 first = file + strlen (file) - 1;
1153 last = first + 1;
1155 while (first != file)
1157 if (*first == ';')
1158 last = first;
1159 if (*first == ':' || *first == ']' || *first == '>')
1161 first++;
1162 break;
1164 first--;
1167 copy = (char *) bfd_alloc (abfd, (bfd_size_type) (last - first + 1));
1168 if (copy == NULL)
1169 return NULL;
1171 memcpy (copy, first, last - first);
1172 copy[last - first] = 0;
1174 return copy;
1177 #else
1178 static const char *
1179 normalize (abfd, file)
1180 bfd *abfd ATTRIBUTE_UNUSED;
1181 const char *file;
1183 const char *filename = strrchr (file, '/');
1185 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1187 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
1188 char *bslash = strrchr (file, '\\');
1189 if (filename == NULL || (bslash != NULL && bslash > filename))
1190 filename = bslash;
1191 if (filename == NULL && file[0] != '\0' && file[1] == ':')
1192 filename = file + 1;
1194 #endif
1195 if (filename != (char *) NULL)
1196 filename++;
1197 else
1198 filename = file;
1199 return filename;
1201 #endif
1203 /* Build a BFD style extended name table. */
1205 bfd_boolean
1206 _bfd_archive_bsd_construct_extended_name_table (abfd, tabloc, tablen, name)
1207 bfd *abfd;
1208 char **tabloc;
1209 bfd_size_type *tablen;
1210 const char **name;
1212 *name = "ARFILENAMES/";
1213 return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
1216 /* Build an SVR4 style extended name table. */
1218 bfd_boolean
1219 _bfd_archive_coff_construct_extended_name_table (abfd, tabloc, tablen, name)
1220 bfd *abfd;
1221 char **tabloc;
1222 bfd_size_type *tablen;
1223 const char **name;
1225 *name = "//";
1226 return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
1229 /* Follows archive_head and produces an extended name table if
1230 necessary. Returns (in tabloc) a pointer to an extended name
1231 table, and in tablen the length of the table. If it makes an entry
1232 it clobbers the filename so that the element may be written without
1233 further massage. Returns TRUE if it ran successfully, FALSE if
1234 something went wrong. A successful return may still involve a
1235 zero-length tablen! */
1237 bfd_boolean
1238 _bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen)
1239 bfd *abfd;
1240 bfd_boolean trailing_slash;
1241 char **tabloc;
1242 bfd_size_type *tablen;
1244 unsigned int maxname = abfd->xvec->ar_max_namelen;
1245 bfd_size_type total_namelen = 0;
1246 bfd *current;
1247 char *strptr;
1249 *tablen = 0;
1251 /* Figure out how long the table should be. */
1252 for (current = abfd->archive_head; current != NULL; current = current->next)
1254 const char *normal;
1255 unsigned int thislen;
1257 normal = normalize (current, current->filename);
1258 if (normal == NULL)
1259 return FALSE;
1261 thislen = strlen (normal);
1263 if (thislen > maxname
1264 && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1265 thislen = maxname;
1267 if (thislen > maxname)
1269 /* Add one to leave room for \n. */
1270 total_namelen += thislen + 1;
1271 if (trailing_slash)
1273 /* Leave room for trailing slash. */
1274 ++total_namelen;
1277 else
1279 struct ar_hdr *hdr = arch_hdr (current);
1280 if (strncmp (normal, hdr->ar_name, thislen) != 0
1281 || (thislen < sizeof hdr->ar_name
1282 && hdr->ar_name[thislen] != ar_padchar (current)))
1284 /* Must have been using extended format even though it
1285 didn't need to. Fix it to use normal format. */
1286 memcpy (hdr->ar_name, normal, thislen);
1287 if (thislen < maxname
1288 || (thislen == maxname && thislen < sizeof hdr->ar_name))
1289 hdr->ar_name[thislen] = ar_padchar (current);
1294 if (total_namelen == 0)
1295 return TRUE;
1297 *tabloc = bfd_zalloc (abfd, total_namelen);
1298 if (*tabloc == NULL)
1299 return FALSE;
1301 *tablen = total_namelen;
1302 strptr = *tabloc;
1304 for (current = abfd->archive_head; current != NULL; current =
1305 current->next)
1307 const char *normal;
1308 unsigned int thislen;
1310 normal = normalize (current, current->filename);
1311 if (normal == NULL)
1312 return FALSE;
1314 thislen = strlen (normal);
1315 if (thislen > maxname)
1317 /* Works for now; may need to be re-engineered if we
1318 encounter an oddball archive format and want to
1319 generalise this hack. */
1320 struct ar_hdr *hdr = arch_hdr (current);
1321 strcpy (strptr, normal);
1322 if (! trailing_slash)
1323 strptr[thislen] = '\012';
1324 else
1326 strptr[thislen] = '/';
1327 strptr[thislen + 1] = '\012';
1329 hdr->ar_name[0] = ar_padchar (current);
1330 /* We know there will always be enough room (one of the few
1331 cases where you may safely use sprintf). */
1332 sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc));
1333 /* Kinda Kludgy. We should just use the returned value of
1334 sprintf but not all implementations get this right. */
1336 char *temp = hdr->ar_name + 2;
1337 for (; temp < hdr->ar_name + maxname; temp++)
1338 if (*temp == '\0')
1339 *temp = ' ';
1341 strptr += thislen + 1;
1342 if (trailing_slash)
1343 ++strptr;
1347 return TRUE;
1350 /** A couple of functions for creating ar_hdrs */
1352 #ifdef HPUX_LARGE_AR_IDS
1353 /* Function to encode large UID/GID values according to HP. */
1355 static void
1356 hpux_uid_gid_encode (str, id)
1357 char str[6];
1358 long int id;
1360 int cnt;
1362 str[5] = '@' + (id & 3);
1363 id >>= 2;
1365 for (cnt = 4; cnt >= 0; ++cnt, id >>= 6)
1366 str[cnt] = ' ' + (id & 0x3f);
1368 #endif /* HPUX_LARGE_AR_IDS */
1370 #ifndef HAVE_GETUID
1371 #define getuid() 0
1372 #endif
1374 #ifndef HAVE_GETGID
1375 #define getgid() 0
1376 #endif
1378 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1379 make one. The filename must refer to a filename in the filesystem.
1380 The filename field of the ar_hdr will NOT be initialized. If member
1381 is set, and it's an in-memory bfd, we fake it. */
1383 static struct areltdata *
1384 bfd_ar_hdr_from_filesystem (abfd, filename, member)
1385 bfd *abfd;
1386 const char *filename;
1387 bfd *member;
1389 struct stat status;
1390 struct areltdata *ared;
1391 struct ar_hdr *hdr;
1392 char *temp, *temp1;
1393 bfd_size_type amt;
1395 if (member && (member->flags & BFD_IN_MEMORY) != 0)
1397 /* Assume we just "made" the member, and fake it. */
1398 struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream;
1399 time (&status.st_mtime);
1400 status.st_uid = getuid ();
1401 status.st_gid = getgid ();
1402 status.st_mode = 0644;
1403 status.st_size = bim->size;
1405 else if (stat (filename, &status) != 0)
1407 bfd_set_error (bfd_error_system_call);
1408 return NULL;
1411 amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
1412 ared = (struct areltdata *) bfd_zalloc (abfd, amt);
1413 if (ared == NULL)
1414 return NULL;
1415 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1417 /* ar headers are space padded, not null padded! */
1418 memset ((PTR) hdr, ' ', sizeof (struct ar_hdr));
1420 strncpy (hdr->ar_fmag, ARFMAG, 2);
1422 /* Goddamned sprintf doesn't permit MAXIMUM field lengths. */
1423 sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime);
1424 #ifdef HPUX_LARGE_AR_IDS
1425 /* HP has a very "special" way to handle UID/GID's with numeric values
1426 > 99999. */
1427 if (status.st_uid > 99999)
1428 hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_uid);
1429 else
1430 #endif
1431 sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid);
1432 #ifdef HPUX_LARGE_AR_IDS
1433 /* HP has a very "special" way to handle UID/GID's with numeric values
1434 > 99999. */
1435 if (status.st_gid > 99999)
1436 hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_gid);
1437 else
1438 #endif
1439 sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid);
1440 sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode);
1441 sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size);
1442 /* Correct for a lossage in sprintf whereby it null-terminates. I cannot
1443 understand how these C losers could design such a ramshackle bunch of
1444 IO operations. */
1445 temp = (char *) hdr;
1446 temp1 = temp + sizeof (struct ar_hdr) - 2;
1447 for (; temp < temp1; temp++)
1449 if (*temp == '\0')
1450 *temp = ' ';
1452 strncpy (hdr->ar_fmag, ARFMAG, 2);
1453 ared->parsed_size = status.st_size;
1454 ared->arch_header = (char *) hdr;
1456 return ared;
1459 /* This is magic required by the "ar" program. Since it's
1460 undocumented, it's undocumented. You may think that it would take
1461 a strong stomach to write this, and it does, but it takes even a
1462 stronger stomach to try to code around such a thing! */
1464 struct ar_hdr *bfd_special_undocumented_glue
1465 PARAMS ((bfd *, const char *));
1467 struct ar_hdr *
1468 bfd_special_undocumented_glue (abfd, filename)
1469 bfd *abfd;
1470 const char *filename;
1472 struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename, 0);
1473 if (ar_elt == NULL)
1474 return NULL;
1475 return (struct ar_hdr *) ar_elt->arch_header;
1478 /* Analogous to stat call. */
1481 bfd_generic_stat_arch_elt (abfd, buf)
1482 bfd *abfd;
1483 struct stat *buf;
1485 struct ar_hdr *hdr;
1486 char *aloser;
1488 if (abfd->arelt_data == NULL)
1490 bfd_set_error (bfd_error_invalid_operation);
1491 return -1;
1494 hdr = arch_hdr (abfd);
1496 #define foo(arelt, stelt, size) \
1497 buf->stelt = strtol (hdr->arelt, &aloser, size); \
1498 if (aloser == hdr->arelt) \
1499 return -1;
1501 /* Some platforms support special notations for large IDs. */
1502 #ifdef HPUX_LARGE_AR_IDS
1503 # define foo2(arelt, stelt, size) \
1504 if (hdr->arelt[5] == ' ') \
1506 foo (arelt, stelt, size); \
1508 else \
1510 int cnt; \
1511 for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \
1513 if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \
1514 return -1; \
1515 buf->stelt <<= 6; \
1516 buf->stelt += hdr->arelt[cnt] - ' '; \
1518 if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \
1519 return -1; \
1520 buf->stelt <<= 2; \
1521 buf->stelt += hdr->arelt[5] - '@'; \
1523 #else
1524 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1525 #endif
1527 foo (ar_date, st_mtime, 10);
1528 foo2 (ar_uid, st_uid, 10);
1529 foo2 (ar_gid, st_gid, 10);
1530 foo (ar_mode, st_mode, 8);
1532 buf->st_size = arch_eltdata (abfd)->parsed_size;
1534 return 0;
1537 void
1538 bfd_dont_truncate_arname (abfd, pathname, arhdr)
1539 bfd *abfd;
1540 const char *pathname;
1541 char *arhdr;
1543 /* FIXME: This interacts unpleasantly with ar's quick-append option.
1544 Fortunately ic960 users will never use that option. Fixing this
1545 is very hard; fortunately I know how to do it and will do so once
1546 intel's release is out the door. */
1548 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1549 size_t length;
1550 const char *filename;
1551 size_t maxlen = ar_maxnamelen (abfd);
1553 if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1555 bfd_bsd_truncate_arname (abfd, pathname, arhdr);
1556 return;
1559 filename = normalize (abfd, pathname);
1560 if (filename == NULL)
1562 /* FIXME */
1563 abort ();
1566 length = strlen (filename);
1568 if (length <= maxlen)
1569 memcpy (hdr->ar_name, filename, length);
1571 /* Add the padding character if there is room for it. */
1572 if (length < maxlen
1573 || (length == maxlen && length < sizeof hdr->ar_name))
1574 (hdr->ar_name)[length] = ar_padchar (abfd);
1577 void
1578 bfd_bsd_truncate_arname (abfd, pathname, arhdr)
1579 bfd *abfd;
1580 const char *pathname;
1581 char *arhdr;
1583 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1584 size_t length;
1585 const char *filename = strrchr (pathname, '/');
1586 size_t maxlen = ar_maxnamelen (abfd);
1588 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1590 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
1591 char *bslash = strrchr (pathname, '\\');
1592 if (filename == NULL || (bslash != NULL && bslash > filename))
1593 filename = bslash;
1594 if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1595 filename = pathname + 1;
1597 #endif
1599 if (filename == NULL)
1600 filename = pathname;
1601 else
1602 ++filename;
1604 length = strlen (filename);
1606 if (length <= maxlen)
1607 memcpy (hdr->ar_name, filename, length);
1608 else
1610 /* pathname: meet procrustes */
1611 memcpy (hdr->ar_name, filename, maxlen);
1612 length = maxlen;
1615 if (length < maxlen)
1616 (hdr->ar_name)[length] = ar_padchar (abfd);
1619 /* Store name into ar header. Truncates the name to fit.
1620 1> strip pathname to be just the basename.
1621 2> if it's short enuf to fit, stuff it in.
1622 3> If it doesn't end with .o, truncate it to fit
1623 4> truncate it before the .o, append .o, stuff THAT in. */
1625 /* This is what gnu ar does. It's better but incompatible with the
1626 bsd ar. */
1628 void
1629 bfd_gnu_truncate_arname (abfd, pathname, arhdr)
1630 bfd *abfd;
1631 const char *pathname;
1632 char *arhdr;
1634 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1635 size_t length;
1636 const char *filename = strrchr (pathname, '/');
1637 size_t maxlen = ar_maxnamelen (abfd);
1639 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1641 /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
1642 char *bslash = strrchr (pathname, '\\');
1643 if (filename == NULL || (bslash != NULL && bslash > filename))
1644 filename = bslash;
1645 if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
1646 filename = pathname + 1;
1648 #endif
1650 if (filename == NULL)
1651 filename = pathname;
1652 else
1653 ++filename;
1655 length = strlen (filename);
1657 if (length <= maxlen)
1658 memcpy (hdr->ar_name, filename, length);
1659 else
1660 { /* pathname: meet procrustes */
1661 memcpy (hdr->ar_name, filename, maxlen);
1662 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
1664 hdr->ar_name[maxlen - 2] = '.';
1665 hdr->ar_name[maxlen - 1] = 'o';
1667 length = maxlen;
1670 if (length < 16)
1671 (hdr->ar_name)[length] = ar_padchar (abfd);
1674 /* The BFD is open for write and has its format set to bfd_archive. */
1676 bfd_boolean
1677 _bfd_write_archive_contents (arch)
1678 bfd *arch;
1680 bfd *current;
1681 char *etable = NULL;
1682 bfd_size_type elength = 0;
1683 const char *ename = NULL;
1684 bfd_boolean makemap = bfd_has_map (arch);
1685 /* If no .o's, don't bother to make a map. */
1686 bfd_boolean hasobjects = FALSE;
1687 bfd_size_type wrote;
1688 unsigned int i;
1689 int tries;
1691 /* Verify the viability of all entries; if any of them live in the
1692 filesystem (as opposed to living in an archive open for input)
1693 then construct a fresh ar_hdr for them. */
1694 for (current = arch->archive_head; current; current = current->next)
1696 /* This check is checking the bfds for the objects we're reading
1697 from (which are usually either an object file or archive on
1698 disk), not the archive entries we're writing to. We don't
1699 actually create bfds for the archive members, we just copy
1700 them byte-wise when we write out the archive. */
1701 if (bfd_write_p (current))
1703 bfd_set_error (bfd_error_invalid_operation);
1704 return FALSE;
1706 if (!current->arelt_data)
1708 current->arelt_data =
1709 (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename, current);
1710 if (!current->arelt_data)
1711 return FALSE;
1713 /* Put in the file name. */
1714 BFD_SEND (arch, _bfd_truncate_arname, (arch,
1715 current->filename,
1716 (char *) arch_hdr (current)));
1719 if (makemap && ! hasobjects)
1720 { /* Don't bother if we won't make a map! */
1721 if ((bfd_check_format (current, bfd_object))
1722 #if 0 /* FIXME -- these are not set correctly */
1723 && ((bfd_get_file_flags (current) & HAS_SYMS))
1724 #endif
1726 hasobjects = TRUE;
1730 if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
1731 (arch, &etable, &elength, &ename)))
1732 return FALSE;
1734 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
1735 return FALSE;
1736 #ifdef GNU960
1737 wrote = bfd_bwrite (BFD_GNU960_ARMAG (arch), (bfd_size_type) SARMAG, arch);
1738 #else
1739 wrote = bfd_bwrite (ARMAG, (bfd_size_type) SARMAG, arch);
1740 #endif
1741 if (wrote != SARMAG)
1742 return FALSE;
1744 if (makemap && hasobjects)
1746 if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
1747 return FALSE;
1750 if (elength != 0)
1752 struct ar_hdr hdr;
1754 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1755 strcpy (hdr.ar_name, ename);
1756 /* Round size up to even number in archive header. */
1757 sprintf (&(hdr.ar_size[0]), "%-10d",
1758 (int) ((elength + 1) & ~(bfd_size_type) 1));
1759 strncpy (hdr.ar_fmag, ARFMAG, 2);
1760 for (i = 0; i < sizeof (struct ar_hdr); i++)
1761 if (((char *) (&hdr))[i] == '\0')
1762 (((char *) (&hdr))[i]) = ' ';
1763 if ((bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
1764 != sizeof (struct ar_hdr))
1765 || bfd_bwrite (etable, elength, arch) != elength)
1766 return FALSE;
1767 if ((elength % 2) == 1)
1769 if (bfd_bwrite ("\012", (bfd_size_type) 1, arch) != 1)
1770 return FALSE;
1774 for (current = arch->archive_head; current; current = current->next)
1776 char buffer[DEFAULT_BUFFERSIZE];
1777 unsigned int remaining = arelt_size (current);
1778 struct ar_hdr *hdr = arch_hdr (current);
1780 /* Write ar header. */
1781 if (bfd_bwrite ((PTR) hdr, (bfd_size_type) sizeof (*hdr), arch)
1782 != sizeof (*hdr))
1783 return FALSE;
1784 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
1785 return FALSE;
1786 while (remaining)
1788 unsigned int amt = DEFAULT_BUFFERSIZE;
1789 if (amt > remaining)
1790 amt = remaining;
1791 errno = 0;
1792 if (bfd_bread (buffer, (bfd_size_type) amt, current) != amt)
1794 if (bfd_get_error () != bfd_error_system_call)
1795 bfd_set_error (bfd_error_malformed_archive);
1796 return FALSE;
1798 if (bfd_bwrite (buffer, (bfd_size_type) amt, arch) != amt)
1799 return FALSE;
1800 remaining -= amt;
1802 if ((arelt_size (current) % 2) == 1)
1804 if (bfd_bwrite ("\012", (bfd_size_type) 1, arch) != 1)
1805 return FALSE;
1809 if (makemap && hasobjects)
1811 /* Verify the timestamp in the archive file. If it would not be
1812 accepted by the linker, rewrite it until it would be. If
1813 anything odd happens, break out and just return. (The
1814 Berkeley linker checks the timestamp and refuses to read the
1815 table-of-contents if it is >60 seconds less than the file's
1816 modified-time. That painful hack requires this painful hack. */
1817 tries = 1;
1820 if (bfd_update_armap_timestamp (arch))
1821 break;
1822 (*_bfd_error_handler)
1823 (_("Warning: writing archive was slow: rewriting timestamp\n"));
1825 while (++tries < 6);
1828 return TRUE;
1831 /* Note that the namidx for the first symbol is 0. */
1833 bfd_boolean
1834 _bfd_compute_and_write_armap (arch, elength)
1835 bfd *arch;
1836 unsigned int elength;
1838 char *first_name = NULL;
1839 bfd *current;
1840 file_ptr elt_no = 0;
1841 struct orl *map = NULL;
1842 unsigned int orl_max = 1024; /* fine initial default */
1843 unsigned int orl_count = 0;
1844 int stridx = 0; /* string index */
1845 asymbol **syms = NULL;
1846 long syms_max = 0;
1847 bfd_boolean ret;
1848 bfd_size_type amt;
1850 /* Dunno if this is the best place for this info... */
1851 if (elength != 0)
1852 elength += sizeof (struct ar_hdr);
1853 elength += elength % 2;
1855 amt = (bfd_size_type) orl_max * sizeof (struct orl);
1856 map = (struct orl *) bfd_malloc (amt);
1857 if (map == NULL)
1858 goto error_return;
1860 /* We put the symbol names on the arch objalloc, and then discard
1861 them when done. */
1862 first_name = bfd_alloc (arch, (bfd_size_type) 1);
1863 if (first_name == NULL)
1864 goto error_return;
1866 /* Drop all the files called __.SYMDEF, we're going to make our own. */
1867 while (arch->archive_head &&
1868 strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
1869 arch->archive_head = arch->archive_head->next;
1871 /* Map over each element. */
1872 for (current = arch->archive_head;
1873 current != (bfd *) NULL;
1874 current = current->next, elt_no++)
1876 if (bfd_check_format (current, bfd_object)
1877 && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
1879 long storage;
1880 long symcount;
1881 long src_count;
1883 storage = bfd_get_symtab_upper_bound (current);
1884 if (storage < 0)
1885 goto error_return;
1887 if (storage != 0)
1889 if (storage > syms_max)
1891 if (syms_max > 0)
1892 free (syms);
1893 syms_max = storage;
1894 syms = (asymbol **) bfd_malloc ((bfd_size_type) syms_max);
1895 if (syms == NULL)
1896 goto error_return;
1898 symcount = bfd_canonicalize_symtab (current, syms);
1899 if (symcount < 0)
1900 goto error_return;
1902 /* Now map over all the symbols, picking out the ones we
1903 want. */
1904 for (src_count = 0; src_count < symcount; src_count++)
1906 flagword flags = (syms[src_count])->flags;
1907 asection *sec = syms[src_count]->section;
1909 if ((flags & BSF_GLOBAL ||
1910 flags & BSF_WEAK ||
1911 flags & BSF_INDIRECT ||
1912 bfd_is_com_section (sec))
1913 && ! bfd_is_und_section (sec))
1915 bfd_size_type namelen;
1916 struct orl *new_map;
1918 /* This symbol will go into the archive header. */
1919 if (orl_count == orl_max)
1921 orl_max *= 2;
1922 amt = (bfd_size_type) orl_max * sizeof (struct orl);
1923 new_map = (struct orl *) bfd_realloc (map, amt);
1924 if (new_map == (struct orl *) NULL)
1925 goto error_return;
1927 map = new_map;
1930 namelen = strlen (syms[src_count]->name);
1931 amt = sizeof (char *);
1932 map[orl_count].name = (char **) bfd_alloc (arch, amt);
1933 if (map[orl_count].name == NULL)
1934 goto error_return;
1935 *(map[orl_count].name) = bfd_alloc (arch, namelen + 1);
1936 if (*(map[orl_count].name) == NULL)
1937 goto error_return;
1938 strcpy (*(map[orl_count].name), syms[src_count]->name);
1939 map[orl_count].u.abfd = current;
1940 map[orl_count].namidx = stridx;
1942 stridx += namelen + 1;
1943 ++orl_count;
1948 /* Now ask the BFD to free up any cached information, so we
1949 don't fill all of memory with symbol tables. */
1950 if (! bfd_free_cached_info (current))
1951 goto error_return;
1955 /* OK, now we have collected all the data, let's write them out. */
1956 ret = BFD_SEND (arch, write_armap,
1957 (arch, elength, map, orl_count, stridx));
1959 if (syms_max > 0)
1960 free (syms);
1961 if (map != NULL)
1962 free (map);
1963 if (first_name != NULL)
1964 bfd_release (arch, first_name);
1966 return ret;
1968 error_return:
1969 if (syms_max > 0)
1970 free (syms);
1971 if (map != NULL)
1972 free (map);
1973 if (first_name != NULL)
1974 bfd_release (arch, first_name);
1976 return FALSE;
1979 bfd_boolean
1980 bsd_write_armap (arch, elength, map, orl_count, stridx)
1981 bfd *arch;
1982 unsigned int elength;
1983 struct orl *map;
1984 unsigned int orl_count;
1985 int stridx;
1987 int padit = stridx & 1;
1988 unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
1989 unsigned int stringsize = stridx + padit;
1990 /* Include 8 bytes to store ranlibsize and stringsize in output. */
1991 unsigned int mapsize = ranlibsize + stringsize + 8;
1992 file_ptr firstreal;
1993 bfd *current = arch->archive_head;
1994 bfd *last_elt = current; /* last element arch seen */
1995 bfd_byte temp[4];
1996 unsigned int count;
1997 struct ar_hdr hdr;
1998 struct stat statbuf;
1999 unsigned int i;
2001 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2003 stat (arch->filename, &statbuf);
2004 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
2005 sprintf (hdr.ar_name, RANLIBMAG);
2006 /* Remember the timestamp, to keep it holy. But fudge it a little. */
2007 bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET;
2008 bfd_ardata (arch)->armap_datepos = (SARMAG
2009 + offsetof (struct ar_hdr, ar_date[0]));
2010 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
2011 sprintf (hdr.ar_uid, "%ld", (long) getuid ());
2012 sprintf (hdr.ar_gid, "%ld", (long) getgid ());
2013 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
2014 strncpy (hdr.ar_fmag, ARFMAG, 2);
2015 for (i = 0; i < sizeof (struct ar_hdr); i++)
2016 if (((char *) (&hdr))[i] == '\0')
2017 (((char *) (&hdr))[i]) = ' ';
2018 if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
2019 != sizeof (struct ar_hdr))
2020 return FALSE;
2021 H_PUT_32 (arch, ranlibsize, temp);
2022 if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), arch) != sizeof (temp))
2023 return FALSE;
2025 for (count = 0; count < orl_count; count++)
2027 bfd_byte buf[BSD_SYMDEF_SIZE];
2029 if (map[count].u.abfd != last_elt)
2033 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
2034 firstreal += firstreal % 2;
2035 current = current->next;
2037 while (current != map[count].u.abfd);
2038 } /* if new archive element */
2040 last_elt = current;
2041 H_PUT_32 (arch, map[count].namidx, buf);
2042 H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2043 if (bfd_bwrite (buf, (bfd_size_type) BSD_SYMDEF_SIZE, arch)
2044 != BSD_SYMDEF_SIZE)
2045 return FALSE;
2048 /* Now write the strings themselves. */
2049 H_PUT_32 (arch, stringsize, temp);
2050 if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), arch) != sizeof (temp))
2051 return FALSE;
2052 for (count = 0; count < orl_count; count++)
2054 size_t len = strlen (*map[count].name) + 1;
2056 if (bfd_bwrite (*map[count].name, (bfd_size_type) len, arch) != len)
2057 return FALSE;
2060 /* The spec sez this should be a newline. But in order to be
2061 bug-compatible for sun's ar we use a null. */
2062 if (padit)
2064 if (bfd_bwrite ("", (bfd_size_type) 1, arch) != 1)
2065 return FALSE;
2068 return TRUE;
2071 /* At the end of archive file handling, update the timestamp in the
2072 file, so the linker will accept it.
2074 Return TRUE if the timestamp was OK, or an unusual problem happened.
2075 Return FALSE if we updated the timestamp. */
2077 bfd_boolean
2078 _bfd_archive_bsd_update_armap_timestamp (arch)
2079 bfd *arch;
2081 struct stat archstat;
2082 struct ar_hdr hdr;
2083 unsigned int i;
2085 /* Flush writes, get last-write timestamp from file, and compare it
2086 to the timestamp IN the file. */
2087 bfd_flush (arch);
2088 if (bfd_stat (arch, &archstat) == -1)
2090 bfd_perror (_("Reading archive file mod timestamp"));
2092 /* Can't read mod time for some reason. */
2093 return TRUE;
2095 if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp)
2096 /* OK by the linker's rules. */
2097 return TRUE;
2099 /* Update the timestamp. */
2100 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2102 /* Prepare an ASCII version suitable for writing. */
2103 memset (hdr.ar_date, 0, sizeof (hdr.ar_date));
2104 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
2105 for (i = 0; i < sizeof (hdr.ar_date); i++)
2106 if (hdr.ar_date[i] == '\0')
2107 (hdr.ar_date)[i] = ' ';
2109 /* Write it into the file. */
2110 bfd_ardata (arch)->armap_datepos = (SARMAG
2111 + offsetof (struct ar_hdr, ar_date[0]));
2112 if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2113 || (bfd_bwrite (hdr.ar_date, (bfd_size_type) sizeof (hdr.ar_date), arch)
2114 != sizeof (hdr.ar_date)))
2116 bfd_perror (_("Writing updated armap timestamp"));
2118 /* Some error while writing. */
2119 return TRUE;
2122 /* We updated the timestamp successfully. */
2123 return FALSE;
2126 /* A coff armap looks like :
2127 lARMAG
2128 struct ar_hdr with name = '/'
2129 number of symbols
2130 offset of file for symbol 0
2131 offset of file for symbol 1
2133 offset of file for symbol n-1
2134 symbol name 0
2135 symbol name 1
2137 symbol name n-1
2140 bfd_boolean
2141 coff_write_armap (arch, elength, map, symbol_count, stridx)
2142 bfd *arch;
2143 unsigned int elength;
2144 struct orl *map;
2145 unsigned int symbol_count;
2146 int stridx;
2148 /* The size of the ranlib is the number of exported symbols in the
2149 archive * the number of bytes in an int, + an int for the count. */
2150 unsigned int ranlibsize = (symbol_count * 4) + 4;
2151 unsigned int stringsize = stridx;
2152 unsigned int mapsize = stringsize + ranlibsize;
2153 unsigned int archive_member_file_ptr;
2154 bfd *current = arch->archive_head;
2155 unsigned int count;
2156 struct ar_hdr hdr;
2157 unsigned int i;
2158 int padit = mapsize & 1;
2160 if (padit)
2161 mapsize++;
2163 /* Work out where the first object file will go in the archive. */
2164 archive_member_file_ptr = (mapsize
2165 + elength
2166 + sizeof (struct ar_hdr)
2167 + SARMAG);
2169 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
2170 hdr.ar_name[0] = '/';
2171 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
2172 sprintf (hdr.ar_date, "%ld", (long) time (NULL));
2173 /* This, at least, is what Intel coff sets the values to. */
2174 sprintf ((hdr.ar_uid), "%d", 0);
2175 sprintf ((hdr.ar_gid), "%d", 0);
2176 sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);
2177 strncpy (hdr.ar_fmag, ARFMAG, 2);
2179 for (i = 0; i < sizeof (struct ar_hdr); i++)
2180 if (((char *) (&hdr))[i] == '\0')
2181 (((char *) (&hdr))[i]) = ' ';
2183 /* Write the ar header for this item and the number of symbols. */
2185 if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) sizeof (struct ar_hdr), arch)
2186 != sizeof (struct ar_hdr))
2187 return FALSE;
2189 if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2190 return FALSE;
2192 /* Two passes, first write the file offsets for each symbol -
2193 remembering that each offset is on a two byte boundary. */
2195 /* Write out the file offset for the file associated with each
2196 symbol, and remember to keep the offsets padded out. */
2198 current = arch->archive_head;
2199 count = 0;
2200 while (current != (bfd *) NULL && count < symbol_count)
2202 /* For each symbol which is used defined in this object, write
2203 out the object file's address in the archive. */
2205 while (count < symbol_count && map[count].u.abfd == current)
2207 if (!bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr))
2208 return FALSE;
2209 count++;
2211 /* Add size of this archive entry. */
2212 archive_member_file_ptr += (arelt_size (current)
2213 + sizeof (struct ar_hdr));
2214 /* Remember aboout the even alignment. */
2215 archive_member_file_ptr += archive_member_file_ptr % 2;
2216 current = current->next;
2219 /* Now write the strings themselves. */
2220 for (count = 0; count < symbol_count; count++)
2222 size_t len = strlen (*map[count].name) + 1;
2224 if (bfd_bwrite (*map[count].name, (bfd_size_type) len, arch) != len)
2225 return FALSE;
2228 /* The spec sez this should be a newline. But in order to be
2229 bug-compatible for arc960 we use a null. */
2230 if (padit)
2232 if (bfd_bwrite ("", (bfd_size_type) 1, arch) != 1)
2233 return FALSE;
2236 return TRUE;