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