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