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