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