1 /* BFD back-end for archive files (libraries).
2 Copyright (C) 1990-1991 Free Software Foundation, Inc.
3 Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 @setfilename archive-info
25 Gumby, you promised to write this bit...
27 Archives are supported in BFD in @code{archive.c}.
29 An archive is represented internally just like another BFD, with a
30 pointer to a chain of contained BFDs. Archives can be created by
31 opening BFDs, linking them together and attatching them as children to
32 another BFD and then closing the parent BFD.
37 o - all archive elements start on an even boundary, newline padded;
38 o - all arch headers are char *;
39 o - all arch headers are the same size (across architectures).
51 #define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
54 /* We keep a cache of archive filepointers to archive elements to
55 speed up searching the archive by filepos. We only add an entry to
56 the cache when we actually read one. We also don't sort the cache;
57 it's short enough to search linearly.
58 Note that the pointers here point to the front of the ar_hdr, not
59 to the front of the contents!
64 struct ar_cache *next;
67 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
68 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
70 #define arch_hdr(bfd) ((struct ar_hdr *) \
71 (((struct areltdata *)((bfd)->arelt_data))->arch_header))
74 _bfd_generic_mkarchive (abfd)
77 set_tdata (abfd, bfd_zalloc(abfd, sizeof (struct artdata)));
79 if (bfd_ardata (abfd) == NULL) {
80 bfd_error = no_memory;
83 bfd_ardata(abfd)->cache = 0;
87 /*proto* bfd_get_next_mapent
89 *; PROTO(symindex, bfd_get_next_mapent, (bfd *, symindex, carsym **));
92 bfd_get_next_mapent (abfd, prev, entry)
97 if (!bfd_has_map (abfd)) {
98 bfd_error = invalid_operation;
99 return BFD_NO_MORE_SYMBOLS;
102 if (prev == BFD_NO_MORE_SYMBOLS) prev = 0;
103 else if (++prev >= bfd_ardata (abfd)->symdef_count)
104 return BFD_NO_MORE_SYMBOLS;
106 *entry = (bfd_ardata (abfd)->symdefs + prev);
111 /* To be called by backends only */
113 _bfd_create_empty_archive_element_shell (obfd)
118 nbfd = new_bfd_contained_in(obfd);
120 bfd_error = no_memory;
126 /*proto* bfd_set_archive_head
127 Used whilst processing archives. Sets the head of the chain of BFDs
128 contained in an archive to @var{new_head}. (see chapter on archives)
129 *; PROTO(boolean, bfd_set_archive_head, (bfd *output, bfd *new_head));
133 DEFUN(bfd_set_archive_head,(output_archive, new_head),
134 bfd *output_archive AND
138 output_archive->archive_head = new_head;
143 look_for_bfd_in_cache (arch_bfd, filepos)
147 struct ar_cache *current;
149 for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
150 current = current->next)
151 if (current->ptr == filepos) return current->arelt;
156 /* Kind of stupid to call cons for each one, but we don't do too many */
158 add_bfd_to_cache (arch_bfd, filepos, new_elt)
159 bfd *arch_bfd, *new_elt;
162 struct ar_cache *new_cache = (struct ar_cache *)
163 bfd_zalloc(arch_bfd, sizeof (struct ar_cache));
165 if (new_cache == NULL) {
166 bfd_error = no_memory;
170 new_cache->ptr = filepos;
171 new_cache->arelt = new_elt;
172 new_cache->next = (struct ar_cache *)NULL;
173 if (bfd_ardata (arch_bfd)->cache == NULL)
174 bfd_ardata (arch_bfd)->cache = new_cache;
176 struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
178 for (; current->next != NULL; current = current->next);
179 current->next = new_cache;
187 /* The name begins with space. Hence the rest of the name is an index into
191 get_extended_arelt_filename (arch, name)
198 unsigned long index = 0;
200 /* Should extract string so that I can guarantee not to overflow into
201 the next region, but I"m too lazy. */
203 index = strtol (name, NULL, 10);
205 bfd_error = malformed_archive;
209 return bfd_ardata (arch)->extended_names + index;
212 /* This functions reads an arch header and returns an areltdata pointer, or
215 Presumes the file pointer is already in the right place (ie pointing
216 to the ar_hdr in the file). Moves the file pointer; on success it
217 should be pointing to the front of the file contents; on failure it
218 could have been moved arbitrarily.
230 char *hdrp = (char *) &hdr;
231 unsigned int parsed_size;
232 struct areltdata *ared;
233 char *filename = NULL;
234 unsigned int namelen = 0;
235 unsigned int allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
238 if (bfd_read ((PTR)hdrp, 1, sizeof (struct ar_hdr), abfd)
239 != sizeof (struct ar_hdr)) {
240 bfd_error = no_more_archived_files;
243 if (strncmp ((hdr.ar_fmag), ARFMAG, 2)) {
244 bfd_error = malformed_archive;
249 parsed_size = strtol (hdr.ar_size, NULL, 10);
251 bfd_error = malformed_archive;
255 /* extract the filename from the archive - there are two ways to
256 specify an extendend name table, either the first char of the
257 name is a space, or it's a slash */
258 if ((hdr.ar_name[0] == '/' || hdr.ar_name[0] == ' ') && bfd_ardata (abfd)->extended_names != NULL) {
259 filename = get_extended_arelt_filename (abfd, hdr.ar_name);
260 if (filename == NULL) {
261 bfd_error = malformed_archive;
267 /* We judge the end of the name by looking for a space or a
272 while (namelen < (unsigned)ar_maxnamelen(abfd) &&
273 ( hdr.ar_name[namelen] != 0 &&
274 hdr.ar_name[namelen] != ' ' &&
275 hdr.ar_name[namelen] != ar_padchar(abfd))) {
279 allocsize += namelen + 1;
282 allocptr = bfd_zalloc(abfd, allocsize);
283 if (allocptr == NULL) {
284 bfd_error = no_memory;
288 ared = (struct areltdata *) allocptr;
290 ared->arch_header = allocptr + sizeof (struct areltdata);
291 memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr));
292 ared->parsed_size = parsed_size;
294 if (filename != NULL) ared->filename = filename;
296 ared->filename = allocptr + (sizeof (struct areltdata) +
297 sizeof (struct ar_hdr));
299 memcpy (ared->filename, hdr.ar_name, namelen);
300 ared->filename[namelen] = '\0';
307 get_elt_at_filepos (archive, filepos)
311 struct areltdata *new_areldata;
314 n_nfd = look_for_bfd_in_cache (archive, filepos);
315 if (n_nfd) return n_nfd;
317 if (0 > bfd_seek (archive, filepos, SEEK_SET)) {
318 bfd_error = system_call_error;
322 if ((new_areldata = snarf_ar_hdr (archive)) == NULL) return NULL;
324 n_nfd = _bfd_create_empty_archive_element_shell (archive);
326 bfd_release (archive, (PTR)new_areldata);
329 n_nfd->origin = bfd_tell (archive);
330 n_nfd->arelt_data = (PTR) new_areldata;
331 n_nfd->filename = new_areldata->filename;
333 if (add_bfd_to_cache (archive, filepos, n_nfd))
337 bfd_release (archive, (PTR)n_nfd);
338 bfd_release (archive, (PTR)new_areldata);
342 /*proto* bfd_get_elt_at_index
344 *; PROTO(bfd *, bfd_get_elt_at_index, (bfd *, int));
348 bfd_get_elt_at_index (abfd, index)
354 (abfd, (bfd_ardata (abfd)->symdefs + index)->file_offset);
358 /*proto* bfd_openr_next_archived_file
359 Initially provided a BFD containing an archive and NULL, opens a BFD
360 on the first contained element and returns that. Subsequent calls to
361 bfd_openr_next_archived_file should pass the archive and the previous
362 return value to return a created BFD to the next contained element.
363 NULL is returned when there are no more.
365 *; PROTO(bfd*, bfd_openr_next_archived_file,
366 (bfd *archive, bfd *previous));
371 DEFUN(bfd_openr_next_archived_file,(archive, last_file),
376 if ((bfd_get_format (archive) != bfd_archive) ||
377 (archive->direction == write_direction)) {
378 bfd_error = invalid_operation;
383 return BFD_SEND (archive,
384 openr_next_archived_file,
390 bfd *bfd_generic_openr_next_archived_file(archive, last_file)
397 filestart = bfd_ardata (archive)->first_file_filepos;
399 unsigned int size = arelt_size(last_file);
400 /* Pad to an even boundary... */
401 filestart = last_file->origin + size + size%2;
404 return get_elt_at_filepos (archive, filestart);
409 bfd_generic_archive_p (abfd)
412 char armag[SARMAG+1];
414 if (bfd_read ((PTR)armag, 1, SARMAG, abfd) != SARMAG) {
415 bfd_error = wrong_format;
420 if (strncmp (armag, BFD_GNU960_ARMAG(abfd), SARMAG)) return 0;
422 if (strncmp (armag, ARMAG, SARMAG)) return 0;
425 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
426 involves a cast, we can't do it as the left operand of assignment. */
427 set_tdata (abfd, bfd_zalloc(abfd,sizeof (struct artdata)));
429 if (bfd_ardata (abfd) == NULL) {
430 bfd_error = no_memory;
434 bfd_ardata (abfd)->first_file_filepos = SARMAG;
436 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))) {
437 bfd_release(abfd, bfd_ardata (abfd));
442 if (!BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd))) {
443 bfd_release(abfd, bfd_ardata (abfd));
451 /* Returns false on error, true otherwise */
453 bfd_slurp_bsd_armap (abfd)
457 struct areltdata *mapdata;
459 unsigned int counter = 0;
460 int *raw_armap, *rbase;
461 struct artdata *ardata = bfd_ardata (abfd);
464 /* FIXME, if the read fails, this routine quietly returns "true"!!
465 It should probably do that if the read gives 0 bytes (empty archive),
466 but fail for any other size... */
467 if (bfd_read ((PTR)nextname, 1, 16, abfd) == 16) {
468 /* The archive has at least 16 bytes in it */
469 bfd_seek (abfd, -16L, SEEK_CUR);
471 /* This should be using RANLIBMAG, but at least it can be grepped for
473 if (strncmp (nextname, "__.SYMDEF ", 16)) {
474 bfd_has_map (abfd) = false;
478 mapdata = snarf_ar_hdr (abfd);
479 if (mapdata == NULL) return false;
481 raw_armap = (int *) bfd_zalloc(abfd,mapdata->parsed_size);
482 if (raw_armap == NULL) {
483 bfd_error = no_memory;
485 bfd_release (abfd, (PTR)mapdata);
489 if (bfd_read ((PTR)raw_armap, 1, mapdata->parsed_size, abfd) !=
490 mapdata->parsed_size) {
491 bfd_error = malformed_archive;
492 bfd_release (abfd, (PTR)raw_armap);
496 ardata->symdef_count = bfd_h_get_32(abfd, (PTR)raw_armap) / sizeof (struct symdef);
499 ardata->symdefs = (carsym *) rbase;
500 stringbase = ((char *) (ardata->symdefs + ardata->symdef_count)) + 4;
502 for (;counter < ardata->symdef_count; counter++) {
503 struct symdef *sym = ((struct symdef *) rbase) + counter;
504 sym->s.name = bfd_h_get_32(abfd, (PTR)(&(sym->s.string_offset))) + stringbase;
505 sym->file_offset = bfd_h_get_32(abfd, (PTR)( &(sym->file_offset)));
508 ardata->first_file_filepos = bfd_tell (abfd);
509 /* Pad to an even boundary if you have to */
510 ardata->first_file_filepos += (ardata-> first_file_filepos) %2;
511 /* FIXME, we should provide some way to free raw_ardata when
512 we are done using the strings from it. For now, it seems
513 to be allocated on an obstack anyway... */
514 bfd_has_map (abfd) = true;
519 /* Returns false on error, true otherwise */
521 bfd_slurp_coff_armap (abfd)
524 struct areltdata *mapdata;
526 int *raw_armap, *rawptr;
527 struct artdata *ardata = bfd_ardata (abfd);
529 unsigned int stringsize;
533 result = bfd_read ((PTR)&nextname, 1, 1, abfd);
534 bfd_seek (abfd, -1L, SEEK_CUR);
536 if (result != 1 || nextname != '/') {
537 /* Actually I think this is an error for a COFF archive */
538 bfd_has_map (abfd) = false;
542 mapdata = snarf_ar_hdr (abfd);
543 if (mapdata == NULL) return false;
545 raw_armap = (int *) bfd_alloc(abfd,mapdata->parsed_size);
547 if (raw_armap == NULL)
549 bfd_error = no_memory;
551 bfd_release (abfd, (PTR)mapdata);
555 /* read in the raw map */
556 if (bfd_read ((PTR)raw_armap, 1, mapdata->parsed_size, abfd) !=
557 mapdata->parsed_size) {
558 bfd_error = malformed_archive;
560 bfd_release (abfd, (PTR)raw_armap);
564 /* The coff armap must be read sequentially. So we construct a bsd-style
565 one in core all at once, for simplicity. */
567 stringsize = mapdata->parsed_size - (4 * (*raw_armap)) - 4;
570 unsigned int nsymz = *raw_armap;
571 unsigned int carsym_size = (nsymz * sizeof (carsym));
572 unsigned int ptrsize = (4 * nsymz);
574 ardata->symdefs = (carsym *) bfd_zalloc(abfd,carsym_size + stringsize + 1);
575 if (ardata->symdefs == NULL) {
576 bfd_error = no_memory;
579 carsyms = ardata->symdefs;
581 stringbase = ((char *) ardata->symdefs) + carsym_size;
582 memcpy (stringbase, (char*)raw_armap + ptrsize + 4, stringsize);
585 /* OK, build the carsyms */
586 for (i = 0; i < nsymz; i++)
588 rawptr = raw_armap + i + 1;
589 carsyms->file_offset = *rawptr;
590 carsyms->name = stringbase;
591 for (; *(stringbase++););
596 ardata->symdef_count = *raw_armap;
597 ardata->first_file_filepos = bfd_tell (abfd);
598 /* Pad to an even boundary if you have to */
599 ardata->first_file_filepos += (ardata->first_file_filepos) %2;
601 /* We'd like to release these allocations, but we have allocated stuff
602 since then (using the same obstack, if bfd_release is obstack based).
603 So they will stick around until the BFD is closed. */
604 /* bfd_release (abfd, (PTR)raw_armap);
605 bfd_release (abfd, (PTR)mapdata); */
606 bfd_has_map (abfd) = true;
610 /** Extended name table.
612 Normally archives support only 14-character filenames.
614 Intel has extended the format: longer names are stored in a special
615 element (the first in the archive, or second if there is an armap);
616 the name in the ar_hdr is replaced by <space><index into filename
617 element>. Index is the P.R. of an int (radix: 8). Data General have
618 extended the format by using the prefix // for the special element */
620 /* Returns false on error, true otherwise */
622 _bfd_slurp_extended_name_table (abfd)
626 struct areltdata *namedata;
628 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ,
629 we probably don't want to return true. */
630 if (bfd_read ((PTR)nextname, 1, 16, abfd) == 16) {
632 bfd_seek (abfd, -16L, SEEK_CUR);
634 if (strncmp (nextname, "ARFILENAMES/ ", 16) != 0 &&
635 strncmp (nextname, "// ", 16) != 0)
637 bfd_ardata (abfd)->extended_names = NULL;
641 namedata = snarf_ar_hdr (abfd);
642 if (namedata == NULL) return false;
644 bfd_ardata (abfd)->extended_names = bfd_zalloc(abfd,namedata->parsed_size);
645 if (bfd_ardata (abfd)->extended_names == NULL) {
646 bfd_error = no_memory;
648 bfd_release (abfd, (PTR)namedata);
652 if (bfd_read ((PTR)bfd_ardata (abfd)->extended_names, 1,
653 namedata->parsed_size, abfd) != namedata->parsed_size) {
654 bfd_error = malformed_archive;
655 bfd_release (abfd, (PTR)(bfd_ardata (abfd)->extended_names));
656 bfd_ardata (abfd)->extended_names = NULL;
660 /* Since the archive is supposed to be printable if it contains
661 text, the entries in the list are newline-padded, not null
662 padded. We'll fix that there.. */
664 char *temp = bfd_ardata (abfd)->extended_names;
665 for (; *temp != '\0'; ++temp)
666 if (*temp == '\n') *temp = '\0';
669 /* Pad to an even boundary if you have to */
670 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
671 bfd_ardata (abfd)->first_file_filepos +=
672 (bfd_ardata (abfd)->first_file_filepos) %2;
674 /* FIXME, we can't release namedata here because it was allocated
675 below extended_names on the obstack... */
676 /* bfd_release (abfd, namedata); */
682 char *normalize(file)
685 char * filename = strrchr(file, '/');
686 if (filename != (char *)NULL) {
695 /* Follows archive_head and produces an extended name table if necessary.
696 Returns (in tabloc) a pointer to an extended name table, and in tablen
697 the length of the table. If it makes an entry it clobbers the filename
698 so that the element may be written without further massage.
699 Returns true if it ran successfully, false if something went wrong.
700 A successful return may still involve a zero-length tablen!
703 bfd_construct_extended_name_table (abfd, tabloc, tablen)
706 unsigned int *tablen;
708 unsigned int maxname = abfd->xvec->ar_max_namelen;
709 unsigned int total_namelen = 0;
715 /* Figure out how long the table should be */
716 for (current = abfd->archive_head; current != NULL; current = current->next){
717 unsigned int thislen = strlen (normalize(current->filename));
718 if (thislen > maxname) total_namelen += thislen + 1; /* leave room for \n */
721 if (total_namelen == 0) return true;
723 *tabloc = bfd_zalloc (abfd,total_namelen);
724 if (*tabloc == NULL) {
725 bfd_error = no_memory;
729 *tablen = total_namelen;
732 for (current = abfd->archive_head; current != NULL; current =
734 char *normal =normalize( current->filename);
735 unsigned int thislen = strlen (normal);
736 if (thislen > maxname) {
737 /* Works for now; may need to be re-engineered if we encounter an oddball
738 archive format and want to generalise this hack. */
739 struct ar_hdr *hdr = arch_hdr(current);
740 strcpy (strptr, normal);
741 strptr[thislen] = '\n';
742 hdr->ar_name[0] = ' ';
743 /* We know there will always be enough room (one of the few cases
744 where you may safely use sprintf). */
745 sprintf ((hdr->ar_name) + 1, "%-o", (unsigned) (strptr - *tabloc));
746 /* Kinda Kludgy. We should just use the returned value of sprintf
747 but not all implementations get this right */
749 char *temp = hdr->ar_name +2;
750 for (; temp < hdr->ar_name + maxname; temp++)
751 if (*temp == '\0') *temp = ' ';
753 strptr += thislen + 1;
760 /** A couple of functions for creating ar_hdrs */
762 /* Takes a filename, returns an arelt_data for it, or NULL if it can't make one.
763 The filename must refer to a filename in the filesystem.
764 The filename field of the ar_hdr will NOT be initialized
768 DEFUN(bfd_ar_hdr_from_filesystem, (abfd,filename),
770 CONST char *filename)
773 struct areltdata *ared;
778 if (stat (filename, &status) != 0) {
779 bfd_error = system_call_error;
783 ared = (struct areltdata *) bfd_zalloc(abfd, sizeof (struct ar_hdr) +
784 sizeof (struct areltdata));
786 bfd_error = no_memory;
789 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
791 /* ar headers are space padded, not null padded! */
793 temp1 = temp + sizeof (struct ar_hdr) - 2;
794 for (; temp < temp1; *(temp++) = ' ');
795 strncpy (hdr->ar_fmag, ARFMAG, 2);
797 /* Goddamned sprintf doesn't permit MAXIMUM field lengths */
798 sprintf ((hdr->ar_date), "%-12ld", status.st_mtime);
799 sprintf ((hdr->ar_uid), "%d", status.st_uid);
800 sprintf ((hdr->ar_gid), "%d", status.st_gid);
801 sprintf ((hdr->ar_mode), "%-8o", (unsigned) status.st_mode);
802 sprintf ((hdr->ar_size), "%-10ld", status.st_size);
803 /* Correct for a lossage in sprintf whereby it null-terminates. I cannot
804 understand how these C losers could design such a ramshackle bunch of
807 temp1 = temp + sizeof (struct ar_hdr) - 2;
808 for (; temp < temp1; temp++) {
809 if (*temp == '\0') *temp = ' ';
811 strncpy (hdr->ar_fmag, ARFMAG, 2);
812 ared->parsed_size = status.st_size;
813 ared->arch_header = (char *) hdr;
819 DEFUN(bfd_special_undocumented_glue, (abfd, filename),
824 return (struct ar_hdr *) bfd_ar_hdr_from_filesystem (abfd, filename) -> arch_header;
828 /* Analogous to stat call */
830 bfd_generic_stat_arch_elt (abfd, buf)
837 if (abfd->arelt_data == NULL) {
838 bfd_error = invalid_operation;
842 hdr = arch_hdr (abfd);
844 #define foo(arelt, stelt, size) \
845 buf->stelt = strtol (hdr->arelt, &aloser, size); \
846 if (aloser == hdr->arelt) return -1;
848 foo (ar_date, st_mtime, 10);
849 foo (ar_uid, st_uid, 10);
850 foo (ar_gid, st_gid, 10);
851 foo (ar_mode, st_mode, 8);
852 foo (ar_size, st_size, 10);
858 bfd_dont_truncate_arname (abfd, pathname, arhdr)
860 CONST char *pathname;
863 /* FIXME: This interacts unpleasantly with ar's quick-append option.
864 Fortunately ic960 users will never use that option. Fixing this
865 is very hard; fortunately I know how to do it and will do so once
866 intel's release is out the door. */
868 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
870 CONST char *filename = strrchr (pathname, '/');
871 int maxlen = ar_maxnamelen (abfd);
873 if (filename == NULL)
878 length = strlen (filename);
880 if (length <= maxlen)
881 memcpy (hdr->ar_name, filename, length);
883 if (length < maxlen) (hdr->ar_name)[length] = ar_padchar (abfd);
889 bfd_bsd_truncate_arname (abfd, pathname, arhdr)
891 CONST char *pathname;
894 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
896 CONST char *filename = strrchr (pathname, '/');
897 int maxlen = ar_maxnamelen (abfd);
900 if (filename == NULL)
905 length = strlen (filename);
907 if (length <= maxlen)
908 memcpy (hdr->ar_name, filename, length);
910 /* pathname: meet procrustes */
911 memcpy (hdr->ar_name, filename, maxlen);
915 if (length < maxlen) (hdr->ar_name)[length] = ar_padchar (abfd);
918 /* Store name into ar header. Truncates the name to fit.
919 1> strip pathname to be just the basename.
920 2> if it's short enuf to fit, stuff it in.
921 3> If it doesn't end with .o, truncate it to fit
922 4> truncate it before the .o, append .o, stuff THAT in.
925 /* This is what gnu ar does. It's better but incompatible with the bsd ar. */
927 bfd_gnu_truncate_arname (abfd, pathname, arhdr)
929 CONST char *pathname;
932 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
934 CONST char *filename = strrchr (pathname, '/');
935 int maxlen = ar_maxnamelen (abfd);
937 if (filename == NULL)
942 length = strlen (filename);
944 if (length <= maxlen)
945 memcpy (hdr->ar_name, filename, length);
946 else { /* pathname: meet procrustes */
947 memcpy (hdr->ar_name, filename, maxlen);
948 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o')) {
949 hdr->ar_name[maxlen - 2] = '.';
950 hdr->ar_name[maxlen - 1] = 'o';
955 if (length < 16) (hdr->ar_name)[length] = ar_padchar (abfd);
959 PROTO (boolean, compute_and_write_armap, (bfd *arch, unsigned int elength));
961 /* The BFD is open for write and has its format set to bfd_archive */
963 _bfd_write_archive_contents (arch)
968 unsigned int elength = 0;
969 boolean makemap = bfd_has_map (arch);
970 boolean hasobjects = false; /* if no .o's, don't bother to make a map */
973 /* Verify the viability of all entries; if any of them live in the
974 filesystem (as opposed to living in an archive open for input)
975 then construct a fresh ar_hdr for them.
977 for (current = arch->archive_head; current; current = current->next) {
978 if (bfd_write_p (current)) {
979 bfd_error = invalid_operation;
982 if (!current->arelt_data) {
983 current->arelt_data =
984 (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename);
985 if (!current->arelt_data) return false;
987 /* Put in the file name */
989 BFD_SEND (arch, _bfd_truncate_arname,(arch,
991 (char *) arch_hdr(current)));
996 if (makemap) { /* don't bother if we won't make a map! */
997 if ((bfd_check_format (current, bfd_object))
998 #if 0 /* FIXME -- these are not set correctly */
999 && ((bfd_get_file_flags (current) & HAS_SYMS))
1006 if (!bfd_construct_extended_name_table (arch, &etable, &elength))
1009 bfd_seek (arch, 0, SEEK_SET);
1011 bfd_write (BFD_GNU960_ARMAG(arch), 1, SARMAG, arch);
1013 bfd_write (ARMAG, 1, SARMAG, arch);
1016 if (makemap && hasobjects) {
1018 if (compute_and_write_armap (arch, elength) != true) {
1026 memset ((char *)(&hdr), 0, sizeof (struct ar_hdr));
1027 sprintf (&(hdr.ar_name[0]), "ARFILENAMES/");
1028 sprintf (&(hdr.ar_size[0]), "%-10d", (int) elength);
1029 hdr.ar_fmag[0] = '`'; hdr.ar_fmag[1] = '\n';
1030 for (i = 0; i < sizeof (struct ar_hdr); i++)
1031 if (((char *)(&hdr))[i] == '\0') (((char *)(&hdr))[i]) = ' ';
1032 bfd_write ((char *)&hdr, 1, sizeof (struct ar_hdr), arch);
1033 bfd_write (etable, 1, elength, arch);
1034 if ((elength % 2) == 1) bfd_write ("\n", 1, 1, arch);
1038 for (current = arch->archive_head; current; current = current->next) {
1039 char buffer[DEFAULT_BUFFERSIZE];
1040 unsigned int remaining = arelt_size (current);
1041 struct ar_hdr *hdr = arch_hdr(current);
1042 /* write ar header */
1044 if (bfd_write ((char *)hdr, 1, sizeof(*hdr), arch) != sizeof(*hdr)) {
1046 bfd_error = system_call_error;
1049 if (bfd_seek (current, 0L, SEEK_SET) != 0L) goto syserr;
1052 unsigned int amt = DEFAULT_BUFFERSIZE;
1053 if (amt > remaining) {
1056 if (bfd_read (buffer, amt, 1, current) != amt) goto syserr;
1057 if (bfd_write (buffer, amt, 1, arch) != amt) goto syserr;
1060 if ((arelt_size (current) % 2) == 1) bfd_write ("\n", 1, 1, arch);
1065 /* Note that the namidx for the first symbol is 0 */
1068 compute_and_write_armap (arch, elength)
1070 unsigned int elength;
1073 file_ptr elt_no = 0;
1075 int orl_max = 15000; /* fine initial default */
1077 int stridx = 0; /* string index */
1079 /* Dunno if this is the best place for this info... */
1080 if (elength != 0) elength += sizeof (struct ar_hdr);
1081 elength += elength %2 ;
1083 map = (struct orl *) bfd_zalloc (arch,orl_max * sizeof (struct orl));
1085 bfd_error = no_memory;
1089 /* Map over each element */
1090 for (current = arch->archive_head;
1091 current != (bfd *)NULL;
1092 current = current->next, elt_no++)
1094 if ((bfd_check_format (current, bfd_object) == true)
1095 && ((bfd_get_file_flags (current) & HAS_SYMS))) {
1097 unsigned int storage;
1098 unsigned int symcount;
1099 unsigned int src_count;
1101 storage = get_symtab_upper_bound (current);
1104 syms = (asymbol **) bfd_zalloc (arch,storage);
1106 bfd_error = no_memory; /* FIXME -- memory leak */
1109 symcount = bfd_canonicalize_symtab (current, syms);
1112 /* Now map over all the symbols, picking out the ones we want */
1113 for (src_count = 0; src_count <symcount; src_count++) {
1114 flagword flags = (syms[src_count])->flags;
1115 if ((flags & BSF_GLOBAL) ||
1116 (flags & BSF_FORT_COMM)) {
1118 /* This symbol will go into the archive header */
1119 if (orl_count == orl_max)
1122 map = (struct orl *) bfd_realloc (arch, (char *) map,
1123 orl_max * sizeof (struct orl));
1126 (map[orl_count]).name = (char **) &((syms[src_count])->name);
1127 (map[orl_count]).pos = (file_ptr) current;
1128 (map[orl_count]).namidx = stridx;
1130 stridx += strlen ((syms[src_count])->name) + 1;
1137 /* OK, now we have collected all the data, let's write them out */
1138 if (!BFD_SEND (arch, write_armap,
1139 (arch, elength, map, orl_count, stridx))) {
1149 bsd_write_armap (arch, elength, map, orl_count, stridx)
1151 unsigned int elength;
1156 unsigned int ranlibsize = (orl_count * sizeof (struct ranlib)) + 4;
1157 unsigned int stringsize = stridx + 4;
1158 unsigned int mapsize = stringsize + ranlibsize;
1160 bfd *current = arch->archive_head;
1161 bfd *last_elt = current; /* last element arch seen */
1165 struct stat statbuf;
1167 int padit = mapsize & 1;
1169 if (padit) mapsize ++;
1171 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
1173 stat (arch->filename, &statbuf);
1174 memset ((char *)(&hdr), 0, sizeof (struct ar_hdr));
1175 sprintf (hdr.ar_name, RANLIBMAG);
1176 sprintf (hdr.ar_date, "%ld", statbuf.st_mtime);
1177 sprintf (hdr.ar_uid, "%d", getuid());
1178 sprintf (hdr.ar_gid, "%d", getgid());
1179 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1180 hdr.ar_fmag[0] = '`'; hdr.ar_fmag[1] = '\n';
1181 for (i = 0; i < sizeof (struct ar_hdr); i++)
1182 if (((char *)(&hdr))[i] == '\0') (((char *)(&hdr))[i]) = ' ';
1183 bfd_write ((char *)&hdr, 1, sizeof (struct ar_hdr), arch);
1184 bfd_h_put_32(arch, ranlibsize, (PTR)&temp);
1185 bfd_write (&temp, 1, sizeof (temp), arch);
1187 for (count = 0; count < orl_count; count++) {
1189 struct symdef *outp = &outs;
1191 if (((bfd *)(map[count]).pos) != last_elt) {
1193 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
1194 firstreal += firstreal % 2;
1195 current = current->next;
1196 } while (current != (bfd *)(map[count]).pos);
1197 } /* if new archive element */
1200 bfd_h_put_32(arch, ((map[count]).namidx),(PTR) &outs.s.string_offset);
1201 bfd_h_put_32(arch, firstreal,(PTR) &outs.file_offset);
1202 bfd_write ((char *)outp, 1, sizeof (outs), arch);
1205 /* now write the strings themselves */
1206 bfd_h_put_32(arch, stridx, (PTR)&temp);
1207 bfd_write ((PTR)&temp, 1, sizeof (temp), arch);
1208 for (count = 0; count < orl_count; count++)
1209 bfd_write (*((map[count]).name), 1, strlen (*((map[count]).name))+1, arch);
1211 /* The spec sez this should be a newline. But in order to be
1212 bug-compatible for sun's ar we use a null. */
1214 bfd_write("\0",1,1,arch);
1220 /* A coff armap looks like :
1222 struct ar_hdr with name = '/'
1224 offset of file for symbol 0
1225 offset of file for symbol 1
1227 offset of file for symbol n-1
1236 coff_write_armap (arch, elength, map, orl_count, stridx)
1238 unsigned int elength;
1243 unsigned int ranlibsize = (orl_count * 4) + 4;
1244 unsigned int stringsize = stridx;
1245 unsigned int mapsize = stringsize + ranlibsize;
1246 file_ptr archive_member_file_ptr;
1247 bfd *current = arch->archive_head;
1248 int last_eltno = 0; /* last element arch seen */
1252 int padit = mapsize & 1;
1254 if (padit) mapsize ++;
1256 archive_member_file_ptr =
1257 mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
1259 memset ((char *)(&hdr), 0, sizeof (struct ar_hdr));
1260 hdr.ar_name[0] = '/';
1261 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1262 sprintf (hdr.ar_date, "%ld", (long)time (NULL));
1263 /* This, at least, is what Intel coff sets the values to.: */
1264 sprintf ((hdr.ar_uid), "%d", 0);
1265 sprintf ((hdr.ar_gid), "%d", 0);
1266 sprintf ((hdr.ar_mode), "%-7o",(unsigned ) 0);
1267 hdr.ar_fmag[0] = '`'; hdr.ar_fmag[1] = '\n';
1269 for (i = 0; i < sizeof (struct ar_hdr); i++)
1270 if (((char *)(&hdr))[i] == '\0') (((char *)(&hdr))[i]) = ' ';
1272 /* Write the ar header for this item and the number of symbols */
1274 bfd_write ((PTR)&hdr, 1, sizeof (struct ar_hdr), arch);
1275 /* FIXME, this needs to be byte-swapped */
1276 bfd_write ((PTR)&orl_count, 1, sizeof (orl_count), arch);
1278 /* Two passes, first write the file offsets for each symbol -
1279 remembering that each offset is on a two byte boundary
1282 for (count = 0; count < orl_count; count++) {
1283 while ((map[count]).pos != last_eltno) {
1284 /* If this is the first time we've seen a ref to this archive
1285 then remember it's size */
1286 archive_member_file_ptr +=
1287 arelt_size (current) + sizeof (struct ar_hdr);
1288 archive_member_file_ptr += archive_member_file_ptr % 2;
1289 current = current->next;
1292 /* FIXME, this needs to be byte-swapped */
1293 bfd_write ((PTR)&archive_member_file_ptr,
1295 sizeof (archive_member_file_ptr),
1299 /* now write the strings themselves */
1300 for (count = 0; count < orl_count; count++) {
1301 bfd_write ((PTR)*((map[count]).name),
1303 strlen (*((map[count]).name))+1, arch);
1306 /* The spec sez this should be a newline. But in order to be
1307 bug-compatible for arc960 we use a null. */
1309 bfd_write("\0",1,1,arch);