]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/elfcomm.c
Ensure softfloat and singlefloat take precedence in consistency checks
[thirdparty/binutils-gdb.git] / binutils / elfcomm.c
CommitLineData
3284fe0c 1/* elfcomm.c -- common code for ELF format file.
4b95cf5c 2 Copyright (C) 2010-2014 Free Software Foundation, Inc.
3284fe0c
L
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
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
22 02110-1301, USA. */
23
24#include "sysdep.h"
25#include "libiberty.h"
26#include "filenames.h"
27#include "bfd.h"
28#include "aout/ar.h"
29#include "bucomm.h"
30#include "elfcomm.h"
c2a7d3f5 31#include <assert.h>
3284fe0c
L
32
33void
34error (const char *message, ...)
35{
36 va_list args;
37
fafd911d
NC
38 /* Try to keep error messages in sync with the program's normal output. */
39 fflush (stdout);
40
3284fe0c
L
41 va_start (args, message);
42 fprintf (stderr, _("%s: Error: "), program_name);
43 vfprintf (stderr, message, args);
44 va_end (args);
45}
46
47void
48warn (const char *message, ...)
49{
50 va_list args;
51
fafd911d
NC
52 /* Try to keep warning messages in sync with the program's normal output. */
53 fflush (stdout);
54
3284fe0c
L
55 va_start (args, message);
56 fprintf (stderr, _("%s: Warning: "), program_name);
57 vfprintf (stderr, message, args);
58 va_end (args);
59}
60
61void (*byte_put) (unsigned char *, elf_vma, int);
62
63void
64byte_put_little_endian (unsigned char * field, elf_vma value, int size)
65{
66 switch (size)
67 {
68 case 8:
69 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
70 field[6] = ((value >> 24) >> 24) & 0xff;
71 field[5] = ((value >> 24) >> 16) & 0xff;
72 field[4] = ((value >> 24) >> 8) & 0xff;
73 /* Fall through. */
74 case 4:
75 field[3] = (value >> 24) & 0xff;
76 /* Fall through. */
77 case 3:
78 field[2] = (value >> 16) & 0xff;
79 /* Fall through. */
80 case 2:
81 field[1] = (value >> 8) & 0xff;
82 /* Fall through. */
83 case 1:
84 field[0] = value & 0xff;
85 break;
86
87 default:
88 error (_("Unhandled data length: %d\n"), size);
89 abort ();
90 }
91}
92
93void
94byte_put_big_endian (unsigned char * field, elf_vma value, int size)
95{
96 switch (size)
97 {
98 case 8:
99 field[7] = value & 0xff;
100 field[6] = (value >> 8) & 0xff;
101 field[5] = (value >> 16) & 0xff;
102 field[4] = (value >> 24) & 0xff;
103 value >>= 16;
104 value >>= 16;
105 /* Fall through. */
106 case 4:
107 field[3] = value & 0xff;
108 value >>= 8;
109 /* Fall through. */
110 case 3:
111 field[2] = value & 0xff;
112 value >>= 8;
113 /* Fall through. */
114 case 2:
115 field[1] = value & 0xff;
116 value >>= 8;
117 /* Fall through. */
118 case 1:
119 field[0] = value & 0xff;
120 break;
121
122 default:
123 error (_("Unhandled data length: %d\n"), size);
124 abort ();
125 }
126}
127
128elf_vma (*byte_get) (unsigned char *, int);
129
130elf_vma
131byte_get_little_endian (unsigned char *field, int size)
132{
133 switch (size)
134 {
135 case 1:
136 return *field;
137
138 case 2:
139 return ((unsigned int) (field[0]))
140 | (((unsigned int) (field[1])) << 8);
141
142 case 3:
143 return ((unsigned long) (field[0]))
144 | (((unsigned long) (field[1])) << 8)
145 | (((unsigned long) (field[2])) << 16);
146
147 case 4:
148 return ((unsigned long) (field[0]))
149 | (((unsigned long) (field[1])) << 8)
150 | (((unsigned long) (field[2])) << 16)
151 | (((unsigned long) (field[3])) << 24);
152
87bc83b3
CC
153 case 5:
154 if (sizeof (elf_vma) == 8)
155 return ((elf_vma) (field[0]))
156 | (((elf_vma) (field[1])) << 8)
157 | (((elf_vma) (field[2])) << 16)
158 | (((elf_vma) (field[3])) << 24)
159 | (((elf_vma) (field[4])) << 32);
160 else if (sizeof (elf_vma) == 4)
161 /* We want to extract data from an 8 byte wide field and
162 place it into a 4 byte wide field. Since this is a little
163 endian source we can just use the 4 byte extraction code. */
164 return ((unsigned long) (field[0]))
165 | (((unsigned long) (field[1])) << 8)
166 | (((unsigned long) (field[2])) << 16)
167 | (((unsigned long) (field[3])) << 24);
168
169 case 6:
170 if (sizeof (elf_vma) == 8)
171 return ((elf_vma) (field[0]))
172 | (((elf_vma) (field[1])) << 8)
173 | (((elf_vma) (field[2])) << 16)
174 | (((elf_vma) (field[3])) << 24)
175 | (((elf_vma) (field[4])) << 32)
176 | (((elf_vma) (field[5])) << 40);
177 else if (sizeof (elf_vma) == 4)
178 /* We want to extract data from an 8 byte wide field and
179 place it into a 4 byte wide field. Since this is a little
180 endian source we can just use the 4 byte extraction code. */
181 return ((unsigned long) (field[0]))
182 | (((unsigned long) (field[1])) << 8)
183 | (((unsigned long) (field[2])) << 16)
184 | (((unsigned long) (field[3])) << 24);
185
186 case 7:
187 if (sizeof (elf_vma) == 8)
188 return ((elf_vma) (field[0]))
189 | (((elf_vma) (field[1])) << 8)
190 | (((elf_vma) (field[2])) << 16)
191 | (((elf_vma) (field[3])) << 24)
192 | (((elf_vma) (field[4])) << 32)
193 | (((elf_vma) (field[5])) << 40)
194 | (((elf_vma) (field[6])) << 48);
195 else if (sizeof (elf_vma) == 4)
196 /* We want to extract data from an 8 byte wide field and
197 place it into a 4 byte wide field. Since this is a little
198 endian source we can just use the 4 byte extraction code. */
199 return ((unsigned long) (field[0]))
200 | (((unsigned long) (field[1])) << 8)
201 | (((unsigned long) (field[2])) << 16)
202 | (((unsigned long) (field[3])) << 24);
203
3284fe0c
L
204 case 8:
205 if (sizeof (elf_vma) == 8)
206 return ((elf_vma) (field[0]))
207 | (((elf_vma) (field[1])) << 8)
208 | (((elf_vma) (field[2])) << 16)
209 | (((elf_vma) (field[3])) << 24)
210 | (((elf_vma) (field[4])) << 32)
211 | (((elf_vma) (field[5])) << 40)
212 | (((elf_vma) (field[6])) << 48)
213 | (((elf_vma) (field[7])) << 56);
214 else if (sizeof (elf_vma) == 4)
215 /* We want to extract data from an 8 byte wide field and
216 place it into a 4 byte wide field. Since this is a little
217 endian source we can just use the 4 byte extraction code. */
218 return ((unsigned long) (field[0]))
219 | (((unsigned long) (field[1])) << 8)
220 | (((unsigned long) (field[2])) << 16)
221 | (((unsigned long) (field[3])) << 24);
222
223 default:
224 error (_("Unhandled data length: %d\n"), size);
225 abort ();
226 }
227}
228
229elf_vma
230byte_get_big_endian (unsigned char *field, int size)
231{
232 switch (size)
233 {
234 case 1:
235 return *field;
236
237 case 2:
238 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
239
240 case 3:
241 return ((unsigned long) (field[2]))
242 | (((unsigned long) (field[1])) << 8)
243 | (((unsigned long) (field[0])) << 16);
244
245 case 4:
246 return ((unsigned long) (field[3]))
247 | (((unsigned long) (field[2])) << 8)
248 | (((unsigned long) (field[1])) << 16)
249 | (((unsigned long) (field[0])) << 24);
250
87bc83b3
CC
251 case 5:
252 if (sizeof (elf_vma) == 8)
253 return ((elf_vma) (field[4]))
254 | (((elf_vma) (field[3])) << 8)
255 | (((elf_vma) (field[2])) << 16)
256 | (((elf_vma) (field[1])) << 24)
257 | (((elf_vma) (field[0])) << 32);
258 else if (sizeof (elf_vma) == 4)
259 {
260 /* Although we are extracting data from an 8 byte wide field,
261 we are returning only 4 bytes of data. */
262 field += 1;
263 return ((unsigned long) (field[3]))
264 | (((unsigned long) (field[2])) << 8)
265 | (((unsigned long) (field[1])) << 16)
266 | (((unsigned long) (field[0])) << 24);
267 }
268
269 case 6:
270 if (sizeof (elf_vma) == 8)
271 return ((elf_vma) (field[5]))
272 | (((elf_vma) (field[4])) << 8)
273 | (((elf_vma) (field[3])) << 16)
274 | (((elf_vma) (field[2])) << 24)
275 | (((elf_vma) (field[1])) << 32)
276 | (((elf_vma) (field[0])) << 40);
277 else if (sizeof (elf_vma) == 4)
278 {
279 /* Although we are extracting data from an 8 byte wide field,
280 we are returning only 4 bytes of data. */
281 field += 2;
282 return ((unsigned long) (field[3]))
283 | (((unsigned long) (field[2])) << 8)
284 | (((unsigned long) (field[1])) << 16)
285 | (((unsigned long) (field[0])) << 24);
286 }
287
288 case 7:
289 if (sizeof (elf_vma) == 8)
290 return ((elf_vma) (field[6]))
291 | (((elf_vma) (field[5])) << 8)
292 | (((elf_vma) (field[4])) << 16)
293 | (((elf_vma) (field[3])) << 24)
294 | (((elf_vma) (field[2])) << 32)
295 | (((elf_vma) (field[1])) << 40)
296 | (((elf_vma) (field[0])) << 48);
297 else if (sizeof (elf_vma) == 4)
298 {
299 /* Although we are extracting data from an 8 byte wide field,
300 we are returning only 4 bytes of data. */
301 field += 3;
302 return ((unsigned long) (field[3]))
303 | (((unsigned long) (field[2])) << 8)
304 | (((unsigned long) (field[1])) << 16)
305 | (((unsigned long) (field[0])) << 24);
306 }
307
3284fe0c
L
308 case 8:
309 if (sizeof (elf_vma) == 8)
310 return ((elf_vma) (field[7]))
311 | (((elf_vma) (field[6])) << 8)
312 | (((elf_vma) (field[5])) << 16)
313 | (((elf_vma) (field[4])) << 24)
314 | (((elf_vma) (field[3])) << 32)
315 | (((elf_vma) (field[2])) << 40)
316 | (((elf_vma) (field[1])) << 48)
317 | (((elf_vma) (field[0])) << 56);
318 else if (sizeof (elf_vma) == 4)
319 {
87bc83b3 320 /* Although we are extracting data from an 8 byte wide field,
3284fe0c
L
321 we are returning only 4 bytes of data. */
322 field += 4;
323 return ((unsigned long) (field[3]))
324 | (((unsigned long) (field[2])) << 8)
325 | (((unsigned long) (field[1])) << 16)
326 | (((unsigned long) (field[0])) << 24);
327 }
328
329 default:
330 error (_("Unhandled data length: %d\n"), size);
331 abort ();
332 }
333}
334
335elf_vma
336byte_get_signed (unsigned char *field, int size)
337{
338 elf_vma x = byte_get (field, size);
339
340 switch (size)
341 {
342 case 1:
343 return (x ^ 0x80) - 0x80;
344 case 2:
345 return (x ^ 0x8000) - 0x8000;
87bc83b3
CC
346 case 3:
347 return (x ^ 0x800000) - 0x800000;
3284fe0c
L
348 case 4:
349 return (x ^ 0x80000000) - 0x80000000;
87bc83b3
CC
350 case 5:
351 case 6:
352 case 7:
3284fe0c 353 case 8:
87bc83b3
CC
354 /* Reads of 5-, 6-, and 7-byte numbers are the result of
355 trying to read past the end of a buffer, and will therefore
356 not have meaningful values, so we don't try to deal with
357 the sign in these cases. */
3284fe0c
L
358 return x;
359 default:
360 abort ();
361 }
362}
363
74bc6052
CC
364/* Return the high-order 32-bits and the low-order 32-bits
365 of an 8-byte value separately. */
366
367void
368byte_get_64 (unsigned char *field, elf_vma *high, elf_vma *low)
369{
370 if (byte_get == byte_get_big_endian)
371 {
372 *high = byte_get_big_endian (field, 4);
373 *low = byte_get_big_endian (field + 4, 4);
374 }
375 else
376 {
377 *high = byte_get_little_endian (field + 4, 4);
378 *low = byte_get_little_endian (field, 4);
379 }
380 return;
381}
382
3284fe0c
L
383/* Return the path name for a proxy entry in a thin archive, adjusted
384 relative to the path name of the thin archive itself if necessary.
385 Always returns a pointer to malloc'ed memory. */
386
387char *
388adjust_relative_path (const char *file_name, const char *name,
389 int name_len)
390{
391 char * member_file_name;
392 const char * base_name = lbasename (file_name);
393
394 /* This is a proxy entry for a thin archive member.
395 If the extended name table contains an absolute path
396 name, or if the archive is in the current directory,
397 use the path name as given. Otherwise, we need to
398 find the member relative to the directory where the
399 archive is located. */
400 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
401 {
402 member_file_name = (char *) malloc (name_len + 1);
403 if (member_file_name == NULL)
404 {
405 error (_("Out of memory\n"));
406 return NULL;
407 }
408 memcpy (member_file_name, name, name_len);
409 member_file_name[name_len] = '\0';
410 }
411 else
412 {
413 /* Concatenate the path components of the archive file name
414 to the relative path name from the extended name table. */
415 size_t prefix_len = base_name - file_name;
416 member_file_name = (char *) malloc (prefix_len + name_len + 1);
417 if (member_file_name == NULL)
418 {
419 error (_("Out of memory\n"));
420 return NULL;
421 }
422 memcpy (member_file_name, file_name, prefix_len);
423 memcpy (member_file_name + prefix_len, name, name_len);
424 member_file_name[prefix_len + name_len] = '\0';
425 }
426 return member_file_name;
427}
428
c2a7d3f5
NC
429/* Processes the archive index table and symbol table in ARCH.
430 Entries in the index table are SIZEOF_AR_INDEX bytes long.
431 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
432 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
433 ARCH->sym_size and ARCH->sym_table.
434 It is the caller's responsibility to free ARCH->index_array and
435 ARCH->sym_table.
436 Returns TRUE upon success, FALSE otherwise.
437 If failure occurs an error message is printed. */
438
439static bfd_boolean
440process_archive_index_and_symbols (struct archive_info * arch,
441 unsigned int sizeof_ar_index,
442 bfd_boolean read_symbols)
443{
444 size_t got;
445 unsigned long size;
446
447 size = strtoul (arch->arhdr.ar_size, NULL, 10);
448 size = size + (size & 1);
449
450 arch->next_arhdr_offset += sizeof arch->arhdr + size;
451
452 if (! read_symbols)
453 {
454 if (fseek (arch->file, size, SEEK_CUR) != 0)
455 {
456 error (_("%s: failed to skip archive symbol table\n"),
457 arch->file_name);
458 return FALSE;
459 }
460 }
461 else
462 {
463 unsigned long i;
464 /* A buffer used to hold numbers read in from an archive index.
465 These are always SIZEOF_AR_INDEX bytes long and stored in
466 big-endian format. */
467 unsigned char integer_buffer[sizeof arch->index_num];
468 unsigned char * index_buffer;
469
470 assert (sizeof_ar_index <= sizeof integer_buffer);
471
472 /* Check the size of the archive index. */
473 if (size < sizeof_ar_index)
474 {
475 error (_("%s: the archive index is empty\n"), arch->file_name);
476 return FALSE;
477 }
478
479 /* Read the number of entries in the archive index. */
480 got = fread (integer_buffer, 1, sizeof_ar_index, arch->file);
481 if (got != sizeof_ar_index)
482 {
483 error (_("%s: failed to read archive index\n"), arch->file_name);
484 return FALSE;
485 }
486
487 arch->index_num = byte_get_big_endian (integer_buffer, sizeof_ar_index);
488 size -= sizeof_ar_index;
489
490 if (size < arch->index_num * sizeof_ar_index)
491 {
492 error (_("%s: the archive index is supposed to have %ld entries of %d bytes, but the size is only %ld\n"),
493 arch->file_name, (long) arch->index_num, sizeof_ar_index, size);
494 return FALSE;
495 }
496
497 /* Read in the archive index. */
498 index_buffer = (unsigned char *)
499 malloc (arch->index_num * sizeof_ar_index);
500 if (index_buffer == NULL)
501 {
502 error (_("Out of memory whilst trying to read archive symbol index\n"));
503 return FALSE;
504 }
505
506 got = fread (index_buffer, sizeof_ar_index, arch->index_num, arch->file);
507 if (got != arch->index_num)
508 {
509 free (index_buffer);
510 error (_("%s: failed to read archive index\n"), arch->file_name);
511 return FALSE;
512 }
513
514 size -= arch->index_num * sizeof_ar_index;
515
516 /* Convert the index numbers into the host's numeric format. */
517 arch->index_array = (elf_vma *)
518 malloc (arch->index_num * sizeof (* arch->index_array));
519 if (arch->index_array == NULL)
520 {
521 free (index_buffer);
522 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
523 return FALSE;
524 }
525
526 for (i = 0; i < arch->index_num; i++)
527 arch->index_array[i] =
528 byte_get_big_endian ((unsigned char *) (index_buffer + (i * sizeof_ar_index)),
529 sizeof_ar_index);
530 free (index_buffer);
531
532 /* The remaining space in the header is taken up by the symbol table. */
533 if (size < 1)
534 {
535 error (_("%s: the archive has an index but no symbols\n"),
536 arch->file_name);
537 return FALSE;
538 }
539
540 arch->sym_table = (char *) malloc (size);
541 if (arch->sym_table == NULL)
542 {
543 error (_("Out of memory whilst trying to read archive index symbol table\n"));
544 return FALSE;
545 }
546
547 arch->sym_size = size;
548 got = fread (arch->sym_table, 1, size, arch->file);
549 if (got != size)
550 {
551 error (_("%s: failed to read archive index symbol table\n"),
552 arch->file_name);
553 return FALSE;
554 }
555 }
556
557 /* Read the next archive header. */
558 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
559 if (got != sizeof arch->arhdr && got != 0)
560 {
561 error (_("%s: failed to read archive header following archive index\n"),
562 arch->file_name);
563 return FALSE;
564 }
565
566 return TRUE;
567}
568
3284fe0c
L
569/* Read the symbol table and long-name table from an archive. */
570
571int
572setup_archive (struct archive_info *arch, const char *file_name,
573 FILE *file, bfd_boolean is_thin_archive,
574 bfd_boolean read_symbols)
575{
576 size_t got;
3284fe0c
L
577
578 arch->file_name = strdup (file_name);
579 arch->file = file;
580 arch->index_num = 0;
581 arch->index_array = NULL;
582 arch->sym_table = NULL;
583 arch->sym_size = 0;
584 arch->longnames = NULL;
585 arch->longnames_size = 0;
586 arch->nested_member_origin = 0;
587 arch->is_thin_archive = is_thin_archive;
c2a7d3f5 588 arch->uses_64bit_indicies = FALSE;
3284fe0c
L
589 arch->next_arhdr_offset = SARMAG;
590
591 /* Read the first archive member header. */
592 if (fseek (file, SARMAG, SEEK_SET) != 0)
593 {
594 error (_("%s: failed to seek to first archive header\n"), file_name);
595 return 1;
596 }
597 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
598 if (got != sizeof arch->arhdr)
599 {
600 if (got == 0)
601 return 0;
602
603 error (_("%s: failed to read archive header\n"), file_name);
604 return 1;
605 }
606
607 /* See if this is the archive symbol table. */
c2a7d3f5 608 if (const_strneq (arch->arhdr.ar_name, "/ "))
3284fe0c 609 {
c2a7d3f5
NC
610 if (! process_archive_index_and_symbols (arch, 4, read_symbols))
611 return 1;
612 }
613 else if (const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
614 {
615 arch->uses_64bit_indicies = TRUE;
616 if (! process_archive_index_and_symbols (arch, 8, read_symbols))
617 return 1;
3284fe0c
L
618 }
619 else if (read_symbols)
620 printf (_("%s has no archive index\n"), file_name);
621
622 if (const_strneq (arch->arhdr.ar_name, "// "))
623 {
624 /* This is the archive string table holding long member names. */
625 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
626 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
627
628 arch->longnames = (char *) malloc (arch->longnames_size);
629 if (arch->longnames == NULL)
630 {
631 error (_("Out of memory reading long symbol names in archive\n"));
632 return 1;
633 }
634
635 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
636 {
637 free (arch->longnames);
638 arch->longnames = NULL;
639 error (_("%s: failed to read long symbol name string table\n"),
640 file_name);
641 return 1;
642 }
643
644 if ((arch->longnames_size & 1) != 0)
645 getc (file);
646 }
647
648 return 0;
649}
650
651/* Open and setup a nested archive, if not already open. */
652
653int
654setup_nested_archive (struct archive_info *nested_arch,
655 const char *member_file_name)
656{
657 FILE * member_file;
658
659 /* Have we already setup this archive? */
660 if (nested_arch->file_name != NULL
661 && streq (nested_arch->file_name, member_file_name))
662 return 0;
663
664 /* Close previous file and discard cached information. */
665 if (nested_arch->file != NULL)
666 fclose (nested_arch->file);
667 release_archive (nested_arch);
668
669 member_file = fopen (member_file_name, "rb");
670 if (member_file == NULL)
671 return 1;
672 return setup_archive (nested_arch, member_file_name, member_file,
673 FALSE, FALSE);
674}
675
676/* Release the memory used for the archive information. */
677
678void
679release_archive (struct archive_info * arch)
680{
681 if (arch->file_name != NULL)
682 free (arch->file_name);
683 if (arch->index_array != NULL)
684 free (arch->index_array);
685 if (arch->sym_table != NULL)
686 free (arch->sym_table);
687 if (arch->longnames != NULL)
688 free (arch->longnames);
689}
690
691/* Get the name of an archive member from the current archive header.
692 For simple names, this will modify the ar_name field of the current
693 archive header. For long names, it will return a pointer to the
694 longnames table. For nested archives, it will open the nested archive
695 and get the name recursively. NESTED_ARCH is a single-entry cache so
696 we don't keep rereading the same information from a nested archive. */
697
698char *
699get_archive_member_name (struct archive_info *arch,
700 struct archive_info *nested_arch)
701{
702 unsigned long j, k;
703
704 if (arch->arhdr.ar_name[0] == '/')
705 {
706 /* We have a long name. */
707 char *endp;
708 char *member_file_name;
709 char *member_name;
710
907b01b7
NC
711 if (arch->longnames == NULL || arch->longnames_size == 0)
712 {
713 error (_("Archive member uses long names, but no longname table found\n"));
714 return NULL;
715 }
716
3284fe0c
L
717 arch->nested_member_origin = 0;
718 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
719 if (arch->is_thin_archive && endp != NULL && * endp == ':')
720 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
721
722 while ((j < arch->longnames_size)
723 && (arch->longnames[j] != '\n')
724 && (arch->longnames[j] != '\0'))
725 j++;
726 if (arch->longnames[j-1] == '/')
727 j--;
728 arch->longnames[j] = '\0';
729
730 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
731 return arch->longnames + k;
732
733 /* This is a proxy for a member of a nested archive.
734 Find the name of the member in that archive. */
735 member_file_name = adjust_relative_path (arch->file_name,
736 arch->longnames + k, j - k);
737 if (member_file_name != NULL
738 && setup_nested_archive (nested_arch, member_file_name) == 0)
739 {
740 member_name = get_archive_member_name_at (nested_arch,
741 arch->nested_member_origin,
742 NULL);
743 if (member_name != NULL)
744 {
745 free (member_file_name);
746 return member_name;
747 }
748 }
749 free (member_file_name);
750
751 /* Last resort: just return the name of the nested archive. */
752 return arch->longnames + k;
753 }
754
755 /* We have a normal (short) name. */
756 for (j = 0; j < sizeof (arch->arhdr.ar_name); j++)
757 if (arch->arhdr.ar_name[j] == '/')
758 {
759 arch->arhdr.ar_name[j] = '\0';
760 return arch->arhdr.ar_name;
761 }
762
763 /* The full ar_name field is used. Don't rely on ar_date starting
764 with a zero byte. */
765 {
766 char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1);
767 memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name));
768 name[sizeof (arch->arhdr.ar_name)] = '\0';
769 return name;
770 }
771}
772
773/* Get the name of an archive member at a given OFFSET within an archive
774 ARCH. */
775
776char *
777get_archive_member_name_at (struct archive_info *arch,
778 unsigned long offset,
779 struct archive_info *nested_arch)
780{
781 size_t got;
782
783 if (fseek (arch->file, offset, SEEK_SET) != 0)
784 {
785 error (_("%s: failed to seek to next file name\n"), arch->file_name);
786 return NULL;
787 }
788 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
789 if (got != sizeof arch->arhdr)
790 {
791 error (_("%s: failed to read archive header\n"), arch->file_name);
792 return NULL;
793 }
794 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
795 {
796 error (_("%s: did not find a valid archive header\n"),
797 arch->file_name);
798 return NULL;
799 }
800
801 return get_archive_member_name (arch, nested_arch);
802}
803
804/* Construct a string showing the name of the archive member, qualified
805 with the name of the containing archive file. For thin archives, we
806 use square brackets to denote the indirection. For nested archives,
807 we show the qualified name of the external member inside the square
808 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
809
810char *
811make_qualified_name (struct archive_info * arch,
812 struct archive_info * nested_arch,
813 const char *member_name)
814{
a043396b 815 const char * error_name = _("<corrupt>");
3284fe0c
L
816 size_t len;
817 char * name;
818
819 len = strlen (arch->file_name) + strlen (member_name) + 3;
a043396b
NC
820 if (arch->is_thin_archive
821 && arch->nested_member_origin != 0)
822 {
823 /* PR 15140: Allow for corrupt thin archives. */
824 if (nested_arch->file_name)
825 len += strlen (nested_arch->file_name) + 2;
826 else
827 len += strlen (error_name) + 2;
828 }
3284fe0c
L
829
830 name = (char *) malloc (len);
831 if (name == NULL)
832 {
833 error (_("Out of memory\n"));
834 return NULL;
835 }
836
a043396b
NC
837 if (arch->is_thin_archive
838 && arch->nested_member_origin != 0)
839 {
840 if (nested_arch->file_name)
841 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
842 nested_arch->file_name, member_name);
843 else
844 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
845 error_name, member_name);
846 }
3284fe0c
L
847 else if (arch->is_thin_archive)
848 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
849 else
850 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
851
852 return name;
853}