1 /* elfcomm.c -- common code for ELF format file.
2 Copyright (C) 2010-2023 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
24 /* Do not include bfd.h in this file. Functions in this file are used
25 by readelf.c and elfedit.c which define BFD64, and by objdump.c
29 #include "libiberty.h"
31 #include "filenames.h"
36 extern char *program_name
;
39 error (const char *message
, ...)
43 /* Try to keep error messages in sync with the program's normal output. */
46 va_start (args
, message
);
47 fprintf (stderr
, _("%s: Error: "), program_name
);
48 vfprintf (stderr
, message
, args
);
53 warn (const char *message
, ...)
57 /* Try to keep warning messages in sync with the program's normal output. */
60 va_start (args
, message
);
61 fprintf (stderr
, _("%s: Warning: "), program_name
);
62 vfprintf (stderr
, message
, args
);
66 void (*byte_put
) (unsigned char *, uint64_t, unsigned int);
69 byte_put_little_endian (unsigned char *field
, uint64_t value
, unsigned int size
)
71 if (size
> sizeof (uint64_t))
73 error (_("Unhandled data length: %d\n"), size
);
78 *field
++ = value
& 0xff;
84 byte_put_big_endian (unsigned char *field
, uint64_t value
, unsigned int size
)
86 if (size
> sizeof (uint64_t))
88 error (_("Unhandled data length: %d\n"), size
);
93 field
[size
] = value
& 0xff;
98 uint64_t (*byte_get
) (const unsigned char *, unsigned int);
101 byte_get_little_endian (const unsigned char *field
, unsigned int size
)
109 return ((uint64_t) field
[0]
110 | ((uint64_t) field
[1] << 8));
113 return ((uint64_t) field
[0]
114 | ((uint64_t) field
[1] << 8)
115 | ((uint64_t) field
[2] << 16));
118 return ((uint64_t) field
[0]
119 | ((uint64_t) field
[1] << 8)
120 | ((uint64_t) field
[2] << 16)
121 | ((uint64_t) field
[3] << 24));
124 return ((uint64_t) field
[0]
125 | ((uint64_t) field
[1] << 8)
126 | ((uint64_t) field
[2] << 16)
127 | ((uint64_t) field
[3] << 24)
128 | ((uint64_t) field
[4] << 32));
131 return ((uint64_t) field
[0]
132 | ((uint64_t) field
[1] << 8)
133 | ((uint64_t) field
[2] << 16)
134 | ((uint64_t) field
[3] << 24)
135 | ((uint64_t) field
[4] << 32)
136 | ((uint64_t) field
[5] << 40));
139 return ((uint64_t) field
[0]
140 | ((uint64_t) field
[1] << 8)
141 | ((uint64_t) field
[2] << 16)
142 | ((uint64_t) field
[3] << 24)
143 | ((uint64_t) field
[4] << 32)
144 | ((uint64_t) field
[5] << 40)
145 | ((uint64_t) field
[6] << 48));
148 return ((uint64_t) field
[0]
149 | ((uint64_t) field
[1] << 8)
150 | ((uint64_t) field
[2] << 16)
151 | ((uint64_t) field
[3] << 24)
152 | ((uint64_t) field
[4] << 32)
153 | ((uint64_t) field
[5] << 40)
154 | ((uint64_t) field
[6] << 48)
155 | ((uint64_t) field
[7] << 56));
158 error (_("Unhandled data length: %d\n"), size
);
164 byte_get_big_endian (const unsigned char *field
, unsigned int size
)
172 return ((uint64_t) field
[1]
173 | ((uint64_t) field
[0] << 8));
176 return ((uint64_t) field
[2]
177 | ((uint64_t) field
[1] << 8)
178 | ((uint64_t) field
[0] << 16));
181 return ((uint64_t) field
[3]
182 | ((uint64_t) field
[2] << 8)
183 | ((uint64_t) field
[1] << 16)
184 | ((uint64_t) field
[0] << 24));
187 return ((uint64_t) field
[4]
188 | ((uint64_t) field
[3] << 8)
189 | ((uint64_t) field
[2] << 16)
190 | ((uint64_t) field
[1] << 24)
191 | ((uint64_t) field
[0] << 32));
194 return ((uint64_t) field
[5]
195 | ((uint64_t) field
[4] << 8)
196 | ((uint64_t) field
[3] << 16)
197 | ((uint64_t) field
[2] << 24)
198 | ((uint64_t) field
[1] << 32)
199 | ((uint64_t) field
[0] << 40));
202 return ((uint64_t) field
[6]
203 | ((uint64_t) field
[5] << 8)
204 | ((uint64_t) field
[4] << 16)
205 | ((uint64_t) field
[3] << 24)
206 | ((uint64_t) field
[2] << 32)
207 | ((uint64_t) field
[1] << 40)
208 | ((uint64_t) field
[0] << 48));
211 return ((uint64_t) field
[7]
212 | ((uint64_t) field
[6] << 8)
213 | ((uint64_t) field
[5] << 16)
214 | ((uint64_t) field
[4] << 24)
215 | ((uint64_t) field
[3] << 32)
216 | ((uint64_t) field
[2] << 40)
217 | ((uint64_t) field
[1] << 48)
218 | ((uint64_t) field
[0] << 56));
221 error (_("Unhandled data length: %d\n"), size
);
227 byte_get_signed (const unsigned char *field
, unsigned int size
)
229 uint64_t x
= byte_get (field
, size
);
234 return (x
^ 0x80) - 0x80;
236 return (x
^ 0x8000) - 0x8000;
238 return (x
^ 0x800000) - 0x800000;
240 return (x
^ 0x80000000) - 0x80000000;
245 /* Reads of 5-, 6-, and 7-byte numbers are the result of
246 trying to read past the end of a buffer, and will therefore
247 not have meaningful values, so we don't try to deal with
248 the sign in these cases. */
255 /* Return the path name for a proxy entry in a thin archive, adjusted
256 relative to the path name of the thin archive itself if necessary.
257 Always returns a pointer to malloc'ed memory. */
260 adjust_relative_path (const char *file_name
, const char *name
,
261 unsigned long name_len
)
263 char * member_file_name
;
264 const char * base_name
= lbasename (file_name
);
267 /* This is a proxy entry for a thin archive member.
268 If the extended name table contains an absolute path
269 name, or if the archive is in the current directory,
270 use the path name as given. Otherwise, we need to
271 find the member relative to the directory where the
272 archive is located. */
273 if (IS_ABSOLUTE_PATH (name
) || base_name
== file_name
)
278 member_file_name
= (char *) malloc (amt
);
279 if (member_file_name
== NULL
)
281 error (_("Out of memory\n"));
284 memcpy (member_file_name
, name
, name_len
);
285 member_file_name
[name_len
] = '\0';
289 /* Concatenate the path components of the archive file name
290 to the relative path name from the extended name table. */
291 size_t prefix_len
= base_name
- file_name
;
293 amt
= prefix_len
+ name_len
+ 1;
294 /* PR 17531: file: 2896dc8b
296 if (amt
< prefix_len
|| amt
< name_len
)
298 error (_("Abnormal length of thin archive member name: %lx\n"),
303 member_file_name
= (char *) malloc (amt
);
304 if (member_file_name
== NULL
)
306 error (_("Out of memory\n"));
309 memcpy (member_file_name
, file_name
, prefix_len
);
310 memcpy (member_file_name
+ prefix_len
, name
, name_len
);
311 member_file_name
[prefix_len
+ name_len
] = '\0';
313 return member_file_name
;
316 /* Processes the archive index table and symbol table in ARCH.
317 Entries in the index table are SIZEOF_AR_INDEX bytes long.
318 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
319 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
320 ARCH->sym_size and ARCH->sym_table.
321 It is the caller's responsibility to free ARCH->index_array and
323 Returns 1 upon success, 0 otherwise.
324 If failure occurs an error message is printed. */
327 process_archive_index_and_symbols (struct archive_info
*arch
,
328 unsigned int sizeof_ar_index
,
335 fmag_save
= arch
->arhdr
.ar_fmag
[0];
336 arch
->arhdr
.ar_fmag
[0] = 0;
337 size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
338 arch
->arhdr
.ar_fmag
[0] = fmag_save
;
339 /* PR 17531: file: 912bd7de. */
340 if ((signed long) size
< 0)
342 error (_("%s: invalid archive header size: %ld\n"),
343 arch
->file_name
, size
);
347 size
= size
+ (size
& 1);
349 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ size
;
353 if (fseek (arch
->file
, size
, SEEK_CUR
) != 0)
355 error (_("%s: failed to skip archive symbol table\n"),
363 /* A buffer used to hold numbers read in from an archive index.
364 These are always SIZEOF_AR_INDEX bytes long and stored in
365 big-endian format. */
366 unsigned char integer_buffer
[sizeof arch
->index_num
];
367 unsigned char * index_buffer
;
369 assert (sizeof_ar_index
<= sizeof integer_buffer
);
371 /* Check the size of the archive index. */
372 if (size
< sizeof_ar_index
)
374 error (_("%s: the archive index is empty\n"), arch
->file_name
);
378 /* Read the number of entries in the archive index. */
379 got
= fread (integer_buffer
, 1, sizeof_ar_index
, arch
->file
);
380 if (got
!= sizeof_ar_index
)
382 error (_("%s: failed to read archive index\n"), arch
->file_name
);
386 arch
->index_num
= byte_get_big_endian (integer_buffer
, sizeof_ar_index
);
387 size
-= sizeof_ar_index
;
389 if (size
< arch
->index_num
* sizeof_ar_index
390 /* PR 17531: file: 585515d1. */
391 || size
< arch
->index_num
)
393 error (_("%s: the archive index is supposed to have 0x%lx entries of %d bytes, but the size is only 0x%lx\n"),
394 arch
->file_name
, (long) arch
->index_num
, sizeof_ar_index
, size
);
398 /* Read in the archive index. */
399 index_buffer
= (unsigned char *)
400 malloc (arch
->index_num
* sizeof_ar_index
);
401 if (index_buffer
== NULL
)
403 error (_("Out of memory whilst trying to read archive symbol index\n"));
407 got
= fread (index_buffer
, sizeof_ar_index
, arch
->index_num
, arch
->file
);
408 if (got
!= arch
->index_num
)
411 error (_("%s: failed to read archive index\n"), arch
->file_name
);
415 size
-= arch
->index_num
* sizeof_ar_index
;
417 /* Convert the index numbers into the host's numeric format. */
418 arch
->index_array
= (uint64_t *)
419 malloc (arch
->index_num
* sizeof (*arch
->index_array
));
420 if (arch
->index_array
== NULL
)
423 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
427 for (i
= 0; i
< arch
->index_num
; i
++)
428 arch
->index_array
[i
] =
429 byte_get_big_endian ((unsigned char *) (index_buffer
+ (i
* sizeof_ar_index
)),
433 /* The remaining space in the header is taken up by the symbol table. */
436 error (_("%s: the archive has an index but no symbols\n"),
441 arch
->sym_table
= (char *) malloc (size
);
442 if (arch
->sym_table
== NULL
)
444 error (_("Out of memory whilst trying to read archive index symbol table\n"));
448 arch
->sym_size
= size
;
449 got
= fread (arch
->sym_table
, 1, size
, arch
->file
);
452 error (_("%s: failed to read archive index symbol table\n"),
458 /* Read the next archive header. */
459 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
460 if (got
!= sizeof arch
->arhdr
&& got
!= 0)
462 error (_("%s: failed to read archive header following archive index\n"),
470 /* Read the symbol table and long-name table from an archive. */
473 setup_archive (struct archive_info
*arch
, const char *file_name
,
474 FILE *file
, off_t file_size
,
475 int is_thin_archive
, int read_symbols
)
479 arch
->file_name
= strdup (file_name
);
482 arch
->index_array
= NULL
;
483 arch
->sym_table
= NULL
;
485 arch
->longnames
= NULL
;
486 arch
->longnames_size
= 0;
487 arch
->nested_member_origin
= 0;
488 arch
->is_thin_archive
= is_thin_archive
;
489 arch
->uses_64bit_indices
= 0;
490 arch
->next_arhdr_offset
= SARMAG
;
492 /* Read the first archive member header. */
493 if (fseek (file
, SARMAG
, SEEK_SET
) != 0)
495 error (_("%s: failed to seek to first archive header\n"), file_name
);
498 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, file
);
499 if (got
!= sizeof arch
->arhdr
)
504 error (_("%s: failed to read archive header\n"), file_name
);
508 /* See if this is the archive symbol table. */
509 if (startswith (arch
->arhdr
.ar_name
, "/ "))
511 if (! process_archive_index_and_symbols (arch
, 4, read_symbols
))
514 else if (startswith (arch
->arhdr
.ar_name
, "/SYM64/ "))
516 arch
->uses_64bit_indices
= 1;
517 if (! process_archive_index_and_symbols (arch
, 8, read_symbols
))
520 else if (read_symbols
)
521 printf (_("%s has no archive index\n"), file_name
);
523 if (startswith (arch
->arhdr
.ar_name
, "// "))
525 /* This is the archive string table holding long member names. */
526 char fmag_save
= arch
->arhdr
.ar_fmag
[0];
527 arch
->arhdr
.ar_fmag
[0] = 0;
528 arch
->longnames_size
= strtoul (arch
->arhdr
.ar_size
, NULL
, 10);
529 arch
->arhdr
.ar_fmag
[0] = fmag_save
;
530 /* PR 17531: file: 01068045. */
531 if (arch
->longnames_size
< 8)
533 error (_("%s: long name table is too small, (size = %" PRId64
")\n"),
534 file_name
, arch
->longnames_size
);
537 /* PR 17531: file: 639d6a26. */
538 if ((off_t
) arch
->longnames_size
> file_size
539 || (signed long) arch
->longnames_size
< 0)
541 error (_("%s: long name table is too big, (size = %#" PRIx64
")\n"),
542 file_name
, arch
->longnames_size
);
546 arch
->next_arhdr_offset
+= sizeof arch
->arhdr
+ arch
->longnames_size
;
548 /* Plus one to allow for a string terminator. */
549 arch
->longnames
= (char *) malloc (arch
->longnames_size
+ 1);
550 if (arch
->longnames
== NULL
)
552 error (_("Out of memory reading long symbol names in archive\n"));
556 if (fread (arch
->longnames
, arch
->longnames_size
, 1, file
) != 1)
558 free (arch
->longnames
);
559 arch
->longnames
= NULL
;
560 error (_("%s: failed to read long symbol name string table\n"),
565 if ((arch
->longnames_size
& 1) != 0)
568 arch
->longnames
[arch
->longnames_size
] = 0;
574 /* Open and setup a nested archive, if not already open. */
577 setup_nested_archive (struct archive_info
*nested_arch
,
578 const char *member_file_name
)
583 /* Have we already setup this archive? */
584 if (nested_arch
->file_name
!= NULL
585 && streq (nested_arch
->file_name
, member_file_name
))
588 /* Close previous file and discard cached information. */
589 if (nested_arch
->file
!= NULL
)
591 fclose (nested_arch
->file
);
592 nested_arch
->file
= NULL
;
594 release_archive (nested_arch
);
596 member_file
= fopen (member_file_name
, "rb");
597 if (member_file
== NULL
)
599 if (fstat (fileno (member_file
), &statbuf
) < 0)
601 return setup_archive (nested_arch
, member_file_name
, member_file
,
602 statbuf
.st_size
, 0, 0);
605 /* Release the memory used for the archive information. */
608 release_archive (struct archive_info
* arch
)
610 free (arch
->file_name
);
611 free (arch
->index_array
);
612 free (arch
->sym_table
);
613 free (arch
->longnames
);
614 arch
->file_name
= NULL
;
615 arch
->index_array
= NULL
;
616 arch
->sym_table
= NULL
;
617 arch
->longnames
= NULL
;
620 /* Get the name of an archive member from the current archive header.
621 For simple names, this will modify the ar_name field of the current
622 archive header. For long names, it will return a pointer to the
623 longnames table. For nested archives, it will open the nested archive
624 and get the name recursively. NESTED_ARCH is a single-entry cache so
625 we don't keep rereading the same information from a nested archive. */
628 get_archive_member_name (struct archive_info
*arch
,
629 struct archive_info
*nested_arch
)
633 if (arch
->arhdr
.ar_name
[0] == '/')
635 /* We have a long name. */
637 char *member_file_name
;
641 if (arch
->longnames
== NULL
|| arch
->longnames_size
== 0)
643 error (_("Archive member uses long names, but no longname table found\n"));
647 arch
->nested_member_origin
= 0;
648 fmag_save
= arch
->arhdr
.ar_fmag
[0];
649 arch
->arhdr
.ar_fmag
[0] = 0;
650 k
= j
= strtoul (arch
->arhdr
.ar_name
+ 1, &endp
, 10);
651 if (arch
->is_thin_archive
&& endp
!= NULL
&& * endp
== ':')
652 arch
->nested_member_origin
= strtoul (endp
+ 1, NULL
, 10);
653 arch
->arhdr
.ar_fmag
[0] = fmag_save
;
655 if (j
> arch
->longnames_size
)
657 error (_("Found long name index (%ld) beyond end of long name table\n"),j
);
660 while ((j
< arch
->longnames_size
)
661 && (arch
->longnames
[j
] != '\n')
662 && (arch
->longnames
[j
] != '\0'))
664 if (j
> 0 && arch
->longnames
[j
-1] == '/')
666 if (j
> arch
->longnames_size
)
667 j
= arch
->longnames_size
;
668 arch
->longnames
[j
] = '\0';
670 if (!arch
->is_thin_archive
|| arch
->nested_member_origin
== 0)
671 return xstrdup (arch
->longnames
+ k
);
673 /* PR 17531: file: 2896dc8b. */
676 error (_("Invalid Thin archive member name\n"));
680 /* This is a proxy for a member of a nested archive.
681 Find the name of the member in that archive. */
682 member_file_name
= adjust_relative_path (arch
->file_name
,
683 arch
->longnames
+ k
, j
- k
);
684 if (member_file_name
!= NULL
685 && setup_nested_archive (nested_arch
, member_file_name
) == 0)
687 member_name
= get_archive_member_name_at (nested_arch
,
688 arch
->nested_member_origin
,
690 if (member_name
!= NULL
)
692 free (member_file_name
);
696 free (member_file_name
);
698 /* Last resort: just return the name of the nested archive. */
699 return xstrdup (arch
->longnames
+ k
);
702 /* We have a normal (short) name. */
703 for (j
= 0; j
< sizeof (arch
->arhdr
.ar_name
); j
++)
704 if (arch
->arhdr
.ar_name
[j
] == '/')
706 arch
->arhdr
.ar_name
[j
] = '\0';
707 return xstrdup (arch
->arhdr
.ar_name
);
710 /* The full ar_name field is used. Don't rely on ar_date starting
713 char *name
= xmalloc (sizeof (arch
->arhdr
.ar_name
) + 1);
714 memcpy (name
, arch
->arhdr
.ar_name
, sizeof (arch
->arhdr
.ar_name
));
715 name
[sizeof (arch
->arhdr
.ar_name
)] = '\0';
720 /* Get the name of an archive member at a given OFFSET within an archive
724 get_archive_member_name_at (struct archive_info
*arch
,
725 unsigned long offset
,
726 struct archive_info
*nested_arch
)
730 if (fseek (arch
->file
, offset
, SEEK_SET
) != 0)
732 error (_("%s: failed to seek to next file name\n"), arch
->file_name
);
735 got
= fread (&arch
->arhdr
, 1, sizeof arch
->arhdr
, arch
->file
);
736 if (got
!= sizeof arch
->arhdr
)
738 error (_("%s: failed to read archive header\n"), arch
->file_name
);
741 if (memcmp (arch
->arhdr
.ar_fmag
, ARFMAG
, 2) != 0)
743 error (_("%s: did not find a valid archive header\n"),
748 return get_archive_member_name (arch
, nested_arch
);
751 /* Construct a string showing the name of the archive member, qualified
752 with the name of the containing archive file. For thin archives, we
753 use square brackets to denote the indirection. For nested archives,
754 we show the qualified name of the external member inside the square
755 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
758 make_qualified_name (struct archive_info
* arch
,
759 struct archive_info
* nested_arch
,
760 const char *member_name
)
762 const char * error_name
= _("<corrupt>");
766 len
= strlen (arch
->file_name
) + strlen (member_name
) + 3;
767 if (arch
->is_thin_archive
768 && arch
->nested_member_origin
!= 0)
770 /* PR 15140: Allow for corrupt thin archives. */
771 if (nested_arch
->file_name
)
772 len
+= strlen (nested_arch
->file_name
) + 2;
774 len
+= strlen (error_name
) + 2;
777 name
= (char *) malloc (len
);
780 error (_("Out of memory\n"));
784 if (arch
->is_thin_archive
785 && arch
->nested_member_origin
!= 0)
787 if (nested_arch
->file_name
)
788 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
789 nested_arch
->file_name
, member_name
);
791 snprintf (name
, len
, "%s[%s(%s)]", arch
->file_name
,
792 error_name
, member_name
);
794 else if (arch
->is_thin_archive
)
795 snprintf (name
, len
, "%s[%s]", arch
->file_name
, member_name
);
797 snprintf (name
, len
, "%s(%s)", arch
->file_name
, member_name
);