1 /* elfcomm.c -- common code for ELF format file.
2 Copyright 2010-2013 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 | (((elf_vma
) (field
[5])) << 40)
161 | (((elf_vma
) (field
[6])) << 48)
162 | (((elf_vma
) (field
[7])) << 56);
163 else if (sizeof (elf_vma
) == 4)
164 /* We want to extract data from an 8 byte wide field and
165 place it into a 4 byte wide field. Since this is a little
166 endian source we can just use the 4 byte extraction code. */
167 return ((unsigned long) (field
[0]))
168 | (((unsigned long) (field
[1])) << 8)
169 | (((unsigned long) (field
[2])) << 16)
170 | (((unsigned long) (field
[3])) << 24);
173 error (_("Unhandled data length: %d\n"), size
);
179 byte_get_big_endian (unsigned char *field
, int size
)
187 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
190 return ((unsigned long) (field
[2]))
191 | (((unsigned long) (field
[1])) << 8)
192 | (((unsigned long) (field
[0])) << 16);
195 return ((unsigned long) (field
[3]))
196 | (((unsigned long) (field
[2])) << 8)
197 | (((unsigned long) (field
[1])) << 16)
198 | (((unsigned long) (field
[0])) << 24);
201 if (sizeof (elf_vma
) == 8)
202 return ((elf_vma
) (field
[7]))
203 | (((elf_vma
) (field
[6])) << 8)
204 | (((elf_vma
) (field
[5])) << 16)
205 | (((elf_vma
) (field
[4])) << 24)
206 | (((elf_vma
) (field
[3])) << 32)
207 | (((elf_vma
) (field
[2])) << 40)
208 | (((elf_vma
) (field
[1])) << 48)
209 | (((elf_vma
) (field
[0])) << 56);
210 else if (sizeof (elf_vma
) == 4)
212 /* Although we are extracing data from an 8 byte wide field,
213 we are returning only 4 bytes of data. */
215 return ((unsigned long) (field
[3]))
216 | (((unsigned long) (field
[2])) << 8)
217 | (((unsigned long) (field
[1])) << 16)
218 | (((unsigned long) (field
[0])) << 24);
222 error (_("Unhandled data length: %d\n"), size
);
228 byte_get_signed (unsigned char *field
, int size
)
230 elf_vma x
= byte_get (field
, size
);
235 return (x
^ 0x80) - 0x80;
237 return (x
^ 0x8000) - 0x8000;
239 return (x
^ 0x80000000) - 0x80000000;
247 /* Return the high-order 32-bits and the low-order 32-bits
248 of an 8-byte value separately. */
251 byte_get_64 (unsigned char *field
, elf_vma
*high
, elf_vma
*low
)
253 if (byte_get
== byte_get_big_endian
)
255 *high
= byte_get_big_endian (field
, 4);
256 *low
= byte_get_big_endian (field
+ 4, 4);
260 *high
= byte_get_little_endian (field
+ 4, 4);
261 *low
= byte_get_little_endian (field
, 4);
266 /* Return the path name for a proxy entry in a thin archive, adjusted
267 relative to the path name of the thin archive itself if necessary.
268 Always returns a pointer to malloc'ed memory. */
271 adjust_relative_path (const char *file_name
, const char *name
,
274 char * member_file_name
;
275 const char * base_name
= lbasename (file_name
);
277 /* This is a proxy entry for a thin archive member.
278 If the extended name table contains an absolute path
279 name, or if the archive is in the current directory,
280 use the path name as given. Otherwise, we need to
281 find the member relative to the directory where the
282 archive is located. */
283 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
285 member_file_name
= (char *) malloc (name_len
+ 1);
286 if (member_file_name
== NULL
)
288 error (_("Out of memory\n"));
291 memcpy (member_file_name
, name
, name_len
);
292 member_file_name
[name_len
] = '\0';
296 /* Concatenate the path components of the archive file name
297 to the relative path name from the extended name table. */
298 size_t prefix_len
= base_name
- file_name
;
299 member_file_name
= (char *) malloc (prefix_len
+ name_len
+ 1);
300 if (member_file_name
== NULL
)
302 error (_("Out of memory\n"));
305 memcpy (member_file_name
, file_name
, prefix_len
);
306 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
307 member_file_name
[prefix_len
+ name_len
] = '\0';
309 return member_file_name
;
312 /* Processes the archive index table and symbol table in ARCH.
313 Entries in the index table are SIZEOF_AR_INDEX bytes long.
314 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
315 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
316 ARCH->sym_size and ARCH->sym_table.
317 It is the caller's responsibility to free ARCH->index_array and
319 Returns TRUE upon success, FALSE otherwise.
320 If failure occurs an error message is printed. */
323 process_archive_index_and_symbols (struct archive_info
* arch
,
324 unsigned int sizeof_ar_index
,
325 bfd_boolean read_symbols
)
330 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
331 size
= size
+ (size
& 1);
333 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
337 if (fseek (arch
->file
, size
, SEEK_CUR
) != 0)
339 error (_("%s: failed to skip archive symbol table\n"),
347 /* A buffer used to hold numbers read in from an archive index.
348 These are always SIZEOF_AR_INDEX bytes long and stored in
349 big-endian format. */
350 unsigned char integer_buffer
[sizeof arch
->index_num
];
351 unsigned char * index_buffer
;
353 assert (sizeof_ar_index
<= sizeof integer_buffer
);
355 /* Check the size of the archive index. */
356 if (size
< sizeof_ar_index
)
358 error (_("%s: the archive index is empty\n"), arch
->file_name
);
362 /* Read the number of entries in the archive index. */
363 got
= fread (integer_buffer
, 1, sizeof_ar_index
, arch
->file
);
364 if (got
!= sizeof_ar_index
)
366 error (_("%s: failed to read archive index\n"), arch
->file_name
);
370 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof_ar_index
);
371 size
-= sizeof_ar_index
;
373 if (size
< arch
->index_num
* sizeof_ar_index
)
375 error (_("%s: the archive index is supposed to have %ld entries of %d bytes, but the size is only %ld\n"),
376 arch
->file_name
, (long) arch
->index_num
, sizeof_ar_index
, size
);
380 /* Read in the archive index. */
381 index_buffer
= (unsigned char *)
382 malloc (arch
->index_num
* sizeof_ar_index
);
383 if (index_buffer
== NULL
)
385 error (_("Out of memory whilst trying to read archive symbol index\n"));
389 got
= fread (index_buffer
, sizeof_ar_index
, arch
->index_num
, arch
->file
);
390 if (got
!= arch
->index_num
)
393 error (_("%s: failed to read archive index\n"), arch
->file_name
);
397 size
-= arch
->index_num
* sizeof_ar_index
;
399 /* Convert the index numbers into the host's numeric format. */
400 arch
->index_array
= (elf_vma
*)
401 malloc (arch
->index_num
* sizeof (* arch
->index_array
));
402 if (arch
->index_array
== NULL
)
405 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
409 for (i
= 0; i
< arch
->index_num
; i
++)
410 arch
->index_array
[i
] =
411 byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* sizeof_ar_index
)),
415 /* The remaining space in the header is taken up by the symbol table. */
418 error (_("%s: the archive has an index but no symbols\n"),
423 arch
->sym_table
= (char *) malloc (size
);
424 if (arch
->sym_table
== NULL
)
426 error (_("Out of memory whilst trying to read archive index symbol table\n"));
430 arch
->sym_size
= size
;
431 got
= fread (arch
->sym_table
, 1, size
, arch
->file
);
434 error (_("%s: failed to read archive index symbol table\n"),
440 /* Read the next archive header. */
441 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
442 if (got
!= sizeof arch
->arhdr
&& got
!= 0)
444 error (_("%s: failed to read archive header following archive index\n"),
452 /* Read the symbol table and long-name table from an archive. */
455 setup_archive (struct archive_info
*arch
, const char *file_name
,
456 FILE *file
, bfd_boolean is_thin_archive
,
457 bfd_boolean read_symbols
)
461 arch
->file_name
= strdup (file_name
);
464 arch
->index_array
= NULL
;
465 arch
->sym_table
= NULL
;
467 arch
->longnames
= NULL
;
468 arch
->longnames_size
= 0;
469 arch
->nested_member_origin
= 0;
470 arch
->is_thin_archive
= is_thin_archive
;
471 arch
->uses_64bit_indicies
= FALSE
;
472 arch
->next_arhdr_offset
= SARMAG
;
474 /* Read the first archive member header. */
475 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
477 error (_("%s: failed to seek to first archive header\n"), file_name
);
480 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
481 if (got
!= sizeof arch
->arhdr
)
486 error (_("%s: failed to read archive header\n"), file_name
);
490 /* See if this is the archive symbol table. */
491 if (const_strneq (arch
->arhdr
.ar_name
, "/ "))
493 if (! process_archive_index_and_symbols (arch
, 4, read_symbols
))
496 else if (const_strneq (arch
->arhdr
.ar_name
, "/SYM64/ "))
498 arch
->uses_64bit_indicies
= TRUE
;
499 if (! process_archive_index_and_symbols (arch
, 8, read_symbols
))
502 else if (read_symbols
)
503 printf (_("%s has no archive index\n"), file_name
);
505 if (const_strneq (arch
->arhdr
.ar_name
, "// "))
507 /* This is the archive string table holding long member names. */
508 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
509 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
511 arch
->longnames
= (char *) malloc (arch
->longnames_size
);
512 if (arch
->longnames
== NULL
)
514 error (_("Out of memory reading long symbol names in archive\n"));
518 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
520 free (arch
->longnames
);
521 arch
->longnames
= NULL
;
522 error (_("%s: failed to read long symbol name string table\n"),
527 if ((arch
->longnames_size
& 1) != 0)
534 /* Open and setup a nested archive, if not already open. */
537 setup_nested_archive (struct archive_info
*nested_arch
,
538 const char *member_file_name
)
542 /* Have we already setup this archive? */
543 if (nested_arch
->file_name
!= NULL
544 && streq (nested_arch
->file_name
, member_file_name
))
547 /* Close previous file and discard cached information. */
548 if (nested_arch
->file
!= NULL
)
549 fclose (nested_arch
->file
);
550 release_archive (nested_arch
);
552 member_file
= fopen (member_file_name
, "rb");
553 if (member_file
== NULL
)
555 return setup_archive (nested_arch
, member_file_name
, member_file
,
559 /* Release the memory used for the archive information. */
562 release_archive (struct archive_info
* arch
)
564 if (arch
->file_name
!= NULL
)
565 free (arch
->file_name
);
566 if (arch
->index_array
!= NULL
)
567 free (arch
->index_array
);
568 if (arch
->sym_table
!= NULL
)
569 free (arch
->sym_table
);
570 if (arch
->longnames
!= NULL
)
571 free (arch
->longnames
);
574 /* Get the name of an archive member from the current archive header.
575 For simple names, this will modify the ar_name field of the current
576 archive header. For long names, it will return a pointer to the
577 longnames table. For nested archives, it will open the nested archive
578 and get the name recursively. NESTED_ARCH is a single-entry cache so
579 we don't keep rereading the same information from a nested archive. */
582 get_archive_member_name (struct archive_info
*arch
,
583 struct archive_info
*nested_arch
)
587 if (arch
->arhdr
.ar_name
[0] == '/')
589 /* We have a long name. */
591 char *member_file_name
;
594 if (arch
->longnames
== NULL
|| arch
->longnames_size
== 0)
596 error (_("Archive member uses long names, but no longname table found\n"));
600 arch
->nested_member_origin
= 0;
601 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
602 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
603 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
605 while ((j
< arch
->longnames_size
)
606 && (arch
->longnames
[j
] != '\n')
607 && (arch
->longnames
[j
] != '\0'))
609 if (arch
->longnames
[j
-1] == '/')
611 arch
->longnames
[j
] = '\0';
613 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
614 return arch
->longnames
+ k
;
616 /* This is a proxy for a member of a nested archive.
617 Find the name of the member in that archive. */
618 member_file_name
= adjust_relative_path (arch
->file_name
,
619 arch
->longnames
+ k
, j
- k
);
620 if (member_file_name
!= NULL
621 && setup_nested_archive (nested_arch
, member_file_name
) == 0)
623 member_name
= get_archive_member_name_at (nested_arch
,
624 arch
->nested_member_origin
,
626 if (member_name
!= NULL
)
628 free (member_file_name
);
632 free (member_file_name
);
634 /* Last resort: just return the name of the nested archive. */
635 return arch
->longnames
+ k
;
638 /* We have a normal (short) name. */
639 for (j
= 0; j
< sizeof (arch
->arhdr
.ar_name
); j
++)
640 if (arch
->arhdr
.ar_name
[j
] == '/')
642 arch
->arhdr
.ar_name
[j
] = '\0';
643 return arch
->arhdr
.ar_name
;
646 /* The full ar_name field is used. Don't rely on ar_date starting
649 char *name
= xmalloc (sizeof (arch
->arhdr
.ar_name
) + 1);
650 memcpy (name
, arch
->arhdr
.ar_name
, sizeof (arch
->arhdr
.ar_name
));
651 name
[sizeof (arch
->arhdr
.ar_name
)] = '\0';
656 /* Get the name of an archive member at a given OFFSET within an archive
660 get_archive_member_name_at (struct archive_info
*arch
,
661 unsigned long offset
,
662 struct archive_info
*nested_arch
)
666 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
668 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
671 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
672 if (got
!= sizeof arch
->arhdr
)
674 error (_("%s: failed to read archive header\n"), arch
->file_name
);
677 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
679 error (_("%s: did not find a valid archive header\n"),
684 return get_archive_member_name (arch
, nested_arch
);
687 /* Construct a string showing the name of the archive member, qualified
688 with the name of the containing archive file. For thin archives, we
689 use square brackets to denote the indirection. For nested archives,
690 we show the qualified name of the external member inside the square
691 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
694 make_qualified_name (struct archive_info
* arch
,
695 struct archive_info
* nested_arch
,
696 const char *member_name
)
698 const char * error_name
= _("<corrupt>");
702 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
703 if (arch
->is_thin_archive
704 && arch
->nested_member_origin
!= 0)
706 /* PR 15140: Allow for corrupt thin archives. */
707 if (nested_arch
->file_name
)
708 len
+= strlen (nested_arch
->file_name
) + 2;
710 len
+= strlen (error_name
) + 2;
713 name
= (char *) malloc (len
);
716 error (_("Out of memory\n"));
720 if (arch
->is_thin_archive
721 && arch
->nested_member_origin
!= 0)
723 if (nested_arch
->file_name
)
724 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
725 nested_arch
->file_name
, member_name
);
727 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
728 error_name
, member_name
);
730 else if (arch
->is_thin_archive
)
731 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
733 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);