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