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