70a0d47d9e0eea074d7ac8a33cabc0c85c35d3c4
[deliverable/binutils-gdb.git] / bfd / archive.c
1 /* BFD back-end for archive files (libraries).
2 Copyright 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
3 Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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. */
20
21 /*
22 @setfilename archive-info
23 SECTION
24 Archives
25
26 DESCRIPTION
27 An archive (or library) is just another BFD. It has a symbol
28 table, although there's not much a user program will do with it.
29
30 The big difference between an archive BFD and an ordinary BFD
31 is that the archive doesn't have sections. Instead it has a
32 chain of BFDs that are considered its contents. These BFDs can
33 be manipulated like any other. The BFDs contained in an
34 archive opened for reading will all be opened for reading. You
35 may put either input or output BFDs into an archive opened for
36 output; they will be handled correctly when the archive is closed.
37
38 Use <<bfd_openr_next_archived_file>> to step through
39 the contents of an archive opened for input. You don't
40 have to read the entire archive if you don't want
41 to! Read it until you find what you want.
42
43 Archive contents of output BFDs are chained through the
44 <<next>> pointer in a BFD. The first one is findable through
45 the <<archive_head>> slot of the archive. Set it with
46 <<bfd_set_archive_head>> (q.v.). A given BFD may be in only one
47 open output archive at a time.
48
49 As expected, the BFD archive code is more general than the
50 archive code of any given environment. BFD archives may
51 contain files of different formats (e.g., a.out and coff) and
52 even different architectures. You may even place archives
53 recursively into archives!
54
55 This can cause unexpected confusion, since some archive
56 formats are more expressive than others. For instance, Intel
57 COFF archives can preserve long filenames; SunOS a.out archives
58 cannot. If you move a file from the first to the second
59 format and back again, the filename may be truncated.
60 Likewise, different a.out environments have different
61 conventions as to how they truncate filenames, whether they
62 preserve directory names in filenames, etc. When
63 interoperating with native tools, be sure your files are
64 homogeneous.
65
66 Beware: most of these formats do not react well to the
67 presence of spaces in filenames. We do the best we can, but
68 can't always handle this case due to restrictions in the format of
69 archives. Many Unix utilities are braindead in regards to
70 spaces and such in filenames anyway, so this shouldn't be much
71 of a restriction.
72
73 Archives are supported in BFD in <<archive.c>>.
74
75 */
76
77 /* Assumes:
78 o - all archive elements start on an even boundary, newline padded;
79 o - all arch headers are char *;
80 o - all arch headers are the same size (across architectures).
81 */
82
83 /* Some formats provide a way to cram a long filename into the short
84 (16 chars) space provided by a BSD archive. The trick is: make a
85 special "file" in the front of the archive, sort of like the SYMDEF
86 entry. If the filename is too long to fit, put it in the extended
87 name table, and use its index as the filename. To prevent
88 confusion prepend the index with a space. This means you can't
89 have filenames that start with a space, but then again, many Unix
90 utilities can't handle that anyway.
91
92 This scheme unfortunately requires that you stand on your head in
93 order to write an archive since you need to put a magic file at the
94 front, and need to touch every entry to do so. C'est la vie.
95
96 We support two variants of this idea:
97 The SVR4 format (extended name table is named "//"),
98 and an extended pseudo-BSD variant (extended name table is named
99 "ARFILENAMES/"). The origin of the latter format is uncertain.
100
101 BSD 4.4 uses a third scheme: It writes a long filename
102 directly after the header. This allows 'ar q' to work.
103 We currently can read BSD 4.4 archives, but not write them.
104 */
105
106 /* Summary of archive member names:
107
108 Symbol table (must be first):
109 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib.
110 "/ " - Symbol table, system 5 style.
111
112 Long name table (must be before regular file members):
113 "// " - Long name table, System 5 R4 style.
114 "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4).
115
116 Regular file members with short names:
117 "filename.o/ " - Regular file, System 5 style (embedded spaces ok).
118 "filename.o " - Regular file, Berkeley style (no embedded spaces).
119
120 Regular files with long names (or embedded spaces, for BSD variants):
121 "/18 " - SVR4 style, name at offset 18 in name table.
122 "#1/23 " - Long name (or embedded paces) 23 characters long,
123 BSD 4.4 style, full name follows header.
124 Implemented for reading, not writing.
125 " 18 " - Long name 18 characters long, extended pseudo-BSD.
126 */
127
128 #include "bfd.h"
129 #include "sysdep.h"
130 #include "libbfd.h"
131 #include "aout/ar.h"
132 #include "aout/ranlib.h"
133 #include <errno.h>
134 #include <string.h> /* For memchr, strrchr and friends */
135 #include <ctype.h>
136
137 #ifndef errno
138 extern int errno;
139 #endif
140
141 #ifdef GNU960
142 #define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB)
143 #endif
144
145 /* Can't define this in hosts/foo.h, because (e.g. in gprof) the hosts file
146 is included, then obstack.h, which thinks if offsetof is defined, it
147 doesn't need to include stddef.h. */
148 /* Define offsetof for those systems which lack it */
149
150 #if !defined (offsetof)
151 #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
152 #endif
153
154 /* We keep a cache of archive filepointers to archive elements to
155 speed up searching the archive by filepos. We only add an entry to
156 the cache when we actually read one. We also don't sort the cache;
157 it's generally short enough to search linearly.
158 Note that the pointers here point to the front of the ar_hdr, not
159 to the front of the contents!
160 */
161 struct ar_cache
162 {
163 file_ptr ptr;
164 bfd *arelt;
165 struct ar_cache *next;
166 };
167
168 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
169 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
170
171 #define arch_eltdata(bfd) ((struct areltdata *)((bfd)->arelt_data))
172 #define arch_hdr(bfd) ((struct ar_hdr *)arch_eltdata(bfd)->arch_header)
173
174 static char *get_extended_arelt_filename PARAMS ((bfd *arch,
175 const char *name));
176 static boolean do_slurp_bsd_armap PARAMS ((bfd *abfd));
177 static boolean do_slurp_coff_armap PARAMS ((bfd *abfd));
178 static const char *normalize PARAMS ((const char *file));
179 static boolean bfd_construct_extended_name_table PARAMS ((bfd *abfd,
180 char **tabloc,
181 unsigned int *));
182 static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd,
183 const char *));
184 static boolean compute_and_write_armap PARAMS ((bfd *arch,
185 unsigned int elength));
186 \f
187 boolean
188 _bfd_generic_mkarchive (abfd)
189 bfd *abfd;
190 {
191 abfd->tdata.aout_ar_data = ((struct artdata *)
192 bfd_zalloc (abfd, sizeof (struct artdata)));
193
194 if (bfd_ardata (abfd) == NULL)
195 {
196 bfd_set_error (bfd_error_no_memory);
197 return false;
198 }
199
200 bfd_ardata (abfd)->cache = NULL;
201 bfd_ardata (abfd)->archive_head = NULL;
202 bfd_ardata (abfd)->symdefs = NULL;
203 bfd_ardata (abfd)->extended_names = NULL;
204 bfd_ardata (abfd)->tdata = NULL;
205
206 return true;
207 }
208
209 /*
210 FUNCTION
211 bfd_get_next_mapent
212
213 SYNOPSIS
214 symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym);
215
216 DESCRIPTION
217 Step through archive @var{abfd}'s symbol table (if it
218 has one). Successively update @var{sym} with the next symbol's
219 information, returning that symbol's (internal) index into the
220 symbol table.
221
222 Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
223 the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
224 got the last one.
225
226 A <<carsym>> is a canonical archive symbol. The only
227 user-visible element is its name, a null-terminated string.
228 */
229
230 symindex
231 bfd_get_next_mapent (abfd, prev, entry)
232 bfd *abfd;
233 symindex prev;
234 carsym **entry;
235 {
236 if (!bfd_has_map (abfd))
237 {
238 bfd_set_error (bfd_error_invalid_operation);
239 return BFD_NO_MORE_SYMBOLS;
240 }
241
242 if (prev == BFD_NO_MORE_SYMBOLS)
243 prev = 0;
244 else if (++prev >= bfd_ardata (abfd)->symdef_count)
245 return BFD_NO_MORE_SYMBOLS;
246
247 *entry = (bfd_ardata (abfd)->symdefs + prev);
248 return prev;
249 }
250
251 /* To be called by backends only */
252
253 bfd *
254 _bfd_create_empty_archive_element_shell (obfd)
255 bfd *obfd;
256 {
257 bfd *nbfd;
258
259 nbfd = _bfd_new_bfd_contained_in (obfd);
260 if (nbfd == NULL)
261 {
262 bfd_set_error (bfd_error_no_memory);
263 return NULL;
264 }
265 return nbfd;
266 }
267
268 /*
269 FUNCTION
270 bfd_set_archive_head
271
272 SYNOPSIS
273 boolean bfd_set_archive_head(bfd *output, bfd *new_head);
274
275 DESCRIPTION
276 Set the head of the chain of
277 BFDs contained in the archive @var{output} to @var{new_head}.
278 */
279
280 boolean
281 bfd_set_archive_head (output_archive, new_head)
282 bfd *output_archive;
283 bfd *new_head;
284 {
285
286 output_archive->archive_head = new_head;
287 return true;
288 }
289
290 bfd *
291 _bfd_look_for_bfd_in_cache (arch_bfd, filepos)
292 bfd *arch_bfd;
293 file_ptr filepos;
294 {
295 struct ar_cache *current;
296
297 for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
298 current = current->next)
299 if (current->ptr == filepos)
300 return current->arelt;
301
302 return NULL;
303 }
304
305 /* Kind of stupid to call cons for each one, but we don't do too many */
306 boolean
307 _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt)
308 bfd *arch_bfd, *new_elt;
309 file_ptr filepos;
310 {
311 struct ar_cache *new_cache = ((struct ar_cache *)
312 bfd_zalloc (arch_bfd,
313 sizeof (struct ar_cache)));
314
315 if (new_cache == NULL)
316 {
317 bfd_set_error (bfd_error_no_memory);
318 return false;
319 }
320
321 new_cache->ptr = filepos;
322 new_cache->arelt = new_elt;
323 new_cache->next = (struct ar_cache *) NULL;
324 if (bfd_ardata (arch_bfd)->cache == NULL)
325 bfd_ardata (arch_bfd)->cache = new_cache;
326 else
327 {
328 struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
329
330 while (current->next != NULL)
331 current = current->next;
332 current->next = new_cache;
333 }
334
335 return true;
336 }
337 \f
338 /* The name begins with space. Hence the rest of the name is an index into
339 the string table. */
340
341 static char *
342 get_extended_arelt_filename (arch, name)
343 bfd *arch;
344 const char *name;
345 {
346 unsigned long index = 0;
347
348 /* Should extract string so that I can guarantee not to overflow into
349 the next region, but I'm too lazy. */
350 errno = 0;
351 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
352 index = strtol (name + 1, NULL, 10);
353 if (errno != 0)
354 {
355 bfd_set_error (bfd_error_malformed_archive);
356 return NULL;
357 }
358
359 return bfd_ardata (arch)->extended_names + index;
360 }
361
362 /* This functions reads an arch header and returns an areltdata pointer, or
363 NULL on error.
364
365 Presumes the file pointer is already in the right place (ie pointing
366 to the ar_hdr in the file). Moves the file pointer; on success it
367 should be pointing to the front of the file contents; on failure it
368 could have been moved arbitrarily.
369 */
370
371 struct areltdata *
372 _bfd_snarf_ar_hdr (abfd)
373 bfd *abfd;
374 {
375 #ifndef errno
376 extern int errno;
377 #endif
378
379 struct ar_hdr hdr;
380 char *hdrp = (char *) &hdr;
381 unsigned int parsed_size;
382 struct areltdata *ared;
383 char *filename = NULL;
384 unsigned int namelen = 0;
385 unsigned int allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
386 char *allocptr = 0;
387
388 if (bfd_read ((PTR) hdrp, 1, sizeof (struct ar_hdr), abfd)
389 != sizeof (struct ar_hdr))
390 {
391 if (bfd_get_error () != bfd_error_system_call)
392 bfd_set_error (bfd_error_no_more_archived_files);
393 return NULL;
394 }
395 if (strncmp (hdr.ar_fmag, ARFMAG, 2))
396 {
397 bfd_set_error (bfd_error_malformed_archive);
398 return NULL;
399 }
400
401 errno = 0;
402 parsed_size = strtol (hdr.ar_size, NULL, 10);
403 if (errno != 0)
404 {
405 bfd_set_error (bfd_error_malformed_archive);
406 return NULL;
407 }
408
409 /* Extract the filename from the archive - there are two ways to
410 specify an extendend name table, either the first char of the
411 name is a space, or it's a slash. */
412 if ((hdr.ar_name[0] == '/'
413 || (hdr.ar_name[0] == ' '
414 && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
415 && bfd_ardata (abfd)->extended_names != NULL)
416 {
417 filename = get_extended_arelt_filename (abfd, hdr.ar_name);
418 if (filename == NULL)
419 {
420 bfd_set_error (bfd_error_malformed_archive);
421 return NULL;
422 }
423 }
424 /* BSD4.4-style long filename.
425 Only implemented for reading, so far! */
426 else if (hdr.ar_name[0] == '#' && hdr.ar_name[1] == '1'
427 && hdr.ar_name[2] == '/' && isdigit (hdr.ar_name[3]))
428 {
429 /* BSD-4.4 extended name */
430 namelen = atoi (&hdr.ar_name[3]);
431 allocsize += namelen + 1;
432 parsed_size -= namelen;
433
434 allocptr = bfd_zalloc (abfd, allocsize);
435 if (allocptr == NULL)
436 {
437 bfd_set_error (bfd_error_no_memory);
438 return NULL;
439 }
440 filename = (allocptr
441 + sizeof (struct areltdata)
442 + sizeof (struct ar_hdr));
443 if (bfd_read (filename, 1, namelen, abfd) != namelen)
444 {
445 if (bfd_get_error () != bfd_error_system_call)
446 bfd_set_error (bfd_error_no_more_archived_files);
447 return NULL;
448 }
449 filename[namelen] = '\0';
450 }
451 else
452 {
453 /* We judge the end of the name by looking for '/' or ' '.
454 Note: The SYSV format (terminated by '/') allows embedded
455 spaces, so only look for ' ' if we don't find '/'. */
456
457 namelen = 0;
458 while (hdr.ar_name[namelen] != '\0' &&
459 hdr.ar_name[namelen] != '/')
460 {
461 namelen++;
462 if (namelen == (unsigned) ar_maxnamelen (abfd))
463 {
464 namelen = 0;
465 while (hdr.ar_name[namelen] != ' '
466 && namelen < (unsigned) ar_maxnamelen (abfd))
467 namelen++;
468 break;
469 }
470 }
471
472 allocsize += namelen + 1;
473 }
474
475 if (!allocptr)
476 {
477 allocptr = bfd_zalloc (abfd, allocsize);
478 if (allocptr == NULL)
479 {
480 bfd_set_error (bfd_error_no_memory);
481 return NULL;
482 }
483 }
484
485 ared = (struct areltdata *) allocptr;
486
487 ared->arch_header = allocptr + sizeof (struct areltdata);
488 memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr));
489 ared->parsed_size = parsed_size;
490
491 if (filename != NULL)
492 ared->filename = filename;
493 else
494 {
495 ared->filename = allocptr + (sizeof (struct areltdata) +
496 sizeof (struct ar_hdr));
497 if (namelen)
498 memcpy (ared->filename, hdr.ar_name, namelen);
499 ared->filename[namelen] = '\0';
500 }
501
502 return ared;
503 }
504 \f
505 /* This is an internal function; it's mainly used when indexing
506 through the archive symbol table, but also used to get the next
507 element, since it handles the bookkeeping so nicely for us. */
508
509 bfd *
510 _bfd_get_elt_at_filepos (archive, filepos)
511 bfd *archive;
512 file_ptr filepos;
513 {
514 struct areltdata *new_areldata;
515 bfd *n_nfd;
516
517 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
518 if (n_nfd)
519 return n_nfd;
520
521 if (0 > bfd_seek (archive, filepos, SEEK_SET))
522 return NULL;
523
524 if ((new_areldata = _bfd_snarf_ar_hdr (archive)) == NULL)
525 return NULL;
526
527 n_nfd = _bfd_create_empty_archive_element_shell (archive);
528 if (n_nfd == NULL)
529 {
530 bfd_release (archive, (PTR) new_areldata);
531 return NULL;
532 }
533
534 n_nfd->origin = bfd_tell (archive);
535 n_nfd->arelt_data = (PTR) new_areldata;
536 n_nfd->filename = new_areldata->filename;
537
538 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
539 return n_nfd;
540
541 /* huh? */
542 bfd_release (archive, (PTR) n_nfd);
543 bfd_release (archive, (PTR) new_areldata);
544 return NULL;
545 }
546
547 /*
548 FUNCTION
549 bfd_get_elt_at_index
550
551 SYNOPSIS
552 bfd *bfd_get_elt_at_index(bfd *archive, int index);
553
554 DESCRIPTION
555 Return the BFD which is referenced by the symbol in @var{archive}
556 indexed by @var{index}. @var{index} should have been returned by
557 <<bfd_get_next_mapent>> (q.v.).
558
559 */
560 bfd *
561 bfd_get_elt_at_index (abfd, index)
562 bfd *abfd;
563 int index;
564 {
565 carsym *entry;
566
567 entry = bfd_ardata (abfd)->symdefs + index;
568 return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
569 }
570
571 /*
572 FUNCTION
573 bfd_openr_next_archived_file
574
575 SYNOPSIS
576 bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous);
577
578 DESCRIPTION
579 Provided a BFD, @var{archive}, containing an archive and NULL, open
580 an input BFD on the first contained element and returns that.
581 Subsequent calls should pass
582 the archive and the previous return value to return a created
583 BFD to the next contained element. NULL is returned when there
584 are no more.
585
586 */
587
588 bfd *
589 bfd_openr_next_archived_file (archive, last_file)
590 bfd *archive;
591 bfd *last_file;
592 {
593 if ((bfd_get_format (archive) != bfd_archive) ||
594 (archive->direction == write_direction))
595 {
596 bfd_set_error (bfd_error_invalid_operation);
597 return NULL;
598 }
599
600 return BFD_SEND (archive,
601 openr_next_archived_file,
602 (archive,
603 last_file));
604 }
605
606 bfd *
607 bfd_generic_openr_next_archived_file (archive, last_file)
608 bfd *archive;
609 bfd *last_file;
610 {
611 file_ptr filestart;
612
613 if (!last_file)
614 filestart = bfd_ardata (archive)->first_file_filepos;
615 else
616 {
617 unsigned int size = arelt_size (last_file);
618 /* Pad to an even boundary...
619 Note that last_file->origin can be odd in the case of
620 BSD-4.4-style element with a long odd size. */
621 filestart = last_file->origin + size;
622 filestart += filestart % 2;
623 }
624
625 return _bfd_get_elt_at_filepos (archive, filestart);
626 }
627
628
629 const bfd_target *
630 bfd_generic_archive_p (abfd)
631 bfd *abfd;
632 {
633 char armag[SARMAG + 1];
634
635 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG)
636 {
637 if (bfd_get_error () != bfd_error_system_call)
638 bfd_set_error (bfd_error_wrong_format);
639 return NULL;
640 }
641
642 #ifdef GNU960
643 if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0)
644 return 0;
645 #else
646 if (strncmp (armag, ARMAG, SARMAG) != 0 &&
647 strncmp (armag, ARMAGB, SARMAG) != 0)
648 return 0;
649 #endif
650
651 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
652 involves a cast, we can't do it as the left operand of assignment. */
653 abfd->tdata.aout_ar_data = ((struct artdata *)
654 bfd_zalloc (abfd, sizeof (struct artdata)));
655
656 if (bfd_ardata (abfd) == NULL)
657 {
658 bfd_set_error (bfd_error_no_memory);
659 return NULL;
660 }
661
662 bfd_ardata (abfd)->first_file_filepos = SARMAG;
663 bfd_ardata (abfd)->cache = NULL;
664 bfd_ardata (abfd)->archive_head = NULL;
665 bfd_ardata (abfd)->symdefs = NULL;
666 bfd_ardata (abfd)->extended_names = NULL;
667 bfd_ardata (abfd)->tdata = NULL;
668
669 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd)))
670 {
671 bfd_release (abfd, bfd_ardata (abfd));
672 abfd->tdata.aout_ar_data = NULL;
673 return NULL;
674 }
675
676 if (!BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
677 {
678 bfd_release (abfd, bfd_ardata (abfd));
679 abfd->tdata.aout_ar_data = NULL;
680 return NULL;
681 }
682
683 return abfd->xvec;
684 }
685
686 /* Some constants for a 32 bit BSD archive structure. We do not
687 support 64 bit archives presently; so far as I know, none actually
688 exist. Supporting them would require changing these constants, and
689 changing some bfd_h_get_32 to bfd_h_get_64. */
690
691 /* The size of an external symdef structure. */
692 #define BSD_SYMDEF_SIZE 8
693
694 /* The offset from the start of a symdef structure to the file offset. */
695 #define BSD_SYMDEF_OFFSET_SIZE 4
696
697 /* The size of the symdef count. */
698 #define BSD_SYMDEF_COUNT_SIZE 4
699
700 /* The size of the string count. */
701 #define BSD_STRING_COUNT_SIZE 4
702
703 /* Returns false on error, true otherwise */
704
705 static boolean
706 do_slurp_bsd_armap (abfd)
707 bfd *abfd;
708 {
709 struct areltdata *mapdata;
710 unsigned int counter;
711 bfd_byte *raw_armap, *rbase;
712 struct artdata *ardata = bfd_ardata (abfd);
713 char *stringbase;
714 unsigned int parsed_size;
715 carsym *set;
716
717 mapdata = _bfd_snarf_ar_hdr (abfd);
718 if (mapdata == NULL)
719 return false;
720 parsed_size = mapdata->parsed_size;
721 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */
722
723 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
724 if (raw_armap == (bfd_byte *) NULL)
725 {
726 bfd_set_error (bfd_error_no_memory);
727 return false;
728 }
729
730 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
731 {
732 if (bfd_get_error () != bfd_error_system_call)
733 bfd_set_error (bfd_error_malformed_archive);
734 byebye:
735 bfd_release (abfd, (PTR) raw_armap);
736 return false;
737 }
738
739 ardata->symdef_count = bfd_h_get_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
740
741 if (ardata->symdef_count * BSD_SYMDEF_SIZE >
742 parsed_size - BSD_SYMDEF_COUNT_SIZE)
743 {
744 /* Probably we're using the wrong byte ordering. */
745 bfd_set_error (bfd_error_wrong_format);
746 goto byebye;
747 }
748
749 ardata->cache = 0;
750 rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
751 stringbase = ((char *) rbase
752 + ardata->symdef_count * BSD_SYMDEF_SIZE
753 + BSD_STRING_COUNT_SIZE);
754 ardata->symdefs = (carsym *) bfd_alloc (abfd,
755 (ardata->symdef_count
756 * sizeof (carsym)));
757 if (!ardata->symdefs)
758 {
759 bfd_set_error (bfd_error_no_memory);
760 return false;
761 }
762
763 for (counter = 0, set = ardata->symdefs;
764 counter < ardata->symdef_count;
765 counter++, set++, rbase += BSD_SYMDEF_SIZE)
766 {
767 set->name = bfd_h_get_32 (abfd, rbase) + stringbase;
768 set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
769 }
770
771 ardata->first_file_filepos = bfd_tell (abfd);
772 /* Pad to an even boundary if you have to */
773 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
774 /* FIXME, we should provide some way to free raw_ardata when
775 we are done using the strings from it. For now, it seems
776 to be allocated on an obstack anyway... */
777 bfd_has_map (abfd) = true;
778 return true;
779 }
780
781 /* Returns false on error, true otherwise */
782 static boolean
783 do_slurp_coff_armap (abfd)
784 bfd *abfd;
785 {
786 struct areltdata *mapdata;
787 int *raw_armap, *rawptr;
788 struct artdata *ardata = bfd_ardata (abfd);
789 char *stringbase;
790 unsigned int stringsize;
791 unsigned int parsed_size;
792 carsym *carsyms;
793 unsigned int nsymz; /* Number of symbols in armap. */
794 bfd_vma (*swap) PARAMS ((const bfd_byte *));
795 char int_buf[sizeof (long)];
796 unsigned int carsym_size, ptrsize, i;
797
798 mapdata = _bfd_snarf_ar_hdr (abfd);
799 if (mapdata == NULL)
800 return false;
801 parsed_size = mapdata->parsed_size;
802 bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */
803
804 if (bfd_read ((PTR) int_buf, 1, 4, abfd) != 4)
805 {
806 if (bfd_get_error () != bfd_error_system_call)
807 bfd_set_error (bfd_error_malformed_archive);
808 return false;
809 }
810 /* It seems that all numeric information in a coff archive is always
811 in big endian format, nomatter the host or target. */
812 swap = bfd_getb32;
813 nsymz = bfd_getb32 ((PTR) int_buf);
814 stringsize = parsed_size - (4 * nsymz) - 4;
815
816 #if 1
817 /* ... except that some archive formats are broken, and it may be our
818 fault - the i960 little endian coff sometimes has big and sometimes
819 little, because our tools changed. Here's a horrible hack to clean
820 up the crap. */
821
822 if (stringsize > 0xfffff)
823 {
824 /* This looks dangerous, let's do it the other way around */
825 nsymz = bfd_getl32 ((PTR) int_buf);
826 stringsize = parsed_size - (4 * nsymz) - 4;
827 swap = bfd_getl32;
828 }
829 #endif
830
831 /* The coff armap must be read sequentially. So we construct a
832 bsd-style one in core all at once, for simplicity. */
833
834 carsym_size = (nsymz * sizeof (carsym));
835 ptrsize = (4 * nsymz);
836
837 ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
838 if (ardata->symdefs == NULL)
839 {
840 bfd_set_error (bfd_error_no_memory);
841 return false;
842 }
843 carsyms = ardata->symdefs;
844 stringbase = ((char *) ardata->symdefs) + carsym_size;
845
846 /* Allocate and read in the raw offsets. */
847 raw_armap = (int *) bfd_alloc (abfd, ptrsize);
848 if (raw_armap == NULL)
849 {
850 bfd_set_error (bfd_error_no_memory);
851 goto release_symdefs;
852 }
853 if (bfd_read ((PTR) raw_armap, 1, ptrsize, abfd) != ptrsize
854 || bfd_read ((PTR) stringbase, 1, stringsize, abfd) != stringsize)
855 {
856 if (bfd_get_error () != bfd_error_system_call)
857 bfd_set_error (bfd_error_malformed_archive);
858 goto release_raw_armap;
859 }
860
861 /* OK, build the carsyms */
862 for (i = 0; i < nsymz; i++)
863 {
864 rawptr = raw_armap + i;
865 carsyms->file_offset = swap ((PTR) rawptr);
866 carsyms->name = stringbase;
867 stringbase += strlen (stringbase) + 1;
868 carsyms++;
869 }
870 *stringbase = 0;
871
872 ardata->symdef_count = nsymz;
873 ardata->first_file_filepos = bfd_tell (abfd);
874 /* Pad to an even boundary if you have to */
875 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
876
877 bfd_has_map (abfd) = true;
878 bfd_release (abfd, (PTR) raw_armap);
879 return true;
880
881 release_raw_armap:
882 bfd_release (abfd, (PTR) raw_armap);
883 release_symdefs:
884 bfd_release (abfd, (PTR) (ardata)->symdefs);
885 return false;
886 }
887
888 /* This routine can handle either coff-style or bsd-style armaps.
889 Returns false on error, true otherwise */
890
891 boolean
892 bfd_slurp_armap (abfd)
893 bfd *abfd;
894 {
895 char nextname[17];
896 int i = bfd_read ((PTR) nextname, 1, 16, abfd);
897
898 if (i == 0)
899 return true;
900 if (i != 16)
901 return false;
902
903 if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)
904 return false;
905
906 if (!strncmp (nextname, "__.SYMDEF ", 16)
907 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */
908 return do_slurp_bsd_armap (abfd);
909 else if (!strncmp (nextname, "/ ", 16))
910 return do_slurp_coff_armap (abfd);
911
912 bfd_has_map (abfd) = false;
913 return true;
914 }
915 \f
916 /* Returns false on error, true otherwise */
917 /* flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
918 header is in a slightly different order and the map name is '/'.
919 This flavour is used by hp300hpux. */
920
921 #define HPUX_SYMDEF_COUNT_SIZE 2
922
923 boolean
924 bfd_slurp_bsd_armap_f2 (abfd)
925 bfd *abfd;
926 {
927 struct areltdata *mapdata;
928 char nextname[17];
929 unsigned int counter;
930 bfd_byte *raw_armap, *rbase;
931 struct artdata *ardata = bfd_ardata (abfd);
932 char *stringbase;
933 unsigned int stringsize;
934 carsym *set;
935 int i = bfd_read ((PTR) nextname, 1, 16, abfd);
936
937 if (i == 0)
938 return true;
939 if (i != 16)
940 return false;
941
942 /* The archive has at least 16 bytes in it */
943 if (bfd_seek (abfd, -16L, SEEK_CUR) != 0)
944 return false;
945
946 if (!strncmp (nextname, "__.SYMDEF ", 16)
947 || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */
948 return do_slurp_bsd_armap (abfd);
949
950 if (strncmp (nextname, "/ ", 16))
951 {
952 bfd_has_map (abfd) = false;
953 return true;
954 }
955
956 mapdata = _bfd_snarf_ar_hdr (abfd);
957 if (mapdata == NULL)
958 return false;
959
960 raw_armap = (bfd_byte *) bfd_zalloc (abfd, mapdata->parsed_size);
961 if (raw_armap == NULL)
962 {
963 bfd_set_error (bfd_error_no_memory);
964 byebye:
965 bfd_release (abfd, (PTR) mapdata);
966 return false;
967 }
968
969 if (bfd_read ((PTR) raw_armap, 1, mapdata->parsed_size, abfd) !=
970 mapdata->parsed_size)
971 {
972 if (bfd_get_error () != bfd_error_system_call)
973 bfd_set_error (bfd_error_malformed_archive);
974 byebyebye:
975 bfd_release (abfd, (PTR) raw_armap);
976 goto byebye;
977 }
978
979 ardata->symdef_count = bfd_h_get_16 (abfd, (PTR) raw_armap);
980
981 if (ardata->symdef_count * BSD_SYMDEF_SIZE
982 > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE)
983 {
984 /* Probably we're using the wrong byte ordering. */
985 bfd_set_error (bfd_error_wrong_format);
986 goto byebyebye;
987 }
988
989 ardata->cache = 0;
990
991 stringsize = bfd_h_get_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
992 /* skip sym count and string sz */
993 stringbase = ((char *) raw_armap
994 + HPUX_SYMDEF_COUNT_SIZE
995 + BSD_STRING_COUNT_SIZE);
996 rbase = (bfd_byte *) stringbase + stringsize;
997 ardata->symdefs = (carsym *) bfd_alloc (abfd,
998 (ardata->symdef_count
999 * BSD_SYMDEF_SIZE));
1000 if (!ardata->symdefs)
1001 {
1002 bfd_set_error (bfd_error_no_memory);
1003 return false;
1004 }
1005
1006 for (counter = 0, set = ardata->symdefs;
1007 counter < ardata->symdef_count;
1008 counter++, set++, rbase += BSD_SYMDEF_SIZE)
1009 {
1010 set->name = bfd_h_get_32 (abfd, rbase) + stringbase;
1011 set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1012 }
1013
1014 ardata->first_file_filepos = bfd_tell (abfd);
1015 /* Pad to an even boundary if you have to */
1016 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1017 /* FIXME, we should provide some way to free raw_ardata when
1018 we are done using the strings from it. For now, it seems
1019 to be allocated on an obstack anyway... */
1020 bfd_has_map (abfd) = true;
1021 return true;
1022 }
1023 \f
1024 /** Extended name table.
1025
1026 Normally archives support only 14-character filenames.
1027
1028 Intel has extended the format: longer names are stored in a special
1029 element (the first in the archive, or second if there is an armap);
1030 the name in the ar_hdr is replaced by <space><index into filename
1031 element>. Index is the P.R. of an int (decimal). Data General have
1032 extended the format by using the prefix // for the special element */
1033
1034 /* Returns false on error, true otherwise */
1035 boolean
1036 _bfd_slurp_extended_name_table (abfd)
1037 bfd *abfd;
1038 {
1039 char nextname[17];
1040 struct areltdata *namedata;
1041
1042 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ,
1043 we probably don't want to return true. */
1044 if (bfd_read ((PTR) nextname, 1, 16, abfd) == 16)
1045 {
1046
1047 if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0)
1048 return false;
1049
1050 if (strncmp (nextname, "ARFILENAMES/ ", 16) != 0 &&
1051 strncmp (nextname, "// ", 16) != 0)
1052 {
1053 bfd_ardata (abfd)->extended_names = NULL;
1054 return true;
1055 }
1056
1057 namedata = _bfd_snarf_ar_hdr (abfd);
1058 if (namedata == NULL)
1059 return false;
1060
1061 bfd_ardata (abfd)->extended_names =
1062 bfd_zalloc (abfd, namedata->parsed_size);
1063 if (bfd_ardata (abfd)->extended_names == NULL)
1064 {
1065 bfd_set_error (bfd_error_no_memory);
1066 byebye:
1067 bfd_release (abfd, (PTR) namedata);
1068 return false;
1069 }
1070
1071 if (bfd_read ((PTR) bfd_ardata (abfd)->extended_names, 1,
1072 namedata->parsed_size, abfd) != namedata->parsed_size)
1073 {
1074 if (bfd_get_error () != bfd_error_system_call)
1075 bfd_set_error (bfd_error_malformed_archive);
1076 bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names));
1077 bfd_ardata (abfd)->extended_names = NULL;
1078 goto byebye;
1079 }
1080
1081 /* Since the archive is supposed to be printable if it contains
1082 text, the entries in the list are newline-padded, not null
1083 padded. In SVR4-style archives, the names also have a
1084 trailing '/'. We'll fix both problems here.. */
1085 {
1086 char *temp = bfd_ardata (abfd)->extended_names;
1087 char *limit = temp + namedata->parsed_size;
1088 for (; temp < limit; ++temp)
1089 if (*temp == '\012')
1090 temp[temp[-1] == '/' ? -1 : 0] = '\0';
1091 }
1092
1093 /* Pad to an even boundary if you have to */
1094 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1095 bfd_ardata (abfd)->first_file_filepos +=
1096 (bfd_ardata (abfd)->first_file_filepos) % 2;
1097
1098 /* FIXME, we can't release namedata here because it was allocated
1099 below extended_names on the obstack... */
1100 /* bfd_release (abfd, namedata); */
1101 }
1102 return true;
1103 }
1104
1105 #ifdef VMS
1106
1107 /* Return a copy of the stuff in the filename between any :]> and a
1108 semicolon */
1109 static const char *
1110 normalize (file)
1111 const char *file;
1112 {
1113 CONST char *first;
1114 CONST char *last;
1115 char *copy;
1116
1117 first = file + strlen (file) - 1;
1118 last = first + 1;
1119
1120 while (first != file)
1121 {
1122 if (*first == ';')
1123 last = first;
1124 if (*first == ':' || *first == ']' || *first == '>')
1125 {
1126 first++;
1127 break;
1128 }
1129 first--;
1130 }
1131
1132
1133 copy = malloc (last - first + 1);
1134 if (!copy)
1135 return copy;
1136
1137 memcpy (copy, first, last - first);
1138 copy[last - first] = 0;
1139
1140 return copy;
1141 }
1142
1143 #else
1144 static const char *
1145 normalize (file)
1146 const char *file;
1147 {
1148 CONST char *filename = strrchr (file, '/');
1149
1150 if (filename != (char *) NULL)
1151 filename++;
1152 else
1153 filename = file;
1154 return filename;
1155 }
1156 #endif
1157
1158 /* Follows archive_head and produces an extended name table if
1159 necessary. Returns (in tabloc) a pointer to an extended name
1160 table, and in tablen the length of the table. If it makes an entry
1161 it clobbers the filename so that the element may be written without
1162 further massage. Returns true if it ran successfully, false if
1163 something went wrong. A successful return may still involve a
1164 zero-length tablen! */
1165
1166 static boolean
1167 bfd_construct_extended_name_table (abfd, tabloc, tablen)
1168 bfd *abfd;
1169 char **tabloc;
1170 unsigned int *tablen;
1171 {
1172 unsigned int maxname = abfd->xvec->ar_max_namelen;
1173 unsigned int total_namelen = 0;
1174 bfd *current;
1175 char *strptr;
1176
1177 *tablen = 0;
1178
1179 /* Figure out how long the table should be */
1180 for (current = abfd->archive_head; current != NULL; current = current->next)
1181 {
1182 CONST char *normal = normalize (current->filename);
1183 unsigned int thislen;
1184
1185 if (!normal)
1186 {
1187 bfd_set_error (bfd_error_no_memory);
1188 return false;
1189 }
1190 thislen = strlen (normal);
1191 if (thislen > maxname)
1192 total_namelen += thislen + 1; /* leave room for \n */
1193 }
1194
1195 if (total_namelen == 0)
1196 return true;
1197
1198 *tabloc = bfd_zalloc (abfd, total_namelen);
1199 if (*tabloc == NULL)
1200 {
1201 bfd_set_error (bfd_error_no_memory);
1202 return false;
1203 }
1204
1205 *tablen = total_namelen;
1206 strptr = *tabloc;
1207
1208 for (current = abfd->archive_head; current != NULL; current =
1209 current->next)
1210 {
1211 CONST char *normal = normalize (current->filename);
1212 unsigned int thislen;
1213
1214 if (!normal)
1215 {
1216 bfd_set_error (bfd_error_no_memory);
1217 return false;
1218 }
1219 thislen = strlen (normal);
1220 if (thislen > maxname)
1221 {
1222 /* Works for now; may need to be re-engineered if we
1223 encounter an oddball archive format and want to
1224 generalise this hack. */
1225 struct ar_hdr *hdr = arch_hdr (current);
1226 strcpy (strptr, normal);
1227 strptr[thislen] = '\012';
1228 hdr->ar_name[0] = ar_padchar (current);
1229 /* We know there will always be enough room (one of the few
1230 cases where you may safely use sprintf). */
1231 sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc));
1232 /* Kinda Kludgy. We should just use the returned value of
1233 sprintf but not all implementations get this right */
1234 {
1235 char *temp = hdr->ar_name + 2;
1236 for (; temp < hdr->ar_name + maxname; temp++)
1237 if (*temp == '\0')
1238 *temp = ' ';
1239 }
1240 strptr += thislen + 1;
1241 }
1242 }
1243
1244 return true;
1245 }
1246 \f
1247 /** A couple of functions for creating ar_hdrs */
1248
1249 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1250 make one. The filename must refer to a filename in the filesystem.
1251 The filename field of the ar_hdr will NOT be initialized */
1252
1253 static struct areltdata *
1254 bfd_ar_hdr_from_filesystem (abfd, filename)
1255 bfd *abfd;
1256 const char *filename;
1257 {
1258 struct stat status;
1259 struct areltdata *ared;
1260 struct ar_hdr *hdr;
1261 char *temp, *temp1;
1262
1263 if (stat (filename, &status) != 0)
1264 {
1265 bfd_set_error (bfd_error_system_call);
1266 return NULL;
1267 }
1268
1269 ared = (struct areltdata *) bfd_zalloc (abfd, sizeof (struct ar_hdr) +
1270 sizeof (struct areltdata));
1271 if (ared == NULL)
1272 {
1273 bfd_set_error (bfd_error_no_memory);
1274 return NULL;
1275 }
1276 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1277
1278 /* ar headers are space padded, not null padded! */
1279 memset ((PTR) hdr, ' ', sizeof (struct ar_hdr));
1280
1281 strncpy (hdr->ar_fmag, ARFMAG, 2);
1282
1283 /* Goddamned sprintf doesn't permit MAXIMUM field lengths */
1284 sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime);
1285 sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid);
1286 sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid);
1287 sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode);
1288 sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size);
1289 /* Correct for a lossage in sprintf whereby it null-terminates. I cannot
1290 understand how these C losers could design such a ramshackle bunch of
1291 IO operations */
1292 temp = (char *) hdr;
1293 temp1 = temp + sizeof (struct ar_hdr) - 2;
1294 for (; temp < temp1; temp++)
1295 {
1296 if (*temp == '\0')
1297 *temp = ' ';
1298 }
1299 strncpy (hdr->ar_fmag, ARFMAG, 2);
1300 ared->parsed_size = status.st_size;
1301 ared->arch_header = (char *) hdr;
1302
1303 return ared;
1304 }
1305
1306 /* This is magic required by the "ar" program. Since it's
1307 undocumented, it's undocumented. You may think that it would take
1308 a strong stomach to write this, and it does, but it takes even a
1309 stronger stomach to try to code around such a thing! */
1310
1311 struct ar_hdr *
1312 bfd_special_undocumented_glue (abfd, filename)
1313 bfd *abfd;
1314 char *filename;
1315 {
1316 struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename);
1317 if (ar_elt == NULL)
1318 return NULL;
1319 return (struct ar_hdr *) ar_elt->arch_header;
1320 }
1321
1322
1323 /* Analogous to stat call */
1324 int
1325 bfd_generic_stat_arch_elt (abfd, buf)
1326 bfd *abfd;
1327 struct stat *buf;
1328 {
1329 struct ar_hdr *hdr;
1330 char *aloser;
1331
1332 if (abfd->arelt_data == NULL)
1333 {
1334 bfd_set_error (bfd_error_invalid_operation);
1335 return -1;
1336 }
1337
1338 hdr = arch_hdr (abfd);
1339
1340 #define foo(arelt, stelt, size) \
1341 buf->stelt = strtol (hdr->arelt, &aloser, size); \
1342 if (aloser == hdr->arelt) return -1;
1343
1344 foo (ar_date, st_mtime, 10);
1345 foo (ar_uid, st_uid, 10);
1346 foo (ar_gid, st_gid, 10);
1347 foo (ar_mode, st_mode, 8);
1348
1349 buf->st_size = arch_eltdata (abfd)->parsed_size;
1350
1351 return 0;
1352 }
1353
1354 void
1355 bfd_dont_truncate_arname (abfd, pathname, arhdr)
1356 bfd *abfd;
1357 CONST char *pathname;
1358 char *arhdr;
1359 {
1360 /* FIXME: This interacts unpleasantly with ar's quick-append option.
1361 Fortunately ic960 users will never use that option. Fixing this
1362 is very hard; fortunately I know how to do it and will do so once
1363 intel's release is out the door. */
1364
1365 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1366 int length;
1367 CONST char *filename = normalize (pathname);
1368 int maxlen = ar_maxnamelen (abfd);
1369
1370 length = strlen (filename);
1371
1372 if (length <= maxlen)
1373 memcpy (hdr->ar_name, filename, length);
1374
1375 if (length < maxlen)
1376 (hdr->ar_name)[length] = ar_padchar (abfd);
1377 }
1378
1379 void
1380 bfd_bsd_truncate_arname (abfd, pathname, arhdr)
1381 bfd *abfd;
1382 CONST char *pathname;
1383 char *arhdr;
1384 {
1385 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1386 int length;
1387 CONST char *filename = strrchr (pathname, '/');
1388 int maxlen = ar_maxnamelen (abfd);
1389
1390 if (filename == NULL)
1391 filename = pathname;
1392 else
1393 ++filename;
1394
1395 length = strlen (filename);
1396
1397 if (length <= maxlen)
1398 memcpy (hdr->ar_name, filename, length);
1399 else
1400 {
1401 /* pathname: meet procrustes */
1402 memcpy (hdr->ar_name, filename, maxlen);
1403 length = maxlen;
1404 }
1405
1406 if (length < maxlen)
1407 (hdr->ar_name)[length] = ar_padchar (abfd);
1408 }
1409
1410 /* Store name into ar header. Truncates the name to fit.
1411 1> strip pathname to be just the basename.
1412 2> if it's short enuf to fit, stuff it in.
1413 3> If it doesn't end with .o, truncate it to fit
1414 4> truncate it before the .o, append .o, stuff THAT in. */
1415
1416 /* This is what gnu ar does. It's better but incompatible with the
1417 bsd ar. */
1418
1419 void
1420 bfd_gnu_truncate_arname (abfd, pathname, arhdr)
1421 bfd *abfd;
1422 CONST char *pathname;
1423 char *arhdr;
1424 {
1425 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1426 int length;
1427 CONST char *filename = strrchr (pathname, '/');
1428 int maxlen = ar_maxnamelen (abfd);
1429
1430 if (filename == NULL)
1431 filename = pathname;
1432 else
1433 ++filename;
1434
1435 length = strlen (filename);
1436
1437 if (length <= maxlen)
1438 memcpy (hdr->ar_name, filename, length);
1439 else
1440 { /* pathname: meet procrustes */
1441 memcpy (hdr->ar_name, filename, maxlen);
1442 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
1443 {
1444 hdr->ar_name[maxlen - 2] = '.';
1445 hdr->ar_name[maxlen - 1] = 'o';
1446 }
1447 length = maxlen;
1448 }
1449
1450 if (length < 16)
1451 (hdr->ar_name)[length] = ar_padchar (abfd);
1452 }
1453 \f
1454 /* The BFD is open for write and has its format set to bfd_archive */
1455
1456 boolean
1457 _bfd_write_archive_contents (arch)
1458 bfd *arch;
1459 {
1460 bfd *current;
1461 char *etable = NULL;
1462 unsigned int elength = 0;
1463 boolean makemap = bfd_has_map (arch);
1464 boolean hasobjects = false; /* if no .o's, don't bother to make a map */
1465 bfd_size_type wrote;
1466 unsigned int i;
1467 int tries;
1468
1469 /* Verify the viability of all entries; if any of them live in the
1470 filesystem (as opposed to living in an archive open for input)
1471 then construct a fresh ar_hdr for them. */
1472 for (current = arch->archive_head; current; current = current->next)
1473 {
1474 if (bfd_write_p (current))
1475 {
1476 bfd_set_error (bfd_error_invalid_operation);
1477 return false;
1478 }
1479 if (!current->arelt_data)
1480 {
1481 current->arelt_data =
1482 (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename);
1483 if (!current->arelt_data)
1484 return false;
1485
1486 /* Put in the file name */
1487 BFD_SEND (arch, _bfd_truncate_arname, (arch,
1488 current->filename,
1489 (char *) arch_hdr (current)));
1490 }
1491
1492 if (makemap && ! hasobjects)
1493 { /* don't bother if we won't make a map! */
1494 if ((bfd_check_format (current, bfd_object))
1495 #if 0 /* FIXME -- these are not set correctly */
1496 && ((bfd_get_file_flags (current) & HAS_SYMS))
1497 #endif
1498 )
1499 hasobjects = true;
1500 }
1501 }
1502
1503 if (!bfd_construct_extended_name_table (arch, &etable, &elength))
1504 return false;
1505
1506 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
1507 return false;
1508 #ifdef GNU960
1509 wrote = bfd_write (BFD_GNU960_ARMAG (arch), 1, SARMAG, arch);
1510 #else
1511 wrote = bfd_write (ARMAG, 1, SARMAG, arch);
1512 #endif
1513 if (wrote != SARMAG)
1514 return false;
1515
1516 if (makemap && hasobjects)
1517 {
1518 if (compute_and_write_armap (arch, elength) != true)
1519 return false;
1520 }
1521
1522 if (elength != 0)
1523 {
1524 struct ar_hdr hdr;
1525
1526 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1527 if (ar_padchar (arch) == '/')
1528 sprintf (&(hdr.ar_name[0]), "//");
1529 else
1530 sprintf (&(hdr.ar_name[0]), "ARFILENAMES/");
1531 sprintf (&(hdr.ar_size[0]), "%-10d", (int) elength);
1532 strncpy (hdr.ar_fmag, ARFMAG, 2);
1533 for (i = 0; i < sizeof (struct ar_hdr); i++)
1534 if (((char *) (&hdr))[i] == '\0')
1535 (((char *) (&hdr))[i]) = ' ';
1536 if ((bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch)
1537 != sizeof (struct ar_hdr))
1538 || bfd_write (etable, 1, elength, arch) != elength)
1539 return false;
1540 if ((elength % 2) == 1)
1541 {
1542 if (bfd_write ("\012", 1, 1, arch) != 1)
1543 return false;
1544 }
1545 }
1546
1547 for (current = arch->archive_head; current; current = current->next)
1548 {
1549 char buffer[DEFAULT_BUFFERSIZE];
1550 unsigned int remaining = arelt_size (current);
1551 struct ar_hdr *hdr = arch_hdr (current);
1552
1553 /* write ar header */
1554 if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr))
1555 return false;
1556 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
1557 return false;
1558 while (remaining)
1559 {
1560 unsigned int amt = DEFAULT_BUFFERSIZE;
1561 if (amt > remaining)
1562 amt = remaining;
1563 errno = 0;
1564 if (bfd_read (buffer, amt, 1, current) != amt)
1565 {
1566 if (bfd_get_error () != bfd_error_system_call)
1567 bfd_set_error (bfd_error_malformed_archive);
1568 return false;
1569 }
1570 if (bfd_write (buffer, amt, 1, arch) != amt)
1571 return false;
1572 remaining -= amt;
1573 }
1574 if ((arelt_size (current) % 2) == 1)
1575 {
1576 if (bfd_write ("\012", 1, 1, arch) != 1)
1577 return false;
1578 }
1579 }
1580
1581 /* Verify the timestamp in the archive file. If it would not be
1582 accepted by the linker, rewrite it until it would be. If
1583 anything odd happens, break out and just return. (The Berkeley
1584 linker checks the timestamp and refuses to read the
1585 table-of-contents if it is >60 seconds less than the file's
1586 modified-time. That painful hack requires this painful hack. */
1587
1588 tries = 1;
1589 do
1590 {
1591 if (bfd_update_armap_timestamp (arch) == true) /* FIXME!!! Vector it */
1592 break;
1593 if (tries > 0)
1594 fprintf (stderr,
1595 "Warning: writing archive was slow: rewriting timestamp\n");
1596 }
1597 while (++tries < 6);
1598
1599 return true;
1600 }
1601 \f
1602 /* Note that the namidx for the first symbol is 0 */
1603
1604 static boolean
1605 compute_and_write_armap (arch, elength)
1606 bfd *arch;
1607 unsigned int elength;
1608 {
1609 char *first_name = NULL;
1610 bfd *current;
1611 file_ptr elt_no = 0;
1612 struct orl *map = NULL;
1613 int orl_max = 1024; /* fine initial default */
1614 int orl_count = 0;
1615 int stridx = 0; /* string index */
1616 asymbol **syms = NULL;
1617 long syms_max = 0;
1618 boolean ret;
1619
1620 /* Dunno if this is the best place for this info... */
1621 if (elength != 0)
1622 elength += sizeof (struct ar_hdr);
1623 elength += elength % 2;
1624
1625 map = (struct orl *) malloc (orl_max * sizeof (struct orl));
1626 if (map == NULL)
1627 goto no_memory_return;
1628
1629 /* We put the symbol names on the arch obstack, and then discard
1630 them when done. */
1631 first_name = bfd_alloc (arch, 1);
1632 if (first_name == NULL)
1633 goto no_memory_return;
1634
1635 /* Drop all the files called __.SYMDEF, we're going to make our
1636 own */
1637 while (arch->archive_head &&
1638 strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
1639 arch->archive_head = arch->archive_head->next;
1640
1641 /* Map over each element */
1642 for (current = arch->archive_head;
1643 current != (bfd *) NULL;
1644 current = current->next, elt_no++)
1645 {
1646 if ((bfd_check_format (current, bfd_object) == true)
1647 && ((bfd_get_file_flags (current) & HAS_SYMS)))
1648 {
1649 long storage;
1650 long symcount;
1651 long src_count;
1652
1653 storage = bfd_get_symtab_upper_bound (current);
1654 if (storage < 0)
1655 goto error_return;
1656
1657 if (storage != 0)
1658 {
1659 if (storage > syms_max)
1660 {
1661 if (syms_max > 0)
1662 free (syms);
1663 syms_max = storage;
1664 syms = (asymbol **) malloc ((size_t) syms_max);
1665 if (syms == NULL)
1666 goto no_memory_return;
1667 }
1668 symcount = bfd_canonicalize_symtab (current, syms);
1669 if (symcount < 0)
1670 goto error_return;
1671
1672 /* Now map over all the symbols, picking out the ones we want */
1673 for (src_count = 0; src_count < symcount; src_count++)
1674 {
1675 flagword flags = (syms[src_count])->flags;
1676 asection *sec = syms[src_count]->section;
1677
1678 if ((flags & BSF_GLOBAL ||
1679 flags & BSF_WEAK ||
1680 flags & BSF_INDIRECT ||
1681 bfd_is_com_section (sec))
1682 && ! bfd_is_und_section (sec))
1683 {
1684 size_t namelen;
1685 struct orl *new_map;
1686
1687 /* This symbol will go into the archive header */
1688 if (orl_count == orl_max)
1689 {
1690 orl_max *= 2;
1691 new_map = ((struct orl *)
1692 realloc ((PTR) map,
1693 orl_max * sizeof (struct orl)));
1694 if (new_map == (struct orl *) NULL)
1695 goto no_memory_return;
1696
1697 map = new_map;
1698 }
1699
1700 namelen = strlen (syms[src_count]->name);
1701 map[orl_count].name = ((char **)
1702 bfd_alloc (arch,
1703 sizeof (char *)));
1704 if (map[orl_count].name == NULL)
1705 goto no_memory_return;
1706 *(map[orl_count].name) = bfd_alloc (arch, namelen + 1);
1707 if (*(map[orl_count].name) == NULL)
1708 goto no_memory_return;
1709 strcpy (*(map[orl_count].name), syms[src_count]->name);
1710 (map[orl_count]).pos = (file_ptr) current;
1711 (map[orl_count]).namidx = stridx;
1712
1713 stridx += namelen + 1;
1714 ++orl_count;
1715 }
1716 }
1717 }
1718
1719 /* Now ask the BFD to free up any cached information, so we
1720 don't fill all of memory with symbol tables. */
1721 if (! bfd_free_cached_info (current))
1722 goto error_return;
1723 }
1724 }
1725
1726 /* OK, now we have collected all the data, let's write them out */
1727 ret = BFD_SEND (arch, write_armap,
1728 (arch, elength, map, orl_count, stridx));
1729
1730 if (syms_max > 0)
1731 free (syms);
1732 if (map != NULL)
1733 free (map);
1734 if (first_name != NULL)
1735 bfd_release (arch, first_name);
1736
1737 return ret;
1738
1739 no_memory_return:
1740 bfd_set_error (bfd_error_no_memory);
1741
1742 error_return:
1743 if (syms_max > 0)
1744 free (syms);
1745 if (map != NULL)
1746 free (map);
1747 if (first_name != NULL)
1748 bfd_release (arch, first_name);
1749
1750 return false;
1751 }
1752
1753 boolean
1754 bsd_write_armap (arch, elength, map, orl_count, stridx)
1755 bfd *arch;
1756 unsigned int elength;
1757 struct orl *map;
1758 unsigned int orl_count;
1759 int stridx;
1760 {
1761 int padit = stridx & 1;
1762 unsigned int ranlibsize = orl_count * sizeof (struct ranlib);
1763 unsigned int stringsize = stridx + padit;
1764 /* Include 8 bytes to store ranlibsize and stringsize in output. */
1765 unsigned int mapsize = ranlibsize + stringsize + 8;
1766 file_ptr firstreal;
1767 bfd *current = arch->archive_head;
1768 bfd *last_elt = current; /* last element arch seen */
1769 int temp;
1770 int count;
1771 struct ar_hdr hdr;
1772 struct stat statbuf;
1773 unsigned int i;
1774
1775 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
1776
1777 stat (arch->filename, &statbuf);
1778 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1779 sprintf (hdr.ar_name, RANLIBMAG);
1780 /* Remember the timestamp, to keep it holy. But fudge it a little. */
1781 bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET;
1782 bfd_ardata (arch)->armap_datepos = (SARMAG
1783 + offsetof (struct ar_hdr, ar_date[0]));
1784 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
1785 sprintf (hdr.ar_uid, "%d", getuid ());
1786 sprintf (hdr.ar_gid, "%d", getgid ());
1787 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1788 strncpy (hdr.ar_fmag, ARFMAG, 2);
1789 for (i = 0; i < sizeof (struct ar_hdr); i++)
1790 if (((char *) (&hdr))[i] == '\0')
1791 (((char *) (&hdr))[i]) = ' ';
1792 if (bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch)
1793 != sizeof (struct ar_hdr))
1794 return false;
1795 bfd_h_put_32 (arch, (bfd_vma) ranlibsize, (PTR) &temp);
1796 if (bfd_write (&temp, 1, sizeof (temp), arch) != sizeof (temp))
1797 return false;
1798
1799 for (count = 0; count < orl_count; count++)
1800 {
1801 struct symdef outs;
1802 struct symdef *outp = &outs;
1803
1804 if (((bfd *) (map[count]).pos) != last_elt)
1805 {
1806 do
1807 {
1808 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
1809 firstreal += firstreal % 2;
1810 current = current->next;
1811 }
1812 while (current != (bfd *) (map[count]).pos);
1813 } /* if new archive element */
1814
1815 last_elt = current;
1816 bfd_h_put_32 (arch, ((map[count]).namidx), (PTR) &outs.s.string_offset);
1817 bfd_h_put_32 (arch, firstreal, (PTR) &outs.file_offset);
1818 if (bfd_write ((char *) outp, 1, sizeof (outs), arch) != sizeof (outs))
1819 return false;
1820 }
1821
1822 /* now write the strings themselves */
1823 bfd_h_put_32 (arch, stringsize, (PTR) &temp);
1824 if (bfd_write ((PTR) &temp, 1, sizeof (temp), arch) != sizeof (temp))
1825 return false;
1826 for (count = 0; count < orl_count; count++)
1827 {
1828 size_t len = strlen (*map[count].name) + 1;
1829
1830 if (bfd_write (*map[count].name, 1, len, arch) != len)
1831 return false;
1832 }
1833
1834 /* The spec sez this should be a newline. But in order to be
1835 bug-compatible for sun's ar we use a null. */
1836 if (padit)
1837 {
1838 if (bfd_write ("", 1, 1, arch) != 1)
1839 return false;
1840 }
1841
1842 return true;
1843 }
1844
1845 /* At the end of archive file handling, update the timestamp in the
1846 file, so the linker will accept it.
1847
1848 Return true if the timestamp was OK, or an unusual problem happened.
1849 Return false if we updated the timestamp. */
1850
1851 boolean
1852 _bfd_archive_bsd_update_armap_timestamp (arch)
1853 bfd *arch;
1854 {
1855 struct stat archstat;
1856 struct ar_hdr hdr;
1857 int i;
1858
1859 /* Flush writes, get last-write timestamp from file, and compare it
1860 to the timestamp IN the file. */
1861 bfd_flush (arch);
1862 if (bfd_stat (arch, &archstat) == -1)
1863 {
1864 perror ("Reading archive file mod timestamp");
1865 return true; /* Can't read mod time for some reason */
1866 }
1867 if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp)
1868 return true; /* OK by the linker's rules */
1869
1870 /* Update the timestamp. */
1871 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
1872
1873 /* Prepare an ASCII version suitable for writing. */
1874 memset (hdr.ar_date, 0, sizeof (hdr.ar_date));
1875 sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp);
1876 for (i = 0; i < sizeof (hdr.ar_date); i++)
1877 if (hdr.ar_date[i] == '\0')
1878 (hdr.ar_date)[i] = ' ';
1879
1880 /* Write it into the file. */
1881 bfd_ardata (arch)->armap_datepos = (SARMAG
1882 + offsetof (struct ar_hdr, ar_date[0]));
1883 if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
1884 || (bfd_write (hdr.ar_date, sizeof (hdr.ar_date), 1, arch)
1885 != sizeof (hdr.ar_date)))
1886 {
1887 /* FIXME: bfd can't call perror. */
1888 perror ("Writing updated armap timestamp");
1889 return true; /* Some error while writing */
1890 }
1891
1892 return false; /* We updated the timestamp successfully. */
1893 }
1894 \f
1895 /* A coff armap looks like :
1896 lARMAG
1897 struct ar_hdr with name = '/'
1898 number of symbols
1899 offset of file for symbol 0
1900 offset of file for symbol 1
1901
1902 offset of file for symbol n-1
1903 symbol name 0
1904 symbol name 1
1905
1906 symbol name n-1
1907 */
1908
1909 boolean
1910 coff_write_armap (arch, elength, map, symbol_count, stridx)
1911 bfd *arch;
1912 unsigned int elength;
1913 struct orl *map;
1914 unsigned int symbol_count;
1915 int stridx;
1916 {
1917 /* The size of the ranlib is the number of exported symbols in the
1918 archive * the number of bytes in a int, + an int for the count */
1919 unsigned int ranlibsize = (symbol_count * 4) + 4;
1920 unsigned int stringsize = stridx;
1921 unsigned int mapsize = stringsize + ranlibsize;
1922 file_ptr archive_member_file_ptr;
1923 bfd *current = arch->archive_head;
1924 int count;
1925 struct ar_hdr hdr;
1926 unsigned int i;
1927 int padit = mapsize & 1;
1928
1929 if (padit)
1930 mapsize++;
1931
1932 /* work out where the first object file will go in the archive */
1933 archive_member_file_ptr = (mapsize
1934 + elength
1935 + sizeof (struct ar_hdr)
1936 + SARMAG);
1937
1938 memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
1939 hdr.ar_name[0] = '/';
1940 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
1941 sprintf (hdr.ar_date, "%ld", (long) time (NULL));
1942 /* This, at least, is what Intel coff sets the values to.: */
1943 sprintf ((hdr.ar_uid), "%d", 0);
1944 sprintf ((hdr.ar_gid), "%d", 0);
1945 sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0);
1946 strncpy (hdr.ar_fmag, ARFMAG, 2);
1947
1948 for (i = 0; i < sizeof (struct ar_hdr); i++)
1949 if (((char *) (&hdr))[i] == '\0')
1950 (((char *) (&hdr))[i]) = ' ';
1951
1952 /* Write the ar header for this item and the number of symbols */
1953
1954 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch)
1955 != sizeof (struct ar_hdr))
1956 return false;
1957
1958 bfd_write_bigendian_4byte_int (arch, symbol_count);
1959
1960 /* Two passes, first write the file offsets for each symbol -
1961 remembering that each offset is on a two byte boundary. */
1962
1963 /* Write out the file offset for the file associated with each
1964 symbol, and remember to keep the offsets padded out. */
1965
1966 current = arch->archive_head;
1967 count = 0;
1968 while (current != (bfd *) NULL && count < symbol_count)
1969 {
1970 /* For each symbol which is used defined in this object, write out
1971 the object file's address in the archive */
1972
1973 while (((bfd *) (map[count]).pos) == current)
1974 {
1975 bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr);
1976 count++;
1977 }
1978 /* Add size of this archive entry */
1979 archive_member_file_ptr += (arelt_size (current)
1980 + sizeof (struct ar_hdr));
1981 /* remember aboout the even alignment */
1982 archive_member_file_ptr += archive_member_file_ptr % 2;
1983 current = current->next;
1984 }
1985
1986 /* now write the strings themselves */
1987 for (count = 0; count < symbol_count; count++)
1988 {
1989 size_t len = strlen (*map[count].name) + 1;
1990
1991 if (bfd_write (*map[count].name, 1, len, arch) != len)
1992 return false;
1993 }
1994
1995 /* The spec sez this should be a newline. But in order to be
1996 bug-compatible for arc960 we use a null. */
1997 if (padit)
1998 {
1999 if (bfd_write ("", 1, 1, arch) != 1)
2000 return false;
2001 }
2002
2003 return true;
2004 }
This page took 0.090609 seconds and 4 git commands to generate.