1 /* BFD back-end for archive files (libraries).
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
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
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>>.
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.
134 #include "aout/ranlib.h"
135 #include "safe-ctype.h"
142 #define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
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! */
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
));
177 _bfd_generic_mkarchive (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
)
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
;
200 symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym);
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
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
212 A <<carsym>> is a canonical archive symbol. The only
213 user-visible element is its name, a null-terminated string.
217 bfd_get_next_mapent (abfd
, prev
, 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
)
232 if (prev
>= bfd_ardata (abfd
)->symdef_count
)
233 return BFD_NO_MORE_SYMBOLS
;
235 *entry
= (bfd_ardata (abfd
)->symdefs
+ prev
);
239 /* To be called by backends only */
242 _bfd_create_empty_archive_element_shell (obfd
)
245 return _bfd_new_bfd_contained_in (obfd
);
253 bfd_boolean bfd_set_archive_head(bfd *output, bfd *new_head);
256 Set the head of the chain of
257 BFDs contained in the archive @var{output} to @var{new_head}.
261 bfd_set_archive_head (output_archive
, new_head
)
266 output_archive
->archive_head
= new_head
;
271 _bfd_look_for_bfd_in_cache (arch_bfd
, 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
;
285 /* Kind of stupid to call cons for each one, but we don't do too many */
287 _bfd_add_bfd_to_archive_cache (arch_bfd
, filepos
, new_elt
)
288 bfd
*arch_bfd
, *new_elt
;
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
)
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
;
304 struct ar_cache
*current
= bfd_ardata (arch_bfd
)->cache
;
306 while (current
->next
!= NULL
)
307 current
= current
->next
;
308 current
->next
= new_cache
;
314 /* The name begins with space. Hence the rest of the name is an index into
318 get_extended_arelt_filename (arch
, 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. */
327 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
328 index
= strtol (name
+ 1, NULL
, 10);
331 bfd_set_error (bfd_error_malformed_archive
);
335 return bfd_ardata (arch
)->extended_names
+ index
;
338 /* This functions reads an arch header and returns an areltdata pointer, or
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
)
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
)
363 char *hdrp
= (char *) &hdr
;
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
);
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
);
378 if (strncmp (hdr
.ar_fmag
, ARFMAG
, 2) != 0
380 || strncmp (hdr
.ar_fmag
, mag
, 2) != 0))
382 bfd_set_error (bfd_error_malformed_archive
);
387 parsed_size
= strtol (hdr
.ar_size
, NULL
, 10);
390 bfd_set_error (bfd_error_malformed_archive
);
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
);
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
)
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
);
433 filename
[namelen
] = '\0';
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 '/'. */
442 e
= (char *) memchr (hdr
.ar_name
, '\0', ar_maxnamelen (abfd
));
445 e
= (char *) memchr (hdr
.ar_name
, '/', ar_maxnamelen (abfd
));
447 e
= (char *) memchr (hdr
.ar_name
, ' ', ar_maxnamelen (abfd
));
451 namelen
= e
- hdr
.ar_name
;
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;
464 allocptr
= bfd_zalloc (abfd
, allocsize
);
465 if (allocptr
== 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
;
479 ared
->filename
= allocptr
+ (sizeof (struct areltdata
) +
480 sizeof (struct ar_hdr
));
482 memcpy (ared
->filename
, hdr
.ar_name
, (size_t) namelen
);
483 ared
->filename
[namelen
] = '\0';
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. */
494 _bfd_get_elt_at_filepos (archive
, filepos
)
498 struct areltdata
*new_areldata
;
501 n_nfd
= _bfd_look_for_bfd_in_cache (archive
, filepos
);
505 if (0 > bfd_seek (archive
, filepos
, SEEK_SET
))
508 if ((new_areldata
= (struct areltdata
*) _bfd_read_ar_hdr (archive
)) == NULL
)
511 n_nfd
= _bfd_create_empty_archive_element_shell (archive
);
514 bfd_release (archive
, (PTR
) new_areldata
);
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
))
526 bfd_release (archive
, (PTR
) n_nfd
);
527 bfd_release (archive
, (PTR
) new_areldata
);
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. */
535 _bfd_generic_get_elt_at_index (abfd
, index
)
541 entry
= bfd_ardata (abfd
)->symdefs
+ index
;
542 return _bfd_get_elt_at_filepos (abfd
, entry
->file_offset
);
547 bfd_openr_next_archived_file
550 bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous);
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
562 bfd_openr_next_archived_file (archive
, last_file
)
566 if ((bfd_get_format (archive
) != bfd_archive
) ||
567 (archive
->direction
== write_direction
))
569 bfd_set_error (bfd_error_invalid_operation
);
573 return BFD_SEND (archive
,
574 openr_next_archived_file
,
580 bfd_generic_openr_next_archived_file (archive
, last_file
)
587 filestart
= bfd_ardata (archive
)->first_file_filepos
;
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
);
602 bfd_generic_archive_p (abfd
)
605 struct artdata
*tdata_hold
;
606 char armag
[SARMAG
+ 1];
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
);
617 if (strncmp (armag
, BFD_GNU960_ARMAG (abfd
), SARMAG
) != 0)
620 if (strncmp (armag
, ARMAG
, SARMAG
) != 0 &&
621 strncmp (armag
, ARMAGB
, SARMAG
) != 0)
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
;
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
;
652 if (bfd_has_map (abfd
))
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
);
672 first
->target_defaulted
= FALSE
;
674 if (bfd_check_format (first
, bfd_object
)
675 && first
->xvec
!= abfd
->xvec
)
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
));
685 bfd_set_error (bfd_error_wrong_object_format
);
686 bfd_ardata (abfd
) = tdata_hold
;
689 /* And we ought to close `first' here too. */
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 */
716 do_slurp_bsd_armap (abfd
)
719 struct areltdata
*mapdata
;
720 unsigned int counter
;
721 bfd_byte
*raw_armap
, *rbase
;
722 struct artdata
*ardata
= bfd_ardata (abfd
);
724 bfd_size_type parsed_size
, amt
;
727 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
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
)
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
);
742 bfd_release (abfd
, (PTR
) raw_armap
);
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
);
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
)
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
;
784 /* Returns FALSE on error, TRUE otherwise. */
787 do_slurp_coff_armap (abfd
)
790 struct areltdata
*mapdata
;
791 int *raw_armap
, *rawptr
;
792 struct artdata
*ardata
= bfd_ardata (abfd
);
794 bfd_size_type stringsize
;
795 unsigned int parsed_size
;
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
;
803 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
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
);
815 /* It seems that all numeric information in a coff archive is always
816 in big endian format, nomatter the host or target. */
818 nsymz
= bfd_getb32 ((PTR
) int_buf
);
819 stringsize
= parsed_size
- (4 * nsymz
) - 4;
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
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;
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
)
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;
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
);
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
);
902 bfd_release (abfd
, (PTR
) raw_armap
);
904 bfd_release (abfd
, (PTR
) (ardata
)->symdefs
);
908 /* This routine can handle either coff-style or bsd-style armaps.
909 Returns FALSE on error, TRUE otherwise */
912 bfd_slurp_armap (abfd
)
916 int i
= bfd_bread ((PTR
) nextname
, (bfd_size_type
) 16, abfd
);
923 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
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. */
935 return bfd_elf64_archive_slurp_armap (abfd
);
937 bfd_set_error (bfd_error_wrong_format
);
942 bfd_has_map (abfd
) = FALSE
;
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
954 bfd_slurp_bsd_armap_f2 (abfd
)
957 struct areltdata
*mapdata
;
959 unsigned int counter
;
960 bfd_byte
*raw_armap
, *rbase
;
961 struct artdata
*ardata
= bfd_ardata (abfd
);
963 unsigned int stringsize
;
966 int i
= bfd_bread ((PTR
) nextname
, (bfd_size_type
) 16, abfd
);
973 /* The archive has at least 16 bytes in it. */
974 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
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
;
987 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
991 amt
= mapdata
->parsed_size
;
992 raw_armap
= (bfd_byte
*) bfd_zalloc (abfd
, amt
);
993 if (raw_armap
== NULL
)
996 bfd_release (abfd
, (PTR
) mapdata
);
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
);
1005 bfd_release (abfd
, (PTR
) raw_armap
);
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
);
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
)
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
;
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. */
1063 _bfd_slurp_extended_name_table (abfd
)
1067 struct areltdata
*namedata
;
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)
1078 if (strncmp (nextname
, "ARFILENAMES/ ", 16) != 0 &&
1079 strncmp (nextname
, "// ", 16) != 0)
1081 bfd_ardata (abfd
)->extended_names
= NULL
;
1085 namedata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
1086 if (namedata
== NULL
)
1089 amt
= namedata
->parsed_size
;
1090 bfd_ardata (abfd
)->extended_names
= bfd_zalloc (abfd
, amt
);
1091 if (bfd_ardata (abfd
)->extended_names
== NULL
)
1094 bfd_release (abfd
, (PTR
) namedata
);
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
;
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';
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... */
1132 bfd_release (abfd
, namedata
);
1140 /* Return a copy of the stuff in the filename between any :]> and a
1144 normalize (abfd
, file
)
1152 first
= file
+ strlen (file
) - 1;
1155 while (first
!= file
)
1159 if (*first
== ':' || *first
== ']' || *first
== '>')
1167 copy
= (char *) bfd_alloc (abfd
, (bfd_size_type
) (last
- first
+ 1));
1171 memcpy (copy
, first
, last
- first
);
1172 copy
[last
- first
] = 0;
1179 normalize (abfd
, file
)
1180 bfd
*abfd ATTRIBUTE_UNUSED
;
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
))
1191 if (filename
== NULL
&& file
[0] != '\0' && file
[1] == ':')
1192 filename
= file
+ 1;
1195 if (filename
!= (char *) NULL
)
1203 /* Build a BFD style extended name table. */
1206 _bfd_archive_bsd_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
1209 bfd_size_type
*tablen
;
1212 *name
= "ARFILENAMES/";
1213 return _bfd_construct_extended_name_table (abfd
, FALSE
, tabloc
, tablen
);
1216 /* Build an SVR4 style extended name table. */
1219 _bfd_archive_coff_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
1222 bfd_size_type
*tablen
;
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! */
1238 _bfd_construct_extended_name_table (abfd
, trailing_slash
, tabloc
, tablen
)
1240 bfd_boolean trailing_slash
;
1242 bfd_size_type
*tablen
;
1244 unsigned int maxname
= abfd
->xvec
->ar_max_namelen
;
1245 bfd_size_type total_namelen
= 0;
1251 /* Figure out how long the table should be. */
1252 for (current
= abfd
->archive_head
; current
!= NULL
; current
= current
->next
)
1255 unsigned int thislen
;
1257 normal
= normalize (current
, current
->filename
);
1261 thislen
= strlen (normal
);
1263 if (thislen
> maxname
1264 && (bfd_get_file_flags (abfd
) & BFD_TRADITIONAL_FORMAT
) != 0)
1267 if (thislen
> maxname
)
1269 /* Add one to leave room for \n. */
1270 total_namelen
+= thislen
+ 1;
1273 /* Leave room for trailing slash. */
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)
1297 *tabloc
= bfd_zalloc (abfd
, total_namelen
);
1298 if (*tabloc
== NULL
)
1301 *tablen
= total_namelen
;
1304 for (current
= abfd
->archive_head
; current
!= NULL
; current
=
1308 unsigned int thislen
;
1310 normal
= normalize (current
, current
->filename
);
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';
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
++)
1341 strptr
+= thislen
+ 1;
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. */
1356 hpux_uid_gid_encode (str
, id
)
1362 str
[5] = '@' + (id
& 3);
1365 for (cnt
= 4; cnt
>= 0; ++cnt
, id
>>= 6)
1366 str
[cnt
] = ' ' + (id
& 0x3f);
1368 #endif /* HPUX_LARGE_AR_IDS */
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
)
1386 const char *filename
;
1390 struct areltdata
*ared
;
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
);
1411 amt
= sizeof (struct ar_hdr
) + sizeof (struct areltdata
);
1412 ared
= (struct areltdata
*) bfd_zalloc (abfd
, amt
);
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
1427 if (status
.st_uid
> 99999)
1428 hpux_uid_gid_encode (hdr
->ar_gid
, (long) status
.st_uid
);
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
1435 if (status
.st_gid
> 99999)
1436 hpux_uid_gid_encode (hdr
->ar_uid
, (long) status
.st_gid
);
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
1445 temp
= (char *) hdr
;
1446 temp1
= temp
+ sizeof (struct ar_hdr
) - 2;
1447 for (; temp
< temp1
; temp
++)
1452 strncpy (hdr
->ar_fmag
, ARFMAG
, 2);
1453 ared
->parsed_size
= status
.st_size
;
1454 ared
->arch_header
= (char *) hdr
;
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 *));
1468 bfd_special_undocumented_glue (abfd
, filename
)
1470 const char *filename
;
1472 struct areltdata
*ar_elt
= bfd_ar_hdr_from_filesystem (abfd
, filename
, 0);
1475 return (struct ar_hdr
*) ar_elt
->arch_header
;
1478 /* Analogous to stat call. */
1481 bfd_generic_stat_arch_elt (abfd
, buf
)
1488 if (abfd
->arelt_data
== NULL
)
1490 bfd_set_error (bfd_error_invalid_operation
);
1494 hdr
= arch_hdr (abfd
);
1496 #define foo(arelt, stelt, size) \
1497 buf->stelt = strtol (hdr->arelt, &aloser, size); \
1498 if (aloser == hdr->arelt) \
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); \
1511 for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \
1513 if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \
1516 buf->stelt += hdr->arelt[cnt] - ' '; \
1518 if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \
1521 buf->stelt += hdr->arelt[5] - '@'; \
1524 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
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
;
1538 bfd_dont_truncate_arname (abfd
, pathname
, arhdr
)
1540 const char *pathname
;
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
;
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
);
1559 filename
= normalize (abfd
, pathname
);
1560 if (filename
== NULL
)
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. */
1573 || (length
== maxlen
&& length
< sizeof hdr
->ar_name
))
1574 (hdr
->ar_name
)[length
] = ar_padchar (abfd
);
1578 bfd_bsd_truncate_arname (abfd
, pathname
, arhdr
)
1580 const char *pathname
;
1583 struct ar_hdr
*hdr
= (struct ar_hdr
*) arhdr
;
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
))
1594 if (filename
== NULL
&& pathname
[0] != '\0' && pathname
[1] == ':')
1595 filename
= pathname
+ 1;
1599 if (filename
== NULL
)
1600 filename
= pathname
;
1604 length
= strlen (filename
);
1606 if (length
<= maxlen
)
1607 memcpy (hdr
->ar_name
, filename
, length
);
1610 /* pathname: meet procrustes */
1611 memcpy (hdr
->ar_name
, filename
, 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
1629 bfd_gnu_truncate_arname (abfd
, pathname
, arhdr
)
1631 const char *pathname
;
1634 struct ar_hdr
*hdr
= (struct ar_hdr
*) arhdr
;
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
))
1645 if (filename
== NULL
&& pathname
[0] != '\0' && pathname
[1] == ':')
1646 filename
= pathname
+ 1;
1650 if (filename
== NULL
)
1651 filename
= pathname
;
1655 length
= strlen (filename
);
1657 if (length
<= maxlen
)
1658 memcpy (hdr
->ar_name
, filename
, length
);
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';
1671 (hdr
->ar_name
)[length
] = ar_padchar (abfd
);
1674 /* The BFD is open for write and has its format set to bfd_archive. */
1677 _bfd_write_archive_contents (arch
)
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
;
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
);
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
)
1713 /* Put in the file name. */
1714 BFD_SEND (arch
, _bfd_truncate_arname
, (arch
,
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
))
1730 if (!BFD_SEND (arch
, _bfd_construct_extended_name_table
,
1731 (arch
, &etable
, &elength
, &ename
)))
1734 if (bfd_seek (arch
, (file_ptr
) 0, SEEK_SET
) != 0)
1737 wrote
= bfd_bwrite (BFD_GNU960_ARMAG (arch
), (bfd_size_type
) SARMAG
, arch
);
1739 wrote
= bfd_bwrite (ARMAG
, (bfd_size_type
) SARMAG
, arch
);
1741 if (wrote
!= SARMAG
)
1744 if (makemap
&& hasobjects
)
1746 if (! _bfd_compute_and_write_armap (arch
, (unsigned int) elength
))
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
)
1767 if ((elength
% 2) == 1)
1769 if (bfd_bwrite ("\012", (bfd_size_type
) 1, arch
) != 1)
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
)
1784 if (bfd_seek (current
, (file_ptr
) 0, SEEK_SET
) != 0)
1788 unsigned int amt
= DEFAULT_BUFFERSIZE
;
1789 if (amt
> remaining
)
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
);
1798 if (bfd_bwrite (buffer
, (bfd_size_type
) amt
, arch
) != amt
)
1802 if ((arelt_size (current
) % 2) == 1)
1804 if (bfd_bwrite ("\012", (bfd_size_type
) 1, arch
) != 1)
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. */
1820 if (bfd_update_armap_timestamp (arch
))
1822 (*_bfd_error_handler
)
1823 (_("Warning: writing archive was slow: rewriting timestamp\n"));
1825 while (++tries
< 6);
1831 /* Note that the namidx for the first symbol is 0. */
1834 _bfd_compute_and_write_armap (arch
, elength
)
1836 unsigned int elength
;
1838 char *first_name
= NULL
;
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
;
1850 /* Dunno if this is the best place for this info... */
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
);
1860 /* We put the symbol names on the arch objalloc, and then discard
1862 first_name
= bfd_alloc (arch
, (bfd_size_type
) 1);
1863 if (first_name
== NULL
)
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)
1883 storage
= bfd_get_symtab_upper_bound (current
);
1889 if (storage
> syms_max
)
1894 syms
= (asymbol
**) bfd_malloc ((bfd_size_type
) syms_max
);
1898 symcount
= bfd_canonicalize_symtab (current
, syms
);
1902 /* Now map over all the symbols, picking out the ones we
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
||
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
)
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
)
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
)
1935 *(map
[orl_count
].name
) = bfd_alloc (arch
, namelen
+ 1);
1936 if (*(map
[orl_count
].name
) == NULL
)
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;
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
))
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
));
1963 if (first_name
!= NULL
)
1964 bfd_release (arch
, first_name
);
1973 if (first_name
!= NULL
)
1974 bfd_release (arch
, first_name
);
1980 bsd_write_armap (arch
, elength
, map
, orl_count
, stridx
)
1982 unsigned int elength
;
1984 unsigned int orl_count
;
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;
1993 bfd
*current
= arch
->archive_head
;
1994 bfd
*last_elt
= current
; /* last element arch seen */
1998 struct stat statbuf
;
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
))
2021 H_PUT_32 (arch
, ranlibsize
, temp
);
2022 if (bfd_bwrite (temp
, (bfd_size_type
) sizeof (temp
), arch
) != sizeof (temp
))
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 */
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
)
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
))
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
)
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. */
2064 if (bfd_bwrite ("", (bfd_size_type
) 1, arch
) != 1)
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. */
2078 _bfd_archive_bsd_update_armap_timestamp (arch
)
2081 struct stat archstat
;
2085 /* Flush writes, get last-write timestamp from file, and compare it
2086 to the timestamp IN the file. */
2088 if (bfd_stat (arch
, &archstat
) == -1)
2090 bfd_perror (_("Reading archive file mod timestamp"));
2092 /* Can't read mod time for some reason. */
2095 if (archstat
.st_mtime
<= bfd_ardata (arch
)->armap_timestamp
)
2096 /* OK by the linker's rules. */
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. */
2122 /* We updated the timestamp successfully. */
2126 /* A coff armap looks like :
2128 struct ar_hdr with name = '/'
2130 offset of file for symbol 0
2131 offset of file for symbol 1
2133 offset of file for symbol n-1
2141 coff_write_armap (arch
, elength
, map
, symbol_count
, stridx
)
2143 unsigned int elength
;
2145 unsigned int symbol_count
;
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
;
2158 int padit
= mapsize
& 1;
2163 /* Work out where the first object file will go in the archive. */
2164 archive_member_file_ptr
= (mapsize
2166 + sizeof (struct ar_hdr
)
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
))
2189 if (!bfd_write_bigendian_4byte_int (arch
, symbol_count
))
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
;
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
))
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
)
2228 /* The spec sez this should be a newline. But in order to be
2229 bug-compatible for arc960 we use a null. */
2232 if (bfd_bwrite ("", (bfd_size_type
) 1, arch
) != 1)