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