OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [oc/] [gdb-5.0/] [bfd/] [archive.c] - Blame information for rev 104

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.