[PATCH 40/57][Arm][OBJDUMP] Add support for MVE instructions: vdup, veor, vfma, vfms...
[binutils-gdb.git] / binutils / elfcomm.c
blob17cd492778db1ef3f27ae86e646df943be90e14f
1 /* elfcomm.c -- common code for ELF format file.
2 Copyright (C) 2010-2019 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
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.
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.
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. */
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"
31 #include <assert.h>
33 void
34 error (const char *message, ...)
36 va_list args;
38 /* Try to keep error messages in sync with the program's normal output. */
39 fflush (stdout);
41 va_start (args, message);
42 fprintf (stderr, _("%s: Error: "), program_name);
43 vfprintf (stderr, message, args);
44 va_end (args);
47 void
48 warn (const char *message, ...)
50 va_list args;
52 /* Try to keep warning messages in sync with the program's normal output. */
53 fflush (stdout);
55 va_start (args, message);
56 fprintf (stderr, _("%s: Warning: "), program_name);
57 vfprintf (stderr, message, args);
58 va_end (args);
61 void (*byte_put) (unsigned char *, elf_vma, int);
63 void
64 byte_put_little_endian (unsigned char * field, elf_vma value, int size)
66 switch (size)
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;
87 default:
88 error (_("Unhandled data length: %d\n"), size);
89 abort ();
93 void
94 byte_put_big_endian (unsigned char * field, elf_vma value, int size)
96 switch (size)
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;
122 default:
123 error (_("Unhandled data length: %d\n"), size);
124 abort ();
128 elf_vma (*byte_get) (const unsigned char *, int);
130 elf_vma
131 byte_get_little_endian (const unsigned char *field, int size)
133 switch (size)
135 case 1:
136 return *field;
138 case 2:
139 return ((unsigned int) (field[0]))
140 | (((unsigned int) (field[1])) << 8);
142 case 3:
143 return ((unsigned long) (field[0]))
144 | (((unsigned long) (field[1])) << 8)
145 | (((unsigned long) (field[2])) << 16);
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);
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 /* Fall through. */
170 case 6:
171 if (sizeof (elf_vma) == 8)
172 return ((elf_vma) (field[0]))
173 | (((elf_vma) (field[1])) << 8)
174 | (((elf_vma) (field[2])) << 16)
175 | (((elf_vma) (field[3])) << 24)
176 | (((elf_vma) (field[4])) << 32)
177 | (((elf_vma) (field[5])) << 40);
178 else if (sizeof (elf_vma) == 4)
179 /* We want to extract data from an 8 byte wide field and
180 place it into a 4 byte wide field. Since this is a little
181 endian source we can just use the 4 byte extraction code. */
182 return ((unsigned long) (field[0]))
183 | (((unsigned long) (field[1])) << 8)
184 | (((unsigned long) (field[2])) << 16)
185 | (((unsigned long) (field[3])) << 24);
186 /* Fall through. */
188 case 7:
189 if (sizeof (elf_vma) == 8)
190 return ((elf_vma) (field[0]))
191 | (((elf_vma) (field[1])) << 8)
192 | (((elf_vma) (field[2])) << 16)
193 | (((elf_vma) (field[3])) << 24)
194 | (((elf_vma) (field[4])) << 32)
195 | (((elf_vma) (field[5])) << 40)
196 | (((elf_vma) (field[6])) << 48);
197 else if (sizeof (elf_vma) == 4)
198 /* We want to extract data from an 8 byte wide field and
199 place it into a 4 byte wide field. Since this is a little
200 endian source we can just use the 4 byte extraction code. */
201 return ((unsigned long) (field[0]))
202 | (((unsigned long) (field[1])) << 8)
203 | (((unsigned long) (field[2])) << 16)
204 | (((unsigned long) (field[3])) << 24);
205 /* Fall through. */
207 case 8:
208 if (sizeof (elf_vma) == 8)
209 return ((elf_vma) (field[0]))
210 | (((elf_vma) (field[1])) << 8)
211 | (((elf_vma) (field[2])) << 16)
212 | (((elf_vma) (field[3])) << 24)
213 | (((elf_vma) (field[4])) << 32)
214 | (((elf_vma) (field[5])) << 40)
215 | (((elf_vma) (field[6])) << 48)
216 | (((elf_vma) (field[7])) << 56);
217 else if (sizeof (elf_vma) == 4)
218 /* We want to extract data from an 8 byte wide field and
219 place it into a 4 byte wide field. Since this is a little
220 endian source we can just use the 4 byte extraction code. */
221 return ((unsigned long) (field[0]))
222 | (((unsigned long) (field[1])) << 8)
223 | (((unsigned long) (field[2])) << 16)
224 | (((unsigned long) (field[3])) << 24);
225 /* Fall through. */
227 default:
228 error (_("Unhandled data length: %d\n"), size);
229 abort ();
233 elf_vma
234 byte_get_big_endian (const unsigned char *field, int size)
236 switch (size)
238 case 1:
239 return *field;
241 case 2:
242 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
244 case 3:
245 return ((unsigned long) (field[2]))
246 | (((unsigned long) (field[1])) << 8)
247 | (((unsigned long) (field[0])) << 16);
249 case 4:
250 return ((unsigned long) (field[3]))
251 | (((unsigned long) (field[2])) << 8)
252 | (((unsigned long) (field[1])) << 16)
253 | (((unsigned long) (field[0])) << 24);
255 case 5:
256 if (sizeof (elf_vma) == 8)
257 return ((elf_vma) (field[4]))
258 | (((elf_vma) (field[3])) << 8)
259 | (((elf_vma) (field[2])) << 16)
260 | (((elf_vma) (field[1])) << 24)
261 | (((elf_vma) (field[0])) << 32);
262 else if (sizeof (elf_vma) == 4)
264 /* Although we are extracting data from an 8 byte wide field,
265 we are returning only 4 bytes of data. */
266 field += 1;
267 return ((unsigned long) (field[3]))
268 | (((unsigned long) (field[2])) << 8)
269 | (((unsigned long) (field[1])) << 16)
270 | (((unsigned long) (field[0])) << 24);
272 /* Fall through. */
274 case 6:
275 if (sizeof (elf_vma) == 8)
276 return ((elf_vma) (field[5]))
277 | (((elf_vma) (field[4])) << 8)
278 | (((elf_vma) (field[3])) << 16)
279 | (((elf_vma) (field[2])) << 24)
280 | (((elf_vma) (field[1])) << 32)
281 | (((elf_vma) (field[0])) << 40);
282 else if (sizeof (elf_vma) == 4)
284 /* Although we are extracting data from an 8 byte wide field,
285 we are returning only 4 bytes of data. */
286 field += 2;
287 return ((unsigned long) (field[3]))
288 | (((unsigned long) (field[2])) << 8)
289 | (((unsigned long) (field[1])) << 16)
290 | (((unsigned long) (field[0])) << 24);
292 /* Fall through. */
294 case 7:
295 if (sizeof (elf_vma) == 8)
296 return ((elf_vma) (field[6]))
297 | (((elf_vma) (field[5])) << 8)
298 | (((elf_vma) (field[4])) << 16)
299 | (((elf_vma) (field[3])) << 24)
300 | (((elf_vma) (field[2])) << 32)
301 | (((elf_vma) (field[1])) << 40)
302 | (((elf_vma) (field[0])) << 48);
303 else if (sizeof (elf_vma) == 4)
305 /* Although we are extracting data from an 8 byte wide field,
306 we are returning only 4 bytes of data. */
307 field += 3;
308 return ((unsigned long) (field[3]))
309 | (((unsigned long) (field[2])) << 8)
310 | (((unsigned long) (field[1])) << 16)
311 | (((unsigned long) (field[0])) << 24);
313 /* Fall through. */
315 case 8:
316 if (sizeof (elf_vma) == 8)
317 return ((elf_vma) (field[7]))
318 | (((elf_vma) (field[6])) << 8)
319 | (((elf_vma) (field[5])) << 16)
320 | (((elf_vma) (field[4])) << 24)
321 | (((elf_vma) (field[3])) << 32)
322 | (((elf_vma) (field[2])) << 40)
323 | (((elf_vma) (field[1])) << 48)
324 | (((elf_vma) (field[0])) << 56);
325 else if (sizeof (elf_vma) == 4)
327 /* Although we are extracting data from an 8 byte wide field,
328 we are returning only 4 bytes of data. */
329 field += 4;
330 return ((unsigned long) (field[3]))
331 | (((unsigned long) (field[2])) << 8)
332 | (((unsigned long) (field[1])) << 16)
333 | (((unsigned long) (field[0])) << 24);
335 /* Fall through. */
337 default:
338 error (_("Unhandled data length: %d\n"), size);
339 abort ();
343 elf_vma
344 byte_get_signed (const unsigned char *field, int size)
346 elf_vma x = byte_get (field, size);
348 switch (size)
350 case 1:
351 return (x ^ 0x80) - 0x80;
352 case 2:
353 return (x ^ 0x8000) - 0x8000;
354 case 3:
355 return (x ^ 0x800000) - 0x800000;
356 case 4:
357 return (x ^ 0x80000000) - 0x80000000;
358 case 5:
359 case 6:
360 case 7:
361 case 8:
362 /* Reads of 5-, 6-, and 7-byte numbers are the result of
363 trying to read past the end of a buffer, and will therefore
364 not have meaningful values, so we don't try to deal with
365 the sign in these cases. */
366 return x;
367 default:
368 abort ();
372 /* Return the high-order 32-bits and the low-order 32-bits
373 of an 8-byte value separately. */
375 void
376 byte_get_64 (const unsigned char *field, elf_vma *high, elf_vma *low)
378 if (byte_get == byte_get_big_endian)
380 *high = byte_get_big_endian (field, 4);
381 *low = byte_get_big_endian (field + 4, 4);
383 else
385 *high = byte_get_little_endian (field + 4, 4);
386 *low = byte_get_little_endian (field, 4);
388 return;
391 /* Return the path name for a proxy entry in a thin archive, adjusted
392 relative to the path name of the thin archive itself if necessary.
393 Always returns a pointer to malloc'ed memory. */
395 char *
396 adjust_relative_path (const char *file_name, const char *name,
397 unsigned long name_len)
399 char * member_file_name;
400 const char * base_name = lbasename (file_name);
401 size_t amt;
403 /* This is a proxy entry for a thin archive member.
404 If the extended name table contains an absolute path
405 name, or if the archive is in the current directory,
406 use the path name as given. Otherwise, we need to
407 find the member relative to the directory where the
408 archive is located. */
409 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
411 amt = name_len + 1;
412 if (amt == 0)
413 return NULL;
414 member_file_name = (char *) malloc (amt);
415 if (member_file_name == NULL)
417 error (_("Out of memory\n"));
418 return NULL;
420 memcpy (member_file_name, name, name_len);
421 member_file_name[name_len] = '\0';
423 else
425 /* Concatenate the path components of the archive file name
426 to the relative path name from the extended name table. */
427 size_t prefix_len = base_name - file_name;
429 amt = prefix_len + name_len + 1;
430 /* PR 17531: file: 2896dc8b
431 Catch wraparound. */
432 if (amt < prefix_len || amt < name_len)
434 error (_("Abnormal length of thin archive member name: %lx\n"),
435 name_len);
436 return NULL;
439 member_file_name = (char *) malloc (amt);
440 if (member_file_name == NULL)
442 error (_("Out of memory\n"));
443 return NULL;
445 memcpy (member_file_name, file_name, prefix_len);
446 memcpy (member_file_name + prefix_len, name, name_len);
447 member_file_name[prefix_len + name_len] = '\0';
449 return member_file_name;
452 /* Processes the archive index table and symbol table in ARCH.
453 Entries in the index table are SIZEOF_AR_INDEX bytes long.
454 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
455 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
456 ARCH->sym_size and ARCH->sym_table.
457 It is the caller's responsibility to free ARCH->index_array and
458 ARCH->sym_table.
459 Returns TRUE upon success, FALSE otherwise.
460 If failure occurs an error message is printed. */
462 static bfd_boolean
463 process_archive_index_and_symbols (struct archive_info * arch,
464 unsigned int sizeof_ar_index,
465 bfd_boolean read_symbols)
467 size_t got;
468 unsigned long size;
469 char fmag_save;
471 fmag_save = arch->arhdr.ar_fmag[0];
472 arch->arhdr.ar_fmag[0] = 0;
473 size = strtoul (arch->arhdr.ar_size, NULL, 10);
474 arch->arhdr.ar_fmag[0] = fmag_save;
475 /* PR 17531: file: 912bd7de. */
476 if ((signed long) size < 0)
478 error (_("%s: invalid archive header size: %ld\n"),
479 arch->file_name, size);
480 return FALSE;
483 size = size + (size & 1);
485 arch->next_arhdr_offset += sizeof arch->arhdr + size;
487 if (! read_symbols)
489 if (fseek (arch->file, size, SEEK_CUR) != 0)
491 error (_("%s: failed to skip archive symbol table\n"),
492 arch->file_name);
493 return FALSE;
496 else
498 unsigned long i;
499 /* A buffer used to hold numbers read in from an archive index.
500 These are always SIZEOF_AR_INDEX bytes long and stored in
501 big-endian format. */
502 unsigned char integer_buffer[sizeof arch->index_num];
503 unsigned char * index_buffer;
505 assert (sizeof_ar_index <= sizeof integer_buffer);
507 /* Check the size of the archive index. */
508 if (size < sizeof_ar_index)
510 error (_("%s: the archive index is empty\n"), arch->file_name);
511 return FALSE;
514 /* Read the number of entries in the archive index. */
515 got = fread (integer_buffer, 1, sizeof_ar_index, arch->file);
516 if (got != sizeof_ar_index)
518 error (_("%s: failed to read archive index\n"), arch->file_name);
519 return FALSE;
522 arch->index_num = byte_get_big_endian (integer_buffer, sizeof_ar_index);
523 size -= sizeof_ar_index;
525 if (size < arch->index_num * sizeof_ar_index
526 /* PR 17531: file: 585515d1. */
527 || size < arch->index_num)
529 error (_("%s: the archive index is supposed to have 0x%lx entries of %d bytes, but the size is only 0x%lx\n"),
530 arch->file_name, (long) arch->index_num, sizeof_ar_index, size);
531 return FALSE;
534 /* Read in the archive index. */
535 index_buffer = (unsigned char *)
536 malloc (arch->index_num * sizeof_ar_index);
537 if (index_buffer == NULL)
539 error (_("Out of memory whilst trying to read archive symbol index\n"));
540 return FALSE;
543 got = fread (index_buffer, sizeof_ar_index, arch->index_num, arch->file);
544 if (got != arch->index_num)
546 free (index_buffer);
547 error (_("%s: failed to read archive index\n"), arch->file_name);
548 return FALSE;
551 size -= arch->index_num * sizeof_ar_index;
553 /* Convert the index numbers into the host's numeric format. */
554 arch->index_array = (elf_vma *)
555 malloc (arch->index_num * sizeof (* arch->index_array));
556 if (arch->index_array == NULL)
558 free (index_buffer);
559 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
560 return FALSE;
563 for (i = 0; i < arch->index_num; i++)
564 arch->index_array[i] =
565 byte_get_big_endian ((unsigned char *) (index_buffer + (i * sizeof_ar_index)),
566 sizeof_ar_index);
567 free (index_buffer);
569 /* The remaining space in the header is taken up by the symbol table. */
570 if (size < 1)
572 error (_("%s: the archive has an index but no symbols\n"),
573 arch->file_name);
574 return FALSE;
577 arch->sym_table = (char *) malloc (size);
578 if (arch->sym_table == NULL)
580 error (_("Out of memory whilst trying to read archive index symbol table\n"));
581 return FALSE;
584 arch->sym_size = size;
585 got = fread (arch->sym_table, 1, size, arch->file);
586 if (got != size)
588 error (_("%s: failed to read archive index symbol table\n"),
589 arch->file_name);
590 return FALSE;
594 /* Read the next archive header. */
595 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
596 if (got != sizeof arch->arhdr && got != 0)
598 error (_("%s: failed to read archive header following archive index\n"),
599 arch->file_name);
600 return FALSE;
603 return TRUE;
606 /* Read the symbol table and long-name table from an archive. */
609 setup_archive (struct archive_info *arch, const char *file_name,
610 FILE *file, bfd_boolean is_thin_archive,
611 bfd_boolean read_symbols)
613 size_t got;
615 arch->file_name = strdup (file_name);
616 arch->file = file;
617 arch->index_num = 0;
618 arch->index_array = NULL;
619 arch->sym_table = NULL;
620 arch->sym_size = 0;
621 arch->longnames = NULL;
622 arch->longnames_size = 0;
623 arch->nested_member_origin = 0;
624 arch->is_thin_archive = is_thin_archive;
625 arch->uses_64bit_indices = FALSE;
626 arch->next_arhdr_offset = SARMAG;
628 /* Read the first archive member header. */
629 if (fseek (file, SARMAG, SEEK_SET) != 0)
631 error (_("%s: failed to seek to first archive header\n"), file_name);
632 return 1;
634 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
635 if (got != sizeof arch->arhdr)
637 if (got == 0)
638 return 0;
640 error (_("%s: failed to read archive header\n"), file_name);
641 return 1;
644 /* See if this is the archive symbol table. */
645 if (const_strneq (arch->arhdr.ar_name, "/ "))
647 if (! process_archive_index_and_symbols (arch, 4, read_symbols))
648 return 1;
650 else if (const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
652 arch->uses_64bit_indices = TRUE;
653 if (! process_archive_index_and_symbols (arch, 8, read_symbols))
654 return 1;
656 else if (read_symbols)
657 printf (_("%s has no archive index\n"), file_name);
659 if (const_strneq (arch->arhdr.ar_name, "// "))
661 /* This is the archive string table holding long member names. */
662 char fmag_save = arch->arhdr.ar_fmag[0];
663 arch->arhdr.ar_fmag[0] = 0;
664 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
665 arch->arhdr.ar_fmag[0] = fmag_save;
666 /* PR 17531: file: 01068045. */
667 if (arch->longnames_size < 8)
669 error (_("%s: long name table is too small, (size = %ld)\n"),
670 file_name, arch->longnames_size);
671 return 1;
673 /* PR 17531: file: 639d6a26. */
674 if ((signed long) arch->longnames_size < 0)
676 error (_("%s: long name table is too big, (size = 0x%lx)\n"),
677 file_name, arch->longnames_size);
678 return 1;
681 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
683 /* Plus one to allow for a string terminator. */
684 arch->longnames = (char *) malloc (arch->longnames_size + 1);
685 if (arch->longnames == NULL)
687 error (_("Out of memory reading long symbol names in archive\n"));
688 return 1;
691 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
693 free (arch->longnames);
694 arch->longnames = NULL;
695 error (_("%s: failed to read long symbol name string table\n"),
696 file_name);
697 return 1;
700 if ((arch->longnames_size & 1) != 0)
701 getc (file);
703 arch->longnames[arch->longnames_size] = 0;
706 return 0;
709 /* Open and setup a nested archive, if not already open. */
712 setup_nested_archive (struct archive_info *nested_arch,
713 const char *member_file_name)
715 FILE * member_file;
717 /* Have we already setup this archive? */
718 if (nested_arch->file_name != NULL
719 && streq (nested_arch->file_name, member_file_name))
720 return 0;
722 /* Close previous file and discard cached information. */
723 if (nested_arch->file != NULL)
724 fclose (nested_arch->file);
725 release_archive (nested_arch);
727 member_file = fopen (member_file_name, "rb");
728 if (member_file == NULL)
729 return 1;
730 return setup_archive (nested_arch, member_file_name, member_file,
731 FALSE, FALSE);
734 /* Release the memory used for the archive information. */
736 void
737 release_archive (struct archive_info * arch)
739 if (arch->file_name != NULL)
740 free (arch->file_name);
741 if (arch->index_array != NULL)
742 free (arch->index_array);
743 if (arch->sym_table != NULL)
744 free (arch->sym_table);
745 if (arch->longnames != NULL)
746 free (arch->longnames);
749 /* Get the name of an archive member from the current archive header.
750 For simple names, this will modify the ar_name field of the current
751 archive header. For long names, it will return a pointer to the
752 longnames table. For nested archives, it will open the nested archive
753 and get the name recursively. NESTED_ARCH is a single-entry cache so
754 we don't keep rereading the same information from a nested archive. */
756 char *
757 get_archive_member_name (struct archive_info *arch,
758 struct archive_info *nested_arch)
760 unsigned long j, k;
762 if (arch->arhdr.ar_name[0] == '/')
764 /* We have a long name. */
765 char *endp;
766 char *member_file_name;
767 char *member_name;
768 char fmag_save;
770 if (arch->longnames == NULL || arch->longnames_size == 0)
772 error (_("Archive member uses long names, but no longname table found\n"));
773 return NULL;
776 arch->nested_member_origin = 0;
777 fmag_save = arch->arhdr.ar_fmag[0];
778 arch->arhdr.ar_fmag[0] = 0;
779 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
780 if (arch->is_thin_archive && endp != NULL && * endp == ':')
781 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
782 arch->arhdr.ar_fmag[0] = fmag_save;
784 if (j > arch->longnames_size)
786 error (_("Found long name index (%ld) beyond end of long name table\n"),j);
787 return NULL;
789 while ((j < arch->longnames_size)
790 && (arch->longnames[j] != '\n')
791 && (arch->longnames[j] != '\0'))
792 j++;
793 if (j > 0 && arch->longnames[j-1] == '/')
794 j--;
795 if (j > arch->longnames_size)
796 j = arch->longnames_size;
797 arch->longnames[j] = '\0';
799 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
800 return arch->longnames + k;
802 /* PR 17531: file: 2896dc8b. */
803 if (k >= j)
805 error (_("Invalid Thin archive member name\n"));
806 return NULL;
809 /* This is a proxy for a member of a nested archive.
810 Find the name of the member in that archive. */
811 member_file_name = adjust_relative_path (arch->file_name,
812 arch->longnames + k, j - k);
813 if (member_file_name != NULL
814 && setup_nested_archive (nested_arch, member_file_name) == 0)
816 member_name = get_archive_member_name_at (nested_arch,
817 arch->nested_member_origin,
818 NULL);
819 if (member_name != NULL)
821 free (member_file_name);
822 return member_name;
825 free (member_file_name);
827 /* Last resort: just return the name of the nested archive. */
828 return arch->longnames + k;
831 /* We have a normal (short) name. */
832 for (j = 0; j < sizeof (arch->arhdr.ar_name); j++)
833 if (arch->arhdr.ar_name[j] == '/')
835 arch->arhdr.ar_name[j] = '\0';
836 return arch->arhdr.ar_name;
839 /* The full ar_name field is used. Don't rely on ar_date starting
840 with a zero byte. */
842 char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1);
843 memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name));
844 name[sizeof (arch->arhdr.ar_name)] = '\0';
845 return name;
849 /* Get the name of an archive member at a given OFFSET within an archive
850 ARCH. */
852 char *
853 get_archive_member_name_at (struct archive_info *arch,
854 unsigned long offset,
855 struct archive_info *nested_arch)
857 size_t got;
859 if (fseek (arch->file, offset, SEEK_SET) != 0)
861 error (_("%s: failed to seek to next file name\n"), arch->file_name);
862 return NULL;
864 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
865 if (got != sizeof arch->arhdr)
867 error (_("%s: failed to read archive header\n"), arch->file_name);
868 return NULL;
870 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
872 error (_("%s: did not find a valid archive header\n"),
873 arch->file_name);
874 return NULL;
877 return get_archive_member_name (arch, nested_arch);
880 /* Construct a string showing the name of the archive member, qualified
881 with the name of the containing archive file. For thin archives, we
882 use square brackets to denote the indirection. For nested archives,
883 we show the qualified name of the external member inside the square
884 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
886 char *
887 make_qualified_name (struct archive_info * arch,
888 struct archive_info * nested_arch,
889 const char *member_name)
891 const char * error_name = _("<corrupt>");
892 size_t len;
893 char * name;
895 len = strlen (arch->file_name) + strlen (member_name) + 3;
896 if (arch->is_thin_archive
897 && arch->nested_member_origin != 0)
899 /* PR 15140: Allow for corrupt thin archives. */
900 if (nested_arch->file_name)
901 len += strlen (nested_arch->file_name) + 2;
902 else
903 len += strlen (error_name) + 2;
906 name = (char *) malloc (len);
907 if (name == NULL)
909 error (_("Out of memory\n"));
910 return NULL;
913 if (arch->is_thin_archive
914 && arch->nested_member_origin != 0)
916 if (nested_arch->file_name)
917 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
918 nested_arch->file_name, member_name);
919 else
920 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
921 error_name, member_name);
923 else if (arch->is_thin_archive)
924 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
925 else
926 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
928 return name;