1 /* elfcomm.c -- common code for ELF format file.
2 Copyright (C) 2010-2014 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
25 #include "libiberty.h"
26 #include "filenames.h"
34 error (const char *message
, ...)
38 /* Try to keep error messages in sync with the program's normal output. */
41 va_start (args
, message
);
42 fprintf (stderr
, _("%s: Error: "), program_name
);
43 vfprintf (stderr
, message
, args
);
48 warn (const char *message
, ...)
52 /* Try to keep warning messages in sync with the program's normal output. */
55 va_start (args
, message
);
56 fprintf (stderr
, _("%s: Warning: "), program_name
);
57 vfprintf (stderr
, message
, args
);
61 void (*byte_put
) (unsigned char *, elf_vma
, int);
64 byte_put_little_endian (unsigned char * field
, elf_vma value
, int size
)
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;
75 field
[3] = (value
>> 24) & 0xff;
78 field
[2] = (value
>> 16) & 0xff;
81 field
[1] = (value
>> 8) & 0xff;
84 field
[0] = value
& 0xff;
88 error (_("Unhandled data length: %d\n"), size
);
94 byte_put_big_endian (unsigned char * field
, elf_vma value
, int size
)
99 field
[7] = value
& 0xff;
100 field
[6] = (value
>> 8) & 0xff;
101 field
[5] = (value
>> 16) & 0xff;
102 field
[4] = (value
>> 24) & 0xff;
107 field
[3] = value
& 0xff;
111 field
[2] = value
& 0xff;
115 field
[1] = value
& 0xff;
119 field
[0] = value
& 0xff;
123 error (_("Unhandled data length: %d\n"), size
);
128 elf_vma (*byte_get
) (unsigned char *, int);
131 byte_get_little_endian (unsigned char *field
, int size
)
139 return ((unsigned int) (field
[0]))
140 | (((unsigned int) (field
[1])) << 8);
143 return ((unsigned long) (field
[0]))
144 | (((unsigned long) (field
[1])) << 8)
145 | (((unsigned long) (field
[2])) << 16);
148 return ((unsigned long) (field
[0]))
149 | (((unsigned long) (field
[1])) << 8)
150 | (((unsigned long) (field
[2])) << 16)
151 | (((unsigned long) (field
[3])) << 24);
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);
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);
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);
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);
224 error (_("Unhandled data length: %d\n"), size
);
230 byte_get_big_endian (unsigned char *field
, int size
)
238 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
241 return ((unsigned long) (field
[2]))
242 | (((unsigned long) (field
[1])) << 8)
243 | (((unsigned long) (field
[0])) << 16);
246 return ((unsigned long) (field
[3]))
247 | (((unsigned long) (field
[2])) << 8)
248 | (((unsigned long) (field
[1])) << 16)
249 | (((unsigned long) (field
[0])) << 24);
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)
260 /* Although we are extracting data from an 8 byte wide field,
261 we are returning only 4 bytes of data. */
263 return ((unsigned long) (field
[3]))
264 | (((unsigned long) (field
[2])) << 8)
265 | (((unsigned long) (field
[1])) << 16)
266 | (((unsigned long) (field
[0])) << 24);
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)
279 /* Although we are extracting data from an 8 byte wide field,
280 we are returning only 4 bytes of data. */
282 return ((unsigned long) (field
[3]))
283 | (((unsigned long) (field
[2])) << 8)
284 | (((unsigned long) (field
[1])) << 16)
285 | (((unsigned long) (field
[0])) << 24);
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)
299 /* Although we are extracting data from an 8 byte wide field,
300 we are returning only 4 bytes of data. */
302 return ((unsigned long) (field
[3]))
303 | (((unsigned long) (field
[2])) << 8)
304 | (((unsigned long) (field
[1])) << 16)
305 | (((unsigned long) (field
[0])) << 24);
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)
320 /* Although we are extracting data from an 8 byte wide field,
321 we are returning only 4 bytes of data. */
323 return ((unsigned long) (field
[3]))
324 | (((unsigned long) (field
[2])) << 8)
325 | (((unsigned long) (field
[1])) << 16)
326 | (((unsigned long) (field
[0])) << 24);
330 error (_("Unhandled data length: %d\n"), size
);
336 byte_get_signed (unsigned char *field
, int size
)
338 elf_vma x
= byte_get (field
, size
);
343 return (x
^ 0x80) - 0x80;
345 return (x
^ 0x8000) - 0x8000;
347 return (x
^ 0x800000) - 0x800000;
349 return (x
^ 0x80000000) - 0x80000000;
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. */
364 /* Return the high-order 32-bits and the low-order 32-bits
365 of an 8-byte value separately. */
368 byte_get_64 (unsigned char *field
, elf_vma
*high
, elf_vma
*low
)
370 if (byte_get
== byte_get_big_endian
)
372 *high
= byte_get_big_endian (field
, 4);
373 *low
= byte_get_big_endian (field
+ 4, 4);
377 *high
= byte_get_little_endian (field
+ 4, 4);
378 *low
= byte_get_little_endian (field
, 4);
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. */
388 adjust_relative_path (const char *file_name
, const char *name
,
389 unsigned long name_len
)
391 char * member_file_name
;
392 const char * base_name
= lbasename (file_name
);
395 /* This is a proxy entry for a thin archive member.
396 If the extended name table contains an absolute path
397 name, or if the archive is in the current directory,
398 use the path name as given. Otherwise, we need to
399 find the member relative to the directory where the
400 archive is located. */
401 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
406 member_file_name
= (char *) malloc (amt
);
407 if (member_file_name
== NULL
)
409 error (_("Out of memory\n"));
412 memcpy (member_file_name
, name
, name_len
);
413 member_file_name
[name_len
] = '\0';
417 /* Concatenate the path components of the archive file name
418 to the relative path name from the extended name table. */
419 size_t prefix_len
= base_name
- file_name
;
421 amt
= prefix_len
+ name_len
+ 1;
422 /* PR 17531: file: 2896dc8b
424 if (amt
< prefix_len
|| amt
< name_len
)
426 error (_("Abnormal length of thin archive member name: %lx\n"),
431 member_file_name
= (char *) malloc (amt
);
432 if (member_file_name
== NULL
)
434 error (_("Out of memory\n"));
437 memcpy (member_file_name
, file_name
, prefix_len
);
438 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
439 member_file_name
[prefix_len
+ name_len
] = '\0';
441 return member_file_name
;
444 /* Processes the archive index table and symbol table in ARCH.
445 Entries in the index table are SIZEOF_AR_INDEX bytes long.
446 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
447 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
448 ARCH->sym_size and ARCH->sym_table.
449 It is the caller's responsibility to free ARCH->index_array and
451 Returns TRUE upon success, FALSE otherwise.
452 If failure occurs an error message is printed. */
455 process_archive_index_and_symbols (struct archive_info
* arch
,
456 unsigned int sizeof_ar_index
,
457 bfd_boolean read_symbols
)
462 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
463 /* PR 17531: file: 912bd7de. */
464 if ((signed long) size
< 0)
466 error (_("%s: invalid archive header size: %ld\n"),
467 arch
->file_name
, size
);
471 size
= size
+ (size
& 1);
473 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
477 if (fseek (arch
->file
, size
, SEEK_CUR
) != 0)
479 error (_("%s: failed to skip archive symbol table\n"),
487 /* A buffer used to hold numbers read in from an archive index.
488 These are always SIZEOF_AR_INDEX bytes long and stored in
489 big-endian format. */
490 unsigned char integer_buffer
[sizeof arch
->index_num
];
491 unsigned char * index_buffer
;
493 assert (sizeof_ar_index
<= sizeof integer_buffer
);
495 /* Check the size of the archive index. */
496 if (size
< sizeof_ar_index
)
498 error (_("%s: the archive index is empty\n"), arch
->file_name
);
502 /* Read the number of entries in the archive index. */
503 got
= fread (integer_buffer
, 1, sizeof_ar_index
, arch
->file
);
504 if (got
!= sizeof_ar_index
)
506 error (_("%s: failed to read archive index\n"), arch
->file_name
);
510 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof_ar_index
);
511 size
-= sizeof_ar_index
;
513 if (size
< arch
->index_num
* sizeof_ar_index
)
515 error (_("%s: the archive index is supposed to have %ld entries of %d bytes, but the size is only %ld\n"),
516 arch
->file_name
, (long) arch
->index_num
, sizeof_ar_index
, size
);
520 /* Read in the archive index. */
521 index_buffer
= (unsigned char *)
522 malloc (arch
->index_num
* sizeof_ar_index
);
523 if (index_buffer
== NULL
)
525 error (_("Out of memory whilst trying to read archive symbol index\n"));
529 got
= fread (index_buffer
, sizeof_ar_index
, arch
->index_num
, arch
->file
);
530 if (got
!= arch
->index_num
)
533 error (_("%s: failed to read archive index\n"), arch
->file_name
);
537 size
-= arch
->index_num
* sizeof_ar_index
;
539 /* Convert the index numbers into the host's numeric format. */
540 arch
->index_array
= (elf_vma
*)
541 malloc (arch
->index_num
* sizeof (* arch
->index_array
));
542 if (arch
->index_array
== NULL
)
545 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
549 for (i
= 0; i
< arch
->index_num
; i
++)
550 arch
->index_array
[i
] =
551 byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* sizeof_ar_index
)),
555 /* The remaining space in the header is taken up by the symbol table. */
558 error (_("%s: the archive has an index but no symbols\n"),
563 arch
->sym_table
= (char *) malloc (size
);
564 if (arch
->sym_table
== NULL
)
566 error (_("Out of memory whilst trying to read archive index symbol table\n"));
570 arch
->sym_size
= size
;
571 got
= fread (arch
->sym_table
, 1, size
, arch
->file
);
574 error (_("%s: failed to read archive index symbol table\n"),
580 /* Read the next archive header. */
581 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
582 if (got
!= sizeof arch
->arhdr
&& got
!= 0)
584 error (_("%s: failed to read archive header following archive index\n"),
592 /* Read the symbol table and long-name table from an archive. */
595 setup_archive (struct archive_info
*arch
, const char *file_name
,
596 FILE *file
, bfd_boolean is_thin_archive
,
597 bfd_boolean read_symbols
)
601 arch
->file_name
= strdup (file_name
);
604 arch
->index_array
= NULL
;
605 arch
->sym_table
= NULL
;
607 arch
->longnames
= NULL
;
608 arch
->longnames_size
= 0;
609 arch
->nested_member_origin
= 0;
610 arch
->is_thin_archive
= is_thin_archive
;
611 arch
->uses_64bit_indicies
= FALSE
;
612 arch
->next_arhdr_offset
= SARMAG
;
614 /* Read the first archive member header. */
615 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
617 error (_("%s: failed to seek to first archive header\n"), file_name
);
620 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
621 if (got
!= sizeof arch
->arhdr
)
626 error (_("%s: failed to read archive header\n"), file_name
);
630 /* See if this is the archive symbol table. */
631 if (const_strneq (arch
->arhdr
.ar_name
, "/ "))
633 if (! process_archive_index_and_symbols (arch
, 4, read_symbols
))
636 else if (const_strneq (arch
->arhdr
.ar_name
, "/SYM64/ "))
638 arch
->uses_64bit_indicies
= TRUE
;
639 if (! process_archive_index_and_symbols (arch
, 8, read_symbols
))
642 else if (read_symbols
)
643 printf (_("%s has no archive index\n"), file_name
);
645 if (const_strneq (arch
->arhdr
.ar_name
, "// "))
647 /* This is the archive string table holding long member names. */
648 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
649 /* PR 17531: file: 01068045. */
650 if (arch
->longnames_size
< 8)
652 error (_("%s: long name table is too small, (size = %ld)\n"),
653 file_name
, arch
->longnames_size
);
656 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
658 /* Plus one to allow for a string terminator. */
659 arch
->longnames
= (char *) malloc (arch
->longnames_size
+ 1);
660 if (arch
->longnames
== NULL
)
662 error (_("Out of memory reading long symbol names in archive\n"));
666 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
668 free (arch
->longnames
);
669 arch
->longnames
= NULL
;
670 error (_("%s: failed to read long symbol name string table\n"),
675 if ((arch
->longnames_size
& 1) != 0)
682 /* Open and setup a nested archive, if not already open. */
685 setup_nested_archive (struct archive_info
*nested_arch
,
686 const char *member_file_name
)
690 /* Have we already setup this archive? */
691 if (nested_arch
->file_name
!= NULL
692 && streq (nested_arch
->file_name
, member_file_name
))
695 /* Close previous file and discard cached information. */
696 if (nested_arch
->file
!= NULL
)
697 fclose (nested_arch
->file
);
698 release_archive (nested_arch
);
700 member_file
= fopen (member_file_name
, "rb");
701 if (member_file
== NULL
)
703 return setup_archive (nested_arch
, member_file_name
, member_file
,
707 /* Release the memory used for the archive information. */
710 release_archive (struct archive_info
* arch
)
712 if (arch
->file_name
!= NULL
)
713 free (arch
->file_name
);
714 if (arch
->index_array
!= NULL
)
715 free (arch
->index_array
);
716 if (arch
->sym_table
!= NULL
)
717 free (arch
->sym_table
);
718 if (arch
->longnames
!= NULL
)
719 free (arch
->longnames
);
722 /* Get the name of an archive member from the current archive header.
723 For simple names, this will modify the ar_name field of the current
724 archive header. For long names, it will return a pointer to the
725 longnames table. For nested archives, it will open the nested archive
726 and get the name recursively. NESTED_ARCH is a single-entry cache so
727 we don't keep rereading the same information from a nested archive. */
730 get_archive_member_name (struct archive_info
*arch
,
731 struct archive_info
*nested_arch
)
735 if (arch
->arhdr
.ar_name
[0] == '/')
737 /* We have a long name. */
739 char *member_file_name
;
742 if (arch
->longnames
== NULL
|| arch
->longnames_size
== 0)
744 error (_("Archive member uses long names, but no longname table found\n"));
748 arch
->nested_member_origin
= 0;
749 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
750 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
751 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
753 if (j
> arch
->longnames_size
)
755 error (_("Found long name index (%ld) beyond end of long name table\n"),j
);
758 while ((j
< arch
->longnames_size
)
759 && (arch
->longnames
[j
] != '\n')
760 && (arch
->longnames
[j
] != '\0'))
762 if (j
> 0 && arch
->longnames
[j
-1] == '/')
764 if (j
> arch
->longnames_size
)
765 j
= arch
->longnames_size
;
766 arch
->longnames
[j
] = '\0';
768 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
769 return arch
->longnames
+ k
;
771 /* PR 17531: file: 2896dc8b. */
774 error (_("Invalid Thin archive member name\n"));
778 /* This is a proxy for a member of a nested archive.
779 Find the name of the member in that archive. */
780 member_file_name
= adjust_relative_path (arch
->file_name
,
781 arch
->longnames
+ k
, j
- k
);
782 if (member_file_name
!= NULL
783 && setup_nested_archive (nested_arch
, member_file_name
) == 0)
785 member_name
= get_archive_member_name_at (nested_arch
,
786 arch
->nested_member_origin
,
788 if (member_name
!= NULL
)
790 free (member_file_name
);
794 free (member_file_name
);
796 /* Last resort: just return the name of the nested archive. */
797 return arch
->longnames
+ k
;
800 /* We have a normal (short) name. */
801 for (j
= 0; j
< sizeof (arch
->arhdr
.ar_name
); j
++)
802 if (arch
->arhdr
.ar_name
[j
] == '/')
804 arch
->arhdr
.ar_name
[j
] = '\0';
805 return arch
->arhdr
.ar_name
;
808 /* The full ar_name field is used. Don't rely on ar_date starting
811 char *name
= xmalloc (sizeof (arch
->arhdr
.ar_name
) + 1);
812 memcpy (name
, arch
->arhdr
.ar_name
, sizeof (arch
->arhdr
.ar_name
));
813 name
[sizeof (arch
->arhdr
.ar_name
)] = '\0';
818 /* Get the name of an archive member at a given OFFSET within an archive
822 get_archive_member_name_at (struct archive_info
*arch
,
823 unsigned long offset
,
824 struct archive_info
*nested_arch
)
828 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
830 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
833 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
834 if (got
!= sizeof arch
->arhdr
)
836 error (_("%s: failed to read archive header\n"), arch
->file_name
);
839 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
841 error (_("%s: did not find a valid archive header\n"),
846 return get_archive_member_name (arch
, nested_arch
);
849 /* Construct a string showing the name of the archive member, qualified
850 with the name of the containing archive file. For thin archives, we
851 use square brackets to denote the indirection. For nested archives,
852 we show the qualified name of the external member inside the square
853 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
856 make_qualified_name (struct archive_info
* arch
,
857 struct archive_info
* nested_arch
,
858 const char *member_name
)
860 const char * error_name
= _("<corrupt>");
864 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
865 if (arch
->is_thin_archive
866 && arch
->nested_member_origin
!= 0)
868 /* PR 15140: Allow for corrupt thin archives. */
869 if (nested_arch
->file_name
)
870 len
+= strlen (nested_arch
->file_name
) + 2;
872 len
+= strlen (error_name
) + 2;
875 name
= (char *) malloc (len
);
878 error (_("Out of memory\n"));
882 if (arch
->is_thin_archive
883 && arch
->nested_member_origin
!= 0)
885 if (nested_arch
->file_name
)
886 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
887 nested_arch
->file_name
, member_name
);
889 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
890 error_name
, member_name
);
892 else if (arch
->is_thin_archive
)
893 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
895 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);