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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [bfd/] [archive.c] - Blame information for rev 835

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

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

powered by: WebSVN 2.1.0

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