daily update
[deliverable/binutils-gdb.git] / bfd / archive.c
1 /* BFD back-end for archive files (libraries).
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 2012 Free Software Foundation, Inc.
5 Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
22
23 /*
24 @setfilename archive-info
25 SECTION
26 Archives
27
28 DESCRIPTION
29 An archive (or library) is just another BFD. It has a symbol
30 table, although there's not much a user program will do with it.
31
32 The big difference between an archive BFD and an ordinary BFD
33 is that the archive doesn't have sections. Instead it has a
34 chain of BFDs that are considered its contents. These BFDs can
35 be manipulated like any other. The BFDs contained in an
36 archive opened for reading will all be opened for reading. You
37 may put either input or output BFDs into an archive opened for
38 output; they will be handled correctly when the archive is closed.
39
40 Use <<bfd_openr_next_archived_file>> to step through
41 the contents of an archive opened for input. You don't
42 have to read the entire archive if you don't want
43 to! Read it until you find what you want.
44
45 Archive contents of output BFDs are chained through the
46 <<next>> pointer in a BFD. The first one is findable through
47 the <<archive_head>> slot of the archive. Set it with
48 <<bfd_set_archive_head>> (q.v.). A given BFD may be in only one
49 open output archive at a time.
50
51 As expected, the BFD archive code is more general than the
52 archive code of any given environment. BFD archives may
53 contain files of different formats (e.g., a.out and coff) and
54 even different architectures. You may even place archives
55 recursively into archives!
56
57 This can cause unexpected confusion, since some archive
58 formats are more expressive than others. For instance, Intel
59 COFF archives can preserve long filenames; SunOS a.out archives
60 cannot. If you move a file from the first to the second
61 format and back again, the filename may be truncated.
62 Likewise, different a.out environments have different
63 conventions as to how they truncate filenames, whether they
64 preserve directory names in filenames, etc. When
65 interoperating with native tools, be sure your files are
66 homogeneous.
67
68 Beware: most of these formats do not react well to the
69 presence of spaces in filenames. We do the best we can, but
70 can't always handle this case due to restrictions in the format of
71 archives. Many Unix utilities are braindead in regards to
72 spaces and such in filenames anyway, so this shouldn't be much
73 of a restriction.
74
75 Archives are supported in BFD in <<archive.c>>.
76
77 SUBSECTION
78 Archive functions
79 */
80
81 /* Assumes:
82 o - all archive elements start on an even boundary, newline padded;
83 o - all arch headers are char *;
84 o - all arch headers are the same size (across architectures).
85 */
86
87 /* Some formats provide a way to cram a long filename into the short
88 (16 chars) space provided by a BSD archive. The trick is: make a
89 special "file" in the front of the archive, sort of like the SYMDEF
90 entry. If the filename is too long to fit, put it in the extended
91 name table, and use its index as the filename. To prevent
92 confusion prepend the index with a space. This means you can't
93 have filenames that start with a space, but then again, many Unix
94 utilities can't handle that anyway.
95
96 This scheme unfortunately requires that you stand on your head in
97 order to write an archive since you need to put a magic file at the
98 front, and need to touch every entry to do so. C'est la vie.
99
100 We support two variants of this idea:
101 The SVR4 format (extended name table is named "//"),
102 and an extended pseudo-BSD variant (extended name table is named
103 "ARFILENAMES/"). The origin of the latter format is uncertain.
104
105 BSD 4.4 uses a third scheme: It writes a long filename
106 directly after the header. This allows 'ar q' to work.
107 */
108
109 /* Summary of archive member names:
110
111 Symbol table (must be first):
112 "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib.
113 "/ " - Symbol table, system 5 style.
114
115 Long name table (must be before regular file members):
116 "// " - Long name table, System 5 R4 style.
117 "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4).
118
119 Regular file members with short names:
120 "filename.o/ " - Regular file, System 5 style (embedded spaces ok).
121 "filename.o " - Regular file, Berkeley style (no embedded spaces).
122
123 Regular files with long names (or embedded spaces, for BSD variants):
124 "/18 " - SVR4 style, name at offset 18 in name table.
125 "#1/23 " - Long name (or embedded spaces) 23 characters long,
126 BSD 4.4 style, full name follows header.
127 " 18 " - Long name 18 characters long, extended pseudo-BSD.
128 */
129
130 #include "sysdep.h"
131 #include "bfd.h"
132 #include "libiberty.h"
133 #include "libbfd.h"
134 #include "aout/ar.h"
135 #include "aout/ranlib.h"
136 #include "safe-ctype.h"
137 #include "hashtab.h"
138 #include "filenames.h"
139
140 #ifndef errno
141 extern int errno;
142 #endif
143
144 /* We keep a cache of archive filepointers to archive elements to
145 speed up searching the archive by filepos. We only add an entry to
146 the cache when we actually read one. We also don't sort the cache;
147 it's generally short enough to search linearly.
148 Note that the pointers here point to the front of the ar_hdr, not
149 to the front of the contents! */
150 struct ar_cache
151 {
152 file_ptr ptr;
153 bfd *arbfd;
154 };
155
156 #define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
157 #define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
158
159 #define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
160 #define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header)
161
162 /* True iff NAME designated a BSD 4.4 extended name. */
163
164 #define is_bsd44_extended_name(NAME) \
165 (NAME[0] == '#' && NAME[1] == '1' && NAME[2] == '/' && ISDIGIT (NAME[3]))
166 \f
167 void
168 _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
169 {
170 static char buf[20];
171 size_t len;
172
173 snprintf (buf, sizeof (buf), fmt, val);
174 len = strlen (buf);
175 if (len < n)
176 {
177 memcpy (p, buf, len);
178 memset (p + len, ' ', n - len);
179 }
180 else
181 memcpy (p, buf, n);
182 }
183
184 bfd_boolean
185 _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
186 {
187 static char buf[21];
188 size_t len;
189
190 snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
191 len = strlen (buf);
192 if (len > n)
193 {
194 bfd_set_error (bfd_error_file_too_big);
195 return FALSE;
196 }
197 if (len < n)
198 {
199 memcpy (p, buf, len);
200 memset (p + len, ' ', n - len);
201 }
202 else
203 memcpy (p, buf, n);
204 return TRUE;
205 }
206 \f
207 bfd_boolean
208 _bfd_generic_mkarchive (bfd *abfd)
209 {
210 bfd_size_type amt = sizeof (struct artdata);
211
212 abfd->tdata.aout_ar_data = (struct artdata *) bfd_zalloc (abfd, amt);
213 if (bfd_ardata (abfd) == NULL)
214 return FALSE;
215
216 /* Already cleared by bfd_zalloc above.
217 bfd_ardata (abfd)->cache = NULL;
218 bfd_ardata (abfd)->archive_head = NULL;
219 bfd_ardata (abfd)->symdefs = NULL;
220 bfd_ardata (abfd)->extended_names = NULL;
221 bfd_ardata (abfd)->extended_names_size = 0;
222 bfd_ardata (abfd)->tdata = NULL; */
223
224 return TRUE;
225 }
226
227 /*
228 FUNCTION
229 bfd_get_next_mapent
230
231 SYNOPSIS
232 symindex bfd_get_next_mapent
233 (bfd *abfd, symindex previous, carsym **sym);
234
235 DESCRIPTION
236 Step through archive @var{abfd}'s symbol table (if it
237 has one). Successively update @var{sym} with the next symbol's
238 information, returning that symbol's (internal) index into the
239 symbol table.
240
241 Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get
242 the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already
243 got the last one.
244
245 A <<carsym>> is a canonical archive symbol. The only
246 user-visible element is its name, a null-terminated string.
247 */
248
249 symindex
250 bfd_get_next_mapent (bfd *abfd, symindex prev, carsym **entry)
251 {
252 if (!bfd_has_map (abfd))
253 {
254 bfd_set_error (bfd_error_invalid_operation);
255 return BFD_NO_MORE_SYMBOLS;
256 }
257
258 if (prev == BFD_NO_MORE_SYMBOLS)
259 prev = 0;
260 else
261 ++prev;
262 if (prev >= bfd_ardata (abfd)->symdef_count)
263 return BFD_NO_MORE_SYMBOLS;
264
265 *entry = (bfd_ardata (abfd)->symdefs + prev);
266 return prev;
267 }
268
269 /* To be called by backends only. */
270
271 bfd *
272 _bfd_create_empty_archive_element_shell (bfd *obfd)
273 {
274 return _bfd_new_bfd_contained_in (obfd);
275 }
276
277 /*
278 FUNCTION
279 bfd_set_archive_head
280
281 SYNOPSIS
282 bfd_boolean bfd_set_archive_head (bfd *output, bfd *new_head);
283
284 DESCRIPTION
285 Set the head of the chain of
286 BFDs contained in the archive @var{output} to @var{new_head}.
287 */
288
289 bfd_boolean
290 bfd_set_archive_head (bfd *output_archive, bfd *new_head)
291 {
292 output_archive->archive_head = new_head;
293 return TRUE;
294 }
295
296 bfd *
297 _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
298 {
299 htab_t hash_table = bfd_ardata (arch_bfd)->cache;
300 struct ar_cache m;
301
302 m.ptr = filepos;
303
304 if (hash_table)
305 {
306 struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m);
307 if (!entry)
308 return NULL;
309 else
310 return entry->arbfd;
311 }
312 else
313 return NULL;
314 }
315
316 static hashval_t
317 hash_file_ptr (const void * p)
318 {
319 return (hashval_t) (((struct ar_cache *) p)->ptr);
320 }
321
322 /* Returns non-zero if P1 and P2 are equal. */
323
324 static int
325 eq_file_ptr (const void * p1, const void * p2)
326 {
327 struct ar_cache *arc1 = (struct ar_cache *) p1;
328 struct ar_cache *arc2 = (struct ar_cache *) p2;
329 return arc1->ptr == arc2->ptr;
330 }
331
332 /* The calloc function doesn't always take size_t (e.g. on VMS)
333 so wrap it to avoid a compile time warning. */
334
335 static void *
336 _bfd_calloc_wrapper (size_t a, size_t b)
337 {
338 return calloc (a, b);
339 }
340
341 /* Kind of stupid to call cons for each one, but we don't do too many. */
342
343 bfd_boolean
344 _bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt)
345 {
346 struct ar_cache *cache;
347 htab_t hash_table = bfd_ardata (arch_bfd)->cache;
348
349 /* If the hash table hasn't been created, create it. */
350 if (hash_table == NULL)
351 {
352 hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr,
353 NULL, _bfd_calloc_wrapper, free);
354 if (hash_table == NULL)
355 return FALSE;
356 bfd_ardata (arch_bfd)->cache = hash_table;
357 }
358
359 /* Insert new_elt into the hash table by filepos. */
360 cache = (struct ar_cache *) bfd_zalloc (arch_bfd, sizeof (struct ar_cache));
361 cache->ptr = filepos;
362 cache->arbfd = new_elt;
363 *htab_find_slot (hash_table, (const void *) cache, INSERT) = cache;
364
365 return TRUE;
366 }
367 \f
368 static bfd *
369 _bfd_find_nested_archive (bfd *arch_bfd, const char *filename)
370 {
371 bfd *abfd;
372 const char *target;
373
374 for (abfd = arch_bfd->nested_archives;
375 abfd != NULL;
376 abfd = abfd->archive_next)
377 {
378 if (filename_cmp (filename, abfd->filename) == 0)
379 return abfd;
380 }
381 target = NULL;
382 if (!arch_bfd->target_defaulted)
383 target = arch_bfd->xvec->name;
384 abfd = bfd_openr (filename, target);
385 if (abfd)
386 {
387 abfd->archive_next = arch_bfd->nested_archives;
388 arch_bfd->nested_archives = abfd;
389 }
390 return abfd;
391 }
392
393 /* The name begins with space. Hence the rest of the name is an index into
394 the string table. */
395
396 static char *
397 get_extended_arelt_filename (bfd *arch, const char *name, file_ptr *originp)
398 {
399 unsigned long table_index = 0;
400 const char *endp;
401
402 /* Should extract string so that I can guarantee not to overflow into
403 the next region, but I'm too lazy. */
404 errno = 0;
405 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
406 table_index = strtol (name + 1, (char **) &endp, 10);
407 if (errno != 0 || table_index >= bfd_ardata (arch)->extended_names_size)
408 {
409 bfd_set_error (bfd_error_malformed_archive);
410 return NULL;
411 }
412 /* In a thin archive, a member of an archive-within-an-archive
413 will have the offset in the inner archive encoded here. */
414 if (bfd_is_thin_archive (arch) && endp != NULL && *endp == ':')
415 {
416 file_ptr origin = strtol (endp + 1, NULL, 10);
417
418 if (errno != 0)
419 {
420 bfd_set_error (bfd_error_malformed_archive);
421 return NULL;
422 }
423 *originp = origin;
424 }
425 else
426 *originp = 0;
427
428 return bfd_ardata (arch)->extended_names + table_index;
429 }
430
431 /* This functions reads an arch header and returns an areltdata pointer, or
432 NULL on error.
433
434 Presumes the file pointer is already in the right place (ie pointing
435 to the ar_hdr in the file). Moves the file pointer; on success it
436 should be pointing to the front of the file contents; on failure it
437 could have been moved arbitrarily. */
438
439 void *
440 _bfd_generic_read_ar_hdr (bfd *abfd)
441 {
442 return _bfd_generic_read_ar_hdr_mag (abfd, NULL);
443 }
444
445 /* Alpha ECOFF uses an optional different ARFMAG value, so we have a
446 variant of _bfd_generic_read_ar_hdr which accepts a magic string. */
447
448 void *
449 _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
450 {
451 struct ar_hdr hdr;
452 char *hdrp = (char *) &hdr;
453 bfd_size_type parsed_size;
454 struct areltdata *ared;
455 char *filename = NULL;
456 bfd_size_type namelen = 0;
457 bfd_size_type allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr);
458 char *allocptr = 0;
459 file_ptr origin = 0;
460 unsigned int extra_size = 0;
461 char fmag_save;
462 int scan;
463
464 if (bfd_bread (hdrp, sizeof (struct ar_hdr), abfd) != sizeof (struct ar_hdr))
465 {
466 if (bfd_get_error () != bfd_error_system_call)
467 bfd_set_error (bfd_error_no_more_archived_files);
468 return NULL;
469 }
470 if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0
471 && (mag == NULL
472 || strncmp (hdr.ar_fmag, mag, 2) != 0))
473 {
474 bfd_set_error (bfd_error_malformed_archive);
475 return NULL;
476 }
477
478 errno = 0;
479 fmag_save = hdr.ar_fmag[0];
480 hdr.ar_fmag[0] = 0;
481 scan = sscanf (hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size);
482 hdr.ar_fmag[0] = fmag_save;
483 if (scan != 1)
484 {
485 bfd_set_error (bfd_error_malformed_archive);
486 return NULL;
487 }
488
489 /* Extract the filename from the archive - there are two ways to
490 specify an extended name table, either the first char of the
491 name is a space, or it's a slash. */
492 if ((hdr.ar_name[0] == '/'
493 || (hdr.ar_name[0] == ' '
494 && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL))
495 && bfd_ardata (abfd)->extended_names != NULL)
496 {
497 filename = get_extended_arelt_filename (abfd, hdr.ar_name, &origin);
498 if (filename == NULL)
499 return NULL;
500 }
501 /* BSD4.4-style long filename. */
502 else if (is_bsd44_extended_name (hdr.ar_name))
503 {
504 /* BSD-4.4 extended name */
505 namelen = atoi (&hdr.ar_name[3]);
506 allocsize += namelen + 1;
507 parsed_size -= namelen;
508 extra_size = namelen;
509
510 allocptr = (char *) bfd_zalloc (abfd, allocsize);
511 if (allocptr == NULL)
512 return NULL;
513 filename = (allocptr
514 + sizeof (struct areltdata)
515 + sizeof (struct ar_hdr));
516 if (bfd_bread (filename, namelen, abfd) != namelen)
517 {
518 if (bfd_get_error () != bfd_error_system_call)
519 bfd_set_error (bfd_error_no_more_archived_files);
520 return NULL;
521 }
522 filename[namelen] = '\0';
523 }
524 else
525 {
526 /* We judge the end of the name by looking for '/' or ' '.
527 Note: The SYSV format (terminated by '/') allows embedded
528 spaces, so only look for ' ' if we don't find '/'. */
529
530 char *e;
531 e = (char *) memchr (hdr.ar_name, '\0', ar_maxnamelen (abfd));
532 if (e == NULL)
533 {
534 e = (char *) memchr (hdr.ar_name, '/', ar_maxnamelen (abfd));
535 if (e == NULL)
536 e = (char *) memchr (hdr.ar_name, ' ', ar_maxnamelen (abfd));
537 }
538
539 if (e != NULL)
540 namelen = e - hdr.ar_name;
541 else
542 {
543 /* If we didn't find a termination character, then the name
544 must be the entire field. */
545 namelen = ar_maxnamelen (abfd);
546 }
547
548 allocsize += namelen + 1;
549 }
550
551 if (!allocptr)
552 {
553 allocptr = (char *) bfd_zalloc (abfd, allocsize);
554 if (allocptr == NULL)
555 return NULL;
556 }
557
558 ared = (struct areltdata *) allocptr;
559
560 ared->arch_header = allocptr + sizeof (struct areltdata);
561 memcpy (ared->arch_header, &hdr, sizeof (struct ar_hdr));
562 ared->parsed_size = parsed_size;
563 ared->extra_size = extra_size;
564 ared->origin = origin;
565
566 if (filename != NULL)
567 ared->filename = filename;
568 else
569 {
570 ared->filename = allocptr + (sizeof (struct areltdata) +
571 sizeof (struct ar_hdr));
572 if (namelen)
573 memcpy (ared->filename, hdr.ar_name, namelen);
574 ared->filename[namelen] = '\0';
575 }
576
577 return ared;
578 }
579 \f
580 /* Append the relative pathname for a member of the thin archive
581 to the pathname of the directory containing the archive. */
582
583 char *
584 _bfd_append_relative_path (bfd *arch, char *elt_name)
585 {
586 const char *arch_name = arch->filename;
587 const char *base_name = lbasename (arch_name);
588 size_t prefix_len;
589 char *filename;
590
591 if (base_name == arch_name)
592 return elt_name;
593
594 prefix_len = base_name - arch_name;
595 filename = (char *) bfd_alloc (arch, prefix_len + strlen (elt_name) + 1);
596 if (filename == NULL)
597 return NULL;
598
599 strncpy (filename, arch_name, prefix_len);
600 strcpy (filename + prefix_len, elt_name);
601 return filename;
602 }
603
604 /* This is an internal function; it's mainly used when indexing
605 through the archive symbol table, but also used to get the next
606 element, since it handles the bookkeeping so nicely for us. */
607
608 bfd *
609 _bfd_get_elt_at_filepos (bfd *archive, file_ptr filepos)
610 {
611 struct areltdata *new_areldata;
612 bfd *n_nfd;
613 char *filename;
614
615 n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
616 if (n_nfd)
617 return n_nfd;
618
619 if (0 > bfd_seek (archive, filepos, SEEK_SET))
620 return NULL;
621
622 if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL)
623 return NULL;
624
625 filename = new_areldata->filename;
626
627 if (bfd_is_thin_archive (archive))
628 {
629 const char *target;
630
631 /* This is a proxy entry for an external file. */
632 if (! IS_ABSOLUTE_PATH (filename))
633 {
634 filename = _bfd_append_relative_path (archive, filename);
635 if (filename == NULL)
636 return NULL;
637 }
638
639 if (new_areldata->origin > 0)
640 {
641 /* This proxy entry refers to an element of a nested archive.
642 Locate the member of that archive and return a bfd for it. */
643 bfd *ext_arch = _bfd_find_nested_archive (archive, filename);
644
645 if (ext_arch == NULL
646 || ! bfd_check_format (ext_arch, bfd_archive))
647 {
648 bfd_release (archive, new_areldata);
649 return NULL;
650 }
651 n_nfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
652 if (n_nfd == NULL)
653 {
654 bfd_release (archive, new_areldata);
655 return NULL;
656 }
657 n_nfd->proxy_origin = bfd_tell (archive);
658 return n_nfd;
659 }
660 /* It's not an element of a nested archive;
661 open the external file as a bfd. */
662 target = NULL;
663 if (!archive->target_defaulted)
664 target = archive->xvec->name;
665 n_nfd = bfd_openr (filename, target);
666 if (n_nfd == NULL)
667 bfd_set_error (bfd_error_malformed_archive);
668 }
669 else
670 {
671 n_nfd = _bfd_create_empty_archive_element_shell (archive);
672 }
673
674 if (n_nfd == NULL)
675 {
676 bfd_release (archive, new_areldata);
677 return NULL;
678 }
679
680 n_nfd->proxy_origin = bfd_tell (archive);
681
682 if (bfd_is_thin_archive (archive))
683 {
684 n_nfd->origin = 0;
685 }
686 else
687 {
688 n_nfd->origin = n_nfd->proxy_origin;
689 n_nfd->filename = filename;
690 }
691
692 n_nfd->arelt_data = new_areldata;
693
694 /* Copy BFD_COMPRESS and BFD_DECOMPRESS flags. */
695 n_nfd->flags |= archive->flags & (BFD_COMPRESS | BFD_DECOMPRESS);
696
697 if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
698 return n_nfd;
699
700 bfd_release (archive, new_areldata);
701 return NULL;
702 }
703
704 /* Return the BFD which is referenced by the symbol in ABFD indexed by
705 SYM_INDEX. SYM_INDEX should have been returned by bfd_get_next_mapent. */
706
707 bfd *
708 _bfd_generic_get_elt_at_index (bfd *abfd, symindex sym_index)
709 {
710 carsym *entry;
711
712 entry = bfd_ardata (abfd)->symdefs + sym_index;
713 return _bfd_get_elt_at_filepos (abfd, entry->file_offset);
714 }
715
716 /*
717 FUNCTION
718 bfd_openr_next_archived_file
719
720 SYNOPSIS
721 bfd *bfd_openr_next_archived_file (bfd *archive, bfd *previous);
722
723 DESCRIPTION
724 Provided a BFD, @var{archive}, containing an archive and NULL, open
725 an input BFD on the first contained element and returns that.
726 Subsequent calls should pass
727 the archive and the previous return value to return a created
728 BFD to the next contained element. NULL is returned when there
729 are no more.
730 */
731
732 bfd *
733 bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
734 {
735 if ((bfd_get_format (archive) != bfd_archive)
736 || (archive->direction == write_direction))
737 {
738 bfd_set_error (bfd_error_invalid_operation);
739 return NULL;
740 }
741
742 return BFD_SEND (archive,
743 openr_next_archived_file, (archive, last_file));
744 }
745
746 bfd *
747 bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
748 {
749 file_ptr filestart;
750
751 if (!last_file)
752 filestart = bfd_ardata (archive)->first_file_filepos;
753 else
754 {
755 bfd_size_type size = arelt_size (last_file);
756
757 filestart = last_file->proxy_origin;
758 if (! bfd_is_thin_archive (archive))
759 filestart += size;
760 /* Pad to an even boundary...
761 Note that last_file->origin can be odd in the case of
762 BSD-4.4-style element with a long odd size. */
763 filestart += filestart % 2;
764 }
765
766 return _bfd_get_elt_at_filepos (archive, filestart);
767 }
768
769 const bfd_target *
770 bfd_generic_archive_p (bfd *abfd)
771 {
772 struct artdata *tdata_hold;
773 char armag[SARMAG + 1];
774 bfd_size_type amt;
775
776 if (bfd_bread (armag, SARMAG, abfd) != SARMAG)
777 {
778 if (bfd_get_error () != bfd_error_system_call)
779 bfd_set_error (bfd_error_wrong_format);
780 return NULL;
781 }
782
783 bfd_is_thin_archive (abfd) = (strncmp (armag, ARMAGT, SARMAG) == 0);
784
785 if (strncmp (armag, ARMAG, SARMAG) != 0
786 && strncmp (armag, ARMAGB, SARMAG) != 0
787 && ! bfd_is_thin_archive (abfd))
788 return NULL;
789
790 tdata_hold = bfd_ardata (abfd);
791
792 amt = sizeof (struct artdata);
793 bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
794 if (bfd_ardata (abfd) == NULL)
795 {
796 bfd_ardata (abfd) = tdata_hold;
797 return NULL;
798 }
799
800 bfd_ardata (abfd)->first_file_filepos = SARMAG;
801 /* Cleared by bfd_zalloc above.
802 bfd_ardata (abfd)->cache = NULL;
803 bfd_ardata (abfd)->archive_head = NULL;
804 bfd_ardata (abfd)->symdefs = NULL;
805 bfd_ardata (abfd)->extended_names = NULL;
806 bfd_ardata (abfd)->extended_names_size = 0;
807 bfd_ardata (abfd)->tdata = NULL; */
808
809 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
810 || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
811 {
812 if (bfd_get_error () != bfd_error_system_call)
813 bfd_set_error (bfd_error_wrong_format);
814 bfd_release (abfd, bfd_ardata (abfd));
815 bfd_ardata (abfd) = tdata_hold;
816 return NULL;
817 }
818
819 if (abfd->target_defaulted && bfd_has_map (abfd))
820 {
821 bfd *first;
822
823 /* This archive has a map, so we may presume that the contents
824 are object files. Make sure that if the first file in the
825 archive can be recognized as an object file, it is for this
826 target. If not, assume that this is the wrong format. If
827 the first file is not an object file, somebody is doing
828 something weird, and we permit it so that ar -t will work.
829
830 This is done because any normal format will recognize any
831 normal archive, regardless of the format of the object files.
832 We do accept an empty archive. */
833
834 first = bfd_openr_next_archived_file (abfd, NULL);
835 if (first != NULL)
836 {
837 first->target_defaulted = FALSE;
838 if (bfd_check_format (first, bfd_object)
839 && first->xvec != abfd->xvec)
840 {
841 bfd_set_error (bfd_error_wrong_object_format);
842 bfd_ardata (abfd) = tdata_hold;
843 return NULL;
844 }
845 /* And we ought to close `first' here too. */
846 }
847 }
848
849 return abfd->xvec;
850 }
851
852 /* Some constants for a 32 bit BSD archive structure. We do not
853 support 64 bit archives presently; so far as I know, none actually
854 exist. Supporting them would require changing these constants, and
855 changing some H_GET_32 to H_GET_64. */
856
857 /* The size of an external symdef structure. */
858 #define BSD_SYMDEF_SIZE 8
859
860 /* The offset from the start of a symdef structure to the file offset. */
861 #define BSD_SYMDEF_OFFSET_SIZE 4
862
863 /* The size of the symdef count. */
864 #define BSD_SYMDEF_COUNT_SIZE 4
865
866 /* The size of the string count. */
867 #define BSD_STRING_COUNT_SIZE 4
868
869 /* Read a BSD-style archive symbol table. Returns FALSE on error,
870 TRUE otherwise. */
871
872 static bfd_boolean
873 do_slurp_bsd_armap (bfd *abfd)
874 {
875 struct areltdata *mapdata;
876 unsigned int counter;
877 bfd_byte *raw_armap, *rbase;
878 struct artdata *ardata = bfd_ardata (abfd);
879 char *stringbase;
880 bfd_size_type parsed_size, amt;
881 carsym *set;
882
883 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
884 if (mapdata == NULL)
885 return FALSE;
886 parsed_size = mapdata->parsed_size;
887 bfd_release (abfd, mapdata); /* Don't need it any more. */
888
889 raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
890 if (raw_armap == NULL)
891 return FALSE;
892
893 if (bfd_bread (raw_armap, parsed_size, abfd) != parsed_size)
894 {
895 if (bfd_get_error () != bfd_error_system_call)
896 bfd_set_error (bfd_error_malformed_archive);
897 byebye:
898 bfd_release (abfd, raw_armap);
899 return FALSE;
900 }
901
902 ardata->symdef_count = H_GET_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE;
903
904 if (ardata->symdef_count * BSD_SYMDEF_SIZE >
905 parsed_size - BSD_SYMDEF_COUNT_SIZE)
906 {
907 /* Probably we're using the wrong byte ordering. */
908 bfd_set_error (bfd_error_wrong_format);
909 goto byebye;
910 }
911
912 ardata->cache = 0;
913 rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE;
914 stringbase = ((char *) rbase
915 + ardata->symdef_count * BSD_SYMDEF_SIZE
916 + BSD_STRING_COUNT_SIZE);
917 amt = ardata->symdef_count * sizeof (carsym);
918 ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
919 if (!ardata->symdefs)
920 return FALSE;
921
922 for (counter = 0, set = ardata->symdefs;
923 counter < ardata->symdef_count;
924 counter++, set++, rbase += BSD_SYMDEF_SIZE)
925 {
926 set->name = H_GET_32 (abfd, rbase) + stringbase;
927 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
928 }
929
930 ardata->first_file_filepos = bfd_tell (abfd);
931 /* Pad to an even boundary if you have to. */
932 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
933 /* FIXME, we should provide some way to free raw_ardata when
934 we are done using the strings from it. For now, it seems
935 to be allocated on an objalloc anyway... */
936 bfd_has_map (abfd) = TRUE;
937 return TRUE;
938 }
939
940 /* Read a COFF archive symbol table. Returns FALSE on error, TRUE
941 otherwise. */
942
943 static bfd_boolean
944 do_slurp_coff_armap (bfd *abfd)
945 {
946 struct areltdata *mapdata;
947 int *raw_armap, *rawptr;
948 struct artdata *ardata = bfd_ardata (abfd);
949 char *stringbase;
950 bfd_size_type stringsize;
951 bfd_size_type parsed_size;
952 carsym *carsyms;
953 bfd_size_type nsymz; /* Number of symbols in armap. */
954 bfd_vma (*swap) (const void *);
955 char int_buf[sizeof (long)];
956 bfd_size_type carsym_size, ptrsize;
957 unsigned int i;
958
959 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
960 if (mapdata == NULL)
961 return FALSE;
962 parsed_size = mapdata->parsed_size;
963 bfd_release (abfd, mapdata); /* Don't need it any more. */
964
965 if (bfd_bread (int_buf, 4, abfd) != 4)
966 {
967 if (bfd_get_error () != bfd_error_system_call)
968 bfd_set_error (bfd_error_malformed_archive);
969 return FALSE;
970 }
971 /* It seems that all numeric information in a coff archive is always
972 in big endian format, nomatter the host or target. */
973 swap = bfd_getb32;
974 nsymz = bfd_getb32 (int_buf);
975 stringsize = parsed_size - (4 * nsymz) - 4;
976
977 /* ... except that some archive formats are broken, and it may be our
978 fault - the i960 little endian coff sometimes has big and sometimes
979 little, because our tools changed. Here's a horrible hack to clean
980 up the crap. */
981
982 if (stringsize > 0xfffff
983 && bfd_get_arch (abfd) == bfd_arch_i960
984 && bfd_get_flavour (abfd) == bfd_target_coff_flavour)
985 {
986 /* This looks dangerous, let's do it the other way around. */
987 nsymz = bfd_getl32 (int_buf);
988 stringsize = parsed_size - (4 * nsymz) - 4;
989 swap = bfd_getl32;
990 }
991
992 /* The coff armap must be read sequentially. So we construct a
993 bsd-style one in core all at once, for simplicity. */
994
995 if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym))
996 return FALSE;
997
998 carsym_size = (nsymz * sizeof (carsym));
999 ptrsize = (4 * nsymz);
1000
1001 if (carsym_size + stringsize + 1 <= carsym_size)
1002 return FALSE;
1003
1004 ardata->symdefs = (struct carsym *) bfd_zalloc (abfd,
1005 carsym_size + stringsize + 1);
1006 if (ardata->symdefs == NULL)
1007 return FALSE;
1008 carsyms = ardata->symdefs;
1009 stringbase = ((char *) ardata->symdefs) + carsym_size;
1010
1011 /* Allocate and read in the raw offsets. */
1012 raw_armap = (int *) bfd_alloc (abfd, ptrsize);
1013 if (raw_armap == NULL)
1014 goto release_symdefs;
1015 if (bfd_bread (raw_armap, ptrsize, abfd) != ptrsize
1016 || (bfd_bread (stringbase, stringsize, abfd) != stringsize))
1017 {
1018 if (bfd_get_error () != bfd_error_system_call)
1019 bfd_set_error (bfd_error_malformed_archive);
1020 goto release_raw_armap;
1021 }
1022
1023 /* OK, build the carsyms. */
1024 for (i = 0; i < nsymz; i++)
1025 {
1026 rawptr = raw_armap + i;
1027 carsyms->file_offset = swap ((bfd_byte *) rawptr);
1028 carsyms->name = stringbase;
1029 stringbase += strlen (stringbase) + 1;
1030 carsyms++;
1031 }
1032 *stringbase = 0;
1033
1034 ardata->symdef_count = nsymz;
1035 ardata->first_file_filepos = bfd_tell (abfd);
1036 /* Pad to an even boundary if you have to. */
1037 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1038
1039 bfd_has_map (abfd) = TRUE;
1040 bfd_release (abfd, raw_armap);
1041
1042 /* Check for a second archive header (as used by PE). */
1043 {
1044 struct areltdata *tmp;
1045
1046 bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET);
1047 tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1048 if (tmp != NULL)
1049 {
1050 if (tmp->arch_header[0] == '/'
1051 && tmp->arch_header[1] == ' ')
1052 {
1053 ardata->first_file_filepos +=
1054 (tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
1055 }
1056 bfd_release (abfd, tmp);
1057 }
1058 }
1059
1060 return TRUE;
1061
1062 release_raw_armap:
1063 bfd_release (abfd, raw_armap);
1064 release_symdefs:
1065 bfd_release (abfd, (ardata)->symdefs);
1066 return FALSE;
1067 }
1068
1069 /* This routine can handle either coff-style or bsd-style armaps
1070 (archive symbol table). Returns FALSE on error, TRUE otherwise */
1071
1072 bfd_boolean
1073 bfd_slurp_armap (bfd *abfd)
1074 {
1075 char nextname[17];
1076 int i = bfd_bread (nextname, 16, abfd);
1077
1078 if (i == 0)
1079 return TRUE;
1080 if (i != 16)
1081 return FALSE;
1082
1083 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1084 return FALSE;
1085
1086 if (CONST_STRNEQ (nextname, "__.SYMDEF ")
1087 || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */
1088 return do_slurp_bsd_armap (abfd);
1089 else if (CONST_STRNEQ (nextname, "/ "))
1090 return do_slurp_coff_armap (abfd);
1091 else if (CONST_STRNEQ (nextname, "/SYM64/ "))
1092 {
1093 /* 64bit ELF (Irix 6) archive. */
1094 #ifdef BFD64
1095 extern bfd_boolean bfd_elf64_archive_slurp_armap (bfd *);
1096 return bfd_elf64_archive_slurp_armap (abfd);
1097 #else
1098 bfd_set_error (bfd_error_wrong_format);
1099 return FALSE;
1100 #endif
1101 }
1102 else if (CONST_STRNEQ (nextname, "#1/20 "))
1103 {
1104 /* Mach-O has a special name for armap when the map is sorted by name.
1105 However because this name has a space it is slightly more difficult
1106 to check it. */
1107 struct ar_hdr hdr;
1108 char extname[21];
1109
1110 if (bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
1111 return FALSE;
1112 /* Read the extended name. We know its length. */
1113 if (bfd_bread (extname, 20, abfd) != 20)
1114 return FALSE;
1115 if (bfd_seek (abfd, -(file_ptr) (sizeof (hdr) + 20), SEEK_CUR) != 0)
1116 return FALSE;
1117 if (CONST_STRNEQ (extname, "__.SYMDEF SORTED")
1118 || CONST_STRNEQ (extname, "__.SYMDEF"))
1119 return do_slurp_bsd_armap (abfd);
1120 }
1121
1122 bfd_has_map (abfd) = FALSE;
1123 return TRUE;
1124 }
1125 \f
1126 /* Returns FALSE on error, TRUE otherwise. */
1127 /* Flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the
1128 header is in a slightly different order and the map name is '/'.
1129 This flavour is used by hp300hpux. */
1130
1131 #define HPUX_SYMDEF_COUNT_SIZE 2
1132
1133 bfd_boolean
1134 bfd_slurp_bsd_armap_f2 (bfd *abfd)
1135 {
1136 struct areltdata *mapdata;
1137 char nextname[17];
1138 unsigned int counter;
1139 bfd_byte *raw_armap, *rbase;
1140 struct artdata *ardata = bfd_ardata (abfd);
1141 char *stringbase;
1142 unsigned int stringsize;
1143 unsigned int left;
1144 bfd_size_type amt;
1145 carsym *set;
1146 int i = bfd_bread (nextname, 16, abfd);
1147
1148 if (i == 0)
1149 return TRUE;
1150 if (i != 16)
1151 return FALSE;
1152
1153 /* The archive has at least 16 bytes in it. */
1154 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1155 return FALSE;
1156
1157 if (CONST_STRNEQ (nextname, "__.SYMDEF ")
1158 || CONST_STRNEQ (nextname, "__.SYMDEF/ ")) /* Old Linux archives. */
1159 return do_slurp_bsd_armap (abfd);
1160
1161 if (! CONST_STRNEQ (nextname, "/ "))
1162 {
1163 bfd_has_map (abfd) = FALSE;
1164 return TRUE;
1165 }
1166
1167 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1168 if (mapdata == NULL)
1169 return FALSE;
1170
1171 if (mapdata->parsed_size < HPUX_SYMDEF_COUNT_SIZE + BSD_STRING_COUNT_SIZE)
1172 {
1173 wrong_format:
1174 bfd_set_error (bfd_error_wrong_format);
1175 byebye:
1176 bfd_release (abfd, mapdata);
1177 return FALSE;
1178 }
1179 left = mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE - BSD_STRING_COUNT_SIZE;
1180
1181 amt = mapdata->parsed_size;
1182 raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
1183 if (raw_armap == NULL)
1184 goto byebye;
1185
1186 if (bfd_bread (raw_armap, amt, abfd) != amt)
1187 {
1188 if (bfd_get_error () != bfd_error_system_call)
1189 bfd_set_error (bfd_error_malformed_archive);
1190 goto byebye;
1191 }
1192
1193 ardata->symdef_count = H_GET_16 (abfd, raw_armap);
1194
1195 ardata->cache = 0;
1196
1197 stringsize = H_GET_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE);
1198 if (stringsize > left)
1199 goto wrong_format;
1200 left -= stringsize;
1201
1202 /* Skip sym count and string sz. */
1203 stringbase = ((char *) raw_armap
1204 + HPUX_SYMDEF_COUNT_SIZE
1205 + BSD_STRING_COUNT_SIZE);
1206 rbase = (bfd_byte *) stringbase + stringsize;
1207 amt = ardata->symdef_count * BSD_SYMDEF_SIZE;
1208 if (amt > left)
1209 goto wrong_format;
1210
1211 ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt);
1212 if (!ardata->symdefs)
1213 return FALSE;
1214
1215 for (counter = 0, set = ardata->symdefs;
1216 counter < ardata->symdef_count;
1217 counter++, set++, rbase += BSD_SYMDEF_SIZE)
1218 {
1219 set->name = H_GET_32 (abfd, rbase) + stringbase;
1220 set->file_offset = H_GET_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE);
1221 }
1222
1223 ardata->first_file_filepos = bfd_tell (abfd);
1224 /* Pad to an even boundary if you have to. */
1225 ardata->first_file_filepos += (ardata->first_file_filepos) % 2;
1226 /* FIXME, we should provide some way to free raw_ardata when
1227 we are done using the strings from it. For now, it seems
1228 to be allocated on an objalloc anyway... */
1229 bfd_has_map (abfd) = TRUE;
1230 return TRUE;
1231 }
1232 \f
1233 /** Extended name table.
1234
1235 Normally archives support only 14-character filenames.
1236
1237 Intel has extended the format: longer names are stored in a special
1238 element (the first in the archive, or second if there is an armap);
1239 the name in the ar_hdr is replaced by <space><index into filename
1240 element>. Index is the P.R. of an int (decimal). Data General have
1241 extended the format by using the prefix // for the special element. */
1242
1243 /* Returns FALSE on error, TRUE otherwise. */
1244
1245 bfd_boolean
1246 _bfd_slurp_extended_name_table (bfd *abfd)
1247 {
1248 char nextname[17];
1249 struct areltdata *namedata;
1250 bfd_size_type amt;
1251
1252 /* FIXME: Formatting sucks here, and in case of failure of BFD_READ,
1253 we probably don't want to return TRUE. */
1254 if (bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET) != 0)
1255 return FALSE;
1256
1257 if (bfd_bread (nextname, 16, abfd) == 16)
1258 {
1259 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
1260 return FALSE;
1261
1262 if (! CONST_STRNEQ (nextname, "ARFILENAMES/ ")
1263 && ! CONST_STRNEQ (nextname, "// "))
1264 {
1265 bfd_ardata (abfd)->extended_names = NULL;
1266 bfd_ardata (abfd)->extended_names_size = 0;
1267 return TRUE;
1268 }
1269
1270 namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
1271 if (namedata == NULL)
1272 return FALSE;
1273
1274 amt = namedata->parsed_size;
1275 if (amt + 1 == 0)
1276 goto byebye;
1277
1278 bfd_ardata (abfd)->extended_names_size = amt;
1279 bfd_ardata (abfd)->extended_names = (char *) bfd_zalloc (abfd, amt + 1);
1280 if (bfd_ardata (abfd)->extended_names == NULL)
1281 {
1282 byebye:
1283 bfd_release (abfd, namedata);
1284 return FALSE;
1285 }
1286
1287 if (bfd_bread (bfd_ardata (abfd)->extended_names, amt, abfd) != amt)
1288 {
1289 if (bfd_get_error () != bfd_error_system_call)
1290 bfd_set_error (bfd_error_malformed_archive);
1291 bfd_release (abfd, (bfd_ardata (abfd)->extended_names));
1292 bfd_ardata (abfd)->extended_names = NULL;
1293 goto byebye;
1294 }
1295
1296 /* Since the archive is supposed to be printable if it contains
1297 text, the entries in the list are newline-padded, not null
1298 padded. In SVR4-style archives, the names also have a
1299 trailing '/'. DOS/NT created archive often have \ in them
1300 We'll fix all problems here.. */
1301 {
1302 char *ext_names = bfd_ardata (abfd)->extended_names;
1303 char *temp = ext_names;
1304 char *limit = temp + namedata->parsed_size;
1305 for (; temp < limit; ++temp)
1306 {
1307 if (*temp == ARFMAG[1])
1308 temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
1309 if (*temp == '\\')
1310 *temp = '/';
1311 }
1312 *limit = '\0';
1313 }
1314
1315 /* Pad to an even boundary if you have to. */
1316 bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd);
1317 bfd_ardata (abfd)->first_file_filepos +=
1318 (bfd_ardata (abfd)->first_file_filepos) % 2;
1319
1320 /* FIXME, we can't release namedata here because it was allocated
1321 below extended_names on the objalloc... */
1322 }
1323 return TRUE;
1324 }
1325
1326 #ifdef VMS
1327
1328 /* Return a copy of the stuff in the filename between any :]> and a
1329 semicolon. */
1330
1331 static const char *
1332 normalize (bfd *abfd, const char *file)
1333 {
1334 const char *first;
1335 const char *last;
1336 char *copy;
1337
1338 first = file + strlen (file) - 1;
1339 last = first + 1;
1340
1341 while (first != file)
1342 {
1343 if (*first == ';')
1344 last = first;
1345 if (*first == ':' || *first == ']' || *first == '>')
1346 {
1347 first++;
1348 break;
1349 }
1350 first--;
1351 }
1352
1353 copy = bfd_alloc (abfd, last - first + 1);
1354 if (copy == NULL)
1355 return NULL;
1356
1357 memcpy (copy, first, last - first);
1358 copy[last - first] = 0;
1359
1360 return copy;
1361 }
1362
1363 #else
1364 static const char *
1365 normalize (bfd *abfd ATTRIBUTE_UNUSED, const char *file)
1366 {
1367 return lbasename (file);
1368 }
1369 #endif
1370
1371 /* Adjust a relative path name based on the reference path.
1372 For example:
1373
1374 Relative path Reference path Result
1375 ------------- -------------- ------
1376 bar.o lib.a bar.o
1377 foo/bar.o lib.a foo/bar.o
1378 bar.o foo/lib.a ../bar.o
1379 foo/bar.o baz/lib.a ../foo/bar.o
1380 bar.o ../lib.a <parent of current dir>/bar.o
1381 ; ../bar.o ../lib.a bar.o
1382 ; ../bar.o lib.a ../bar.o
1383 foo/bar.o ../lib.a <parent of current dir>/foo/bar.o
1384 bar.o ../../lib.a <grandparent>/<parent>/bar.o
1385 bar.o foo/baz/lib.a ../../bar.o
1386
1387 Note - the semicolons above are there to prevent the BFD chew
1388 utility from interpreting those lines as prototypes to put into
1389 the autogenerated bfd.h header...
1390
1391 Note - the string is returned in a static buffer. */
1392
1393 static const char *
1394 adjust_relative_path (const char * path, const char * ref_path)
1395 {
1396 static char *pathbuf = NULL;
1397 static unsigned int pathbuf_len = 0;
1398 const char *pathp;
1399 const char *refp;
1400 char * lpath;
1401 char * rpath;
1402 unsigned int len;
1403 unsigned int dir_up = 0;
1404 unsigned int dir_down = 0;
1405 char *newp;
1406 char * pwd = getpwd ();
1407 const char * down;
1408
1409 /* Remove symlinks, '.' and '..' from the paths, if possible. */
1410 lpath = lrealpath (path);
1411 pathp = lpath == NULL ? path : lpath;
1412
1413 rpath = lrealpath (ref_path);
1414 refp = rpath == NULL ? ref_path : rpath;
1415
1416 /* Remove common leading path elements. */
1417 for (;;)
1418 {
1419 const char *e1 = pathp;
1420 const char *e2 = refp;
1421
1422 while (*e1 && ! IS_DIR_SEPARATOR (*e1))
1423 ++e1;
1424 while (*e2 && ! IS_DIR_SEPARATOR (*e2))
1425 ++e2;
1426 if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
1427 || filename_ncmp (pathp, refp, e1 - pathp) != 0)
1428 break;
1429 pathp = e1 + 1;
1430 refp = e2 + 1;
1431 }
1432
1433 len = strlen (pathp) + 1;
1434 /* For each leading path element in the reference path,
1435 insert "../" into the path. */
1436 for (; *refp; ++refp)
1437 if (IS_DIR_SEPARATOR (*refp))
1438 {
1439 /* PR 12710: If the path element is "../" then instead of
1440 inserting "../" we need to insert the name of the directory
1441 at the current level. */
1442 if (refp > ref_path + 1
1443 && refp[-1] == '.'
1444 && refp[-2] == '.')
1445 dir_down ++;
1446 else
1447 dir_up ++;
1448 }
1449
1450 /* If the lrealpath calls above succeeded then we should never
1451 see dir_up and dir_down both being non-zero. */
1452
1453 len += 3 * dir_up;
1454
1455 if (dir_down)
1456 {
1457 down = pwd + strlen (pwd) - 1;
1458
1459 while (dir_down && down > pwd)
1460 {
1461 if (IS_DIR_SEPARATOR (*down))
1462 --dir_down;
1463 }
1464 BFD_ASSERT (dir_down == 0);
1465 len += strlen (down) + 1;
1466 }
1467 else
1468 down = NULL;
1469
1470 if (len > pathbuf_len)
1471 {
1472 if (pathbuf != NULL)
1473 free (pathbuf);
1474 pathbuf_len = 0;
1475 pathbuf = (char *) bfd_malloc (len);
1476 if (pathbuf == NULL)
1477 goto out;
1478 pathbuf_len = len;
1479 }
1480
1481 newp = pathbuf;
1482 while (dir_up-- > 0)
1483 {
1484 /* FIXME: Support Windows style path separators as well. */
1485 strcpy (newp, "../");
1486 newp += 3;
1487 }
1488
1489 if (down)
1490 sprintf (newp, "%s/%s", down, pathp);
1491 else
1492 strcpy (newp, pathp);
1493
1494 out:
1495 free (lpath);
1496 free (rpath);
1497 return pathbuf;
1498 }
1499
1500 /* Build a BFD style extended name table. */
1501
1502 bfd_boolean
1503 _bfd_archive_bsd_construct_extended_name_table (bfd *abfd,
1504 char **tabloc,
1505 bfd_size_type *tablen,
1506 const char **name)
1507 {
1508 *name = "ARFILENAMES/";
1509 return _bfd_construct_extended_name_table (abfd, FALSE, tabloc, tablen);
1510 }
1511
1512 /* Build an SVR4 style extended name table. */
1513
1514 bfd_boolean
1515 _bfd_archive_coff_construct_extended_name_table (bfd *abfd,
1516 char **tabloc,
1517 bfd_size_type *tablen,
1518 const char **name)
1519 {
1520 *name = "//";
1521 return _bfd_construct_extended_name_table (abfd, TRUE, tabloc, tablen);
1522 }
1523
1524 /* Follows archive_head and produces an extended name table if
1525 necessary. Returns (in tabloc) a pointer to an extended name
1526 table, and in tablen the length of the table. If it makes an entry
1527 it clobbers the filename so that the element may be written without
1528 further massage. Returns TRUE if it ran successfully, FALSE if
1529 something went wrong. A successful return may still involve a
1530 zero-length tablen! */
1531
1532 bfd_boolean
1533 _bfd_construct_extended_name_table (bfd *abfd,
1534 bfd_boolean trailing_slash,
1535 char **tabloc,
1536 bfd_size_type *tablen)
1537 {
1538 unsigned int maxname = ar_maxnamelen (abfd);
1539 bfd_size_type total_namelen = 0;
1540 bfd *current;
1541 char *strptr;
1542 const char *last_filename;
1543 long last_stroff;
1544
1545 *tablen = 0;
1546 last_filename = NULL;
1547
1548 /* Figure out how long the table should be. */
1549 for (current = abfd->archive_head;
1550 current != NULL;
1551 current = current->archive_next)
1552 {
1553 const char *normal;
1554 unsigned int thislen;
1555
1556 if (bfd_is_thin_archive (abfd))
1557 {
1558 const char *filename = current->filename;
1559
1560 /* If the element being added is a member of another archive
1561 (i.e., we are flattening), use the containing archive's name. */
1562 if (current->my_archive
1563 && ! bfd_is_thin_archive (current->my_archive))
1564 filename = current->my_archive->filename;
1565
1566 /* If the path is the same as the previous path seen,
1567 reuse it. This can happen when flattening a thin
1568 archive that contains other archives. */
1569 if (last_filename && filename_cmp (last_filename, filename) == 0)
1570 continue;
1571
1572 last_filename = filename;
1573
1574 /* If the path is relative, adjust it relative to
1575 the containing archive. */
1576 if (! IS_ABSOLUTE_PATH (filename)
1577 && ! IS_ABSOLUTE_PATH (abfd->filename))
1578 normal = adjust_relative_path (filename, abfd->filename);
1579 else
1580 normal = filename;
1581
1582 /* In a thin archive, always store the full pathname
1583 in the extended name table. */
1584 total_namelen += strlen (normal) + 1;
1585 if (trailing_slash)
1586 /* Leave room for trailing slash. */
1587 ++total_namelen;
1588
1589 continue;
1590 }
1591
1592 normal = normalize (current, current->filename);
1593 if (normal == NULL)
1594 return FALSE;
1595
1596 thislen = strlen (normal);
1597
1598 if (thislen > maxname
1599 && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
1600 thislen = maxname;
1601
1602 if (thislen > maxname)
1603 {
1604 /* Add one to leave room for \n. */
1605 total_namelen += thislen + 1;
1606 if (trailing_slash)
1607 {
1608 /* Leave room for trailing slash. */
1609 ++total_namelen;
1610 }
1611 }
1612 else
1613 {
1614 struct ar_hdr *hdr = arch_hdr (current);
1615 if (filename_ncmp (normal, hdr->ar_name, thislen) != 0
1616 || (thislen < sizeof hdr->ar_name
1617 && hdr->ar_name[thislen] != ar_padchar (current)))
1618 {
1619 /* Must have been using extended format even though it
1620 didn't need to. Fix it to use normal format. */
1621 memcpy (hdr->ar_name, normal, thislen);
1622 if (thislen < maxname
1623 || (thislen == maxname && thislen < sizeof hdr->ar_name))
1624 hdr->ar_name[thislen] = ar_padchar (current);
1625 }
1626 }
1627 }
1628
1629 if (total_namelen == 0)
1630 return TRUE;
1631
1632 *tabloc = (char *) bfd_zalloc (abfd, total_namelen);
1633 if (*tabloc == NULL)
1634 return FALSE;
1635
1636 *tablen = total_namelen;
1637 strptr = *tabloc;
1638
1639 last_filename = NULL;
1640 last_stroff = 0;
1641
1642 for (current = abfd->archive_head;
1643 current != NULL;
1644 current = current->archive_next)
1645 {
1646 const char *normal;
1647 unsigned int thislen;
1648 long stroff;
1649 const char *filename = current->filename;
1650
1651 if (bfd_is_thin_archive (abfd))
1652 {
1653 /* If the element being added is a member of another archive
1654 (i.e., we are flattening), use the containing archive's name. */
1655 if (current->my_archive
1656 && ! bfd_is_thin_archive (current->my_archive))
1657 filename = current->my_archive->filename;
1658 /* If the path is the same as the previous path seen,
1659 reuse it. This can happen when flattening a thin
1660 archive that contains other archives.
1661 If the path is relative, adjust it relative to
1662 the containing archive. */
1663 if (last_filename && filename_cmp (last_filename, filename) == 0)
1664 normal = last_filename;
1665 else if (! IS_ABSOLUTE_PATH (filename)
1666 && ! IS_ABSOLUTE_PATH (abfd->filename))
1667 normal = adjust_relative_path (filename, abfd->filename);
1668 else
1669 normal = filename;
1670 }
1671 else
1672 {
1673 normal = normalize (current, filename);
1674 if (normal == NULL)
1675 return FALSE;
1676 }
1677
1678 thislen = strlen (normal);
1679 if (thislen > maxname || bfd_is_thin_archive (abfd))
1680 {
1681 /* Works for now; may need to be re-engineered if we
1682 encounter an oddball archive format and want to
1683 generalise this hack. */
1684 struct ar_hdr *hdr = arch_hdr (current);
1685 if (normal == last_filename)
1686 stroff = last_stroff;
1687 else
1688 {
1689 strcpy (strptr, normal);
1690 if (! trailing_slash)
1691 strptr[thislen] = ARFMAG[1];
1692 else
1693 {
1694 strptr[thislen] = '/';
1695 strptr[thislen + 1] = ARFMAG[1];
1696 }
1697 stroff = strptr - *tabloc;
1698 last_stroff = stroff;
1699 }
1700 hdr->ar_name[0] = ar_padchar (current);
1701 if (bfd_is_thin_archive (abfd) && current->origin > 0)
1702 {
1703 int len = snprintf (hdr->ar_name + 1, maxname - 1, "%-ld:",
1704 stroff);
1705 _bfd_ar_spacepad (hdr->ar_name + 1 + len, maxname - 1 - len,
1706 "%-ld",
1707 current->origin - sizeof (struct ar_hdr));
1708 }
1709 else
1710 _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff);
1711 if (normal != last_filename)
1712 {
1713 strptr += thislen + 1;
1714 if (trailing_slash)
1715 ++strptr;
1716 last_filename = filename;
1717 }
1718 }
1719 }
1720
1721 return TRUE;
1722 }
1723
1724 /* Do not construct an extended name table but transforms name field into
1725 its extended form. */
1726
1727 bfd_boolean
1728 _bfd_archive_bsd44_construct_extended_name_table (bfd *abfd,
1729 char **tabloc,
1730 bfd_size_type *tablen,
1731 const char **name)
1732 {
1733 unsigned int maxname = ar_maxnamelen (abfd);
1734 bfd *current;
1735
1736 *tablen = 0;
1737 *tabloc = NULL;
1738 *name = NULL;
1739
1740 for (current = abfd->archive_head;
1741 current != NULL;
1742 current = current->archive_next)
1743 {
1744 const char *normal = normalize (current, current->filename);
1745 int has_space = 0;
1746 unsigned int len;
1747
1748 if (normal == NULL)
1749 return FALSE;
1750
1751 for (len = 0; normal[len]; len++)
1752 if (normal[len] == ' ')
1753 has_space = 1;
1754
1755 if (len > maxname || has_space)
1756 {
1757 struct ar_hdr *hdr = arch_hdr (current);
1758
1759 len = (len + 3) & ~3;
1760 arch_eltdata (current)->extra_size = len;
1761 _bfd_ar_spacepad (hdr->ar_name, maxname, "#1/%lu", len);
1762 }
1763 }
1764
1765 return TRUE;
1766 }
1767 \f
1768 /* Write an archive header. */
1769
1770 bfd_boolean
1771 _bfd_generic_write_ar_hdr (bfd *archive, bfd *abfd)
1772 {
1773 struct ar_hdr *hdr = arch_hdr (abfd);
1774
1775 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1776 return FALSE;
1777 return TRUE;
1778 }
1779
1780 /* Write an archive header using BSD4.4 convention. */
1781
1782 bfd_boolean
1783 _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
1784 {
1785 struct ar_hdr *hdr = arch_hdr (abfd);
1786
1787 if (is_bsd44_extended_name (hdr->ar_name))
1788 {
1789 /* This is a BSD 4.4 extended name. */
1790 const char *fullname = normalize (abfd, abfd->filename);
1791 unsigned int len = strlen (fullname);
1792 unsigned int padded_len = (len + 3) & ~3;
1793
1794 BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
1795
1796 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
1797 arch_eltdata (abfd)->parsed_size + padded_len))
1798 return FALSE;
1799
1800 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1801 return FALSE;
1802
1803 if (bfd_bwrite (fullname, len, archive) != len)
1804 return FALSE;
1805
1806 if (len & 3)
1807 {
1808 static const char pad[3] = { 0, 0, 0 };
1809
1810 len = 4 - (len & 3);
1811 if (bfd_bwrite (pad, len, archive) != len)
1812 return FALSE;
1813 }
1814 }
1815 else
1816 {
1817 if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
1818 return FALSE;
1819 }
1820 return TRUE;
1821 }
1822 \f
1823 /* A couple of functions for creating ar_hdrs. */
1824
1825 #ifdef HPUX_LARGE_AR_IDS
1826 /* Function to encode large UID/GID values according to HP. */
1827
1828 static void
1829 hpux_uid_gid_encode (char str[6], long int id)
1830 {
1831 int cnt;
1832
1833 str[5] = '@' + (id & 3);
1834 id >>= 2;
1835
1836 for (cnt = 4; cnt >= 0; --cnt, id >>= 6)
1837 str[cnt] = ' ' + (id & 0x3f);
1838 }
1839 #endif /* HPUX_LARGE_AR_IDS */
1840
1841 #ifndef HAVE_GETUID
1842 #define getuid() 0
1843 #endif
1844
1845 #ifndef HAVE_GETGID
1846 #define getgid() 0
1847 #endif
1848
1849 /* Takes a filename, returns an arelt_data for it, or NULL if it can't
1850 make one. The filename must refer to a filename in the filesystem.
1851 The filename field of the ar_hdr will NOT be initialized. If member
1852 is set, and it's an in-memory bfd, we fake it. */
1853
1854 static struct areltdata *
1855 bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
1856 {
1857 struct stat status;
1858 struct areltdata *ared;
1859 struct ar_hdr *hdr;
1860 bfd_size_type amt;
1861
1862 if (member && (member->flags & BFD_IN_MEMORY) != 0)
1863 {
1864 /* Assume we just "made" the member, and fake it. */
1865 struct bfd_in_memory *bim = (struct bfd_in_memory *) member->iostream;
1866 time (&status.st_mtime);
1867 status.st_uid = getuid ();
1868 status.st_gid = getgid ();
1869 status.st_mode = 0644;
1870 status.st_size = bim->size;
1871 }
1872 else if (stat (filename, &status) != 0)
1873 {
1874 bfd_set_error (bfd_error_system_call);
1875 return NULL;
1876 }
1877
1878 /* If the caller requested that the BFD generate deterministic output,
1879 fake values for modification time, UID, GID, and file mode. */
1880 if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
1881 {
1882 status.st_mtime = 0;
1883 status.st_uid = 0;
1884 status.st_gid = 0;
1885 status.st_mode = 0644;
1886 }
1887
1888 amt = sizeof (struct ar_hdr) + sizeof (struct areltdata);
1889 ared = (struct areltdata *) bfd_zalloc (abfd, amt);
1890 if (ared == NULL)
1891 return NULL;
1892 hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
1893
1894 /* ar headers are space padded, not null padded! */
1895 memset (hdr, ' ', sizeof (struct ar_hdr));
1896
1897 _bfd_ar_spacepad (hdr->ar_date, sizeof (hdr->ar_date), "%-12ld",
1898 status.st_mtime);
1899 #ifdef HPUX_LARGE_AR_IDS
1900 /* HP has a very "special" way to handle UID/GID's with numeric values
1901 > 99999. */
1902 if (status.st_uid > 99999)
1903 hpux_uid_gid_encode (hdr->ar_uid, (long) status.st_uid);
1904 else
1905 #endif
1906 _bfd_ar_spacepad (hdr->ar_uid, sizeof (hdr->ar_uid), "%ld",
1907 status.st_uid);
1908 #ifdef HPUX_LARGE_AR_IDS
1909 /* HP has a very "special" way to handle UID/GID's with numeric values
1910 > 99999. */
1911 if (status.st_gid > 99999)
1912 hpux_uid_gid_encode (hdr->ar_gid, (long) status.st_gid);
1913 else
1914 #endif
1915 _bfd_ar_spacepad (hdr->ar_gid, sizeof (hdr->ar_gid), "%ld",
1916 status.st_gid);
1917 _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
1918 status.st_mode);
1919 if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
1920 {
1921 free (ared);
1922 return NULL;
1923 }
1924 memcpy (hdr->ar_fmag, ARFMAG, 2);
1925 ared->parsed_size = status.st_size;
1926 ared->arch_header = (char *) hdr;
1927
1928 return ared;
1929 }
1930
1931 /* Analogous to stat call. */
1932
1933 int
1934 bfd_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
1935 {
1936 struct ar_hdr *hdr;
1937 char *aloser;
1938
1939 if (abfd->arelt_data == NULL)
1940 {
1941 bfd_set_error (bfd_error_invalid_operation);
1942 return -1;
1943 }
1944
1945 hdr = arch_hdr (abfd);
1946
1947 #define foo(arelt, stelt, size) \
1948 buf->stelt = strtol (hdr->arelt, &aloser, size); \
1949 if (aloser == hdr->arelt) \
1950 return -1;
1951
1952 /* Some platforms support special notations for large IDs. */
1953 #ifdef HPUX_LARGE_AR_IDS
1954 # define foo2(arelt, stelt, size) \
1955 if (hdr->arelt[5] == ' ') \
1956 { \
1957 foo (arelt, stelt, size); \
1958 } \
1959 else \
1960 { \
1961 int cnt; \
1962 for (buf->stelt = cnt = 0; cnt < 5; ++cnt) \
1963 { \
1964 if (hdr->arelt[cnt] < ' ' || hdr->arelt[cnt] > ' ' + 0x3f) \
1965 return -1; \
1966 buf->stelt <<= 6; \
1967 buf->stelt += hdr->arelt[cnt] - ' '; \
1968 } \
1969 if (hdr->arelt[5] < '@' || hdr->arelt[5] > '@' + 3) \
1970 return -1; \
1971 buf->stelt <<= 2; \
1972 buf->stelt += hdr->arelt[5] - '@'; \
1973 }
1974 #else
1975 # define foo2(arelt, stelt, size) foo (arelt, stelt, size)
1976 #endif
1977
1978 foo (ar_date, st_mtime, 10);
1979 foo2 (ar_uid, st_uid, 10);
1980 foo2 (ar_gid, st_gid, 10);
1981 foo (ar_mode, st_mode, 8);
1982
1983 buf->st_size = arch_eltdata (abfd)->parsed_size;
1984
1985 return 0;
1986 }
1987
1988 void
1989 bfd_dont_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
1990 {
1991 /* FIXME: This interacts unpleasantly with ar's quick-append option.
1992 Fortunately ic960 users will never use that option. Fixing this
1993 is very hard; fortunately I know how to do it and will do so once
1994 intel's release is out the door. */
1995
1996 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
1997 size_t length;
1998 const char *filename;
1999 size_t maxlen = ar_maxnamelen (abfd);
2000
2001 if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
2002 {
2003 bfd_bsd_truncate_arname (abfd, pathname, arhdr);
2004 return;
2005 }
2006
2007 filename = normalize (abfd, pathname);
2008 if (filename == NULL)
2009 {
2010 /* FIXME */
2011 abort ();
2012 }
2013
2014 length = strlen (filename);
2015
2016 if (length <= maxlen)
2017 memcpy (hdr->ar_name, filename, length);
2018
2019 /* Add the padding character if there is room for it. */
2020 if (length < maxlen
2021 || (length == maxlen && length < sizeof hdr->ar_name))
2022 (hdr->ar_name)[length] = ar_padchar (abfd);
2023 }
2024
2025 void
2026 bfd_bsd_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2027 {
2028 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2029 size_t length;
2030 const char *filename = lbasename (pathname);
2031 size_t maxlen = ar_maxnamelen (abfd);
2032
2033 length = strlen (filename);
2034
2035 if (length <= maxlen)
2036 memcpy (hdr->ar_name, filename, length);
2037 else
2038 {
2039 /* pathname: meet procrustes */
2040 memcpy (hdr->ar_name, filename, maxlen);
2041 length = maxlen;
2042 }
2043
2044 if (length < maxlen)
2045 (hdr->ar_name)[length] = ar_padchar (abfd);
2046 }
2047
2048 /* Store name into ar header. Truncates the name to fit.
2049 1> strip pathname to be just the basename.
2050 2> if it's short enuf to fit, stuff it in.
2051 3> If it doesn't end with .o, truncate it to fit
2052 4> truncate it before the .o, append .o, stuff THAT in. */
2053
2054 /* This is what gnu ar does. It's better but incompatible with the
2055 bsd ar. */
2056
2057 void
2058 bfd_gnu_truncate_arname (bfd *abfd, const char *pathname, char *arhdr)
2059 {
2060 struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
2061 size_t length;
2062 const char *filename = lbasename (pathname);
2063 size_t maxlen = ar_maxnamelen (abfd);
2064
2065 length = strlen (filename);
2066
2067 if (length <= maxlen)
2068 memcpy (hdr->ar_name, filename, length);
2069 else
2070 {
2071 /* pathname: meet procrustes. */
2072 memcpy (hdr->ar_name, filename, maxlen);
2073 if ((filename[length - 2] == '.') && (filename[length - 1] == 'o'))
2074 {
2075 hdr->ar_name[maxlen - 2] = '.';
2076 hdr->ar_name[maxlen - 1] = 'o';
2077 }
2078 length = maxlen;
2079 }
2080
2081 if (length < 16)
2082 (hdr->ar_name)[length] = ar_padchar (abfd);
2083 }
2084 \f
2085 /* The BFD is open for write and has its format set to bfd_archive. */
2086
2087 bfd_boolean
2088 _bfd_write_archive_contents (bfd *arch)
2089 {
2090 bfd *current;
2091 char *etable = NULL;
2092 bfd_size_type elength = 0;
2093 const char *ename = NULL;
2094 bfd_boolean makemap = bfd_has_map (arch);
2095 /* If no .o's, don't bother to make a map. */
2096 bfd_boolean hasobjects = FALSE;
2097 bfd_size_type wrote;
2098 int tries;
2099 char *armag;
2100
2101 /* Verify the viability of all entries; if any of them live in the
2102 filesystem (as opposed to living in an archive open for input)
2103 then construct a fresh ar_hdr for them. */
2104 for (current = arch->archive_head;
2105 current != NULL;
2106 current = current->archive_next)
2107 {
2108 /* This check is checking the bfds for the objects we're reading
2109 from (which are usually either an object file or archive on
2110 disk), not the archive entries we're writing to. We don't
2111 actually create bfds for the archive members, we just copy
2112 them byte-wise when we write out the archive. */
2113 if (bfd_write_p (current))
2114 {
2115 bfd_set_error (bfd_error_invalid_operation);
2116 goto input_err;
2117 }
2118 if (!current->arelt_data)
2119 {
2120 current->arelt_data =
2121 bfd_ar_hdr_from_filesystem (arch, current->filename, current);
2122 if (!current->arelt_data)
2123 goto input_err;
2124
2125 /* Put in the file name. */
2126 BFD_SEND (arch, _bfd_truncate_arname,
2127 (arch, current->filename, (char *) arch_hdr (current)));
2128 }
2129
2130 if (makemap && ! hasobjects)
2131 { /* Don't bother if we won't make a map! */
2132 if ((bfd_check_format (current, bfd_object)))
2133 hasobjects = TRUE;
2134 }
2135 }
2136
2137 if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
2138 (arch, &etable, &elength, &ename)))
2139 return FALSE;
2140
2141 if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
2142 return FALSE;
2143 armag = ARMAG;
2144 if (bfd_is_thin_archive (arch))
2145 armag = ARMAGT;
2146 wrote = bfd_bwrite (armag, SARMAG, arch);
2147 if (wrote != SARMAG)
2148 return FALSE;
2149
2150 if (makemap && hasobjects)
2151 {
2152 if (! _bfd_compute_and_write_armap (arch, (unsigned int) elength))
2153 return FALSE;
2154 }
2155
2156 if (elength != 0)
2157 {
2158 struct ar_hdr hdr;
2159
2160 memset (&hdr, ' ', sizeof (struct ar_hdr));
2161 memcpy (hdr.ar_name, ename, strlen (ename));
2162 /* Round size up to even number in archive header. */
2163 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
2164 (elength + 1) & ~(bfd_size_type) 1))
2165 return FALSE;
2166 memcpy (hdr.ar_fmag, ARFMAG, 2);
2167 if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2168 != sizeof (struct ar_hdr))
2169 || bfd_bwrite (etable, elength, arch) != elength)
2170 return FALSE;
2171 if ((elength % 2) == 1)
2172 {
2173 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2174 return FALSE;
2175 }
2176 }
2177
2178 for (current = arch->archive_head;
2179 current != NULL;
2180 current = current->archive_next)
2181 {
2182 char buffer[DEFAULT_BUFFERSIZE];
2183 bfd_size_type remaining = arelt_size (current);
2184
2185 /* Write ar header. */
2186 if (!_bfd_write_ar_hdr (arch, current))
2187 return FALSE;
2188 if (bfd_is_thin_archive (arch))
2189 continue;
2190 if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
2191 goto input_err;
2192
2193 while (remaining)
2194 {
2195 unsigned int amt = DEFAULT_BUFFERSIZE;
2196
2197 if (amt > remaining)
2198 amt = remaining;
2199 errno = 0;
2200 if (bfd_bread (buffer, amt, current) != amt)
2201 {
2202 if (bfd_get_error () != bfd_error_system_call)
2203 bfd_set_error (bfd_error_file_truncated);
2204 goto input_err;
2205 }
2206 if (bfd_bwrite (buffer, amt, arch) != amt)
2207 return FALSE;
2208 remaining -= amt;
2209 }
2210
2211 if ((arelt_size (current) % 2) == 1)
2212 {
2213 if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
2214 return FALSE;
2215 }
2216 }
2217
2218 if (makemap && hasobjects)
2219 {
2220 /* Verify the timestamp in the archive file. If it would not be
2221 accepted by the linker, rewrite it until it would be. If
2222 anything odd happens, break out and just return. (The
2223 Berkeley linker checks the timestamp and refuses to read the
2224 table-of-contents if it is >60 seconds less than the file's
2225 modified-time. That painful hack requires this painful hack. */
2226 tries = 1;
2227 do
2228 {
2229 if (bfd_update_armap_timestamp (arch))
2230 break;
2231 (*_bfd_error_handler)
2232 (_("Warning: writing archive was slow: rewriting timestamp\n"));
2233 }
2234 while (++tries < 6);
2235 }
2236
2237 return TRUE;
2238
2239 input_err:
2240 bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
2241 return FALSE;
2242 }
2243 \f
2244 /* Note that the namidx for the first symbol is 0. */
2245
2246 bfd_boolean
2247 _bfd_compute_and_write_armap (bfd *arch, unsigned int elength)
2248 {
2249 char *first_name = NULL;
2250 bfd *current;
2251 file_ptr elt_no = 0;
2252 struct orl *map = NULL;
2253 unsigned int orl_max = 1024; /* Fine initial default. */
2254 unsigned int orl_count = 0;
2255 int stridx = 0;
2256 asymbol **syms = NULL;
2257 long syms_max = 0;
2258 bfd_boolean ret;
2259 bfd_size_type amt;
2260
2261 /* Dunno if this is the best place for this info... */
2262 if (elength != 0)
2263 elength += sizeof (struct ar_hdr);
2264 elength += elength % 2;
2265
2266 amt = orl_max * sizeof (struct orl);
2267 map = (struct orl *) bfd_malloc (amt);
2268 if (map == NULL)
2269 goto error_return;
2270
2271 /* We put the symbol names on the arch objalloc, and then discard
2272 them when done. */
2273 first_name = (char *) bfd_alloc (arch, 1);
2274 if (first_name == NULL)
2275 goto error_return;
2276
2277 /* Drop all the files called __.SYMDEF, we're going to make our own. */
2278 while (arch->archive_head
2279 && strcmp (arch->archive_head->filename, "__.SYMDEF") == 0)
2280 arch->archive_head = arch->archive_head->archive_next;
2281
2282 /* Map over each element. */
2283 for (current = arch->archive_head;
2284 current != NULL;
2285 current = current->archive_next, elt_no++)
2286 {
2287 if (bfd_check_format (current, bfd_object)
2288 && (bfd_get_file_flags (current) & HAS_SYMS) != 0)
2289 {
2290 long storage;
2291 long symcount;
2292 long src_count;
2293
2294 storage = bfd_get_symtab_upper_bound (current);
2295 if (storage < 0)
2296 goto error_return;
2297
2298 if (storage != 0)
2299 {
2300 if (storage > syms_max)
2301 {
2302 if (syms_max > 0)
2303 free (syms);
2304 syms_max = storage;
2305 syms = (asymbol **) bfd_malloc (syms_max);
2306 if (syms == NULL)
2307 goto error_return;
2308 }
2309 symcount = bfd_canonicalize_symtab (current, syms);
2310 if (symcount < 0)
2311 goto error_return;
2312
2313 /* Now map over all the symbols, picking out the ones we
2314 want. */
2315 for (src_count = 0; src_count < symcount; src_count++)
2316 {
2317 flagword flags = (syms[src_count])->flags;
2318 asection *sec = syms[src_count]->section;
2319
2320 if (((flags & (BSF_GLOBAL
2321 | BSF_WEAK
2322 | BSF_INDIRECT
2323 | BSF_GNU_UNIQUE)) != 0
2324 || bfd_is_com_section (sec))
2325 && ! bfd_is_und_section (sec))
2326 {
2327 bfd_size_type namelen;
2328 struct orl *new_map;
2329
2330 /* This symbol will go into the archive header. */
2331 if (orl_count == orl_max)
2332 {
2333 orl_max *= 2;
2334 amt = orl_max * sizeof (struct orl);
2335 new_map = (struct orl *) bfd_realloc (map, amt);
2336 if (new_map == NULL)
2337 goto error_return;
2338
2339 map = new_map;
2340 }
2341
2342 namelen = strlen (syms[src_count]->name);
2343 amt = sizeof (char *);
2344 map[orl_count].name = (char **) bfd_alloc (arch, amt);
2345 if (map[orl_count].name == NULL)
2346 goto error_return;
2347 *(map[orl_count].name) = (char *) bfd_alloc (arch,
2348 namelen + 1);
2349 if (*(map[orl_count].name) == NULL)
2350 goto error_return;
2351 strcpy (*(map[orl_count].name), syms[src_count]->name);
2352 map[orl_count].u.abfd = current;
2353 map[orl_count].namidx = stridx;
2354
2355 stridx += namelen + 1;
2356 ++orl_count;
2357 }
2358 }
2359 }
2360
2361 /* Now ask the BFD to free up any cached information, so we
2362 don't fill all of memory with symbol tables. */
2363 if (! bfd_free_cached_info (current))
2364 goto error_return;
2365 }
2366 }
2367
2368 /* OK, now we have collected all the data, let's write them out. */
2369 ret = BFD_SEND (arch, write_armap,
2370 (arch, elength, map, orl_count, stridx));
2371
2372 if (syms_max > 0)
2373 free (syms);
2374 if (map != NULL)
2375 free (map);
2376 if (first_name != NULL)
2377 bfd_release (arch, first_name);
2378
2379 return ret;
2380
2381 error_return:
2382 if (syms_max > 0)
2383 free (syms);
2384 if (map != NULL)
2385 free (map);
2386 if (first_name != NULL)
2387 bfd_release (arch, first_name);
2388
2389 return FALSE;
2390 }
2391
2392 bfd_boolean
2393 bsd_write_armap (bfd *arch,
2394 unsigned int elength,
2395 struct orl *map,
2396 unsigned int orl_count,
2397 int stridx)
2398 {
2399 int padit = stridx & 1;
2400 unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
2401 unsigned int stringsize = stridx + padit;
2402 /* Include 8 bytes to store ranlibsize and stringsize in output. */
2403 unsigned int mapsize = ranlibsize + stringsize + 8;
2404 file_ptr firstreal;
2405 bfd *current = arch->archive_head;
2406 bfd *last_elt = current; /* Last element arch seen. */
2407 bfd_byte temp[4];
2408 unsigned int count;
2409 struct ar_hdr hdr;
2410 long uid, gid;
2411 file_ptr max_first_real = 1;
2412
2413 max_first_real <<= 31;
2414
2415 firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG;
2416
2417 /* If deterministic, we use 0 as the timestamp in the map.
2418 Some linkers may require that the archive filesystem modification
2419 time is less than (or near to) the archive map timestamp. Those
2420 linkers should not be used with deterministic mode. (GNU ld and
2421 Gold do not have this restriction.) */
2422 bfd_ardata (arch)->armap_timestamp = 0;
2423 uid = 0;
2424 gid = 0;
2425 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0)
2426 {
2427 struct stat statbuf;
2428
2429 if (stat (arch->filename, &statbuf) == 0)
2430 bfd_ardata (arch)->armap_timestamp = (statbuf.st_mtime
2431 + ARMAP_TIME_OFFSET);
2432 uid = getuid();
2433 gid = getgid();
2434 }
2435
2436 memset (&hdr, ' ', sizeof (struct ar_hdr));
2437 memcpy (hdr.ar_name, RANLIBMAG, strlen (RANLIBMAG));
2438 bfd_ardata (arch)->armap_datepos = (SARMAG
2439 + offsetof (struct ar_hdr, ar_date[0]));
2440 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2441 bfd_ardata (arch)->armap_timestamp);
2442 _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
2443 _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
2444 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2445 return FALSE;
2446 memcpy (hdr.ar_fmag, ARFMAG, 2);
2447 if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2448 != sizeof (struct ar_hdr))
2449 return FALSE;
2450 H_PUT_32 (arch, ranlibsize, temp);
2451 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2452 return FALSE;
2453
2454 for (count = 0; count < orl_count; count++)
2455 {
2456 bfd_byte buf[BSD_SYMDEF_SIZE];
2457
2458 if (map[count].u.abfd != last_elt)
2459 {
2460 do
2461 {
2462 struct areltdata *ared = arch_eltdata (current);
2463
2464 firstreal += (ared->parsed_size + ared->extra_size
2465 + sizeof (struct ar_hdr));
2466 firstreal += firstreal % 2;
2467 current = current->archive_next;
2468 }
2469 while (current != map[count].u.abfd);
2470 }
2471
2472 /* The archive file format only has 4 bytes to store the offset
2473 of the member. Check to make sure that firstreal has not grown
2474 too big. */
2475 if (firstreal >= max_first_real)
2476 {
2477 bfd_set_error (bfd_error_file_truncated);
2478 return FALSE;
2479 }
2480
2481 last_elt = current;
2482 H_PUT_32 (arch, map[count].namidx, buf);
2483 H_PUT_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
2484 if (bfd_bwrite (buf, BSD_SYMDEF_SIZE, arch)
2485 != BSD_SYMDEF_SIZE)
2486 return FALSE;
2487 }
2488
2489 /* Now write the strings themselves. */
2490 H_PUT_32 (arch, stringsize, temp);
2491 if (bfd_bwrite (temp, sizeof (temp), arch) != sizeof (temp))
2492 return FALSE;
2493 for (count = 0; count < orl_count; count++)
2494 {
2495 size_t len = strlen (*map[count].name) + 1;
2496
2497 if (bfd_bwrite (*map[count].name, len, arch) != len)
2498 return FALSE;
2499 }
2500
2501 /* The spec sez this should be a newline. But in order to be
2502 bug-compatible for sun's ar we use a null. */
2503 if (padit)
2504 {
2505 if (bfd_bwrite ("", 1, arch) != 1)
2506 return FALSE;
2507 }
2508
2509 return TRUE;
2510 }
2511
2512 /* At the end of archive file handling, update the timestamp in the
2513 file, so the linker will accept it.
2514
2515 Return TRUE if the timestamp was OK, or an unusual problem happened.
2516 Return FALSE if we updated the timestamp. */
2517
2518 bfd_boolean
2519 _bfd_archive_bsd_update_armap_timestamp (bfd *arch)
2520 {
2521 struct stat archstat;
2522 struct ar_hdr hdr;
2523
2524 /* If creating deterministic archives, just leave the timestamp as-is. */
2525 if ((arch->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2526 return TRUE;
2527
2528 /* Flush writes, get last-write timestamp from file, and compare it
2529 to the timestamp IN the file. */
2530 bfd_flush (arch);
2531 if (bfd_stat (arch, &archstat) == -1)
2532 {
2533 bfd_perror (_("Reading archive file mod timestamp"));
2534
2535 /* Can't read mod time for some reason. */
2536 return TRUE;
2537 }
2538 if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
2539 /* OK by the linker's rules. */
2540 return TRUE;
2541
2542 /* Update the timestamp. */
2543 bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET;
2544
2545 /* Prepare an ASCII version suitable for writing. */
2546 memset (hdr.ar_date, ' ', sizeof (hdr.ar_date));
2547 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2548 bfd_ardata (arch)->armap_timestamp);
2549
2550 /* Write it into the file. */
2551 bfd_ardata (arch)->armap_datepos = (SARMAG
2552 + offsetof (struct ar_hdr, ar_date[0]));
2553 if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0
2554 || (bfd_bwrite (hdr.ar_date, sizeof (hdr.ar_date), arch)
2555 != sizeof (hdr.ar_date)))
2556 {
2557 bfd_perror (_("Writing updated armap timestamp"));
2558
2559 /* Some error while writing. */
2560 return TRUE;
2561 }
2562
2563 /* We updated the timestamp successfully. */
2564 return FALSE;
2565 }
2566 \f
2567 /* A coff armap looks like :
2568 lARMAG
2569 struct ar_hdr with name = '/'
2570 number of symbols
2571 offset of file for symbol 0
2572 offset of file for symbol 1
2573
2574 offset of file for symbol n-1
2575 symbol name 0
2576 symbol name 1
2577
2578 symbol name n-1 */
2579
2580 bfd_boolean
2581 coff_write_armap (bfd *arch,
2582 unsigned int elength,
2583 struct orl *map,
2584 unsigned int symbol_count,
2585 int stridx)
2586 {
2587 /* The size of the ranlib is the number of exported symbols in the
2588 archive * the number of bytes in an int, + an int for the count. */
2589 unsigned int ranlibsize = (symbol_count * 4) + 4;
2590 unsigned int stringsize = stridx;
2591 unsigned int mapsize = stringsize + ranlibsize;
2592 file_ptr archive_member_file_ptr;
2593 bfd *current = arch->archive_head;
2594 unsigned int count;
2595 struct ar_hdr hdr;
2596 int padit = mapsize & 1;
2597
2598 if (padit)
2599 mapsize++;
2600
2601 /* Work out where the first object file will go in the archive. */
2602 archive_member_file_ptr = (mapsize
2603 + elength
2604 + sizeof (struct ar_hdr)
2605 + SARMAG);
2606
2607 memset (&hdr, ' ', sizeof (struct ar_hdr));
2608 hdr.ar_name[0] = '/';
2609 if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
2610 return FALSE;
2611 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
2612 ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
2613 ? time (NULL) : 0));
2614 /* This, at least, is what Intel coff sets the values to. */
2615 _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0);
2616 _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0);
2617 _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0);
2618 memcpy (hdr.ar_fmag, ARFMAG, 2);
2619
2620 /* Write the ar header for this item and the number of symbols. */
2621 if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
2622 != sizeof (struct ar_hdr))
2623 return FALSE;
2624
2625 if (!bfd_write_bigendian_4byte_int (arch, symbol_count))
2626 return FALSE;
2627
2628 /* Two passes, first write the file offsets for each symbol -
2629 remembering that each offset is on a two byte boundary. */
2630
2631 /* Write out the file offset for the file associated with each
2632 symbol, and remember to keep the offsets padded out. */
2633
2634 current = arch->archive_head;
2635 count = 0;
2636 while (current != NULL && count < symbol_count)
2637 {
2638 /* For each symbol which is used defined in this object, write
2639 out the object file's address in the archive. */
2640
2641 while (count < symbol_count && map[count].u.abfd == current)
2642 {
2643 unsigned int offset = (unsigned int) archive_member_file_ptr;
2644
2645 /* Catch an attempt to grow an archive past its 4Gb limit. */
2646 if (archive_member_file_ptr != (file_ptr) offset)
2647 {
2648 bfd_set_error (bfd_error_file_truncated);
2649 return FALSE;
2650 }
2651 if (!bfd_write_bigendian_4byte_int (arch, offset))
2652 return FALSE;
2653 count++;
2654 }
2655 archive_member_file_ptr += sizeof (struct ar_hdr);
2656 if (! bfd_is_thin_archive (arch))
2657 {
2658 /* Add size of this archive entry. */
2659 archive_member_file_ptr += arelt_size (current);
2660 /* Remember about the even alignment. */
2661 archive_member_file_ptr += archive_member_file_ptr % 2;
2662 }
2663 current = current->archive_next;
2664 }
2665
2666 /* Now write the strings themselves. */
2667 for (count = 0; count < symbol_count; count++)
2668 {
2669 size_t len = strlen (*map[count].name) + 1;
2670
2671 if (bfd_bwrite (*map[count].name, len, arch) != len)
2672 return FALSE;
2673 }
2674
2675 /* The spec sez this should be a newline. But in order to be
2676 bug-compatible for arc960 we use a null. */
2677 if (padit)
2678 {
2679 if (bfd_bwrite ("", 1, arch) != 1)
2680 return FALSE;
2681 }
2682
2683 return TRUE;
2684 }
This page took 0.083819 seconds and 4 git commands to generate.