cfd35d2cd67e5a197e708cb2694f479456a6ef6a
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
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 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h. */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/ia64.h"
113 #include "elf/ip2k.h"
114 #include "elf/lm32.h"
115 #include "elf/iq2000.h"
116 #include "elf/m32c.h"
117 #include "elf/m32r.h"
118 #include "elf/m68k.h"
119 #include "elf/m68hc11.h"
120 #include "elf/mcore.h"
121 #include "elf/mep.h"
122 #include "elf/metag.h"
123 #include "elf/microblaze.h"
124 #include "elf/mips.h"
125 #include "elf/mmix.h"
126 #include "elf/mn10200.h"
127 #include "elf/mn10300.h"
128 #include "elf/moxie.h"
129 #include "elf/mt.h"
130 #include "elf/msp430.h"
131 #include "elf/nds32.h"
132 #include "elf/nios2.h"
133 #include "elf/or1k.h"
134 #include "elf/pj.h"
135 #include "elf/ppc.h"
136 #include "elf/ppc64.h"
137 #include "elf/pru.h"
138 #include "elf/riscv.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/wasm32.h"
153 #include "elf/x86-64.h"
154 #include "elf/xc16x.h"
155 #include "elf/xgate.h"
156 #include "elf/xstormy16.h"
157 #include "elf/xtensa.h"
158
159 #include "getopt.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
162 #include "filenames.h"
163
164 #ifndef offsetof
165 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166 #endif
167
168 typedef struct elf_section_list
169 {
170 Elf_Internal_Shdr * hdr;
171 struct elf_section_list * next;
172 } elf_section_list;
173
174 /* Flag bits indicating particular types of dump. */
175 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
176 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
177 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
178 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
179 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
180
181 typedef unsigned char dump_type;
182
183 /* A linked list of the section names for which dumps were requested. */
184 struct dump_list_entry
185 {
186 char * name;
187 dump_type type;
188 struct dump_list_entry * next;
189 };
190
191 typedef struct filedata
192 {
193 const char * file_name;
194 FILE * handle;
195 bfd_size_type file_size;
196 Elf_Internal_Ehdr file_header;
197 Elf_Internal_Shdr * section_headers;
198 Elf_Internal_Phdr * program_headers;
199 char * string_table;
200 unsigned long string_table_length;
201 /* A dynamic array of flags indicating for which sections a dump of
202 some kind has been requested. It is reset on a per-object file
203 basis and then initialised from the cmdline_dump_sects array,
204 the results of interpreting the -w switch, and the
205 dump_sects_byname list. */
206 dump_type * dump_sects;
207 unsigned int num_dump_sects;
208 } Filedata;
209
210 char * program_name = "readelf";
211
212 static unsigned long archive_file_offset;
213 static unsigned long archive_file_size;
214 static unsigned long dynamic_addr;
215 static bfd_size_type dynamic_size;
216 static size_t dynamic_nent;
217 static char * dynamic_strings;
218 static unsigned long dynamic_strings_length;
219 static unsigned long num_dynamic_syms;
220 static Elf_Internal_Sym * dynamic_symbols;
221 static Elf_Internal_Syminfo * dynamic_syminfo;
222 static unsigned long dynamic_syminfo_offset;
223 static unsigned int dynamic_syminfo_nent;
224 static char program_interpreter[PATH_MAX];
225 static bfd_vma dynamic_info[DT_ENCODING];
226 static bfd_vma dynamic_info_DT_GNU_HASH;
227 static bfd_vma version_info[16];
228 static Elf_Internal_Dyn * dynamic_section;
229 static elf_section_list * symtab_shndx_list;
230 static bfd_boolean show_name = FALSE;
231 static bfd_boolean do_dynamic = FALSE;
232 static bfd_boolean do_syms = FALSE;
233 static bfd_boolean do_dyn_syms = FALSE;
234 static bfd_boolean do_reloc = FALSE;
235 static bfd_boolean do_sections = FALSE;
236 static bfd_boolean do_section_groups = FALSE;
237 static bfd_boolean do_section_details = FALSE;
238 static bfd_boolean do_segments = FALSE;
239 static bfd_boolean do_unwind = FALSE;
240 static bfd_boolean do_using_dynamic = FALSE;
241 static bfd_boolean do_header = FALSE;
242 static bfd_boolean do_dump = FALSE;
243 static bfd_boolean do_version = FALSE;
244 static bfd_boolean do_histogram = FALSE;
245 static bfd_boolean do_debugging = FALSE;
246 static bfd_boolean do_arch = FALSE;
247 static bfd_boolean do_notes = FALSE;
248 static bfd_boolean do_archive_index = FALSE;
249 static bfd_boolean is_32bit_elf = FALSE;
250 static bfd_boolean decompress_dumps = FALSE;
251
252 struct group_list
253 {
254 struct group_list * next;
255 unsigned int section_index;
256 };
257
258 struct group
259 {
260 struct group_list * root;
261 unsigned int group_index;
262 };
263
264 static size_t group_count;
265 static struct group * section_groups;
266 static struct group ** section_headers_groups;
267
268 /* A dynamic array of flags indicating for which sections a dump
269 has been requested via command line switches. */
270 static Filedata cmdline;
271
272 static struct dump_list_entry * dump_sects_byname;
273
274 /* How to print a vma value. */
275 typedef enum print_mode
276 {
277 HEX,
278 DEC,
279 DEC_5,
280 UNSIGNED,
281 PREFIX_HEX,
282 FULL_HEX,
283 LONG_HEX
284 }
285 print_mode;
286
287 /* Versioned symbol info. */
288 enum versioned_symbol_info
289 {
290 symbol_undefined,
291 symbol_hidden,
292 symbol_public
293 };
294
295 static const char * get_symbol_version_string
296 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
297 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
298
299 #define UNKNOWN -1
300
301 #define SECTION_NAME(X) \
302 ((X) == NULL ? _("<none>") \
303 : filedata->string_table == NULL ? _("<no-strings>") \
304 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
305 : filedata->string_table + (X)->sh_name))
306
307 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
308
309 #define GET_ELF_SYMBOLS(file, section, sym_count) \
310 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
311 : get_64bit_elf_symbols (file, section, sym_count))
312
313 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
314 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
315 already been called and verified that the string exists. */
316 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
317
318 #define REMOVE_ARCH_BITS(ADDR) \
319 do \
320 { \
321 if (filedata->file_header.e_machine == EM_ARM) \
322 (ADDR) &= ~1; \
323 } \
324 while (0)
325 \f
326 /* Print a BFD_VMA to an internal buffer, for use in error messages.
327 BFD_FMA_FMT can't be used in translated strings. */
328
329 static const char *
330 bfd_vmatoa (char *fmtch, bfd_vma value)
331 {
332 /* bfd_vmatoa is used more then once in a printf call for output.
333 Cycle through an array of buffers. */
334 static int buf_pos = 0;
335 static struct bfd_vmatoa_buf
336 {
337 char place[64];
338 } buf[4];
339 char *ret;
340 char fmt[32];
341
342 ret = buf[buf_pos++].place;
343 buf_pos %= ARRAY_SIZE (buf);
344
345 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
346 snprintf (ret, sizeof (buf[0].place), fmt, value);
347 return ret;
348 }
349
350 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
351 OFFSET + the offset of the current archive member, if we are examining an
352 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
353 allocate a buffer using malloc and fill that. In either case return the
354 pointer to the start of the retrieved data or NULL if something went wrong.
355 If something does go wrong and REASON is not NULL then emit an error
356 message using REASON as part of the context. */
357
358 static void *
359 get_data (void * var,
360 Filedata * filedata,
361 unsigned long offset,
362 bfd_size_type size,
363 bfd_size_type nmemb,
364 const char * reason)
365 {
366 void * mvar;
367 bfd_size_type amt = size * nmemb;
368
369 if (size == 0 || nmemb == 0)
370 return NULL;
371
372 /* If the size_t type is smaller than the bfd_size_type, eg because
373 you are building a 32-bit tool on a 64-bit host, then make sure
374 that when the sizes are cast to (size_t) no information is lost. */
375 if (sizeof (size_t) < sizeof (bfd_size_type)
376 && ( (bfd_size_type) ((size_t) size) != size
377 || (bfd_size_type) ((size_t) nmemb) != nmemb))
378 {
379 if (reason)
380 error (_("Size truncation prevents reading %s"
381 " elements of size %s for %s\n"),
382 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
383 return NULL;
384 }
385
386 /* Check for size overflow. */
387 if (amt < nmemb)
388 {
389 if (reason)
390 error (_("Size overflow prevents reading %s"
391 " elements of size %s for %s\n"),
392 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
393 return NULL;
394 }
395
396 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
397 attempting to allocate memory when the read is bound to fail. */
398 if (amt > filedata->file_size
399 || offset + archive_file_offset + amt > filedata->file_size)
400 {
401 if (reason)
402 error (_("Reading %s bytes extends past end of file for %s\n"),
403 bfd_vmatoa ("u", amt), reason);
404 return NULL;
405 }
406
407 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
408 {
409 if (reason)
410 error (_("Unable to seek to 0x%lx for %s\n"),
411 archive_file_offset + offset, reason);
412 return NULL;
413 }
414
415 mvar = var;
416 if (mvar == NULL)
417 {
418 /* Check for overflow. */
419 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
420 /* + 1 so that we can '\0' terminate invalid string table sections. */
421 mvar = malloc ((size_t) amt + 1);
422
423 if (mvar == NULL)
424 {
425 if (reason)
426 error (_("Out of memory allocating %s bytes for %s\n"),
427 bfd_vmatoa ("u", amt), reason);
428 return NULL;
429 }
430
431 ((char *) mvar)[amt] = '\0';
432 }
433
434 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
435 {
436 if (reason)
437 error (_("Unable to read in %s bytes of %s\n"),
438 bfd_vmatoa ("u", amt), reason);
439 if (mvar != var)
440 free (mvar);
441 return NULL;
442 }
443
444 return mvar;
445 }
446
447 /* Print a VMA value in the MODE specified.
448 Returns the number of characters displayed. */
449
450 static unsigned int
451 print_vma (bfd_vma vma, print_mode mode)
452 {
453 unsigned int nc = 0;
454
455 switch (mode)
456 {
457 case FULL_HEX:
458 nc = printf ("0x");
459 /* Fall through. */
460 case LONG_HEX:
461 #ifdef BFD64
462 if (is_32bit_elf)
463 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
464 #endif
465 printf_vma (vma);
466 return nc + 16;
467
468 case DEC_5:
469 if (vma <= 99999)
470 return printf ("%5" BFD_VMA_FMT "d", vma);
471 /* Fall through. */
472 case PREFIX_HEX:
473 nc = printf ("0x");
474 /* Fall through. */
475 case HEX:
476 return nc + printf ("%" BFD_VMA_FMT "x", vma);
477
478 case DEC:
479 return printf ("%" BFD_VMA_FMT "d", vma);
480
481 case UNSIGNED:
482 return printf ("%" BFD_VMA_FMT "u", vma);
483
484 default:
485 /* FIXME: Report unrecognised mode ? */
486 return 0;
487 }
488 }
489
490 /* Display a symbol on stdout. Handles the display of control characters and
491 multibye characters (assuming the host environment supports them).
492
493 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
494
495 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
496 padding as necessary.
497
498 Returns the number of emitted characters. */
499
500 static unsigned int
501 print_symbol (signed int width, const char *symbol)
502 {
503 bfd_boolean extra_padding = FALSE;
504 signed int num_printed = 0;
505 #ifdef HAVE_MBSTATE_T
506 mbstate_t state;
507 #endif
508 unsigned int width_remaining;
509
510 if (width < 0)
511 {
512 /* Keep the width positive. This helps the code below. */
513 width = - width;
514 extra_padding = TRUE;
515 }
516 assert (width != 0);
517
518 if (do_wide)
519 /* Set the remaining width to a very large value.
520 This simplifies the code below. */
521 width_remaining = INT_MAX;
522 else
523 width_remaining = width;
524
525 #ifdef HAVE_MBSTATE_T
526 /* Initialise the multibyte conversion state. */
527 memset (& state, 0, sizeof (state));
528 #endif
529
530 while (width_remaining)
531 {
532 size_t n;
533 const char c = *symbol++;
534
535 if (c == 0)
536 break;
537
538 /* Do not print control characters directly as they can affect terminal
539 settings. Such characters usually appear in the names generated
540 by the assembler for local labels. */
541 if (ISCNTRL (c))
542 {
543 if (width_remaining < 2)
544 break;
545
546 printf ("^%c", c + 0x40);
547 width_remaining -= 2;
548 num_printed += 2;
549 }
550 else if (ISPRINT (c))
551 {
552 putchar (c);
553 width_remaining --;
554 num_printed ++;
555 }
556 else
557 {
558 #ifdef HAVE_MBSTATE_T
559 wchar_t w;
560 #endif
561 /* Let printf do the hard work of displaying multibyte characters. */
562 printf ("%.1s", symbol - 1);
563 width_remaining --;
564 num_printed ++;
565
566 #ifdef HAVE_MBSTATE_T
567 /* Try to find out how many bytes made up the character that was
568 just printed. Advance the symbol pointer past the bytes that
569 were displayed. */
570 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
571 #else
572 n = 1;
573 #endif
574 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
575 symbol += (n - 1);
576 }
577 }
578
579 if (extra_padding && num_printed < width)
580 {
581 /* Fill in the remaining spaces. */
582 printf ("%-*s", width - num_printed, " ");
583 num_printed = width;
584 }
585
586 return num_printed;
587 }
588
589 /* Returns a pointer to a static buffer containing a printable version of
590 the given section's name. Like print_symbol, except that it does not try
591 to print multibyte characters, it just interprets them as hex values. */
592
593 static const char *
594 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
595 {
596 #define MAX_PRINT_SEC_NAME_LEN 128
597 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
598 const char * name = SECTION_NAME (sec);
599 char * buf = sec_name_buf;
600 char c;
601 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
602
603 while ((c = * name ++) != 0)
604 {
605 if (ISCNTRL (c))
606 {
607 if (remaining < 2)
608 break;
609
610 * buf ++ = '^';
611 * buf ++ = c + 0x40;
612 remaining -= 2;
613 }
614 else if (ISPRINT (c))
615 {
616 * buf ++ = c;
617 remaining -= 1;
618 }
619 else
620 {
621 static char hex[17] = "0123456789ABCDEF";
622
623 if (remaining < 4)
624 break;
625 * buf ++ = '<';
626 * buf ++ = hex[(c & 0xf0) >> 4];
627 * buf ++ = hex[c & 0x0f];
628 * buf ++ = '>';
629 remaining -= 4;
630 }
631
632 if (remaining == 0)
633 break;
634 }
635
636 * buf = 0;
637 return sec_name_buf;
638 }
639
640 static const char *
641 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
642 {
643 if (ndx >= filedata->file_header.e_shnum)
644 return _("<corrupt>");
645
646 return printable_section_name (filedata, filedata->section_headers + ndx);
647 }
648
649 /* Return a pointer to section NAME, or NULL if no such section exists. */
650
651 static Elf_Internal_Shdr *
652 find_section (Filedata * filedata, const char * name)
653 {
654 unsigned int i;
655
656 if (filedata->section_headers == NULL)
657 return NULL;
658
659 for (i = 0; i < filedata->file_header.e_shnum; i++)
660 if (streq (SECTION_NAME (filedata->section_headers + i), name))
661 return filedata->section_headers + i;
662
663 return NULL;
664 }
665
666 /* Return a pointer to a section containing ADDR, or NULL if no such
667 section exists. */
668
669 static Elf_Internal_Shdr *
670 find_section_by_address (Filedata * filedata, bfd_vma addr)
671 {
672 unsigned int i;
673
674 if (filedata->section_headers == NULL)
675 return NULL;
676
677 for (i = 0; i < filedata->file_header.e_shnum; i++)
678 {
679 Elf_Internal_Shdr *sec = filedata->section_headers + i;
680
681 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
682 return sec;
683 }
684
685 return NULL;
686 }
687
688 static Elf_Internal_Shdr *
689 find_section_by_type (Filedata * filedata, unsigned int type)
690 {
691 unsigned int i;
692
693 if (filedata->section_headers == NULL)
694 return NULL;
695
696 for (i = 0; i < filedata->file_header.e_shnum; i++)
697 {
698 Elf_Internal_Shdr *sec = filedata->section_headers + i;
699
700 if (sec->sh_type == type)
701 return sec;
702 }
703
704 return NULL;
705 }
706
707 /* Return a pointer to section NAME, or NULL if no such section exists,
708 restricted to the list of sections given in SET. */
709
710 static Elf_Internal_Shdr *
711 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
712 {
713 unsigned int i;
714
715 if (filedata->section_headers == NULL)
716 return NULL;
717
718 if (set != NULL)
719 {
720 while ((i = *set++) > 0)
721 {
722 /* See PR 21156 for a reproducer. */
723 if (i >= filedata->file_header.e_shnum)
724 continue; /* FIXME: Should we issue an error message ? */
725
726 if (streq (SECTION_NAME (filedata->section_headers + i), name))
727 return filedata->section_headers + i;
728 }
729 }
730
731 return find_section (filedata, name);
732 }
733
734 /* Read an unsigned LEB128 encoded value from DATA.
735 Set *LENGTH_RETURN to the number of bytes read. */
736
737 static inline unsigned long
738 read_uleb128 (unsigned char * data,
739 unsigned int * length_return,
740 const unsigned char * const end)
741 {
742 return read_leb128 (data, length_return, FALSE, end);
743 }
744
745 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
746 This OS has so many departures from the ELF standard that we test it at
747 many places. */
748
749 static inline bfd_boolean
750 is_ia64_vms (Filedata * filedata)
751 {
752 return filedata->file_header.e_machine == EM_IA_64
753 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
754 }
755
756 /* Guess the relocation size commonly used by the specific machines. */
757
758 static bfd_boolean
759 guess_is_rela (unsigned int e_machine)
760 {
761 switch (e_machine)
762 {
763 /* Targets that use REL relocations. */
764 case EM_386:
765 case EM_IAMCU:
766 case EM_ARM:
767 case EM_D10V:
768 case EM_CYGNUS_D10V:
769 case EM_DLX:
770 case EM_MIPS:
771 case EM_MIPS_RS3_LE:
772 case EM_CYGNUS_M32R:
773 case EM_SCORE:
774 case EM_XGATE:
775 return FALSE;
776
777 /* Targets that use RELA relocations. */
778 case EM_68K:
779 case EM_AARCH64:
780 case EM_ADAPTEVA_EPIPHANY:
781 case EM_ALPHA:
782 case EM_ALTERA_NIOS2:
783 case EM_ARC:
784 case EM_ARC_COMPACT:
785 case EM_ARC_COMPACT2:
786 case EM_AVR:
787 case EM_AVR_OLD:
788 case EM_BLACKFIN:
789 case EM_CR16:
790 case EM_CRIS:
791 case EM_CRX:
792 case EM_D30V:
793 case EM_CYGNUS_D30V:
794 case EM_FR30:
795 case EM_FT32:
796 case EM_CYGNUS_FR30:
797 case EM_CYGNUS_FRV:
798 case EM_H8S:
799 case EM_H8_300:
800 case EM_H8_300H:
801 case EM_IA_64:
802 case EM_IP2K:
803 case EM_IP2K_OLD:
804 case EM_IQ2000:
805 case EM_LATTICEMICO32:
806 case EM_M32C_OLD:
807 case EM_M32C:
808 case EM_M32R:
809 case EM_MCORE:
810 case EM_CYGNUS_MEP:
811 case EM_METAG:
812 case EM_MMIX:
813 case EM_MN10200:
814 case EM_CYGNUS_MN10200:
815 case EM_MN10300:
816 case EM_CYGNUS_MN10300:
817 case EM_MOXIE:
818 case EM_MSP430:
819 case EM_MSP430_OLD:
820 case EM_MT:
821 case EM_NDS32:
822 case EM_NIOS32:
823 case EM_OR1K:
824 case EM_PPC64:
825 case EM_PPC:
826 case EM_TI_PRU:
827 case EM_RISCV:
828 case EM_RL78:
829 case EM_RX:
830 case EM_S390:
831 case EM_S390_OLD:
832 case EM_SH:
833 case EM_SPARC:
834 case EM_SPARC32PLUS:
835 case EM_SPARCV9:
836 case EM_SPU:
837 case EM_TI_C6000:
838 case EM_TILEGX:
839 case EM_TILEPRO:
840 case EM_V800:
841 case EM_V850:
842 case EM_CYGNUS_V850:
843 case EM_VAX:
844 case EM_VISIUM:
845 case EM_X86_64:
846 case EM_L1OM:
847 case EM_K1OM:
848 case EM_XSTORMY16:
849 case EM_XTENSA:
850 case EM_XTENSA_OLD:
851 case EM_MICROBLAZE:
852 case EM_MICROBLAZE_OLD:
853 case EM_WEBASSEMBLY:
854 return TRUE;
855
856 case EM_68HC05:
857 case EM_68HC08:
858 case EM_68HC11:
859 case EM_68HC16:
860 case EM_FX66:
861 case EM_ME16:
862 case EM_MMA:
863 case EM_NCPU:
864 case EM_NDR1:
865 case EM_PCP:
866 case EM_ST100:
867 case EM_ST19:
868 case EM_ST7:
869 case EM_ST9PLUS:
870 case EM_STARCORE:
871 case EM_SVX:
872 case EM_TINYJ:
873 default:
874 warn (_("Don't know about relocations on this machine architecture\n"));
875 return FALSE;
876 }
877 }
878
879 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
880 Returns TRUE upon success, FALSE otherwise. If successful then a
881 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
882 and the number of relocs loaded is placed in *NRELASP. It is the caller's
883 responsibility to free the allocated buffer. */
884
885 static bfd_boolean
886 slurp_rela_relocs (Filedata * filedata,
887 unsigned long rel_offset,
888 unsigned long rel_size,
889 Elf_Internal_Rela ** relasp,
890 unsigned long * nrelasp)
891 {
892 Elf_Internal_Rela * relas;
893 size_t nrelas;
894 unsigned int i;
895
896 if (is_32bit_elf)
897 {
898 Elf32_External_Rela * erelas;
899
900 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
901 rel_size, _("32-bit relocation data"));
902 if (!erelas)
903 return FALSE;
904
905 nrelas = rel_size / sizeof (Elf32_External_Rela);
906
907 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
908 sizeof (Elf_Internal_Rela));
909
910 if (relas == NULL)
911 {
912 free (erelas);
913 error (_("out of memory parsing relocs\n"));
914 return FALSE;
915 }
916
917 for (i = 0; i < nrelas; i++)
918 {
919 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
920 relas[i].r_info = BYTE_GET (erelas[i].r_info);
921 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
922 }
923
924 free (erelas);
925 }
926 else
927 {
928 Elf64_External_Rela * erelas;
929
930 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
931 rel_size, _("64-bit relocation data"));
932 if (!erelas)
933 return FALSE;
934
935 nrelas = rel_size / sizeof (Elf64_External_Rela);
936
937 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
938 sizeof (Elf_Internal_Rela));
939
940 if (relas == NULL)
941 {
942 free (erelas);
943 error (_("out of memory parsing relocs\n"));
944 return FALSE;
945 }
946
947 for (i = 0; i < nrelas; i++)
948 {
949 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
950 relas[i].r_info = BYTE_GET (erelas[i].r_info);
951 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
952
953 /* The #ifdef BFD64 below is to prevent a compile time
954 warning. We know that if we do not have a 64 bit data
955 type that we will never execute this code anyway. */
956 #ifdef BFD64
957 if (filedata->file_header.e_machine == EM_MIPS
958 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
959 {
960 /* In little-endian objects, r_info isn't really a
961 64-bit little-endian value: it has a 32-bit
962 little-endian symbol index followed by four
963 individual byte fields. Reorder INFO
964 accordingly. */
965 bfd_vma inf = relas[i].r_info;
966 inf = (((inf & 0xffffffff) << 32)
967 | ((inf >> 56) & 0xff)
968 | ((inf >> 40) & 0xff00)
969 | ((inf >> 24) & 0xff0000)
970 | ((inf >> 8) & 0xff000000));
971 relas[i].r_info = inf;
972 }
973 #endif /* BFD64 */
974 }
975
976 free (erelas);
977 }
978
979 *relasp = relas;
980 *nrelasp = nrelas;
981 return TRUE;
982 }
983
984 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
985 Returns TRUE upon success, FALSE otherwise. If successful then a
986 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
987 and the number of relocs loaded is placed in *NRELSP. It is the caller's
988 responsibility to free the allocated buffer. */
989
990 static bfd_boolean
991 slurp_rel_relocs (Filedata * filedata,
992 unsigned long rel_offset,
993 unsigned long rel_size,
994 Elf_Internal_Rela ** relsp,
995 unsigned long * nrelsp)
996 {
997 Elf_Internal_Rela * rels;
998 size_t nrels;
999 unsigned int i;
1000
1001 if (is_32bit_elf)
1002 {
1003 Elf32_External_Rel * erels;
1004
1005 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1006 rel_size, _("32-bit relocation data"));
1007 if (!erels)
1008 return FALSE;
1009
1010 nrels = rel_size / sizeof (Elf32_External_Rel);
1011
1012 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1013
1014 if (rels == NULL)
1015 {
1016 free (erels);
1017 error (_("out of memory parsing relocs\n"));
1018 return FALSE;
1019 }
1020
1021 for (i = 0; i < nrels; i++)
1022 {
1023 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1024 rels[i].r_info = BYTE_GET (erels[i].r_info);
1025 rels[i].r_addend = 0;
1026 }
1027
1028 free (erels);
1029 }
1030 else
1031 {
1032 Elf64_External_Rel * erels;
1033
1034 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1035 rel_size, _("64-bit relocation data"));
1036 if (!erels)
1037 return FALSE;
1038
1039 nrels = rel_size / sizeof (Elf64_External_Rel);
1040
1041 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1042
1043 if (rels == NULL)
1044 {
1045 free (erels);
1046 error (_("out of memory parsing relocs\n"));
1047 return FALSE;
1048 }
1049
1050 for (i = 0; i < nrels; i++)
1051 {
1052 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1053 rels[i].r_info = BYTE_GET (erels[i].r_info);
1054 rels[i].r_addend = 0;
1055
1056 /* The #ifdef BFD64 below is to prevent a compile time
1057 warning. We know that if we do not have a 64 bit data
1058 type that we will never execute this code anyway. */
1059 #ifdef BFD64
1060 if (filedata->file_header.e_machine == EM_MIPS
1061 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1062 {
1063 /* In little-endian objects, r_info isn't really a
1064 64-bit little-endian value: it has a 32-bit
1065 little-endian symbol index followed by four
1066 individual byte fields. Reorder INFO
1067 accordingly. */
1068 bfd_vma inf = rels[i].r_info;
1069 inf = (((inf & 0xffffffff) << 32)
1070 | ((inf >> 56) & 0xff)
1071 | ((inf >> 40) & 0xff00)
1072 | ((inf >> 24) & 0xff0000)
1073 | ((inf >> 8) & 0xff000000));
1074 rels[i].r_info = inf;
1075 }
1076 #endif /* BFD64 */
1077 }
1078
1079 free (erels);
1080 }
1081
1082 *relsp = rels;
1083 *nrelsp = nrels;
1084 return TRUE;
1085 }
1086
1087 /* Returns the reloc type extracted from the reloc info field. */
1088
1089 static unsigned int
1090 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1091 {
1092 if (is_32bit_elf)
1093 return ELF32_R_TYPE (reloc_info);
1094
1095 switch (filedata->file_header.e_machine)
1096 {
1097 case EM_MIPS:
1098 /* Note: We assume that reloc_info has already been adjusted for us. */
1099 return ELF64_MIPS_R_TYPE (reloc_info);
1100
1101 case EM_SPARCV9:
1102 return ELF64_R_TYPE_ID (reloc_info);
1103
1104 default:
1105 return ELF64_R_TYPE (reloc_info);
1106 }
1107 }
1108
1109 /* Return the symbol index extracted from the reloc info field. */
1110
1111 static bfd_vma
1112 get_reloc_symindex (bfd_vma reloc_info)
1113 {
1114 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1115 }
1116
1117 static inline bfd_boolean
1118 uses_msp430x_relocs (Filedata * filedata)
1119 {
1120 return
1121 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1122 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1123 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1124 /* TI compiler uses ELFOSABI_NONE. */
1125 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1126 }
1127
1128 /* Display the contents of the relocation data found at the specified
1129 offset. */
1130
1131 static bfd_boolean
1132 dump_relocations (Filedata * filedata,
1133 unsigned long rel_offset,
1134 unsigned long rel_size,
1135 Elf_Internal_Sym * symtab,
1136 unsigned long nsyms,
1137 char * strtab,
1138 unsigned long strtablen,
1139 int is_rela,
1140 bfd_boolean is_dynsym)
1141 {
1142 unsigned long i;
1143 Elf_Internal_Rela * rels;
1144 bfd_boolean res = TRUE;
1145
1146 if (is_rela == UNKNOWN)
1147 is_rela = guess_is_rela (filedata->file_header.e_machine);
1148
1149 if (is_rela)
1150 {
1151 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1152 return FALSE;
1153 }
1154 else
1155 {
1156 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1157 return FALSE;
1158 }
1159
1160 if (is_32bit_elf)
1161 {
1162 if (is_rela)
1163 {
1164 if (do_wide)
1165 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1166 else
1167 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1168 }
1169 else
1170 {
1171 if (do_wide)
1172 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1173 else
1174 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1175 }
1176 }
1177 else
1178 {
1179 if (is_rela)
1180 {
1181 if (do_wide)
1182 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1183 else
1184 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1185 }
1186 else
1187 {
1188 if (do_wide)
1189 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1190 else
1191 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1192 }
1193 }
1194
1195 for (i = 0; i < rel_size; i++)
1196 {
1197 const char * rtype;
1198 bfd_vma offset;
1199 bfd_vma inf;
1200 bfd_vma symtab_index;
1201 bfd_vma type;
1202
1203 offset = rels[i].r_offset;
1204 inf = rels[i].r_info;
1205
1206 type = get_reloc_type (filedata, inf);
1207 symtab_index = get_reloc_symindex (inf);
1208
1209 if (is_32bit_elf)
1210 {
1211 printf ("%8.8lx %8.8lx ",
1212 (unsigned long) offset & 0xffffffff,
1213 (unsigned long) inf & 0xffffffff);
1214 }
1215 else
1216 {
1217 #if BFD_HOST_64BIT_LONG
1218 printf (do_wide
1219 ? "%16.16lx %16.16lx "
1220 : "%12.12lx %12.12lx ",
1221 offset, inf);
1222 #elif BFD_HOST_64BIT_LONG_LONG
1223 #ifndef __MSVCRT__
1224 printf (do_wide
1225 ? "%16.16llx %16.16llx "
1226 : "%12.12llx %12.12llx ",
1227 offset, inf);
1228 #else
1229 printf (do_wide
1230 ? "%16.16I64x %16.16I64x "
1231 : "%12.12I64x %12.12I64x ",
1232 offset, inf);
1233 #endif
1234 #else
1235 printf (do_wide
1236 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1237 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1238 _bfd_int64_high (offset),
1239 _bfd_int64_low (offset),
1240 _bfd_int64_high (inf),
1241 _bfd_int64_low (inf));
1242 #endif
1243 }
1244
1245 switch (filedata->file_header.e_machine)
1246 {
1247 default:
1248 rtype = NULL;
1249 break;
1250
1251 case EM_AARCH64:
1252 rtype = elf_aarch64_reloc_type (type);
1253 break;
1254
1255 case EM_M32R:
1256 case EM_CYGNUS_M32R:
1257 rtype = elf_m32r_reloc_type (type);
1258 break;
1259
1260 case EM_386:
1261 case EM_IAMCU:
1262 rtype = elf_i386_reloc_type (type);
1263 break;
1264
1265 case EM_68HC11:
1266 case EM_68HC12:
1267 rtype = elf_m68hc11_reloc_type (type);
1268 break;
1269
1270 case EM_68K:
1271 rtype = elf_m68k_reloc_type (type);
1272 break;
1273
1274 case EM_AVR:
1275 case EM_AVR_OLD:
1276 rtype = elf_avr_reloc_type (type);
1277 break;
1278
1279 case EM_OLD_SPARCV9:
1280 case EM_SPARC32PLUS:
1281 case EM_SPARCV9:
1282 case EM_SPARC:
1283 rtype = elf_sparc_reloc_type (type);
1284 break;
1285
1286 case EM_SPU:
1287 rtype = elf_spu_reloc_type (type);
1288 break;
1289
1290 case EM_V800:
1291 rtype = v800_reloc_type (type);
1292 break;
1293 case EM_V850:
1294 case EM_CYGNUS_V850:
1295 rtype = v850_reloc_type (type);
1296 break;
1297
1298 case EM_D10V:
1299 case EM_CYGNUS_D10V:
1300 rtype = elf_d10v_reloc_type (type);
1301 break;
1302
1303 case EM_D30V:
1304 case EM_CYGNUS_D30V:
1305 rtype = elf_d30v_reloc_type (type);
1306 break;
1307
1308 case EM_DLX:
1309 rtype = elf_dlx_reloc_type (type);
1310 break;
1311
1312 case EM_SH:
1313 rtype = elf_sh_reloc_type (type);
1314 break;
1315
1316 case EM_MN10300:
1317 case EM_CYGNUS_MN10300:
1318 rtype = elf_mn10300_reloc_type (type);
1319 break;
1320
1321 case EM_MN10200:
1322 case EM_CYGNUS_MN10200:
1323 rtype = elf_mn10200_reloc_type (type);
1324 break;
1325
1326 case EM_FR30:
1327 case EM_CYGNUS_FR30:
1328 rtype = elf_fr30_reloc_type (type);
1329 break;
1330
1331 case EM_CYGNUS_FRV:
1332 rtype = elf_frv_reloc_type (type);
1333 break;
1334
1335 case EM_FT32:
1336 rtype = elf_ft32_reloc_type (type);
1337 break;
1338
1339 case EM_MCORE:
1340 rtype = elf_mcore_reloc_type (type);
1341 break;
1342
1343 case EM_MMIX:
1344 rtype = elf_mmix_reloc_type (type);
1345 break;
1346
1347 case EM_MOXIE:
1348 rtype = elf_moxie_reloc_type (type);
1349 break;
1350
1351 case EM_MSP430:
1352 if (uses_msp430x_relocs (filedata))
1353 {
1354 rtype = elf_msp430x_reloc_type (type);
1355 break;
1356 }
1357 /* Fall through. */
1358 case EM_MSP430_OLD:
1359 rtype = elf_msp430_reloc_type (type);
1360 break;
1361
1362 case EM_NDS32:
1363 rtype = elf_nds32_reloc_type (type);
1364 break;
1365
1366 case EM_PPC:
1367 rtype = elf_ppc_reloc_type (type);
1368 break;
1369
1370 case EM_PPC64:
1371 rtype = elf_ppc64_reloc_type (type);
1372 break;
1373
1374 case EM_MIPS:
1375 case EM_MIPS_RS3_LE:
1376 rtype = elf_mips_reloc_type (type);
1377 break;
1378
1379 case EM_RISCV:
1380 rtype = elf_riscv_reloc_type (type);
1381 break;
1382
1383 case EM_ALPHA:
1384 rtype = elf_alpha_reloc_type (type);
1385 break;
1386
1387 case EM_ARM:
1388 rtype = elf_arm_reloc_type (type);
1389 break;
1390
1391 case EM_ARC:
1392 case EM_ARC_COMPACT:
1393 case EM_ARC_COMPACT2:
1394 rtype = elf_arc_reloc_type (type);
1395 break;
1396
1397 case EM_PARISC:
1398 rtype = elf_hppa_reloc_type (type);
1399 break;
1400
1401 case EM_H8_300:
1402 case EM_H8_300H:
1403 case EM_H8S:
1404 rtype = elf_h8_reloc_type (type);
1405 break;
1406
1407 case EM_OR1K:
1408 rtype = elf_or1k_reloc_type (type);
1409 break;
1410
1411 case EM_PJ:
1412 case EM_PJ_OLD:
1413 rtype = elf_pj_reloc_type (type);
1414 break;
1415 case EM_IA_64:
1416 rtype = elf_ia64_reloc_type (type);
1417 break;
1418
1419 case EM_CRIS:
1420 rtype = elf_cris_reloc_type (type);
1421 break;
1422
1423 case EM_X86_64:
1424 case EM_L1OM:
1425 case EM_K1OM:
1426 rtype = elf_x86_64_reloc_type (type);
1427 break;
1428
1429 case EM_S370:
1430 rtype = i370_reloc_type (type);
1431 break;
1432
1433 case EM_S390_OLD:
1434 case EM_S390:
1435 rtype = elf_s390_reloc_type (type);
1436 break;
1437
1438 case EM_SCORE:
1439 rtype = elf_score_reloc_type (type);
1440 break;
1441
1442 case EM_XSTORMY16:
1443 rtype = elf_xstormy16_reloc_type (type);
1444 break;
1445
1446 case EM_CRX:
1447 rtype = elf_crx_reloc_type (type);
1448 break;
1449
1450 case EM_VAX:
1451 rtype = elf_vax_reloc_type (type);
1452 break;
1453
1454 case EM_VISIUM:
1455 rtype = elf_visium_reloc_type (type);
1456 break;
1457
1458 case EM_ADAPTEVA_EPIPHANY:
1459 rtype = elf_epiphany_reloc_type (type);
1460 break;
1461
1462 case EM_IP2K:
1463 case EM_IP2K_OLD:
1464 rtype = elf_ip2k_reloc_type (type);
1465 break;
1466
1467 case EM_IQ2000:
1468 rtype = elf_iq2000_reloc_type (type);
1469 break;
1470
1471 case EM_XTENSA_OLD:
1472 case EM_XTENSA:
1473 rtype = elf_xtensa_reloc_type (type);
1474 break;
1475
1476 case EM_LATTICEMICO32:
1477 rtype = elf_lm32_reloc_type (type);
1478 break;
1479
1480 case EM_M32C_OLD:
1481 case EM_M32C:
1482 rtype = elf_m32c_reloc_type (type);
1483 break;
1484
1485 case EM_MT:
1486 rtype = elf_mt_reloc_type (type);
1487 break;
1488
1489 case EM_BLACKFIN:
1490 rtype = elf_bfin_reloc_type (type);
1491 break;
1492
1493 case EM_CYGNUS_MEP:
1494 rtype = elf_mep_reloc_type (type);
1495 break;
1496
1497 case EM_CR16:
1498 rtype = elf_cr16_reloc_type (type);
1499 break;
1500
1501 case EM_MICROBLAZE:
1502 case EM_MICROBLAZE_OLD:
1503 rtype = elf_microblaze_reloc_type (type);
1504 break;
1505
1506 case EM_RL78:
1507 rtype = elf_rl78_reloc_type (type);
1508 break;
1509
1510 case EM_RX:
1511 rtype = elf_rx_reloc_type (type);
1512 break;
1513
1514 case EM_METAG:
1515 rtype = elf_metag_reloc_type (type);
1516 break;
1517
1518 case EM_XC16X:
1519 case EM_C166:
1520 rtype = elf_xc16x_reloc_type (type);
1521 break;
1522
1523 case EM_TI_C6000:
1524 rtype = elf_tic6x_reloc_type (type);
1525 break;
1526
1527 case EM_TILEGX:
1528 rtype = elf_tilegx_reloc_type (type);
1529 break;
1530
1531 case EM_TILEPRO:
1532 rtype = elf_tilepro_reloc_type (type);
1533 break;
1534
1535 case EM_WEBASSEMBLY:
1536 rtype = elf_wasm32_reloc_type (type);
1537 break;
1538
1539 case EM_XGATE:
1540 rtype = elf_xgate_reloc_type (type);
1541 break;
1542
1543 case EM_ALTERA_NIOS2:
1544 rtype = elf_nios2_reloc_type (type);
1545 break;
1546
1547 case EM_TI_PRU:
1548 rtype = elf_pru_reloc_type (type);
1549 break;
1550 }
1551
1552 if (rtype == NULL)
1553 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1554 else
1555 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1556
1557 if (filedata->file_header.e_machine == EM_ALPHA
1558 && rtype != NULL
1559 && streq (rtype, "R_ALPHA_LITUSE")
1560 && is_rela)
1561 {
1562 switch (rels[i].r_addend)
1563 {
1564 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1565 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1566 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1567 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1568 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1569 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1570 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1571 default: rtype = NULL;
1572 }
1573
1574 if (rtype)
1575 printf (" (%s)", rtype);
1576 else
1577 {
1578 putchar (' ');
1579 printf (_("<unknown addend: %lx>"),
1580 (unsigned long) rels[i].r_addend);
1581 res = FALSE;
1582 }
1583 }
1584 else if (symtab_index)
1585 {
1586 if (symtab == NULL || symtab_index >= nsyms)
1587 {
1588 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1589 res = FALSE;
1590 }
1591 else
1592 {
1593 Elf_Internal_Sym * psym;
1594 const char * version_string;
1595 enum versioned_symbol_info sym_info;
1596 unsigned short vna_other;
1597
1598 psym = symtab + symtab_index;
1599
1600 version_string
1601 = get_symbol_version_string (filedata, is_dynsym,
1602 strtab, strtablen,
1603 symtab_index,
1604 psym,
1605 &sym_info,
1606 &vna_other);
1607
1608 printf (" ");
1609
1610 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1611 {
1612 const char * name;
1613 unsigned int len;
1614 unsigned int width = is_32bit_elf ? 8 : 14;
1615
1616 /* Relocations against GNU_IFUNC symbols do not use the value
1617 of the symbol as the address to relocate against. Instead
1618 they invoke the function named by the symbol and use its
1619 result as the address for relocation.
1620
1621 To indicate this to the user, do not display the value of
1622 the symbol in the "Symbols's Value" field. Instead show
1623 its name followed by () as a hint that the symbol is
1624 invoked. */
1625
1626 if (strtab == NULL
1627 || psym->st_name == 0
1628 || psym->st_name >= strtablen)
1629 name = "??";
1630 else
1631 name = strtab + psym->st_name;
1632
1633 len = print_symbol (width, name);
1634 if (version_string)
1635 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1636 version_string);
1637 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1638 }
1639 else
1640 {
1641 print_vma (psym->st_value, LONG_HEX);
1642
1643 printf (is_32bit_elf ? " " : " ");
1644 }
1645
1646 if (psym->st_name == 0)
1647 {
1648 const char * sec_name = "<null>";
1649 char name_buf[40];
1650
1651 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1652 {
1653 if (psym->st_shndx < filedata->file_header.e_shnum)
1654 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1655 else if (psym->st_shndx == SHN_ABS)
1656 sec_name = "ABS";
1657 else if (psym->st_shndx == SHN_COMMON)
1658 sec_name = "COMMON";
1659 else if ((filedata->file_header.e_machine == EM_MIPS
1660 && psym->st_shndx == SHN_MIPS_SCOMMON)
1661 || (filedata->file_header.e_machine == EM_TI_C6000
1662 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1663 sec_name = "SCOMMON";
1664 else if (filedata->file_header.e_machine == EM_MIPS
1665 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1666 sec_name = "SUNDEF";
1667 else if ((filedata->file_header.e_machine == EM_X86_64
1668 || filedata->file_header.e_machine == EM_L1OM
1669 || filedata->file_header.e_machine == EM_K1OM)
1670 && psym->st_shndx == SHN_X86_64_LCOMMON)
1671 sec_name = "LARGE_COMMON";
1672 else if (filedata->file_header.e_machine == EM_IA_64
1673 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1674 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1675 sec_name = "ANSI_COM";
1676 else if (is_ia64_vms (filedata)
1677 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1678 sec_name = "VMS_SYMVEC";
1679 else
1680 {
1681 sprintf (name_buf, "<section 0x%x>",
1682 (unsigned int) psym->st_shndx);
1683 sec_name = name_buf;
1684 }
1685 }
1686 print_symbol (22, sec_name);
1687 }
1688 else if (strtab == NULL)
1689 printf (_("<string table index: %3ld>"), psym->st_name);
1690 else if (psym->st_name >= strtablen)
1691 {
1692 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1693 res = FALSE;
1694 }
1695 else
1696 {
1697 print_symbol (22, strtab + psym->st_name);
1698 if (version_string)
1699 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1700 version_string);
1701 }
1702
1703 if (is_rela)
1704 {
1705 bfd_vma off = rels[i].r_addend;
1706
1707 if ((bfd_signed_vma) off < 0)
1708 printf (" - %" BFD_VMA_FMT "x", - off);
1709 else
1710 printf (" + %" BFD_VMA_FMT "x", off);
1711 }
1712 }
1713 }
1714 else if (is_rela)
1715 {
1716 bfd_vma off = rels[i].r_addend;
1717
1718 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1719 if ((bfd_signed_vma) off < 0)
1720 printf ("-%" BFD_VMA_FMT "x", - off);
1721 else
1722 printf ("%" BFD_VMA_FMT "x", off);
1723 }
1724
1725 if (filedata->file_header.e_machine == EM_SPARCV9
1726 && rtype != NULL
1727 && streq (rtype, "R_SPARC_OLO10"))
1728 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1729
1730 putchar ('\n');
1731
1732 #ifdef BFD64
1733 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1734 {
1735 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1736 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1737 const char * rtype2 = elf_mips_reloc_type (type2);
1738 const char * rtype3 = elf_mips_reloc_type (type3);
1739
1740 printf (" Type2: ");
1741
1742 if (rtype2 == NULL)
1743 printf (_("unrecognized: %-7lx"),
1744 (unsigned long) type2 & 0xffffffff);
1745 else
1746 printf ("%-17.17s", rtype2);
1747
1748 printf ("\n Type3: ");
1749
1750 if (rtype3 == NULL)
1751 printf (_("unrecognized: %-7lx"),
1752 (unsigned long) type3 & 0xffffffff);
1753 else
1754 printf ("%-17.17s", rtype3);
1755
1756 putchar ('\n');
1757 }
1758 #endif /* BFD64 */
1759 }
1760
1761 free (rels);
1762
1763 return res;
1764 }
1765
1766 static const char *
1767 get_mips_dynamic_type (unsigned long type)
1768 {
1769 switch (type)
1770 {
1771 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1772 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1773 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1774 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1775 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1776 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1777 case DT_MIPS_MSYM: return "MIPS_MSYM";
1778 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1779 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1780 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1781 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1782 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1783 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1784 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1785 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1786 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1787 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1788 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1789 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1790 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1791 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1792 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1793 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1794 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1795 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1796 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1797 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1798 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1799 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1800 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1801 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1802 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1803 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1804 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1805 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1806 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1807 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1808 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1809 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1810 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1811 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1812 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1813 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1814 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1815 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1816 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1817 default:
1818 return NULL;
1819 }
1820 }
1821
1822 static const char *
1823 get_sparc64_dynamic_type (unsigned long type)
1824 {
1825 switch (type)
1826 {
1827 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1828 default:
1829 return NULL;
1830 }
1831 }
1832
1833 static const char *
1834 get_ppc_dynamic_type (unsigned long type)
1835 {
1836 switch (type)
1837 {
1838 case DT_PPC_GOT: return "PPC_GOT";
1839 case DT_PPC_OPT: return "PPC_OPT";
1840 default:
1841 return NULL;
1842 }
1843 }
1844
1845 static const char *
1846 get_ppc64_dynamic_type (unsigned long type)
1847 {
1848 switch (type)
1849 {
1850 case DT_PPC64_GLINK: return "PPC64_GLINK";
1851 case DT_PPC64_OPD: return "PPC64_OPD";
1852 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1853 case DT_PPC64_OPT: return "PPC64_OPT";
1854 default:
1855 return NULL;
1856 }
1857 }
1858
1859 static const char *
1860 get_parisc_dynamic_type (unsigned long type)
1861 {
1862 switch (type)
1863 {
1864 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1865 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1866 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1867 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1868 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1869 case DT_HP_PREINIT: return "HP_PREINIT";
1870 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1871 case DT_HP_NEEDED: return "HP_NEEDED";
1872 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1873 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1874 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1875 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1876 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1877 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1878 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1879 case DT_HP_FILTERED: return "HP_FILTERED";
1880 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1881 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1882 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1883 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1884 case DT_PLT: return "PLT";
1885 case DT_PLT_SIZE: return "PLT_SIZE";
1886 case DT_DLT: return "DLT";
1887 case DT_DLT_SIZE: return "DLT_SIZE";
1888 default:
1889 return NULL;
1890 }
1891 }
1892
1893 static const char *
1894 get_ia64_dynamic_type (unsigned long type)
1895 {
1896 switch (type)
1897 {
1898 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1899 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1900 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1901 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1902 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1903 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1904 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1905 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1906 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1907 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1908 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1909 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1910 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1911 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1912 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1913 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1914 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1915 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1916 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1917 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1918 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1919 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1920 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1921 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1922 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1923 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1924 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1925 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1926 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1927 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1928 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1929 default:
1930 return NULL;
1931 }
1932 }
1933
1934 static const char *
1935 get_solaris_section_type (unsigned long type)
1936 {
1937 switch (type)
1938 {
1939 case 0x6fffffee: return "SUNW_ancillary";
1940 case 0x6fffffef: return "SUNW_capchain";
1941 case 0x6ffffff0: return "SUNW_capinfo";
1942 case 0x6ffffff1: return "SUNW_symsort";
1943 case 0x6ffffff2: return "SUNW_tlssort";
1944 case 0x6ffffff3: return "SUNW_LDYNSYM";
1945 case 0x6ffffff4: return "SUNW_dof";
1946 case 0x6ffffff5: return "SUNW_cap";
1947 case 0x6ffffff6: return "SUNW_SIGNATURE";
1948 case 0x6ffffff7: return "SUNW_ANNOTATE";
1949 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1950 case 0x6ffffff9: return "SUNW_DEBUG";
1951 case 0x6ffffffa: return "SUNW_move";
1952 case 0x6ffffffb: return "SUNW_COMDAT";
1953 case 0x6ffffffc: return "SUNW_syminfo";
1954 case 0x6ffffffd: return "SUNW_verdef";
1955 case 0x6ffffffe: return "SUNW_verneed";
1956 case 0x6fffffff: return "SUNW_versym";
1957 case 0x70000000: return "SPARC_GOTDATA";
1958 default: return NULL;
1959 }
1960 }
1961
1962 static const char *
1963 get_alpha_dynamic_type (unsigned long type)
1964 {
1965 switch (type)
1966 {
1967 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1968 default: return NULL;
1969 }
1970 }
1971
1972 static const char *
1973 get_score_dynamic_type (unsigned long type)
1974 {
1975 switch (type)
1976 {
1977 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1978 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1979 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1980 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1981 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1982 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1983 default: return NULL;
1984 }
1985 }
1986
1987 static const char *
1988 get_tic6x_dynamic_type (unsigned long type)
1989 {
1990 switch (type)
1991 {
1992 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1993 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1994 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1995 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1996 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1997 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1998 default: return NULL;
1999 }
2000 }
2001
2002 static const char *
2003 get_nios2_dynamic_type (unsigned long type)
2004 {
2005 switch (type)
2006 {
2007 case DT_NIOS2_GP: return "NIOS2_GP";
2008 default: return NULL;
2009 }
2010 }
2011
2012 static const char *
2013 get_solaris_dynamic_type (unsigned long type)
2014 {
2015 switch (type)
2016 {
2017 case 0x6000000d: return "SUNW_AUXILIARY";
2018 case 0x6000000e: return "SUNW_RTLDINF";
2019 case 0x6000000f: return "SUNW_FILTER";
2020 case 0x60000010: return "SUNW_CAP";
2021 case 0x60000011: return "SUNW_SYMTAB";
2022 case 0x60000012: return "SUNW_SYMSZ";
2023 case 0x60000013: return "SUNW_SORTENT";
2024 case 0x60000014: return "SUNW_SYMSORT";
2025 case 0x60000015: return "SUNW_SYMSORTSZ";
2026 case 0x60000016: return "SUNW_TLSSORT";
2027 case 0x60000017: return "SUNW_TLSSORTSZ";
2028 case 0x60000018: return "SUNW_CAPINFO";
2029 case 0x60000019: return "SUNW_STRPAD";
2030 case 0x6000001a: return "SUNW_CAPCHAIN";
2031 case 0x6000001b: return "SUNW_LDMACH";
2032 case 0x6000001d: return "SUNW_CAPCHAINENT";
2033 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2034 case 0x60000021: return "SUNW_PARENT";
2035 case 0x60000023: return "SUNW_ASLR";
2036 case 0x60000025: return "SUNW_RELAX";
2037 case 0x60000029: return "SUNW_NXHEAP";
2038 case 0x6000002b: return "SUNW_NXSTACK";
2039
2040 case 0x70000001: return "SPARC_REGISTER";
2041 case 0x7ffffffd: return "AUXILIARY";
2042 case 0x7ffffffe: return "USED";
2043 case 0x7fffffff: return "FILTER";
2044
2045 default: return NULL;
2046 }
2047 }
2048
2049 static const char *
2050 get_dynamic_type (Filedata * filedata, unsigned long type)
2051 {
2052 static char buff[64];
2053
2054 switch (type)
2055 {
2056 case DT_NULL: return "NULL";
2057 case DT_NEEDED: return "NEEDED";
2058 case DT_PLTRELSZ: return "PLTRELSZ";
2059 case DT_PLTGOT: return "PLTGOT";
2060 case DT_HASH: return "HASH";
2061 case DT_STRTAB: return "STRTAB";
2062 case DT_SYMTAB: return "SYMTAB";
2063 case DT_RELA: return "RELA";
2064 case DT_RELASZ: return "RELASZ";
2065 case DT_RELAENT: return "RELAENT";
2066 case DT_STRSZ: return "STRSZ";
2067 case DT_SYMENT: return "SYMENT";
2068 case DT_INIT: return "INIT";
2069 case DT_FINI: return "FINI";
2070 case DT_SONAME: return "SONAME";
2071 case DT_RPATH: return "RPATH";
2072 case DT_SYMBOLIC: return "SYMBOLIC";
2073 case DT_REL: return "REL";
2074 case DT_RELSZ: return "RELSZ";
2075 case DT_RELENT: return "RELENT";
2076 case DT_PLTREL: return "PLTREL";
2077 case DT_DEBUG: return "DEBUG";
2078 case DT_TEXTREL: return "TEXTREL";
2079 case DT_JMPREL: return "JMPREL";
2080 case DT_BIND_NOW: return "BIND_NOW";
2081 case DT_INIT_ARRAY: return "INIT_ARRAY";
2082 case DT_FINI_ARRAY: return "FINI_ARRAY";
2083 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2084 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2085 case DT_RUNPATH: return "RUNPATH";
2086 case DT_FLAGS: return "FLAGS";
2087
2088 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2089 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2090 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2091
2092 case DT_CHECKSUM: return "CHECKSUM";
2093 case DT_PLTPADSZ: return "PLTPADSZ";
2094 case DT_MOVEENT: return "MOVEENT";
2095 case DT_MOVESZ: return "MOVESZ";
2096 case DT_FEATURE: return "FEATURE";
2097 case DT_POSFLAG_1: return "POSFLAG_1";
2098 case DT_SYMINSZ: return "SYMINSZ";
2099 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2100
2101 case DT_ADDRRNGLO: return "ADDRRNGLO";
2102 case DT_CONFIG: return "CONFIG";
2103 case DT_DEPAUDIT: return "DEPAUDIT";
2104 case DT_AUDIT: return "AUDIT";
2105 case DT_PLTPAD: return "PLTPAD";
2106 case DT_MOVETAB: return "MOVETAB";
2107 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2108
2109 case DT_VERSYM: return "VERSYM";
2110
2111 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2112 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2113 case DT_RELACOUNT: return "RELACOUNT";
2114 case DT_RELCOUNT: return "RELCOUNT";
2115 case DT_FLAGS_1: return "FLAGS_1";
2116 case DT_VERDEF: return "VERDEF";
2117 case DT_VERDEFNUM: return "VERDEFNUM";
2118 case DT_VERNEED: return "VERNEED";
2119 case DT_VERNEEDNUM: return "VERNEEDNUM";
2120
2121 case DT_AUXILIARY: return "AUXILIARY";
2122 case DT_USED: return "USED";
2123 case DT_FILTER: return "FILTER";
2124
2125 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2126 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2127 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2128 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2129 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2130 case DT_GNU_HASH: return "GNU_HASH";
2131
2132 default:
2133 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2134 {
2135 const char * result;
2136
2137 switch (filedata->file_header.e_machine)
2138 {
2139 case EM_MIPS:
2140 case EM_MIPS_RS3_LE:
2141 result = get_mips_dynamic_type (type);
2142 break;
2143 case EM_SPARCV9:
2144 result = get_sparc64_dynamic_type (type);
2145 break;
2146 case EM_PPC:
2147 result = get_ppc_dynamic_type (type);
2148 break;
2149 case EM_PPC64:
2150 result = get_ppc64_dynamic_type (type);
2151 break;
2152 case EM_IA_64:
2153 result = get_ia64_dynamic_type (type);
2154 break;
2155 case EM_ALPHA:
2156 result = get_alpha_dynamic_type (type);
2157 break;
2158 case EM_SCORE:
2159 result = get_score_dynamic_type (type);
2160 break;
2161 case EM_TI_C6000:
2162 result = get_tic6x_dynamic_type (type);
2163 break;
2164 case EM_ALTERA_NIOS2:
2165 result = get_nios2_dynamic_type (type);
2166 break;
2167 default:
2168 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2169 result = get_solaris_dynamic_type (type);
2170 else
2171 result = NULL;
2172 break;
2173 }
2174
2175 if (result != NULL)
2176 return result;
2177
2178 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2179 }
2180 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2181 || (filedata->file_header.e_machine == EM_PARISC
2182 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2183 {
2184 const char * result;
2185
2186 switch (filedata->file_header.e_machine)
2187 {
2188 case EM_PARISC:
2189 result = get_parisc_dynamic_type (type);
2190 break;
2191 case EM_IA_64:
2192 result = get_ia64_dynamic_type (type);
2193 break;
2194 default:
2195 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2196 result = get_solaris_dynamic_type (type);
2197 else
2198 result = NULL;
2199 break;
2200 }
2201
2202 if (result != NULL)
2203 return result;
2204
2205 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2206 type);
2207 }
2208 else
2209 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2210
2211 return buff;
2212 }
2213 }
2214
2215 static char *
2216 get_file_type (unsigned e_type)
2217 {
2218 static char buff[32];
2219
2220 switch (e_type)
2221 {
2222 case ET_NONE: return _("NONE (None)");
2223 case ET_REL: return _("REL (Relocatable file)");
2224 case ET_EXEC: return _("EXEC (Executable file)");
2225 case ET_DYN: return _("DYN (Shared object file)");
2226 case ET_CORE: return _("CORE (Core file)");
2227
2228 default:
2229 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2230 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2231 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2232 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2233 else
2234 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2235 return buff;
2236 }
2237 }
2238
2239 static char *
2240 get_machine_name (unsigned e_machine)
2241 {
2242 static char buff[64]; /* XXX */
2243
2244 switch (e_machine)
2245 {
2246 /* Please keep this switch table sorted by increasing EM_ value. */
2247 /* 0 */
2248 case EM_NONE: return _("None");
2249 case EM_M32: return "WE32100";
2250 case EM_SPARC: return "Sparc";
2251 case EM_386: return "Intel 80386";
2252 case EM_68K: return "MC68000";
2253 case EM_88K: return "MC88000";
2254 case EM_IAMCU: return "Intel MCU";
2255 case EM_860: return "Intel 80860";
2256 case EM_MIPS: return "MIPS R3000";
2257 case EM_S370: return "IBM System/370";
2258 /* 10 */
2259 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2260 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2261 case EM_PARISC: return "HPPA";
2262 case EM_VPP550: return "Fujitsu VPP500";
2263 case EM_SPARC32PLUS: return "Sparc v8+" ;
2264 case EM_960: return "Intel 90860";
2265 case EM_PPC: return "PowerPC";
2266 /* 20 */
2267 case EM_PPC64: return "PowerPC64";
2268 case EM_S390_OLD:
2269 case EM_S390: return "IBM S/390";
2270 case EM_SPU: return "SPU";
2271 /* 30 */
2272 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2273 case EM_FR20: return "Fujitsu FR20";
2274 case EM_RH32: return "TRW RH32";
2275 case EM_MCORE: return "MCORE";
2276 /* 40 */
2277 case EM_ARM: return "ARM";
2278 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2279 case EM_SH: return "Renesas / SuperH SH";
2280 case EM_SPARCV9: return "Sparc v9";
2281 case EM_TRICORE: return "Siemens Tricore";
2282 case EM_ARC: return "ARC";
2283 case EM_H8_300: return "Renesas H8/300";
2284 case EM_H8_300H: return "Renesas H8/300H";
2285 case EM_H8S: return "Renesas H8S";
2286 case EM_H8_500: return "Renesas H8/500";
2287 /* 50 */
2288 case EM_IA_64: return "Intel IA-64";
2289 case EM_MIPS_X: return "Stanford MIPS-X";
2290 case EM_COLDFIRE: return "Motorola Coldfire";
2291 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2292 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2293 case EM_PCP: return "Siemens PCP";
2294 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2295 case EM_NDR1: return "Denso NDR1 microprocesspr";
2296 case EM_STARCORE: return "Motorola Star*Core processor";
2297 case EM_ME16: return "Toyota ME16 processor";
2298 /* 60 */
2299 case EM_ST100: return "STMicroelectronics ST100 processor";
2300 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2301 case EM_X86_64: return "Advanced Micro Devices X86-64";
2302 case EM_PDSP: return "Sony DSP processor";
2303 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2304 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2305 case EM_FX66: return "Siemens FX66 microcontroller";
2306 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2307 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2308 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2309 /* 70 */
2310 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2311 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2312 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2313 case EM_SVX: return "Silicon Graphics SVx";
2314 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2315 case EM_VAX: return "Digital VAX";
2316 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2317 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2318 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2319 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2320 /* 80 */
2321 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2322 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2323 case EM_PRISM: return "Vitesse Prism";
2324 case EM_AVR_OLD:
2325 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2326 case EM_CYGNUS_FR30:
2327 case EM_FR30: return "Fujitsu FR30";
2328 case EM_CYGNUS_D10V:
2329 case EM_D10V: return "d10v";
2330 case EM_CYGNUS_D30V:
2331 case EM_D30V: return "d30v";
2332 case EM_CYGNUS_V850:
2333 case EM_V850: return "Renesas V850";
2334 case EM_CYGNUS_M32R:
2335 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2336 case EM_CYGNUS_MN10300:
2337 case EM_MN10300: return "mn10300";
2338 /* 90 */
2339 case EM_CYGNUS_MN10200:
2340 case EM_MN10200: return "mn10200";
2341 case EM_PJ: return "picoJava";
2342 case EM_OR1K: return "OpenRISC 1000";
2343 case EM_ARC_COMPACT: return "ARCompact";
2344 case EM_XTENSA_OLD:
2345 case EM_XTENSA: return "Tensilica Xtensa Processor";
2346 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2347 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2348 case EM_NS32K: return "National Semiconductor 32000 series";
2349 case EM_TPC: return "Tenor Network TPC processor";
2350 case EM_SNP1K: return "Trebia SNP 1000 processor";
2351 /* 100 */
2352 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2353 case EM_IP2K_OLD:
2354 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2355 case EM_MAX: return "MAX Processor";
2356 case EM_CR: return "National Semiconductor CompactRISC";
2357 case EM_F2MC16: return "Fujitsu F2MC16";
2358 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2359 case EM_BLACKFIN: return "Analog Devices Blackfin";
2360 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2361 case EM_SEP: return "Sharp embedded microprocessor";
2362 case EM_ARCA: return "Arca RISC microprocessor";
2363 /* 110 */
2364 case EM_UNICORE: return "Unicore";
2365 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2366 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2367 case EM_ALTERA_NIOS2: return "Altera Nios II";
2368 case EM_CRX: return "National Semiconductor CRX microprocessor";
2369 case EM_XGATE: return "Motorola XGATE embedded processor";
2370 case EM_C166:
2371 case EM_XC16X: return "Infineon Technologies xc16x";
2372 case EM_M16C: return "Renesas M16C series microprocessors";
2373 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2374 case EM_CE: return "Freescale Communication Engine RISC core";
2375 /* 120 */
2376 case EM_M32C: return "Renesas M32c";
2377 /* 130 */
2378 case EM_TSK3000: return "Altium TSK3000 core";
2379 case EM_RS08: return "Freescale RS08 embedded processor";
2380 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2381 case EM_SCORE: return "SUNPLUS S+Core";
2382 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2383 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2384 case EM_LATTICEMICO32: return "Lattice Mico32";
2385 case EM_SE_C17: return "Seiko Epson C17 family";
2386 /* 140 */
2387 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2388 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2389 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2390 case EM_TI_PRU: return "TI PRU I/O processor";
2391 /* 160 */
2392 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2393 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2394 case EM_R32C: return "Renesas R32C series microprocessors";
2395 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2396 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2397 case EM_8051: return "Intel 8051 and variants";
2398 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2399 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2400 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2401 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2402 /* 170 */
2403 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2404 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2405 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2406 case EM_RX: return "Renesas RX";
2407 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2408 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2409 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2410 case EM_CR16:
2411 case EM_MICROBLAZE:
2412 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2413 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2414 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2415 /* 180 */
2416 case EM_L1OM: return "Intel L1OM";
2417 case EM_K1OM: return "Intel K1OM";
2418 case EM_INTEL182: return "Intel (reserved)";
2419 case EM_AARCH64: return "AArch64";
2420 case EM_ARM184: return "ARM (reserved)";
2421 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2422 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2423 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2424 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2425 /* 190 */
2426 case EM_CUDA: return "NVIDIA CUDA architecture";
2427 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2428 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2429 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2430 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2431 case EM_ARC_COMPACT2: return "ARCv2";
2432 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2433 case EM_RL78: return "Renesas RL78";
2434 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2435 case EM_78K0R: return "Renesas 78K0R";
2436 /* 200 */
2437 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2438 case EM_BA1: return "Beyond BA1 CPU architecture";
2439 case EM_BA2: return "Beyond BA2 CPU architecture";
2440 case EM_XCORE: return "XMOS xCORE processor family";
2441 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2442 /* 210 */
2443 case EM_KM32: return "KM211 KM32 32-bit processor";
2444 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2445 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2446 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2447 case EM_KVARC: return "KM211 KVARC processor";
2448 case EM_CDP: return "Paneve CDP architecture family";
2449 case EM_COGE: return "Cognitive Smart Memory Processor";
2450 case EM_COOL: return "Bluechip Systems CoolEngine";
2451 case EM_NORC: return "Nanoradio Optimized RISC";
2452 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2453 /* 220 */
2454 case EM_Z80: return "Zilog Z80";
2455 case EM_VISIUM: return "CDS VISIUMcore processor";
2456 case EM_FT32: return "FTDI Chip FT32";
2457 case EM_MOXIE: return "Moxie";
2458 case EM_AMDGPU: return "AMD GPU";
2459 case EM_RISCV: return "RISC-V";
2460 case EM_LANAI: return "Lanai 32-bit processor";
2461 case EM_BPF: return "Linux BPF";
2462
2463 /* Large numbers... */
2464 case EM_MT: return "Morpho Techologies MT processor";
2465 case EM_ALPHA: return "Alpha";
2466 case EM_WEBASSEMBLY: return "Web Assembly";
2467 case EM_DLX: return "OpenDLX";
2468 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2469 case EM_IQ2000: return "Vitesse IQ2000";
2470 case EM_M32C_OLD:
2471 case EM_NIOS32: return "Altera Nios";
2472 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2473 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2474 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2475
2476 default:
2477 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2478 return buff;
2479 }
2480 }
2481
2482 static void
2483 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2484 {
2485 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2486 other compilers don't a specific architecture type in the e_flags, and
2487 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2488 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2489 architectures.
2490
2491 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2492 but also sets a specific architecture type in the e_flags field.
2493
2494 However, when decoding the flags we don't worry if we see an
2495 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2496 ARCEM architecture type. */
2497
2498 switch (e_flags & EF_ARC_MACH_MSK)
2499 {
2500 /* We only expect these to occur for EM_ARC_COMPACT2. */
2501 case EF_ARC_CPU_ARCV2EM:
2502 strcat (buf, ", ARC EM");
2503 break;
2504 case EF_ARC_CPU_ARCV2HS:
2505 strcat (buf, ", ARC HS");
2506 break;
2507
2508 /* We only expect these to occur for EM_ARC_COMPACT. */
2509 case E_ARC_MACH_ARC600:
2510 strcat (buf, ", ARC600");
2511 break;
2512 case E_ARC_MACH_ARC601:
2513 strcat (buf, ", ARC601");
2514 break;
2515 case E_ARC_MACH_ARC700:
2516 strcat (buf, ", ARC700");
2517 break;
2518
2519 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2520 new ELF with new architecture being read by an old version of
2521 readelf, or (c) An ELF built with non-GNU compiler that does not
2522 set the architecture in the e_flags. */
2523 default:
2524 if (e_machine == EM_ARC_COMPACT)
2525 strcat (buf, ", Unknown ARCompact");
2526 else
2527 strcat (buf, ", Unknown ARC");
2528 break;
2529 }
2530
2531 switch (e_flags & EF_ARC_OSABI_MSK)
2532 {
2533 case E_ARC_OSABI_ORIG:
2534 strcat (buf, ", (ABI:legacy)");
2535 break;
2536 case E_ARC_OSABI_V2:
2537 strcat (buf, ", (ABI:v2)");
2538 break;
2539 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2540 case E_ARC_OSABI_V3:
2541 strcat (buf, ", v3 no-legacy-syscalls ABI");
2542 break;
2543 case E_ARC_OSABI_V4:
2544 strcat (buf, ", v4 ABI");
2545 break;
2546 default:
2547 strcat (buf, ", unrecognised ARC OSABI flag");
2548 break;
2549 }
2550 }
2551
2552 static void
2553 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2554 {
2555 unsigned eabi;
2556 bfd_boolean unknown = FALSE;
2557
2558 eabi = EF_ARM_EABI_VERSION (e_flags);
2559 e_flags &= ~ EF_ARM_EABIMASK;
2560
2561 /* Handle "generic" ARM flags. */
2562 if (e_flags & EF_ARM_RELEXEC)
2563 {
2564 strcat (buf, ", relocatable executable");
2565 e_flags &= ~ EF_ARM_RELEXEC;
2566 }
2567
2568 /* Now handle EABI specific flags. */
2569 switch (eabi)
2570 {
2571 default:
2572 strcat (buf, ", <unrecognized EABI>");
2573 if (e_flags)
2574 unknown = TRUE;
2575 break;
2576
2577 case EF_ARM_EABI_VER1:
2578 strcat (buf, ", Version1 EABI");
2579 while (e_flags)
2580 {
2581 unsigned flag;
2582
2583 /* Process flags one bit at a time. */
2584 flag = e_flags & - e_flags;
2585 e_flags &= ~ flag;
2586
2587 switch (flag)
2588 {
2589 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2590 strcat (buf, ", sorted symbol tables");
2591 break;
2592
2593 default:
2594 unknown = TRUE;
2595 break;
2596 }
2597 }
2598 break;
2599
2600 case EF_ARM_EABI_VER2:
2601 strcat (buf, ", Version2 EABI");
2602 while (e_flags)
2603 {
2604 unsigned flag;
2605
2606 /* Process flags one bit at a time. */
2607 flag = e_flags & - e_flags;
2608 e_flags &= ~ flag;
2609
2610 switch (flag)
2611 {
2612 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2613 strcat (buf, ", sorted symbol tables");
2614 break;
2615
2616 case EF_ARM_DYNSYMSUSESEGIDX:
2617 strcat (buf, ", dynamic symbols use segment index");
2618 break;
2619
2620 case EF_ARM_MAPSYMSFIRST:
2621 strcat (buf, ", mapping symbols precede others");
2622 break;
2623
2624 default:
2625 unknown = TRUE;
2626 break;
2627 }
2628 }
2629 break;
2630
2631 case EF_ARM_EABI_VER3:
2632 strcat (buf, ", Version3 EABI");
2633 break;
2634
2635 case EF_ARM_EABI_VER4:
2636 strcat (buf, ", Version4 EABI");
2637 while (e_flags)
2638 {
2639 unsigned flag;
2640
2641 /* Process flags one bit at a time. */
2642 flag = e_flags & - e_flags;
2643 e_flags &= ~ flag;
2644
2645 switch (flag)
2646 {
2647 case EF_ARM_BE8:
2648 strcat (buf, ", BE8");
2649 break;
2650
2651 case EF_ARM_LE8:
2652 strcat (buf, ", LE8");
2653 break;
2654
2655 default:
2656 unknown = TRUE;
2657 break;
2658 }
2659 }
2660 break;
2661
2662 case EF_ARM_EABI_VER5:
2663 strcat (buf, ", Version5 EABI");
2664 while (e_flags)
2665 {
2666 unsigned flag;
2667
2668 /* Process flags one bit at a time. */
2669 flag = e_flags & - e_flags;
2670 e_flags &= ~ flag;
2671
2672 switch (flag)
2673 {
2674 case EF_ARM_BE8:
2675 strcat (buf, ", BE8");
2676 break;
2677
2678 case EF_ARM_LE8:
2679 strcat (buf, ", LE8");
2680 break;
2681
2682 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2683 strcat (buf, ", soft-float ABI");
2684 break;
2685
2686 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2687 strcat (buf, ", hard-float ABI");
2688 break;
2689
2690 default:
2691 unknown = TRUE;
2692 break;
2693 }
2694 }
2695 break;
2696
2697 case EF_ARM_EABI_UNKNOWN:
2698 strcat (buf, ", GNU EABI");
2699 while (e_flags)
2700 {
2701 unsigned flag;
2702
2703 /* Process flags one bit at a time. */
2704 flag = e_flags & - e_flags;
2705 e_flags &= ~ flag;
2706
2707 switch (flag)
2708 {
2709 case EF_ARM_INTERWORK:
2710 strcat (buf, ", interworking enabled");
2711 break;
2712
2713 case EF_ARM_APCS_26:
2714 strcat (buf, ", uses APCS/26");
2715 break;
2716
2717 case EF_ARM_APCS_FLOAT:
2718 strcat (buf, ", uses APCS/float");
2719 break;
2720
2721 case EF_ARM_PIC:
2722 strcat (buf, ", position independent");
2723 break;
2724
2725 case EF_ARM_ALIGN8:
2726 strcat (buf, ", 8 bit structure alignment");
2727 break;
2728
2729 case EF_ARM_NEW_ABI:
2730 strcat (buf, ", uses new ABI");
2731 break;
2732
2733 case EF_ARM_OLD_ABI:
2734 strcat (buf, ", uses old ABI");
2735 break;
2736
2737 case EF_ARM_SOFT_FLOAT:
2738 strcat (buf, ", software FP");
2739 break;
2740
2741 case EF_ARM_VFP_FLOAT:
2742 strcat (buf, ", VFP");
2743 break;
2744
2745 case EF_ARM_MAVERICK_FLOAT:
2746 strcat (buf, ", Maverick FP");
2747 break;
2748
2749 default:
2750 unknown = TRUE;
2751 break;
2752 }
2753 }
2754 }
2755
2756 if (unknown)
2757 strcat (buf,_(", <unknown>"));
2758 }
2759
2760 static void
2761 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2762 {
2763 --size; /* Leave space for null terminator. */
2764
2765 switch (e_flags & EF_AVR_MACH)
2766 {
2767 case E_AVR_MACH_AVR1:
2768 strncat (buf, ", avr:1", size);
2769 break;
2770 case E_AVR_MACH_AVR2:
2771 strncat (buf, ", avr:2", size);
2772 break;
2773 case E_AVR_MACH_AVR25:
2774 strncat (buf, ", avr:25", size);
2775 break;
2776 case E_AVR_MACH_AVR3:
2777 strncat (buf, ", avr:3", size);
2778 break;
2779 case E_AVR_MACH_AVR31:
2780 strncat (buf, ", avr:31", size);
2781 break;
2782 case E_AVR_MACH_AVR35:
2783 strncat (buf, ", avr:35", size);
2784 break;
2785 case E_AVR_MACH_AVR4:
2786 strncat (buf, ", avr:4", size);
2787 break;
2788 case E_AVR_MACH_AVR5:
2789 strncat (buf, ", avr:5", size);
2790 break;
2791 case E_AVR_MACH_AVR51:
2792 strncat (buf, ", avr:51", size);
2793 break;
2794 case E_AVR_MACH_AVR6:
2795 strncat (buf, ", avr:6", size);
2796 break;
2797 case E_AVR_MACH_AVRTINY:
2798 strncat (buf, ", avr:100", size);
2799 break;
2800 case E_AVR_MACH_XMEGA1:
2801 strncat (buf, ", avr:101", size);
2802 break;
2803 case E_AVR_MACH_XMEGA2:
2804 strncat (buf, ", avr:102", size);
2805 break;
2806 case E_AVR_MACH_XMEGA3:
2807 strncat (buf, ", avr:103", size);
2808 break;
2809 case E_AVR_MACH_XMEGA4:
2810 strncat (buf, ", avr:104", size);
2811 break;
2812 case E_AVR_MACH_XMEGA5:
2813 strncat (buf, ", avr:105", size);
2814 break;
2815 case E_AVR_MACH_XMEGA6:
2816 strncat (buf, ", avr:106", size);
2817 break;
2818 case E_AVR_MACH_XMEGA7:
2819 strncat (buf, ", avr:107", size);
2820 break;
2821 default:
2822 strncat (buf, ", avr:<unknown>", size);
2823 break;
2824 }
2825
2826 size -= strlen (buf);
2827 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2828 strncat (buf, ", link-relax", size);
2829 }
2830
2831 static void
2832 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2833 {
2834 unsigned abi;
2835 unsigned arch;
2836 unsigned config;
2837 unsigned version;
2838 bfd_boolean has_fpu = FALSE;
2839 unsigned int r = 0;
2840
2841 static const char *ABI_STRINGS[] =
2842 {
2843 "ABI v0", /* use r5 as return register; only used in N1213HC */
2844 "ABI v1", /* use r0 as return register */
2845 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2846 "ABI v2fp", /* for FPU */
2847 "AABI",
2848 "ABI2 FP+"
2849 };
2850 static const char *VER_STRINGS[] =
2851 {
2852 "Andes ELF V1.3 or older",
2853 "Andes ELF V1.3.1",
2854 "Andes ELF V1.4"
2855 };
2856 static const char *ARCH_STRINGS[] =
2857 {
2858 "",
2859 "Andes Star v1.0",
2860 "Andes Star v2.0",
2861 "Andes Star v3.0",
2862 "Andes Star v3.0m"
2863 };
2864
2865 abi = EF_NDS_ABI & e_flags;
2866 arch = EF_NDS_ARCH & e_flags;
2867 config = EF_NDS_INST & e_flags;
2868 version = EF_NDS32_ELF_VERSION & e_flags;
2869
2870 memset (buf, 0, size);
2871
2872 switch (abi)
2873 {
2874 case E_NDS_ABI_V0:
2875 case E_NDS_ABI_V1:
2876 case E_NDS_ABI_V2:
2877 case E_NDS_ABI_V2FP:
2878 case E_NDS_ABI_AABI:
2879 case E_NDS_ABI_V2FP_PLUS:
2880 /* In case there are holes in the array. */
2881 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2882 break;
2883
2884 default:
2885 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2886 break;
2887 }
2888
2889 switch (version)
2890 {
2891 case E_NDS32_ELF_VER_1_2:
2892 case E_NDS32_ELF_VER_1_3:
2893 case E_NDS32_ELF_VER_1_4:
2894 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2895 break;
2896
2897 default:
2898 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2899 break;
2900 }
2901
2902 if (E_NDS_ABI_V0 == abi)
2903 {
2904 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2905 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2906 if (arch == E_NDS_ARCH_STAR_V1_0)
2907 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2908 return;
2909 }
2910
2911 switch (arch)
2912 {
2913 case E_NDS_ARCH_STAR_V1_0:
2914 case E_NDS_ARCH_STAR_V2_0:
2915 case E_NDS_ARCH_STAR_V3_0:
2916 case E_NDS_ARCH_STAR_V3_M:
2917 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2918 break;
2919
2920 default:
2921 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2922 /* ARCH version determines how the e_flags are interpreted.
2923 If it is unknown, we cannot proceed. */
2924 return;
2925 }
2926
2927 /* Newer ABI; Now handle architecture specific flags. */
2928 if (arch == E_NDS_ARCH_STAR_V1_0)
2929 {
2930 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2931 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2932
2933 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2934 r += snprintf (buf + r, size -r, ", MAC");
2935
2936 if (config & E_NDS32_HAS_DIV_INST)
2937 r += snprintf (buf + r, size -r, ", DIV");
2938
2939 if (config & E_NDS32_HAS_16BIT_INST)
2940 r += snprintf (buf + r, size -r, ", 16b");
2941 }
2942 else
2943 {
2944 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2945 {
2946 if (version <= E_NDS32_ELF_VER_1_3)
2947 r += snprintf (buf + r, size -r, ", [B8]");
2948 else
2949 r += snprintf (buf + r, size -r, ", EX9");
2950 }
2951
2952 if (config & E_NDS32_HAS_MAC_DX_INST)
2953 r += snprintf (buf + r, size -r, ", MAC_DX");
2954
2955 if (config & E_NDS32_HAS_DIV_DX_INST)
2956 r += snprintf (buf + r, size -r, ", DIV_DX");
2957
2958 if (config & E_NDS32_HAS_16BIT_INST)
2959 {
2960 if (version <= E_NDS32_ELF_VER_1_3)
2961 r += snprintf (buf + r, size -r, ", 16b");
2962 else
2963 r += snprintf (buf + r, size -r, ", IFC");
2964 }
2965 }
2966
2967 if (config & E_NDS32_HAS_EXT_INST)
2968 r += snprintf (buf + r, size -r, ", PERF1");
2969
2970 if (config & E_NDS32_HAS_EXT2_INST)
2971 r += snprintf (buf + r, size -r, ", PERF2");
2972
2973 if (config & E_NDS32_HAS_FPU_INST)
2974 {
2975 has_fpu = TRUE;
2976 r += snprintf (buf + r, size -r, ", FPU_SP");
2977 }
2978
2979 if (config & E_NDS32_HAS_FPU_DP_INST)
2980 {
2981 has_fpu = TRUE;
2982 r += snprintf (buf + r, size -r, ", FPU_DP");
2983 }
2984
2985 if (config & E_NDS32_HAS_FPU_MAC_INST)
2986 {
2987 has_fpu = TRUE;
2988 r += snprintf (buf + r, size -r, ", FPU_MAC");
2989 }
2990
2991 if (has_fpu)
2992 {
2993 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2994 {
2995 case E_NDS32_FPU_REG_8SP_4DP:
2996 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2997 break;
2998 case E_NDS32_FPU_REG_16SP_8DP:
2999 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3000 break;
3001 case E_NDS32_FPU_REG_32SP_16DP:
3002 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3003 break;
3004 case E_NDS32_FPU_REG_32SP_32DP:
3005 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3006 break;
3007 }
3008 }
3009
3010 if (config & E_NDS32_HAS_AUDIO_INST)
3011 r += snprintf (buf + r, size -r, ", AUDIO");
3012
3013 if (config & E_NDS32_HAS_STRING_INST)
3014 r += snprintf (buf + r, size -r, ", STR");
3015
3016 if (config & E_NDS32_HAS_REDUCED_REGS)
3017 r += snprintf (buf + r, size -r, ", 16REG");
3018
3019 if (config & E_NDS32_HAS_VIDEO_INST)
3020 {
3021 if (version <= E_NDS32_ELF_VER_1_3)
3022 r += snprintf (buf + r, size -r, ", VIDEO");
3023 else
3024 r += snprintf (buf + r, size -r, ", SATURATION");
3025 }
3026
3027 if (config & E_NDS32_HAS_ENCRIPT_INST)
3028 r += snprintf (buf + r, size -r, ", ENCRP");
3029
3030 if (config & E_NDS32_HAS_L2C_INST)
3031 r += snprintf (buf + r, size -r, ", L2C");
3032 }
3033
3034 static char *
3035 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3036 {
3037 static char buf[1024];
3038
3039 buf[0] = '\0';
3040
3041 if (e_flags)
3042 {
3043 switch (e_machine)
3044 {
3045 default:
3046 break;
3047
3048 case EM_ARC_COMPACT2:
3049 case EM_ARC_COMPACT:
3050 decode_ARC_machine_flags (e_flags, e_machine, buf);
3051 break;
3052
3053 case EM_ARM:
3054 decode_ARM_machine_flags (e_flags, buf);
3055 break;
3056
3057 case EM_AVR:
3058 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3059 break;
3060
3061 case EM_BLACKFIN:
3062 if (e_flags & EF_BFIN_PIC)
3063 strcat (buf, ", PIC");
3064
3065 if (e_flags & EF_BFIN_FDPIC)
3066 strcat (buf, ", FDPIC");
3067
3068 if (e_flags & EF_BFIN_CODE_IN_L1)
3069 strcat (buf, ", code in L1");
3070
3071 if (e_flags & EF_BFIN_DATA_IN_L1)
3072 strcat (buf, ", data in L1");
3073
3074 break;
3075
3076 case EM_CYGNUS_FRV:
3077 switch (e_flags & EF_FRV_CPU_MASK)
3078 {
3079 case EF_FRV_CPU_GENERIC:
3080 break;
3081
3082 default:
3083 strcat (buf, ", fr???");
3084 break;
3085
3086 case EF_FRV_CPU_FR300:
3087 strcat (buf, ", fr300");
3088 break;
3089
3090 case EF_FRV_CPU_FR400:
3091 strcat (buf, ", fr400");
3092 break;
3093 case EF_FRV_CPU_FR405:
3094 strcat (buf, ", fr405");
3095 break;
3096
3097 case EF_FRV_CPU_FR450:
3098 strcat (buf, ", fr450");
3099 break;
3100
3101 case EF_FRV_CPU_FR500:
3102 strcat (buf, ", fr500");
3103 break;
3104 case EF_FRV_CPU_FR550:
3105 strcat (buf, ", fr550");
3106 break;
3107
3108 case EF_FRV_CPU_SIMPLE:
3109 strcat (buf, ", simple");
3110 break;
3111 case EF_FRV_CPU_TOMCAT:
3112 strcat (buf, ", tomcat");
3113 break;
3114 }
3115 break;
3116
3117 case EM_68K:
3118 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3119 strcat (buf, ", m68000");
3120 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3121 strcat (buf, ", cpu32");
3122 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3123 strcat (buf, ", fido_a");
3124 else
3125 {
3126 char const * isa = _("unknown");
3127 char const * mac = _("unknown mac");
3128 char const * additional = NULL;
3129
3130 switch (e_flags & EF_M68K_CF_ISA_MASK)
3131 {
3132 case EF_M68K_CF_ISA_A_NODIV:
3133 isa = "A";
3134 additional = ", nodiv";
3135 break;
3136 case EF_M68K_CF_ISA_A:
3137 isa = "A";
3138 break;
3139 case EF_M68K_CF_ISA_A_PLUS:
3140 isa = "A+";
3141 break;
3142 case EF_M68K_CF_ISA_B_NOUSP:
3143 isa = "B";
3144 additional = ", nousp";
3145 break;
3146 case EF_M68K_CF_ISA_B:
3147 isa = "B";
3148 break;
3149 case EF_M68K_CF_ISA_C:
3150 isa = "C";
3151 break;
3152 case EF_M68K_CF_ISA_C_NODIV:
3153 isa = "C";
3154 additional = ", nodiv";
3155 break;
3156 }
3157 strcat (buf, ", cf, isa ");
3158 strcat (buf, isa);
3159 if (additional)
3160 strcat (buf, additional);
3161 if (e_flags & EF_M68K_CF_FLOAT)
3162 strcat (buf, ", float");
3163 switch (e_flags & EF_M68K_CF_MAC_MASK)
3164 {
3165 case 0:
3166 mac = NULL;
3167 break;
3168 case EF_M68K_CF_MAC:
3169 mac = "mac";
3170 break;
3171 case EF_M68K_CF_EMAC:
3172 mac = "emac";
3173 break;
3174 case EF_M68K_CF_EMAC_B:
3175 mac = "emac_b";
3176 break;
3177 }
3178 if (mac)
3179 {
3180 strcat (buf, ", ");
3181 strcat (buf, mac);
3182 }
3183 }
3184 break;
3185
3186 case EM_CYGNUS_MEP:
3187 switch (e_flags & EF_MEP_CPU_MASK)
3188 {
3189 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3190 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3191 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3192 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3193 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3194 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3195 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3196 }
3197
3198 switch (e_flags & EF_MEP_COP_MASK)
3199 {
3200 case EF_MEP_COP_NONE: break;
3201 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3202 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3203 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3204 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3205 default: strcat (buf, _("<unknown MeP copro type>")); break;
3206 }
3207
3208 if (e_flags & EF_MEP_LIBRARY)
3209 strcat (buf, ", Built for Library");
3210
3211 if (e_flags & EF_MEP_INDEX_MASK)
3212 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3213 e_flags & EF_MEP_INDEX_MASK);
3214
3215 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3216 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3217 e_flags & ~ EF_MEP_ALL_FLAGS);
3218 break;
3219
3220 case EM_PPC:
3221 if (e_flags & EF_PPC_EMB)
3222 strcat (buf, ", emb");
3223
3224 if (e_flags & EF_PPC_RELOCATABLE)
3225 strcat (buf, _(", relocatable"));
3226
3227 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3228 strcat (buf, _(", relocatable-lib"));
3229 break;
3230
3231 case EM_PPC64:
3232 if (e_flags & EF_PPC64_ABI)
3233 {
3234 char abi[] = ", abiv0";
3235
3236 abi[6] += e_flags & EF_PPC64_ABI;
3237 strcat (buf, abi);
3238 }
3239 break;
3240
3241 case EM_V800:
3242 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3243 strcat (buf, ", RH850 ABI");
3244
3245 if (e_flags & EF_V800_850E3)
3246 strcat (buf, ", V3 architecture");
3247
3248 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3249 strcat (buf, ", FPU not used");
3250
3251 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3252 strcat (buf, ", regmode: COMMON");
3253
3254 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3255 strcat (buf, ", r4 not used");
3256
3257 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3258 strcat (buf, ", r30 not used");
3259
3260 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3261 strcat (buf, ", r5 not used");
3262
3263 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3264 strcat (buf, ", r2 not used");
3265
3266 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3267 {
3268 switch (e_flags & - e_flags)
3269 {
3270 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3271 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3272 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3273 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3274 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3275 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3276 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3277 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3278 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3279 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3280 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3281 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3282 default: break;
3283 }
3284 }
3285 break;
3286
3287 case EM_V850:
3288 case EM_CYGNUS_V850:
3289 switch (e_flags & EF_V850_ARCH)
3290 {
3291 case E_V850E3V5_ARCH:
3292 strcat (buf, ", v850e3v5");
3293 break;
3294 case E_V850E2V3_ARCH:
3295 strcat (buf, ", v850e2v3");
3296 break;
3297 case E_V850E2_ARCH:
3298 strcat (buf, ", v850e2");
3299 break;
3300 case E_V850E1_ARCH:
3301 strcat (buf, ", v850e1");
3302 break;
3303 case E_V850E_ARCH:
3304 strcat (buf, ", v850e");
3305 break;
3306 case E_V850_ARCH:
3307 strcat (buf, ", v850");
3308 break;
3309 default:
3310 strcat (buf, _(", unknown v850 architecture variant"));
3311 break;
3312 }
3313 break;
3314
3315 case EM_M32R:
3316 case EM_CYGNUS_M32R:
3317 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3318 strcat (buf, ", m32r");
3319 break;
3320
3321 case EM_MIPS:
3322 case EM_MIPS_RS3_LE:
3323 if (e_flags & EF_MIPS_NOREORDER)
3324 strcat (buf, ", noreorder");
3325
3326 if (e_flags & EF_MIPS_PIC)
3327 strcat (buf, ", pic");
3328
3329 if (e_flags & EF_MIPS_CPIC)
3330 strcat (buf, ", cpic");
3331
3332 if (e_flags & EF_MIPS_UCODE)
3333 strcat (buf, ", ugen_reserved");
3334
3335 if (e_flags & EF_MIPS_ABI2)
3336 strcat (buf, ", abi2");
3337
3338 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3339 strcat (buf, ", odk first");
3340
3341 if (e_flags & EF_MIPS_32BITMODE)
3342 strcat (buf, ", 32bitmode");
3343
3344 if (e_flags & EF_MIPS_NAN2008)
3345 strcat (buf, ", nan2008");
3346
3347 if (e_flags & EF_MIPS_FP64)
3348 strcat (buf, ", fp64");
3349
3350 switch ((e_flags & EF_MIPS_MACH))
3351 {
3352 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3353 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3354 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3355 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3356 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3357 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3358 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3359 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3360 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3361 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3362 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3363 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3364 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3365 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3366 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3367 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3368 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3369 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3370 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3371 case 0:
3372 /* We simply ignore the field in this case to avoid confusion:
3373 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3374 extension. */
3375 break;
3376 default: strcat (buf, _(", unknown CPU")); break;
3377 }
3378
3379 switch ((e_flags & EF_MIPS_ABI))
3380 {
3381 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3382 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3383 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3384 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3385 case 0:
3386 /* We simply ignore the field in this case to avoid confusion:
3387 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3388 This means it is likely to be an o32 file, but not for
3389 sure. */
3390 break;
3391 default: strcat (buf, _(", unknown ABI")); break;
3392 }
3393
3394 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3395 strcat (buf, ", mdmx");
3396
3397 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3398 strcat (buf, ", mips16");
3399
3400 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3401 strcat (buf, ", micromips");
3402
3403 switch ((e_flags & EF_MIPS_ARCH))
3404 {
3405 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3406 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3407 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3408 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3409 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3410 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3411 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3412 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3413 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3414 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3415 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3416 default: strcat (buf, _(", unknown ISA")); break;
3417 }
3418 break;
3419
3420 case EM_NDS32:
3421 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3422 break;
3423
3424 case EM_RISCV:
3425 if (e_flags & EF_RISCV_RVC)
3426 strcat (buf, ", RVC");
3427
3428 switch (e_flags & EF_RISCV_FLOAT_ABI)
3429 {
3430 case EF_RISCV_FLOAT_ABI_SOFT:
3431 strcat (buf, ", soft-float ABI");
3432 break;
3433
3434 case EF_RISCV_FLOAT_ABI_SINGLE:
3435 strcat (buf, ", single-float ABI");
3436 break;
3437
3438 case EF_RISCV_FLOAT_ABI_DOUBLE:
3439 strcat (buf, ", double-float ABI");
3440 break;
3441
3442 case EF_RISCV_FLOAT_ABI_QUAD:
3443 strcat (buf, ", quad-float ABI");
3444 break;
3445 }
3446 break;
3447
3448 case EM_SH:
3449 switch ((e_flags & EF_SH_MACH_MASK))
3450 {
3451 case EF_SH1: strcat (buf, ", sh1"); break;
3452 case EF_SH2: strcat (buf, ", sh2"); break;
3453 case EF_SH3: strcat (buf, ", sh3"); break;
3454 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3455 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3456 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3457 case EF_SH3E: strcat (buf, ", sh3e"); break;
3458 case EF_SH4: strcat (buf, ", sh4"); break;
3459 case EF_SH5: strcat (buf, ", sh5"); break;
3460 case EF_SH2E: strcat (buf, ", sh2e"); break;
3461 case EF_SH4A: strcat (buf, ", sh4a"); break;
3462 case EF_SH2A: strcat (buf, ", sh2a"); break;
3463 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3464 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3465 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3466 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3467 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3468 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3469 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3470 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3471 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3472 default: strcat (buf, _(", unknown ISA")); break;
3473 }
3474
3475 if (e_flags & EF_SH_PIC)
3476 strcat (buf, ", pic");
3477
3478 if (e_flags & EF_SH_FDPIC)
3479 strcat (buf, ", fdpic");
3480 break;
3481
3482 case EM_OR1K:
3483 if (e_flags & EF_OR1K_NODELAY)
3484 strcat (buf, ", no delay");
3485 break;
3486
3487 case EM_SPARCV9:
3488 if (e_flags & EF_SPARC_32PLUS)
3489 strcat (buf, ", v8+");
3490
3491 if (e_flags & EF_SPARC_SUN_US1)
3492 strcat (buf, ", ultrasparcI");
3493
3494 if (e_flags & EF_SPARC_SUN_US3)
3495 strcat (buf, ", ultrasparcIII");
3496
3497 if (e_flags & EF_SPARC_HAL_R1)
3498 strcat (buf, ", halr1");
3499
3500 if (e_flags & EF_SPARC_LEDATA)
3501 strcat (buf, ", ledata");
3502
3503 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3504 strcat (buf, ", tso");
3505
3506 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3507 strcat (buf, ", pso");
3508
3509 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3510 strcat (buf, ", rmo");
3511 break;
3512
3513 case EM_PARISC:
3514 switch (e_flags & EF_PARISC_ARCH)
3515 {
3516 case EFA_PARISC_1_0:
3517 strcpy (buf, ", PA-RISC 1.0");
3518 break;
3519 case EFA_PARISC_1_1:
3520 strcpy (buf, ", PA-RISC 1.1");
3521 break;
3522 case EFA_PARISC_2_0:
3523 strcpy (buf, ", PA-RISC 2.0");
3524 break;
3525 default:
3526 break;
3527 }
3528 if (e_flags & EF_PARISC_TRAPNIL)
3529 strcat (buf, ", trapnil");
3530 if (e_flags & EF_PARISC_EXT)
3531 strcat (buf, ", ext");
3532 if (e_flags & EF_PARISC_LSB)
3533 strcat (buf, ", lsb");
3534 if (e_flags & EF_PARISC_WIDE)
3535 strcat (buf, ", wide");
3536 if (e_flags & EF_PARISC_NO_KABP)
3537 strcat (buf, ", no kabp");
3538 if (e_flags & EF_PARISC_LAZYSWAP)
3539 strcat (buf, ", lazyswap");
3540 break;
3541
3542 case EM_PJ:
3543 case EM_PJ_OLD:
3544 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3545 strcat (buf, ", new calling convention");
3546
3547 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3548 strcat (buf, ", gnu calling convention");
3549 break;
3550
3551 case EM_IA_64:
3552 if ((e_flags & EF_IA_64_ABI64))
3553 strcat (buf, ", 64-bit");
3554 else
3555 strcat (buf, ", 32-bit");
3556 if ((e_flags & EF_IA_64_REDUCEDFP))
3557 strcat (buf, ", reduced fp model");
3558 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3559 strcat (buf, ", no function descriptors, constant gp");
3560 else if ((e_flags & EF_IA_64_CONS_GP))
3561 strcat (buf, ", constant gp");
3562 if ((e_flags & EF_IA_64_ABSOLUTE))
3563 strcat (buf, ", absolute");
3564 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3565 {
3566 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3567 strcat (buf, ", vms_linkages");
3568 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3569 {
3570 case EF_IA_64_VMS_COMCOD_SUCCESS:
3571 break;
3572 case EF_IA_64_VMS_COMCOD_WARNING:
3573 strcat (buf, ", warning");
3574 break;
3575 case EF_IA_64_VMS_COMCOD_ERROR:
3576 strcat (buf, ", error");
3577 break;
3578 case EF_IA_64_VMS_COMCOD_ABORT:
3579 strcat (buf, ", abort");
3580 break;
3581 default:
3582 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3583 e_flags & EF_IA_64_VMS_COMCOD);
3584 strcat (buf, ", <unknown>");
3585 }
3586 }
3587 break;
3588
3589 case EM_VAX:
3590 if ((e_flags & EF_VAX_NONPIC))
3591 strcat (buf, ", non-PIC");
3592 if ((e_flags & EF_VAX_DFLOAT))
3593 strcat (buf, ", D-Float");
3594 if ((e_flags & EF_VAX_GFLOAT))
3595 strcat (buf, ", G-Float");
3596 break;
3597
3598 case EM_VISIUM:
3599 if (e_flags & EF_VISIUM_ARCH_MCM)
3600 strcat (buf, ", mcm");
3601 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3602 strcat (buf, ", mcm24");
3603 if (e_flags & EF_VISIUM_ARCH_GR6)
3604 strcat (buf, ", gr6");
3605 break;
3606
3607 case EM_RL78:
3608 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3609 {
3610 case E_FLAG_RL78_ANY_CPU: break;
3611 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3612 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3613 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3614 }
3615 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3616 strcat (buf, ", 64-bit doubles");
3617 break;
3618
3619 case EM_RX:
3620 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3621 strcat (buf, ", 64-bit doubles");
3622 if (e_flags & E_FLAG_RX_DSP)
3623 strcat (buf, ", dsp");
3624 if (e_flags & E_FLAG_RX_PID)
3625 strcat (buf, ", pid");
3626 if (e_flags & E_FLAG_RX_ABI)
3627 strcat (buf, ", RX ABI");
3628 if (e_flags & E_FLAG_RX_SINSNS_SET)
3629 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3630 ? ", uses String instructions" : ", bans String instructions");
3631 if (e_flags & E_FLAG_RX_V2)
3632 strcat (buf, ", V2");
3633 break;
3634
3635 case EM_S390:
3636 if (e_flags & EF_S390_HIGH_GPRS)
3637 strcat (buf, ", highgprs");
3638 break;
3639
3640 case EM_TI_C6000:
3641 if ((e_flags & EF_C6000_REL))
3642 strcat (buf, ", relocatable module");
3643 break;
3644
3645 case EM_MSP430:
3646 strcat (buf, _(": architecture variant: "));
3647 switch (e_flags & EF_MSP430_MACH)
3648 {
3649 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3650 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3651 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3652 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3653 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3654 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3655 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3656 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3657 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3658 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3659 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3660 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3661 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3662 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3663 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3664 default:
3665 strcat (buf, _(": unknown")); break;
3666 }
3667
3668 if (e_flags & ~ EF_MSP430_MACH)
3669 strcat (buf, _(": unknown extra flag bits also present"));
3670 }
3671 }
3672
3673 return buf;
3674 }
3675
3676 static const char *
3677 get_osabi_name (Filedata * filedata, unsigned int osabi)
3678 {
3679 static char buff[32];
3680
3681 switch (osabi)
3682 {
3683 case ELFOSABI_NONE: return "UNIX - System V";
3684 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3685 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3686 case ELFOSABI_GNU: return "UNIX - GNU";
3687 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3688 case ELFOSABI_AIX: return "UNIX - AIX";
3689 case ELFOSABI_IRIX: return "UNIX - IRIX";
3690 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3691 case ELFOSABI_TRU64: return "UNIX - TRU64";
3692 case ELFOSABI_MODESTO: return "Novell - Modesto";
3693 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3694 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3695 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3696 case ELFOSABI_AROS: return "AROS";
3697 case ELFOSABI_FENIXOS: return "FenixOS";
3698 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3699 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3700 default:
3701 if (osabi >= 64)
3702 switch (filedata->file_header.e_machine)
3703 {
3704 case EM_ARM:
3705 switch (osabi)
3706 {
3707 case ELFOSABI_ARM: return "ARM";
3708 default:
3709 break;
3710 }
3711 break;
3712
3713 case EM_MSP430:
3714 case EM_MSP430_OLD:
3715 case EM_VISIUM:
3716 switch (osabi)
3717 {
3718 case ELFOSABI_STANDALONE: return _("Standalone App");
3719 default:
3720 break;
3721 }
3722 break;
3723
3724 case EM_TI_C6000:
3725 switch (osabi)
3726 {
3727 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3728 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3729 default:
3730 break;
3731 }
3732 break;
3733
3734 default:
3735 break;
3736 }
3737 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3738 return buff;
3739 }
3740 }
3741
3742 static const char *
3743 get_aarch64_segment_type (unsigned long type)
3744 {
3745 switch (type)
3746 {
3747 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3748 default: return NULL;
3749 }
3750 }
3751
3752 static const char *
3753 get_arm_segment_type (unsigned long type)
3754 {
3755 switch (type)
3756 {
3757 case PT_ARM_EXIDX: return "EXIDX";
3758 default: return NULL;
3759 }
3760 }
3761
3762 static const char *
3763 get_s390_segment_type (unsigned long type)
3764 {
3765 switch (type)
3766 {
3767 case PT_S390_PGSTE: return "S390_PGSTE";
3768 default: return NULL;
3769 }
3770 }
3771
3772 static const char *
3773 get_mips_segment_type (unsigned long type)
3774 {
3775 switch (type)
3776 {
3777 case PT_MIPS_REGINFO: return "REGINFO";
3778 case PT_MIPS_RTPROC: return "RTPROC";
3779 case PT_MIPS_OPTIONS: return "OPTIONS";
3780 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3781 default: return NULL;
3782 }
3783 }
3784
3785 static const char *
3786 get_parisc_segment_type (unsigned long type)
3787 {
3788 switch (type)
3789 {
3790 case PT_HP_TLS: return "HP_TLS";
3791 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3792 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3793 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3794 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3795 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3796 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3797 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3798 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3799 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3800 case PT_HP_PARALLEL: return "HP_PARALLEL";
3801 case PT_HP_FASTBIND: return "HP_FASTBIND";
3802 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3803 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3804 case PT_HP_STACK: return "HP_STACK";
3805 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3806 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3807 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3808 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3809 default: return NULL;
3810 }
3811 }
3812
3813 static const char *
3814 get_ia64_segment_type (unsigned long type)
3815 {
3816 switch (type)
3817 {
3818 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3819 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3820 case PT_HP_TLS: return "HP_TLS";
3821 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3822 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3823 case PT_IA_64_HP_STACK: return "HP_STACK";
3824 default: return NULL;
3825 }
3826 }
3827
3828 static const char *
3829 get_tic6x_segment_type (unsigned long type)
3830 {
3831 switch (type)
3832 {
3833 case PT_C6000_PHATTR: return "C6000_PHATTR";
3834 default: return NULL;
3835 }
3836 }
3837
3838 static const char *
3839 get_solaris_segment_type (unsigned long type)
3840 {
3841 switch (type)
3842 {
3843 case 0x6464e550: return "PT_SUNW_UNWIND";
3844 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3845 case 0x6ffffff7: return "PT_LOSUNW";
3846 case 0x6ffffffa: return "PT_SUNWBSS";
3847 case 0x6ffffffb: return "PT_SUNWSTACK";
3848 case 0x6ffffffc: return "PT_SUNWDTRACE";
3849 case 0x6ffffffd: return "PT_SUNWCAP";
3850 case 0x6fffffff: return "PT_HISUNW";
3851 default: return NULL;
3852 }
3853 }
3854
3855 static const char *
3856 get_segment_type (Filedata * filedata, unsigned long p_type)
3857 {
3858 static char buff[32];
3859
3860 switch (p_type)
3861 {
3862 case PT_NULL: return "NULL";
3863 case PT_LOAD: return "LOAD";
3864 case PT_DYNAMIC: return "DYNAMIC";
3865 case PT_INTERP: return "INTERP";
3866 case PT_NOTE: return "NOTE";
3867 case PT_SHLIB: return "SHLIB";
3868 case PT_PHDR: return "PHDR";
3869 case PT_TLS: return "TLS";
3870 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3871 case PT_GNU_STACK: return "GNU_STACK";
3872 case PT_GNU_RELRO: return "GNU_RELRO";
3873
3874 default:
3875 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3876 {
3877 sprintf (buff, "GNU_MBIND+%#lx",
3878 p_type - PT_GNU_MBIND_LO);
3879 }
3880 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3881 {
3882 const char * result;
3883
3884 switch (filedata->file_header.e_machine)
3885 {
3886 case EM_AARCH64:
3887 result = get_aarch64_segment_type (p_type);
3888 break;
3889 case EM_ARM:
3890 result = get_arm_segment_type (p_type);
3891 break;
3892 case EM_MIPS:
3893 case EM_MIPS_RS3_LE:
3894 result = get_mips_segment_type (p_type);
3895 break;
3896 case EM_PARISC:
3897 result = get_parisc_segment_type (p_type);
3898 break;
3899 case EM_IA_64:
3900 result = get_ia64_segment_type (p_type);
3901 break;
3902 case EM_TI_C6000:
3903 result = get_tic6x_segment_type (p_type);
3904 break;
3905 case EM_S390:
3906 case EM_S390_OLD:
3907 result = get_s390_segment_type (p_type);
3908 break;
3909 default:
3910 result = NULL;
3911 break;
3912 }
3913
3914 if (result != NULL)
3915 return result;
3916
3917 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3918 }
3919 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3920 {
3921 const char * result;
3922
3923 switch (filedata->file_header.e_machine)
3924 {
3925 case EM_PARISC:
3926 result = get_parisc_segment_type (p_type);
3927 break;
3928 case EM_IA_64:
3929 result = get_ia64_segment_type (p_type);
3930 break;
3931 default:
3932 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3933 result = get_solaris_segment_type (p_type);
3934 else
3935 result = NULL;
3936 break;
3937 }
3938
3939 if (result != NULL)
3940 return result;
3941
3942 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3943 }
3944 else
3945 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3946
3947 return buff;
3948 }
3949 }
3950
3951 static const char *
3952 get_arc_section_type_name (unsigned int sh_type)
3953 {
3954 switch (sh_type)
3955 {
3956 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
3957 default:
3958 break;
3959 }
3960 return NULL;
3961 }
3962
3963 static const char *
3964 get_mips_section_type_name (unsigned int sh_type)
3965 {
3966 switch (sh_type)
3967 {
3968 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3969 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3970 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3971 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3972 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3973 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3974 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3975 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3976 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3977 case SHT_MIPS_RELD: return "MIPS_RELD";
3978 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3979 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3980 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3981 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3982 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3983 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3984 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3985 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3986 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3987 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3988 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3989 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3990 case SHT_MIPS_LINE: return "MIPS_LINE";
3991 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3992 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3993 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3994 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3995 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3996 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3997 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3998 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3999 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4000 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4001 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4002 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4003 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4004 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4005 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4006 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4007 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4008 default:
4009 break;
4010 }
4011 return NULL;
4012 }
4013
4014 static const char *
4015 get_parisc_section_type_name (unsigned int sh_type)
4016 {
4017 switch (sh_type)
4018 {
4019 case SHT_PARISC_EXT: return "PARISC_EXT";
4020 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4021 case SHT_PARISC_DOC: return "PARISC_DOC";
4022 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4023 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4024 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4025 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4026 default: return NULL;
4027 }
4028 }
4029
4030 static const char *
4031 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4032 {
4033 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4034 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4035 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4036
4037 switch (sh_type)
4038 {
4039 case SHT_IA_64_EXT: return "IA_64_EXT";
4040 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4041 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4042 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4043 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4044 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4045 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4046 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4047 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4048 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4049 default:
4050 break;
4051 }
4052 return NULL;
4053 }
4054
4055 static const char *
4056 get_x86_64_section_type_name (unsigned int sh_type)
4057 {
4058 switch (sh_type)
4059 {
4060 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4061 default: return NULL;
4062 }
4063 }
4064
4065 static const char *
4066 get_aarch64_section_type_name (unsigned int sh_type)
4067 {
4068 switch (sh_type)
4069 {
4070 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4071 default: return NULL;
4072 }
4073 }
4074
4075 static const char *
4076 get_arm_section_type_name (unsigned int sh_type)
4077 {
4078 switch (sh_type)
4079 {
4080 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4081 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4082 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4083 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4084 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4085 default: return NULL;
4086 }
4087 }
4088
4089 static const char *
4090 get_tic6x_section_type_name (unsigned int sh_type)
4091 {
4092 switch (sh_type)
4093 {
4094 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4095 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4096 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4097 case SHT_TI_ICODE: return "TI_ICODE";
4098 case SHT_TI_XREF: return "TI_XREF";
4099 case SHT_TI_HANDLER: return "TI_HANDLER";
4100 case SHT_TI_INITINFO: return "TI_INITINFO";
4101 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4102 default: return NULL;
4103 }
4104 }
4105
4106 static const char *
4107 get_msp430x_section_type_name (unsigned int sh_type)
4108 {
4109 switch (sh_type)
4110 {
4111 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4112 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4113 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4114 default: return NULL;
4115 }
4116 }
4117
4118 static const char *
4119 get_v850_section_type_name (unsigned int sh_type)
4120 {
4121 switch (sh_type)
4122 {
4123 case SHT_V850_SCOMMON: return "V850 Small Common";
4124 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4125 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4126 case SHT_RENESAS_IOP: return "RENESAS IOP";
4127 case SHT_RENESAS_INFO: return "RENESAS INFO";
4128 default: return NULL;
4129 }
4130 }
4131
4132 static const char *
4133 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4134 {
4135 static char buff[32];
4136 const char * result;
4137
4138 switch (sh_type)
4139 {
4140 case SHT_NULL: return "NULL";
4141 case SHT_PROGBITS: return "PROGBITS";
4142 case SHT_SYMTAB: return "SYMTAB";
4143 case SHT_STRTAB: return "STRTAB";
4144 case SHT_RELA: return "RELA";
4145 case SHT_HASH: return "HASH";
4146 case SHT_DYNAMIC: return "DYNAMIC";
4147 case SHT_NOTE: return "NOTE";
4148 case SHT_NOBITS: return "NOBITS";
4149 case SHT_REL: return "REL";
4150 case SHT_SHLIB: return "SHLIB";
4151 case SHT_DYNSYM: return "DYNSYM";
4152 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4153 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4154 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4155 case SHT_GNU_HASH: return "GNU_HASH";
4156 case SHT_GROUP: return "GROUP";
4157 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4158 case SHT_GNU_verdef: return "VERDEF";
4159 case SHT_GNU_verneed: return "VERNEED";
4160 case SHT_GNU_versym: return "VERSYM";
4161 case 0x6ffffff0: return "VERSYM";
4162 case 0x6ffffffc: return "VERDEF";
4163 case 0x7ffffffd: return "AUXILIARY";
4164 case 0x7fffffff: return "FILTER";
4165 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4166
4167 default:
4168 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4169 {
4170 switch (filedata->file_header.e_machine)
4171 {
4172 case EM_ARC:
4173 case EM_ARC_COMPACT:
4174 case EM_ARC_COMPACT2:
4175 result = get_arc_section_type_name (sh_type);
4176 break;
4177 case EM_MIPS:
4178 case EM_MIPS_RS3_LE:
4179 result = get_mips_section_type_name (sh_type);
4180 break;
4181 case EM_PARISC:
4182 result = get_parisc_section_type_name (sh_type);
4183 break;
4184 case EM_IA_64:
4185 result = get_ia64_section_type_name (filedata, sh_type);
4186 break;
4187 case EM_X86_64:
4188 case EM_L1OM:
4189 case EM_K1OM:
4190 result = get_x86_64_section_type_name (sh_type);
4191 break;
4192 case EM_AARCH64:
4193 result = get_aarch64_section_type_name (sh_type);
4194 break;
4195 case EM_ARM:
4196 result = get_arm_section_type_name (sh_type);
4197 break;
4198 case EM_TI_C6000:
4199 result = get_tic6x_section_type_name (sh_type);
4200 break;
4201 case EM_MSP430:
4202 result = get_msp430x_section_type_name (sh_type);
4203 break;
4204 case EM_V800:
4205 case EM_V850:
4206 case EM_CYGNUS_V850:
4207 result = get_v850_section_type_name (sh_type);
4208 break;
4209 default:
4210 result = NULL;
4211 break;
4212 }
4213
4214 if (result != NULL)
4215 return result;
4216
4217 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4218 }
4219 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4220 {
4221 switch (filedata->file_header.e_machine)
4222 {
4223 case EM_IA_64:
4224 result = get_ia64_section_type_name (filedata, sh_type);
4225 break;
4226 default:
4227 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4228 result = get_solaris_section_type (sh_type);
4229 else
4230 {
4231 switch (sh_type)
4232 {
4233 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4234 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4235 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4236 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4237 default:
4238 result = NULL;
4239 break;
4240 }
4241 }
4242 break;
4243 }
4244
4245 if (result != NULL)
4246 return result;
4247
4248 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4249 }
4250 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4251 {
4252 switch (filedata->file_header.e_machine)
4253 {
4254 case EM_V800:
4255 case EM_V850:
4256 case EM_CYGNUS_V850:
4257 result = get_v850_section_type_name (sh_type);
4258 break;
4259 default:
4260 result = NULL;
4261 break;
4262 }
4263
4264 if (result != NULL)
4265 return result;
4266
4267 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4268 }
4269 else
4270 /* This message is probably going to be displayed in a 15
4271 character wide field, so put the hex value first. */
4272 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4273
4274 return buff;
4275 }
4276 }
4277
4278 #define OPTION_DEBUG_DUMP 512
4279 #define OPTION_DYN_SYMS 513
4280 #define OPTION_DWARF_DEPTH 514
4281 #define OPTION_DWARF_START 515
4282 #define OPTION_DWARF_CHECK 516
4283
4284 static struct option options[] =
4285 {
4286 {"all", no_argument, 0, 'a'},
4287 {"file-header", no_argument, 0, 'h'},
4288 {"program-headers", no_argument, 0, 'l'},
4289 {"headers", no_argument, 0, 'e'},
4290 {"histogram", no_argument, 0, 'I'},
4291 {"segments", no_argument, 0, 'l'},
4292 {"sections", no_argument, 0, 'S'},
4293 {"section-headers", no_argument, 0, 'S'},
4294 {"section-groups", no_argument, 0, 'g'},
4295 {"section-details", no_argument, 0, 't'},
4296 {"full-section-name",no_argument, 0, 'N'},
4297 {"symbols", no_argument, 0, 's'},
4298 {"syms", no_argument, 0, 's'},
4299 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4300 {"relocs", no_argument, 0, 'r'},
4301 {"notes", no_argument, 0, 'n'},
4302 {"dynamic", no_argument, 0, 'd'},
4303 {"arch-specific", no_argument, 0, 'A'},
4304 {"version-info", no_argument, 0, 'V'},
4305 {"use-dynamic", no_argument, 0, 'D'},
4306 {"unwind", no_argument, 0, 'u'},
4307 {"archive-index", no_argument, 0, 'c'},
4308 {"hex-dump", required_argument, 0, 'x'},
4309 {"relocated-dump", required_argument, 0, 'R'},
4310 {"string-dump", required_argument, 0, 'p'},
4311 {"decompress", no_argument, 0, 'z'},
4312 #ifdef SUPPORT_DISASSEMBLY
4313 {"instruction-dump", required_argument, 0, 'i'},
4314 #endif
4315 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4316
4317 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4318 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4319 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4320
4321 {"version", no_argument, 0, 'v'},
4322 {"wide", no_argument, 0, 'W'},
4323 {"help", no_argument, 0, 'H'},
4324 {0, no_argument, 0, 0}
4325 };
4326
4327 static void
4328 usage (FILE * stream)
4329 {
4330 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4331 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4332 fprintf (stream, _(" Options are:\n\
4333 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4334 -h --file-header Display the ELF file header\n\
4335 -l --program-headers Display the program headers\n\
4336 --segments An alias for --program-headers\n\
4337 -S --section-headers Display the sections' header\n\
4338 --sections An alias for --section-headers\n\
4339 -g --section-groups Display the section groups\n\
4340 -t --section-details Display the section details\n\
4341 -e --headers Equivalent to: -h -l -S\n\
4342 -s --syms Display the symbol table\n\
4343 --symbols An alias for --syms\n\
4344 --dyn-syms Display the dynamic symbol table\n\
4345 -n --notes Display the core notes (if present)\n\
4346 -r --relocs Display the relocations (if present)\n\
4347 -u --unwind Display the unwind info (if present)\n\
4348 -d --dynamic Display the dynamic section (if present)\n\
4349 -V --version-info Display the version sections (if present)\n\
4350 -A --arch-specific Display architecture specific information (if any)\n\
4351 -c --archive-index Display the symbol/file index in an archive\n\
4352 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4353 -x --hex-dump=<number|name>\n\
4354 Dump the contents of section <number|name> as bytes\n\
4355 -p --string-dump=<number|name>\n\
4356 Dump the contents of section <number|name> as strings\n\
4357 -R --relocated-dump=<number|name>\n\
4358 Dump the contents of section <number|name> as relocated bytes\n\
4359 -z --decompress Decompress section before dumping it\n\
4360 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4361 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4362 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4363 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4364 =addr,=cu_index,=links,=follow-links]\n\
4365 Display the contents of DWARF debug sections\n"));
4366 fprintf (stream, _("\
4367 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4368 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4369 or deeper\n"));
4370 #ifdef SUPPORT_DISASSEMBLY
4371 fprintf (stream, _("\
4372 -i --instruction-dump=<number|name>\n\
4373 Disassemble the contents of section <number|name>\n"));
4374 #endif
4375 fprintf (stream, _("\
4376 -I --histogram Display histogram of bucket list lengths\n\
4377 -W --wide Allow output width to exceed 80 characters\n\
4378 @<file> Read options from <file>\n\
4379 -H --help Display this information\n\
4380 -v --version Display the version number of readelf\n"));
4381
4382 if (REPORT_BUGS_TO[0] && stream == stdout)
4383 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4384
4385 exit (stream == stdout ? 0 : 1);
4386 }
4387
4388 /* Record the fact that the user wants the contents of section number
4389 SECTION to be displayed using the method(s) encoded as flags bits
4390 in TYPE. Note, TYPE can be zero if we are creating the array for
4391 the first time. */
4392
4393 static void
4394 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4395 {
4396 if (section >= filedata->num_dump_sects)
4397 {
4398 dump_type * new_dump_sects;
4399
4400 new_dump_sects = (dump_type *) calloc (section + 1,
4401 sizeof (* new_dump_sects));
4402
4403 if (new_dump_sects == NULL)
4404 error (_("Out of memory allocating dump request table.\n"));
4405 else
4406 {
4407 if (filedata->dump_sects)
4408 {
4409 /* Copy current flag settings. */
4410 memcpy (new_dump_sects, filedata->dump_sects,
4411 filedata->num_dump_sects * sizeof (* new_dump_sects));
4412
4413 free (filedata->dump_sects);
4414 }
4415
4416 filedata->dump_sects = new_dump_sects;
4417 filedata->num_dump_sects = section + 1;
4418 }
4419 }
4420
4421 if (filedata->dump_sects)
4422 filedata->dump_sects[section] |= type;
4423 }
4424
4425 /* Request a dump by section name. */
4426
4427 static void
4428 request_dump_byname (const char * section, dump_type type)
4429 {
4430 struct dump_list_entry * new_request;
4431
4432 new_request = (struct dump_list_entry *)
4433 malloc (sizeof (struct dump_list_entry));
4434 if (!new_request)
4435 error (_("Out of memory allocating dump request table.\n"));
4436
4437 new_request->name = strdup (section);
4438 if (!new_request->name)
4439 error (_("Out of memory allocating dump request table.\n"));
4440
4441 new_request->type = type;
4442
4443 new_request->next = dump_sects_byname;
4444 dump_sects_byname = new_request;
4445 }
4446
4447 static inline void
4448 request_dump (Filedata * filedata, dump_type type)
4449 {
4450 int section;
4451 char * cp;
4452
4453 do_dump++;
4454 section = strtoul (optarg, & cp, 0);
4455
4456 if (! *cp && section >= 0)
4457 request_dump_bynumber (filedata, section, type);
4458 else
4459 request_dump_byname (optarg, type);
4460 }
4461
4462 static void
4463 parse_args (Filedata * filedata, int argc, char ** argv)
4464 {
4465 int c;
4466
4467 if (argc < 2)
4468 usage (stderr);
4469
4470 while ((c = getopt_long
4471 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4472 {
4473 switch (c)
4474 {
4475 case 0:
4476 /* Long options. */
4477 break;
4478 case 'H':
4479 usage (stdout);
4480 break;
4481
4482 case 'a':
4483 do_syms = TRUE;
4484 do_reloc = TRUE;
4485 do_unwind = TRUE;
4486 do_dynamic = TRUE;
4487 do_header = TRUE;
4488 do_sections = TRUE;
4489 do_section_groups = TRUE;
4490 do_segments = TRUE;
4491 do_version = TRUE;
4492 do_histogram = TRUE;
4493 do_arch = TRUE;
4494 do_notes = TRUE;
4495 break;
4496 case 'g':
4497 do_section_groups = TRUE;
4498 break;
4499 case 't':
4500 case 'N':
4501 do_sections = TRUE;
4502 do_section_details = TRUE;
4503 break;
4504 case 'e':
4505 do_header = TRUE;
4506 do_sections = TRUE;
4507 do_segments = TRUE;
4508 break;
4509 case 'A':
4510 do_arch = TRUE;
4511 break;
4512 case 'D':
4513 do_using_dynamic = TRUE;
4514 break;
4515 case 'r':
4516 do_reloc = TRUE;
4517 break;
4518 case 'u':
4519 do_unwind = TRUE;
4520 break;
4521 case 'h':
4522 do_header = TRUE;
4523 break;
4524 case 'l':
4525 do_segments = TRUE;
4526 break;
4527 case 's':
4528 do_syms = TRUE;
4529 break;
4530 case 'S':
4531 do_sections = TRUE;
4532 break;
4533 case 'd':
4534 do_dynamic = TRUE;
4535 break;
4536 case 'I':
4537 do_histogram = TRUE;
4538 break;
4539 case 'n':
4540 do_notes = TRUE;
4541 break;
4542 case 'c':
4543 do_archive_index = TRUE;
4544 break;
4545 case 'x':
4546 request_dump (filedata, HEX_DUMP);
4547 break;
4548 case 'p':
4549 request_dump (filedata, STRING_DUMP);
4550 break;
4551 case 'R':
4552 request_dump (filedata, RELOC_DUMP);
4553 break;
4554 case 'z':
4555 decompress_dumps = TRUE;
4556 break;
4557 case 'w':
4558 do_dump = TRUE;
4559 if (optarg == 0)
4560 {
4561 do_debugging = TRUE;
4562 dwarf_select_sections_all ();
4563 }
4564 else
4565 {
4566 do_debugging = FALSE;
4567 dwarf_select_sections_by_letters (optarg);
4568 }
4569 break;
4570 case OPTION_DEBUG_DUMP:
4571 do_dump = TRUE;
4572 if (optarg == 0)
4573 do_debugging = TRUE;
4574 else
4575 {
4576 do_debugging = FALSE;
4577 dwarf_select_sections_by_names (optarg);
4578 }
4579 break;
4580 case OPTION_DWARF_DEPTH:
4581 {
4582 char *cp;
4583
4584 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4585 }
4586 break;
4587 case OPTION_DWARF_START:
4588 {
4589 char *cp;
4590
4591 dwarf_start_die = strtoul (optarg, & cp, 0);
4592 }
4593 break;
4594 case OPTION_DWARF_CHECK:
4595 dwarf_check = TRUE;
4596 break;
4597 case OPTION_DYN_SYMS:
4598 do_dyn_syms = TRUE;
4599 break;
4600 #ifdef SUPPORT_DISASSEMBLY
4601 case 'i':
4602 request_dump (filedata, DISASS_DUMP);
4603 break;
4604 #endif
4605 case 'v':
4606 print_version (program_name);
4607 break;
4608 case 'V':
4609 do_version = TRUE;
4610 break;
4611 case 'W':
4612 do_wide = TRUE;
4613 break;
4614 default:
4615 /* xgettext:c-format */
4616 error (_("Invalid option '-%c'\n"), c);
4617 /* Fall through. */
4618 case '?':
4619 usage (stderr);
4620 }
4621 }
4622
4623 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4624 && !do_segments && !do_header && !do_dump && !do_version
4625 && !do_histogram && !do_debugging && !do_arch && !do_notes
4626 && !do_section_groups && !do_archive_index
4627 && !do_dyn_syms)
4628 usage (stderr);
4629 }
4630
4631 static const char *
4632 get_elf_class (unsigned int elf_class)
4633 {
4634 static char buff[32];
4635
4636 switch (elf_class)
4637 {
4638 case ELFCLASSNONE: return _("none");
4639 case ELFCLASS32: return "ELF32";
4640 case ELFCLASS64: return "ELF64";
4641 default:
4642 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4643 return buff;
4644 }
4645 }
4646
4647 static const char *
4648 get_data_encoding (unsigned int encoding)
4649 {
4650 static char buff[32];
4651
4652 switch (encoding)
4653 {
4654 case ELFDATANONE: return _("none");
4655 case ELFDATA2LSB: return _("2's complement, little endian");
4656 case ELFDATA2MSB: return _("2's complement, big endian");
4657 default:
4658 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4659 return buff;
4660 }
4661 }
4662
4663 /* Decode the data held in 'filedata->file_header'. */
4664
4665 static bfd_boolean
4666 process_file_header (Filedata * filedata)
4667 {
4668 Elf_Internal_Ehdr * header = & filedata->file_header;
4669
4670 if ( header->e_ident[EI_MAG0] != ELFMAG0
4671 || header->e_ident[EI_MAG1] != ELFMAG1
4672 || header->e_ident[EI_MAG2] != ELFMAG2
4673 || header->e_ident[EI_MAG3] != ELFMAG3)
4674 {
4675 error
4676 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4677 return FALSE;
4678 }
4679
4680 init_dwarf_regnames (header->e_machine);
4681
4682 if (do_header)
4683 {
4684 unsigned i;
4685
4686 printf (_("ELF Header:\n"));
4687 printf (_(" Magic: "));
4688 for (i = 0; i < EI_NIDENT; i++)
4689 printf ("%2.2x ", header->e_ident[i]);
4690 printf ("\n");
4691 printf (_(" Class: %s\n"),
4692 get_elf_class (header->e_ident[EI_CLASS]));
4693 printf (_(" Data: %s\n"),
4694 get_data_encoding (header->e_ident[EI_DATA]));
4695 printf (_(" Version: %d %s\n"),
4696 header->e_ident[EI_VERSION],
4697 (header->e_ident[EI_VERSION] == EV_CURRENT
4698 ? "(current)"
4699 : (header->e_ident[EI_VERSION] != EV_NONE
4700 ? _("<unknown: %lx>")
4701 : "")));
4702 printf (_(" OS/ABI: %s\n"),
4703 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4704 printf (_(" ABI Version: %d\n"),
4705 header->e_ident[EI_ABIVERSION]);
4706 printf (_(" Type: %s\n"),
4707 get_file_type (header->e_type));
4708 printf (_(" Machine: %s\n"),
4709 get_machine_name (header->e_machine));
4710 printf (_(" Version: 0x%lx\n"),
4711 (unsigned long) header->e_version);
4712
4713 printf (_(" Entry point address: "));
4714 print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4715 printf (_("\n Start of program headers: "));
4716 print_vma ((bfd_vma) header->e_phoff, DEC);
4717 printf (_(" (bytes into file)\n Start of section headers: "));
4718 print_vma ((bfd_vma) header->e_shoff, DEC);
4719 printf (_(" (bytes into file)\n"));
4720
4721 printf (_(" Flags: 0x%lx%s\n"),
4722 (unsigned long) header->e_flags,
4723 get_machine_flags (filedata, header->e_flags, header->e_machine));
4724 printf (_(" Size of this header: %ld (bytes)\n"),
4725 (long) header->e_ehsize);
4726 printf (_(" Size of program headers: %ld (bytes)\n"),
4727 (long) header->e_phentsize);
4728 printf (_(" Number of program headers: %ld"),
4729 (long) header->e_phnum);
4730 if (filedata->section_headers != NULL
4731 && header->e_phnum == PN_XNUM
4732 && filedata->section_headers[0].sh_info != 0)
4733 printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4734 putc ('\n', stdout);
4735 printf (_(" Size of section headers: %ld (bytes)\n"),
4736 (long) header->e_shentsize);
4737 printf (_(" Number of section headers: %ld"),
4738 (long) header->e_shnum);
4739 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4740 printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4741 putc ('\n', stdout);
4742 printf (_(" Section header string table index: %ld"),
4743 (long) header->e_shstrndx);
4744 if (filedata->section_headers != NULL
4745 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4746 printf (" (%u)", filedata->section_headers[0].sh_link);
4747 else if (header->e_shstrndx != SHN_UNDEF
4748 && header->e_shstrndx >= header->e_shnum)
4749 printf (_(" <corrupt: out of range>"));
4750 putc ('\n', stdout);
4751 }
4752
4753 if (filedata->section_headers != NULL)
4754 {
4755 if (header->e_phnum == PN_XNUM
4756 && filedata->section_headers[0].sh_info != 0)
4757 header->e_phnum = filedata->section_headers[0].sh_info;
4758 if (header->e_shnum == SHN_UNDEF)
4759 header->e_shnum = filedata->section_headers[0].sh_size;
4760 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4761 header->e_shstrndx = filedata->section_headers[0].sh_link;
4762 if (header->e_shstrndx >= header->e_shnum)
4763 header->e_shstrndx = SHN_UNDEF;
4764 free (filedata->section_headers);
4765 filedata->section_headers = NULL;
4766 }
4767
4768 return TRUE;
4769 }
4770
4771 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4772 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4773
4774 static bfd_boolean
4775 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4776 {
4777 Elf32_External_Phdr * phdrs;
4778 Elf32_External_Phdr * external;
4779 Elf_Internal_Phdr * internal;
4780 unsigned int i;
4781 unsigned int size = filedata->file_header.e_phentsize;
4782 unsigned int num = filedata->file_header.e_phnum;
4783
4784 /* PR binutils/17531: Cope with unexpected section header sizes. */
4785 if (size == 0 || num == 0)
4786 return FALSE;
4787 if (size < sizeof * phdrs)
4788 {
4789 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4790 return FALSE;
4791 }
4792 if (size > sizeof * phdrs)
4793 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4794
4795 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4796 size, num, _("program headers"));
4797 if (phdrs == NULL)
4798 return FALSE;
4799
4800 for (i = 0, internal = pheaders, external = phdrs;
4801 i < filedata->file_header.e_phnum;
4802 i++, internal++, external++)
4803 {
4804 internal->p_type = BYTE_GET (external->p_type);
4805 internal->p_offset = BYTE_GET (external->p_offset);
4806 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4807 internal->p_paddr = BYTE_GET (external->p_paddr);
4808 internal->p_filesz = BYTE_GET (external->p_filesz);
4809 internal->p_memsz = BYTE_GET (external->p_memsz);
4810 internal->p_flags = BYTE_GET (external->p_flags);
4811 internal->p_align = BYTE_GET (external->p_align);
4812 }
4813
4814 free (phdrs);
4815 return TRUE;
4816 }
4817
4818 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4819 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4820
4821 static bfd_boolean
4822 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4823 {
4824 Elf64_External_Phdr * phdrs;
4825 Elf64_External_Phdr * external;
4826 Elf_Internal_Phdr * internal;
4827 unsigned int i;
4828 unsigned int size = filedata->file_header.e_phentsize;
4829 unsigned int num = filedata->file_header.e_phnum;
4830
4831 /* PR binutils/17531: Cope with unexpected section header sizes. */
4832 if (size == 0 || num == 0)
4833 return FALSE;
4834 if (size < sizeof * phdrs)
4835 {
4836 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4837 return FALSE;
4838 }
4839 if (size > sizeof * phdrs)
4840 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4841
4842 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4843 size, num, _("program headers"));
4844 if (!phdrs)
4845 return FALSE;
4846
4847 for (i = 0, internal = pheaders, external = phdrs;
4848 i < filedata->file_header.e_phnum;
4849 i++, internal++, external++)
4850 {
4851 internal->p_type = BYTE_GET (external->p_type);
4852 internal->p_flags = BYTE_GET (external->p_flags);
4853 internal->p_offset = BYTE_GET (external->p_offset);
4854 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4855 internal->p_paddr = BYTE_GET (external->p_paddr);
4856 internal->p_filesz = BYTE_GET (external->p_filesz);
4857 internal->p_memsz = BYTE_GET (external->p_memsz);
4858 internal->p_align = BYTE_GET (external->p_align);
4859 }
4860
4861 free (phdrs);
4862 return TRUE;
4863 }
4864
4865 /* Returns TRUE if the program headers were read into `program_headers'. */
4866
4867 static bfd_boolean
4868 get_program_headers (Filedata * filedata)
4869 {
4870 Elf_Internal_Phdr * phdrs;
4871
4872 /* Check cache of prior read. */
4873 if (filedata->program_headers != NULL)
4874 return TRUE;
4875
4876 /* Be kind to memory checkers by looking for
4877 e_phnum values which we know must be invalid. */
4878 if (filedata->file_header.e_phnum
4879 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4880 >= filedata->file_size)
4881 {
4882 error (_("Too many program headers - %#x - the file is not that big\n"),
4883 filedata->file_header.e_phnum);
4884 return FALSE;
4885 }
4886
4887 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4888 sizeof (Elf_Internal_Phdr));
4889 if (phdrs == NULL)
4890 {
4891 error (_("Out of memory reading %u program headers\n"),
4892 filedata->file_header.e_phnum);
4893 return FALSE;
4894 }
4895
4896 if (is_32bit_elf
4897 ? get_32bit_program_headers (filedata, phdrs)
4898 : get_64bit_program_headers (filedata, phdrs))
4899 {
4900 filedata->program_headers = phdrs;
4901 return TRUE;
4902 }
4903
4904 free (phdrs);
4905 return FALSE;
4906 }
4907
4908 /* Returns TRUE if the program headers were loaded. */
4909
4910 static bfd_boolean
4911 process_program_headers (Filedata * filedata)
4912 {
4913 Elf_Internal_Phdr * segment;
4914 unsigned int i;
4915 Elf_Internal_Phdr * previous_load = NULL;
4916
4917 if (filedata->file_header.e_phnum == 0)
4918 {
4919 /* PR binutils/12467. */
4920 if (filedata->file_header.e_phoff != 0)
4921 {
4922 warn (_("possibly corrupt ELF header - it has a non-zero program"
4923 " header offset, but no program headers\n"));
4924 return FALSE;
4925 }
4926 else if (do_segments)
4927 printf (_("\nThere are no program headers in this file.\n"));
4928 return TRUE;
4929 }
4930
4931 if (do_segments && !do_header)
4932 {
4933 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4934 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
4935 printf (ngettext ("There is %d program header, starting at offset %s\n",
4936 "There are %d program headers, starting at offset %s\n",
4937 filedata->file_header.e_phnum),
4938 filedata->file_header.e_phnum,
4939 bfd_vmatoa ("u", filedata->file_header.e_phoff));
4940 }
4941
4942 if (! get_program_headers (filedata))
4943 return TRUE;
4944
4945 if (do_segments)
4946 {
4947 if (filedata->file_header.e_phnum > 1)
4948 printf (_("\nProgram Headers:\n"));
4949 else
4950 printf (_("\nProgram Headers:\n"));
4951
4952 if (is_32bit_elf)
4953 printf
4954 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4955 else if (do_wide)
4956 printf
4957 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4958 else
4959 {
4960 printf
4961 (_(" Type Offset VirtAddr PhysAddr\n"));
4962 printf
4963 (_(" FileSiz MemSiz Flags Align\n"));
4964 }
4965 }
4966
4967 dynamic_addr = 0;
4968 dynamic_size = 0;
4969
4970 for (i = 0, segment = filedata->program_headers;
4971 i < filedata->file_header.e_phnum;
4972 i++, segment++)
4973 {
4974 if (do_segments)
4975 {
4976 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
4977
4978 if (is_32bit_elf)
4979 {
4980 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4981 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4982 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4983 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4984 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4985 printf ("%c%c%c ",
4986 (segment->p_flags & PF_R ? 'R' : ' '),
4987 (segment->p_flags & PF_W ? 'W' : ' '),
4988 (segment->p_flags & PF_X ? 'E' : ' '));
4989 printf ("%#lx", (unsigned long) segment->p_align);
4990 }
4991 else if (do_wide)
4992 {
4993 if ((unsigned long) segment->p_offset == segment->p_offset)
4994 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4995 else
4996 {
4997 print_vma (segment->p_offset, FULL_HEX);
4998 putchar (' ');
4999 }
5000
5001 print_vma (segment->p_vaddr, FULL_HEX);
5002 putchar (' ');
5003 print_vma (segment->p_paddr, FULL_HEX);
5004 putchar (' ');
5005
5006 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5007 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5008 else
5009 {
5010 print_vma (segment->p_filesz, FULL_HEX);
5011 putchar (' ');
5012 }
5013
5014 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5015 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5016 else
5017 {
5018 print_vma (segment->p_memsz, FULL_HEX);
5019 }
5020
5021 printf (" %c%c%c ",
5022 (segment->p_flags & PF_R ? 'R' : ' '),
5023 (segment->p_flags & PF_W ? 'W' : ' '),
5024 (segment->p_flags & PF_X ? 'E' : ' '));
5025
5026 if ((unsigned long) segment->p_align == segment->p_align)
5027 printf ("%#lx", (unsigned long) segment->p_align);
5028 else
5029 {
5030 print_vma (segment->p_align, PREFIX_HEX);
5031 }
5032 }
5033 else
5034 {
5035 print_vma (segment->p_offset, FULL_HEX);
5036 putchar (' ');
5037 print_vma (segment->p_vaddr, FULL_HEX);
5038 putchar (' ');
5039 print_vma (segment->p_paddr, FULL_HEX);
5040 printf ("\n ");
5041 print_vma (segment->p_filesz, FULL_HEX);
5042 putchar (' ');
5043 print_vma (segment->p_memsz, FULL_HEX);
5044 printf (" %c%c%c ",
5045 (segment->p_flags & PF_R ? 'R' : ' '),
5046 (segment->p_flags & PF_W ? 'W' : ' '),
5047 (segment->p_flags & PF_X ? 'E' : ' '));
5048 print_vma (segment->p_align, PREFIX_HEX);
5049 }
5050
5051 putc ('\n', stdout);
5052 }
5053
5054 switch (segment->p_type)
5055 {
5056 case PT_LOAD:
5057 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5058 required by the ELF standard, several programs, including the Linux
5059 kernel, make use of non-ordered segments. */
5060 if (previous_load
5061 && previous_load->p_vaddr > segment->p_vaddr)
5062 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5063 #endif
5064 if (segment->p_memsz < segment->p_filesz)
5065 error (_("the segment's file size is larger than its memory size\n"));
5066 previous_load = segment;
5067 break;
5068
5069 case PT_PHDR:
5070 /* PR 20815 - Verify that the program header is loaded into memory. */
5071 if (i > 0 && previous_load != NULL)
5072 error (_("the PHDR segment must occur before any LOAD segment\n"));
5073 if (filedata->file_header.e_machine != EM_PARISC)
5074 {
5075 unsigned int j;
5076
5077 for (j = 1; j < filedata->file_header.e_phnum; j++)
5078 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5079 && (filedata->program_headers[j].p_vaddr
5080 + filedata->program_headers[j].p_memsz)
5081 >= (segment->p_vaddr + segment->p_filesz))
5082 break;
5083 if (j == filedata->file_header.e_phnum)
5084 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5085 }
5086 break;
5087
5088 case PT_DYNAMIC:
5089 if (dynamic_addr)
5090 error (_("more than one dynamic segment\n"));
5091
5092 /* By default, assume that the .dynamic section is the first
5093 section in the DYNAMIC segment. */
5094 dynamic_addr = segment->p_offset;
5095 dynamic_size = segment->p_filesz;
5096
5097 /* Try to locate the .dynamic section. If there is
5098 a section header table, we can easily locate it. */
5099 if (filedata->section_headers != NULL)
5100 {
5101 Elf_Internal_Shdr * sec;
5102
5103 sec = find_section (filedata, ".dynamic");
5104 if (sec == NULL || sec->sh_size == 0)
5105 {
5106 /* A corresponding .dynamic section is expected, but on
5107 IA-64/OpenVMS it is OK for it to be missing. */
5108 if (!is_ia64_vms (filedata))
5109 error (_("no .dynamic section in the dynamic segment\n"));
5110 break;
5111 }
5112
5113 if (sec->sh_type == SHT_NOBITS)
5114 {
5115 dynamic_size = 0;
5116 break;
5117 }
5118
5119 dynamic_addr = sec->sh_offset;
5120 dynamic_size = sec->sh_size;
5121
5122 if (dynamic_addr < segment->p_offset
5123 || dynamic_addr > segment->p_offset + segment->p_filesz)
5124 warn (_("the .dynamic section is not contained"
5125 " within the dynamic segment\n"));
5126 else if (dynamic_addr > segment->p_offset)
5127 warn (_("the .dynamic section is not the first section"
5128 " in the dynamic segment.\n"));
5129 }
5130
5131 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5132 segment. Check this after matching against the section headers
5133 so we don't warn on debuginfo file (which have NOBITS .dynamic
5134 sections). */
5135 if (dynamic_addr + dynamic_size >= filedata->file_size)
5136 {
5137 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5138 dynamic_addr = dynamic_size = 0;
5139 }
5140 break;
5141
5142 case PT_INTERP:
5143 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5144 SEEK_SET))
5145 error (_("Unable to find program interpreter name\n"));
5146 else
5147 {
5148 char fmt [32];
5149 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5150
5151 if (ret >= (int) sizeof (fmt) || ret < 0)
5152 error (_("Internal error: failed to create format string to display program interpreter\n"));
5153
5154 program_interpreter[0] = 0;
5155 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5156 error (_("Unable to read program interpreter name\n"));
5157
5158 if (do_segments)
5159 printf (_(" [Requesting program interpreter: %s]\n"),
5160 program_interpreter);
5161 }
5162 break;
5163 }
5164 }
5165
5166 if (do_segments
5167 && filedata->section_headers != NULL
5168 && filedata->string_table != NULL)
5169 {
5170 printf (_("\n Section to Segment mapping:\n"));
5171 printf (_(" Segment Sections...\n"));
5172
5173 for (i = 0; i < filedata->file_header.e_phnum; i++)
5174 {
5175 unsigned int j;
5176 Elf_Internal_Shdr * section;
5177
5178 segment = filedata->program_headers + i;
5179 section = filedata->section_headers + 1;
5180
5181 printf (" %2.2d ", i);
5182
5183 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5184 {
5185 if (!ELF_TBSS_SPECIAL (section, segment)
5186 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5187 printf ("%s ", printable_section_name (filedata, section));
5188 }
5189
5190 putc ('\n',stdout);
5191 }
5192 }
5193
5194 return TRUE;
5195 }
5196
5197
5198 /* Find the file offset corresponding to VMA by using the program headers. */
5199
5200 static long
5201 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5202 {
5203 Elf_Internal_Phdr * seg;
5204
5205 if (! get_program_headers (filedata))
5206 {
5207 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5208 return (long) vma;
5209 }
5210
5211 for (seg = filedata->program_headers;
5212 seg < filedata->program_headers + filedata->file_header.e_phnum;
5213 ++seg)
5214 {
5215 if (seg->p_type != PT_LOAD)
5216 continue;
5217
5218 if (vma >= (seg->p_vaddr & -seg->p_align)
5219 && vma + size <= seg->p_vaddr + seg->p_filesz)
5220 return vma - seg->p_vaddr + seg->p_offset;
5221 }
5222
5223 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5224 (unsigned long) vma);
5225 return (long) vma;
5226 }
5227
5228
5229 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5230 If PROBE is true, this is just a probe and we do not generate any error
5231 messages if the load fails. */
5232
5233 static bfd_boolean
5234 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5235 {
5236 Elf32_External_Shdr * shdrs;
5237 Elf_Internal_Shdr * internal;
5238 unsigned int i;
5239 unsigned int size = filedata->file_header.e_shentsize;
5240 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5241
5242 /* PR binutils/17531: Cope with unexpected section header sizes. */
5243 if (size == 0 || num == 0)
5244 return FALSE;
5245 if (size < sizeof * shdrs)
5246 {
5247 if (! probe)
5248 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5249 return FALSE;
5250 }
5251 if (!probe && size > sizeof * shdrs)
5252 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5253
5254 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5255 size, num,
5256 probe ? NULL : _("section headers"));
5257 if (shdrs == NULL)
5258 return FALSE;
5259
5260 free (filedata->section_headers);
5261 filedata->section_headers = (Elf_Internal_Shdr *)
5262 cmalloc (num, sizeof (Elf_Internal_Shdr));
5263 if (filedata->section_headers == NULL)
5264 {
5265 if (!probe)
5266 error (_("Out of memory reading %u section headers\n"), num);
5267 return FALSE;
5268 }
5269
5270 for (i = 0, internal = filedata->section_headers;
5271 i < num;
5272 i++, internal++)
5273 {
5274 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5275 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5276 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5277 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5278 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5279 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5280 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5281 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5282 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5283 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5284 if (!probe && internal->sh_link > num)
5285 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5286 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5287 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5288 }
5289
5290 free (shdrs);
5291 return TRUE;
5292 }
5293
5294 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5295
5296 static bfd_boolean
5297 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5298 {
5299 Elf64_External_Shdr * shdrs;
5300 Elf_Internal_Shdr * internal;
5301 unsigned int i;
5302 unsigned int size = filedata->file_header.e_shentsize;
5303 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5304
5305 /* PR binutils/17531: Cope with unexpected section header sizes. */
5306 if (size == 0 || num == 0)
5307 return FALSE;
5308
5309 if (size < sizeof * shdrs)
5310 {
5311 if (! probe)
5312 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5313 return FALSE;
5314 }
5315
5316 if (! probe && size > sizeof * shdrs)
5317 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5318
5319 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5320 filedata->file_header.e_shoff,
5321 size, num,
5322 probe ? NULL : _("section headers"));
5323 if (shdrs == NULL)
5324 return FALSE;
5325
5326 free (filedata->section_headers);
5327 filedata->section_headers = (Elf_Internal_Shdr *)
5328 cmalloc (num, sizeof (Elf_Internal_Shdr));
5329 if (filedata->section_headers == NULL)
5330 {
5331 if (! probe)
5332 error (_("Out of memory reading %u section headers\n"), num);
5333 return FALSE;
5334 }
5335
5336 for (i = 0, internal = filedata->section_headers;
5337 i < num;
5338 i++, internal++)
5339 {
5340 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5341 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5342 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5343 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5344 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5345 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5346 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5347 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5348 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5349 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5350 if (!probe && internal->sh_link > num)
5351 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5352 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5353 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5354 }
5355
5356 free (shdrs);
5357 return TRUE;
5358 }
5359
5360 static Elf_Internal_Sym *
5361 get_32bit_elf_symbols (Filedata * filedata,
5362 Elf_Internal_Shdr * section,
5363 unsigned long * num_syms_return)
5364 {
5365 unsigned long number = 0;
5366 Elf32_External_Sym * esyms = NULL;
5367 Elf_External_Sym_Shndx * shndx = NULL;
5368 Elf_Internal_Sym * isyms = NULL;
5369 Elf_Internal_Sym * psym;
5370 unsigned int j;
5371
5372 if (section->sh_size == 0)
5373 {
5374 if (num_syms_return != NULL)
5375 * num_syms_return = 0;
5376 return NULL;
5377 }
5378
5379 /* Run some sanity checks first. */
5380 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5381 {
5382 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5383 printable_section_name (filedata, section),
5384 (unsigned long) section->sh_entsize);
5385 goto exit_point;
5386 }
5387
5388 if (section->sh_size > filedata->file_size)
5389 {
5390 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5391 printable_section_name (filedata, section),
5392 (unsigned long) section->sh_size);
5393 goto exit_point;
5394 }
5395
5396 number = section->sh_size / section->sh_entsize;
5397
5398 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5399 {
5400 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5401 (unsigned long) section->sh_size,
5402 printable_section_name (filedata, section),
5403 (unsigned long) section->sh_entsize);
5404 goto exit_point;
5405 }
5406
5407 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5408 section->sh_size, _("symbols"));
5409 if (esyms == NULL)
5410 goto exit_point;
5411
5412 {
5413 elf_section_list * entry;
5414
5415 shndx = NULL;
5416 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5417 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5418 {
5419 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5420 entry->hdr->sh_offset,
5421 1, entry->hdr->sh_size,
5422 _("symbol table section indicies"));
5423 if (shndx == NULL)
5424 goto exit_point;
5425 /* PR17531: file: heap-buffer-overflow */
5426 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5427 {
5428 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5429 printable_section_name (filedata, entry->hdr),
5430 (unsigned long) entry->hdr->sh_size,
5431 (unsigned long) section->sh_size);
5432 goto exit_point;
5433 }
5434 }
5435 }
5436
5437 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5438
5439 if (isyms == NULL)
5440 {
5441 error (_("Out of memory reading %lu symbols\n"),
5442 (unsigned long) number);
5443 goto exit_point;
5444 }
5445
5446 for (j = 0, psym = isyms; j < number; j++, psym++)
5447 {
5448 psym->st_name = BYTE_GET (esyms[j].st_name);
5449 psym->st_value = BYTE_GET (esyms[j].st_value);
5450 psym->st_size = BYTE_GET (esyms[j].st_size);
5451 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5452 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5453 psym->st_shndx
5454 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5455 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5456 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5457 psym->st_info = BYTE_GET (esyms[j].st_info);
5458 psym->st_other = BYTE_GET (esyms[j].st_other);
5459 }
5460
5461 exit_point:
5462 if (shndx != NULL)
5463 free (shndx);
5464 if (esyms != NULL)
5465 free (esyms);
5466
5467 if (num_syms_return != NULL)
5468 * num_syms_return = isyms == NULL ? 0 : number;
5469
5470 return isyms;
5471 }
5472
5473 static Elf_Internal_Sym *
5474 get_64bit_elf_symbols (Filedata * filedata,
5475 Elf_Internal_Shdr * section,
5476 unsigned long * num_syms_return)
5477 {
5478 unsigned long number = 0;
5479 Elf64_External_Sym * esyms = NULL;
5480 Elf_External_Sym_Shndx * shndx = NULL;
5481 Elf_Internal_Sym * isyms = NULL;
5482 Elf_Internal_Sym * psym;
5483 unsigned int j;
5484
5485 if (section->sh_size == 0)
5486 {
5487 if (num_syms_return != NULL)
5488 * num_syms_return = 0;
5489 return NULL;
5490 }
5491
5492 /* Run some sanity checks first. */
5493 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5494 {
5495 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5496 printable_section_name (filedata, section),
5497 (unsigned long) section->sh_entsize);
5498 goto exit_point;
5499 }
5500
5501 if (section->sh_size > filedata->file_size)
5502 {
5503 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5504 printable_section_name (filedata, section),
5505 (unsigned long) section->sh_size);
5506 goto exit_point;
5507 }
5508
5509 number = section->sh_size / section->sh_entsize;
5510
5511 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5512 {
5513 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5514 (unsigned long) section->sh_size,
5515 printable_section_name (filedata, section),
5516 (unsigned long) section->sh_entsize);
5517 goto exit_point;
5518 }
5519
5520 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5521 section->sh_size, _("symbols"));
5522 if (!esyms)
5523 goto exit_point;
5524
5525 {
5526 elf_section_list * entry;
5527
5528 shndx = NULL;
5529 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5530 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5531 {
5532 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5533 entry->hdr->sh_offset,
5534 1, entry->hdr->sh_size,
5535 _("symbol table section indicies"));
5536 if (shndx == NULL)
5537 goto exit_point;
5538 /* PR17531: file: heap-buffer-overflow */
5539 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5540 {
5541 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5542 printable_section_name (filedata, entry->hdr),
5543 (unsigned long) entry->hdr->sh_size,
5544 (unsigned long) section->sh_size);
5545 goto exit_point;
5546 }
5547 }
5548 }
5549
5550 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5551
5552 if (isyms == NULL)
5553 {
5554 error (_("Out of memory reading %lu symbols\n"),
5555 (unsigned long) number);
5556 goto exit_point;
5557 }
5558
5559 for (j = 0, psym = isyms; j < number; j++, psym++)
5560 {
5561 psym->st_name = BYTE_GET (esyms[j].st_name);
5562 psym->st_info = BYTE_GET (esyms[j].st_info);
5563 psym->st_other = BYTE_GET (esyms[j].st_other);
5564 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5565
5566 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5567 psym->st_shndx
5568 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5569 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5570 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5571
5572 psym->st_value = BYTE_GET (esyms[j].st_value);
5573 psym->st_size = BYTE_GET (esyms[j].st_size);
5574 }
5575
5576 exit_point:
5577 if (shndx != NULL)
5578 free (shndx);
5579 if (esyms != NULL)
5580 free (esyms);
5581
5582 if (num_syms_return != NULL)
5583 * num_syms_return = isyms == NULL ? 0 : number;
5584
5585 return isyms;
5586 }
5587
5588 static const char *
5589 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5590 {
5591 static char buff[1024];
5592 char * p = buff;
5593 unsigned int field_size = is_32bit_elf ? 8 : 16;
5594 signed int sindex;
5595 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5596 bfd_vma os_flags = 0;
5597 bfd_vma proc_flags = 0;
5598 bfd_vma unknown_flags = 0;
5599 static const struct
5600 {
5601 const char * str;
5602 unsigned int len;
5603 }
5604 flags [] =
5605 {
5606 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5607 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5608 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5609 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5610 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5611 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5612 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5613 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5614 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5615 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5616 /* IA-64 specific. */
5617 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5618 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5619 /* IA-64 OpenVMS specific. */
5620 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5621 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5622 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5623 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5624 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5625 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5626 /* Generic. */
5627 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5628 /* SPARC specific. */
5629 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5630 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5631 /* ARM specific. */
5632 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5633 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5634 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5635 /* GNU specific. */
5636 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5637 /* VLE specific. */
5638 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5639 };
5640
5641 if (do_section_details)
5642 {
5643 sprintf (buff, "[%*.*lx]: ",
5644 field_size, field_size, (unsigned long) sh_flags);
5645 p += field_size + 4;
5646 }
5647
5648 while (sh_flags)
5649 {
5650 bfd_vma flag;
5651
5652 flag = sh_flags & - sh_flags;
5653 sh_flags &= ~ flag;
5654
5655 if (do_section_details)
5656 {
5657 switch (flag)
5658 {
5659 case SHF_WRITE: sindex = 0; break;
5660 case SHF_ALLOC: sindex = 1; break;
5661 case SHF_EXECINSTR: sindex = 2; break;
5662 case SHF_MERGE: sindex = 3; break;
5663 case SHF_STRINGS: sindex = 4; break;
5664 case SHF_INFO_LINK: sindex = 5; break;
5665 case SHF_LINK_ORDER: sindex = 6; break;
5666 case SHF_OS_NONCONFORMING: sindex = 7; break;
5667 case SHF_GROUP: sindex = 8; break;
5668 case SHF_TLS: sindex = 9; break;
5669 case SHF_EXCLUDE: sindex = 18; break;
5670 case SHF_COMPRESSED: sindex = 20; break;
5671 case SHF_GNU_MBIND: sindex = 24; break;
5672
5673 default:
5674 sindex = -1;
5675 switch (filedata->file_header.e_machine)
5676 {
5677 case EM_IA_64:
5678 if (flag == SHF_IA_64_SHORT)
5679 sindex = 10;
5680 else if (flag == SHF_IA_64_NORECOV)
5681 sindex = 11;
5682 #ifdef BFD64
5683 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5684 switch (flag)
5685 {
5686 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5687 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5688 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5689 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5690 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5691 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5692 default: break;
5693 }
5694 #endif
5695 break;
5696
5697 case EM_386:
5698 case EM_IAMCU:
5699 case EM_X86_64:
5700 case EM_L1OM:
5701 case EM_K1OM:
5702 case EM_OLD_SPARCV9:
5703 case EM_SPARC32PLUS:
5704 case EM_SPARCV9:
5705 case EM_SPARC:
5706 if (flag == SHF_ORDERED)
5707 sindex = 19;
5708 break;
5709
5710 case EM_ARM:
5711 switch (flag)
5712 {
5713 case SHF_ENTRYSECT: sindex = 21; break;
5714 case SHF_ARM_PURECODE: sindex = 22; break;
5715 case SHF_COMDEF: sindex = 23; break;
5716 default: break;
5717 }
5718 break;
5719 case EM_PPC:
5720 if (flag == SHF_PPC_VLE)
5721 sindex = 25;
5722 break;
5723
5724 default:
5725 break;
5726 }
5727 }
5728
5729 if (sindex != -1)
5730 {
5731 if (p != buff + field_size + 4)
5732 {
5733 if (size < (10 + 2))
5734 {
5735 warn (_("Internal error: not enough buffer room for section flag info"));
5736 return _("<unknown>");
5737 }
5738 size -= 2;
5739 *p++ = ',';
5740 *p++ = ' ';
5741 }
5742
5743 size -= flags [sindex].len;
5744 p = stpcpy (p, flags [sindex].str);
5745 }
5746 else if (flag & SHF_MASKOS)
5747 os_flags |= flag;
5748 else if (flag & SHF_MASKPROC)
5749 proc_flags |= flag;
5750 else
5751 unknown_flags |= flag;
5752 }
5753 else
5754 {
5755 switch (flag)
5756 {
5757 case SHF_WRITE: *p = 'W'; break;
5758 case SHF_ALLOC: *p = 'A'; break;
5759 case SHF_EXECINSTR: *p = 'X'; break;
5760 case SHF_MERGE: *p = 'M'; break;
5761 case SHF_STRINGS: *p = 'S'; break;
5762 case SHF_INFO_LINK: *p = 'I'; break;
5763 case SHF_LINK_ORDER: *p = 'L'; break;
5764 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5765 case SHF_GROUP: *p = 'G'; break;
5766 case SHF_TLS: *p = 'T'; break;
5767 case SHF_EXCLUDE: *p = 'E'; break;
5768 case SHF_COMPRESSED: *p = 'C'; break;
5769 case SHF_GNU_MBIND: *p = 'D'; break;
5770
5771 default:
5772 if ((filedata->file_header.e_machine == EM_X86_64
5773 || filedata->file_header.e_machine == EM_L1OM
5774 || filedata->file_header.e_machine == EM_K1OM)
5775 && flag == SHF_X86_64_LARGE)
5776 *p = 'l';
5777 else if (filedata->file_header.e_machine == EM_ARM
5778 && flag == SHF_ARM_PURECODE)
5779 *p = 'y';
5780 else if (filedata->file_header.e_machine == EM_PPC
5781 && flag == SHF_PPC_VLE)
5782 *p = 'v';
5783 else if (flag & SHF_MASKOS)
5784 {
5785 *p = 'o';
5786 sh_flags &= ~ SHF_MASKOS;
5787 }
5788 else if (flag & SHF_MASKPROC)
5789 {
5790 *p = 'p';
5791 sh_flags &= ~ SHF_MASKPROC;
5792 }
5793 else
5794 *p = 'x';
5795 break;
5796 }
5797 p++;
5798 }
5799 }
5800
5801 if (do_section_details)
5802 {
5803 if (os_flags)
5804 {
5805 size -= 5 + field_size;
5806 if (p != buff + field_size + 4)
5807 {
5808 if (size < (2 + 1))
5809 {
5810 warn (_("Internal error: not enough buffer room for section flag info"));
5811 return _("<unknown>");
5812 }
5813 size -= 2;
5814 *p++ = ',';
5815 *p++ = ' ';
5816 }
5817 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5818 (unsigned long) os_flags);
5819 p += 5 + field_size;
5820 }
5821 if (proc_flags)
5822 {
5823 size -= 7 + field_size;
5824 if (p != buff + field_size + 4)
5825 {
5826 if (size < (2 + 1))
5827 {
5828 warn (_("Internal error: not enough buffer room for section flag info"));
5829 return _("<unknown>");
5830 }
5831 size -= 2;
5832 *p++ = ',';
5833 *p++ = ' ';
5834 }
5835 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5836 (unsigned long) proc_flags);
5837 p += 7 + field_size;
5838 }
5839 if (unknown_flags)
5840 {
5841 size -= 10 + field_size;
5842 if (p != buff + field_size + 4)
5843 {
5844 if (size < (2 + 1))
5845 {
5846 warn (_("Internal error: not enough buffer room for section flag info"));
5847 return _("<unknown>");
5848 }
5849 size -= 2;
5850 *p++ = ',';
5851 *p++ = ' ';
5852 }
5853 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5854 (unsigned long) unknown_flags);
5855 p += 10 + field_size;
5856 }
5857 }
5858
5859 *p = '\0';
5860 return buff;
5861 }
5862
5863 static unsigned int
5864 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5865 {
5866 if (is_32bit_elf)
5867 {
5868 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5869
5870 if (size < sizeof (* echdr))
5871 {
5872 error (_("Compressed section is too small even for a compression header\n"));
5873 return 0;
5874 }
5875
5876 chdr->ch_type = BYTE_GET (echdr->ch_type);
5877 chdr->ch_size = BYTE_GET (echdr->ch_size);
5878 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5879 return sizeof (*echdr);
5880 }
5881 else
5882 {
5883 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5884
5885 if (size < sizeof (* echdr))
5886 {
5887 error (_("Compressed section is too small even for a compression header\n"));
5888 return 0;
5889 }
5890
5891 chdr->ch_type = BYTE_GET (echdr->ch_type);
5892 chdr->ch_size = BYTE_GET (echdr->ch_size);
5893 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5894 return sizeof (*echdr);
5895 }
5896 }
5897
5898 static bfd_boolean
5899 process_section_headers (Filedata * filedata)
5900 {
5901 Elf_Internal_Shdr * section;
5902 unsigned int i;
5903
5904 filedata->section_headers = NULL;
5905
5906 if (filedata->file_header.e_shnum == 0)
5907 {
5908 /* PR binutils/12467. */
5909 if (filedata->file_header.e_shoff != 0)
5910 {
5911 warn (_("possibly corrupt ELF file header - it has a non-zero"
5912 " section header offset, but no section headers\n"));
5913 return FALSE;
5914 }
5915 else if (do_sections)
5916 printf (_("\nThere are no sections in this file.\n"));
5917
5918 return TRUE;
5919 }
5920
5921 if (do_sections && !do_header)
5922 printf (ngettext ("There is %d section header, "
5923 "starting at offset 0x%lx:\n",
5924 "There are %d section headers, "
5925 "starting at offset 0x%lx:\n",
5926 filedata->file_header.e_shnum),
5927 filedata->file_header.e_shnum,
5928 (unsigned long) filedata->file_header.e_shoff);
5929
5930 if (is_32bit_elf)
5931 {
5932 if (! get_32bit_section_headers (filedata, FALSE))
5933 return FALSE;
5934 }
5935 else
5936 {
5937 if (! get_64bit_section_headers (filedata, FALSE))
5938 return FALSE;
5939 }
5940
5941 /* Read in the string table, so that we have names to display. */
5942 if (filedata->file_header.e_shstrndx != SHN_UNDEF
5943 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
5944 {
5945 section = filedata->section_headers + filedata->file_header.e_shstrndx;
5946
5947 if (section->sh_size != 0)
5948 {
5949 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
5950 1, section->sh_size,
5951 _("string table"));
5952
5953 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
5954 }
5955 }
5956
5957 /* Scan the sections for the dynamic symbol table
5958 and dynamic string table and debug sections. */
5959 dynamic_symbols = NULL;
5960 dynamic_strings = NULL;
5961 dynamic_syminfo = NULL;
5962 symtab_shndx_list = NULL;
5963
5964 eh_addr_size = is_32bit_elf ? 4 : 8;
5965 switch (filedata->file_header.e_machine)
5966 {
5967 case EM_MIPS:
5968 case EM_MIPS_RS3_LE:
5969 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5970 FDE addresses. However, the ABI also has a semi-official ILP32
5971 variant for which the normal FDE address size rules apply.
5972
5973 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5974 section, where XX is the size of longs in bits. Unfortunately,
5975 earlier compilers provided no way of distinguishing ILP32 objects
5976 from LP64 objects, so if there's any doubt, we should assume that
5977 the official LP64 form is being used. */
5978 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5979 && find_section (filedata, ".gcc_compiled_long32") == NULL)
5980 eh_addr_size = 8;
5981 break;
5982
5983 case EM_H8_300:
5984 case EM_H8_300H:
5985 switch (filedata->file_header.e_flags & EF_H8_MACH)
5986 {
5987 case E_H8_MACH_H8300:
5988 case E_H8_MACH_H8300HN:
5989 case E_H8_MACH_H8300SN:
5990 case E_H8_MACH_H8300SXN:
5991 eh_addr_size = 2;
5992 break;
5993 case E_H8_MACH_H8300H:
5994 case E_H8_MACH_H8300S:
5995 case E_H8_MACH_H8300SX:
5996 eh_addr_size = 4;
5997 break;
5998 }
5999 break;
6000
6001 case EM_M32C_OLD:
6002 case EM_M32C:
6003 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6004 {
6005 case EF_M32C_CPU_M16C:
6006 eh_addr_size = 2;
6007 break;
6008 }
6009 break;
6010 }
6011
6012 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6013 do \
6014 { \
6015 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6016 if (section->sh_entsize != expected_entsize) \
6017 { \
6018 char buf[40]; \
6019 sprintf_vma (buf, section->sh_entsize); \
6020 /* Note: coded this way so that there is a single string for \
6021 translation. */ \
6022 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6023 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6024 (unsigned) expected_entsize); \
6025 section->sh_entsize = expected_entsize; \
6026 } \
6027 } \
6028 while (0)
6029
6030 #define CHECK_ENTSIZE(section, i, type) \
6031 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6032 sizeof (Elf64_External_##type))
6033
6034 for (i = 0, section = filedata->section_headers;
6035 i < filedata->file_header.e_shnum;
6036 i++, section++)
6037 {
6038 char * name = SECTION_NAME (section);
6039
6040 if (section->sh_type == SHT_DYNSYM)
6041 {
6042 if (dynamic_symbols != NULL)
6043 {
6044 error (_("File contains multiple dynamic symbol tables\n"));
6045 continue;
6046 }
6047
6048 CHECK_ENTSIZE (section, i, Sym);
6049 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6050 }
6051 else if (section->sh_type == SHT_STRTAB
6052 && streq (name, ".dynstr"))
6053 {
6054 if (dynamic_strings != NULL)
6055 {
6056 error (_("File contains multiple dynamic string tables\n"));
6057 continue;
6058 }
6059
6060 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6061 1, section->sh_size,
6062 _("dynamic strings"));
6063 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6064 }
6065 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6066 {
6067 elf_section_list * entry = xmalloc (sizeof * entry);
6068
6069 entry->hdr = section;
6070 entry->next = symtab_shndx_list;
6071 symtab_shndx_list = entry;
6072 }
6073 else if (section->sh_type == SHT_SYMTAB)
6074 CHECK_ENTSIZE (section, i, Sym);
6075 else if (section->sh_type == SHT_GROUP)
6076 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6077 else if (section->sh_type == SHT_REL)
6078 CHECK_ENTSIZE (section, i, Rel);
6079 else if (section->sh_type == SHT_RELA)
6080 CHECK_ENTSIZE (section, i, Rela);
6081 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6082 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6083 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6084 || do_debug_str || do_debug_loc || do_debug_ranges
6085 || do_debug_addr || do_debug_cu_index || do_debug_links)
6086 && (const_strneq (name, ".debug_")
6087 || const_strneq (name, ".zdebug_")))
6088 {
6089 if (name[1] == 'z')
6090 name += sizeof (".zdebug_") - 1;
6091 else
6092 name += sizeof (".debug_") - 1;
6093
6094 if (do_debugging
6095 || (do_debug_info && const_strneq (name, "info"))
6096 || (do_debug_info && const_strneq (name, "types"))
6097 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6098 || (do_debug_lines && strcmp (name, "line") == 0)
6099 || (do_debug_lines && const_strneq (name, "line."))
6100 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6101 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6102 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6103 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6104 || (do_debug_aranges && const_strneq (name, "aranges"))
6105 || (do_debug_ranges && const_strneq (name, "ranges"))
6106 || (do_debug_ranges && const_strneq (name, "rnglists"))
6107 || (do_debug_frames && const_strneq (name, "frame"))
6108 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6109 || (do_debug_macinfo && const_strneq (name, "macro"))
6110 || (do_debug_str && const_strneq (name, "str"))
6111 || (do_debug_loc && const_strneq (name, "loc"))
6112 || (do_debug_loc && const_strneq (name, "loclists"))
6113 || (do_debug_addr && const_strneq (name, "addr"))
6114 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6115 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6116 )
6117 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6118 }
6119 /* Linkonce section to be combined with .debug_info at link time. */
6120 else if ((do_debugging || do_debug_info)
6121 && const_strneq (name, ".gnu.linkonce.wi."))
6122 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6123 else if (do_debug_frames && streq (name, ".eh_frame"))
6124 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6125 else if (do_gdb_index && (streq (name, ".gdb_index")
6126 || streq (name, ".debug_names")))
6127 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6128 /* Trace sections for Itanium VMS. */
6129 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6130 || do_trace_aranges)
6131 && const_strneq (name, ".trace_"))
6132 {
6133 name += sizeof (".trace_") - 1;
6134
6135 if (do_debugging
6136 || (do_trace_info && streq (name, "info"))
6137 || (do_trace_abbrevs && streq (name, "abbrev"))
6138 || (do_trace_aranges && streq (name, "aranges"))
6139 )
6140 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6141 }
6142 else if ((do_debugging || do_debug_links)
6143 && (const_strneq (name, ".gnu_debuglink")
6144 || const_strneq (name, ".gnu_debugaltlink")))
6145 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6146 }
6147
6148 if (! do_sections)
6149 return TRUE;
6150
6151 if (filedata->file_header.e_shnum > 1)
6152 printf (_("\nSection Headers:\n"));
6153 else
6154 printf (_("\nSection Header:\n"));
6155
6156 if (is_32bit_elf)
6157 {
6158 if (do_section_details)
6159 {
6160 printf (_(" [Nr] Name\n"));
6161 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6162 }
6163 else
6164 printf
6165 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6166 }
6167 else if (do_wide)
6168 {
6169 if (do_section_details)
6170 {
6171 printf (_(" [Nr] Name\n"));
6172 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6173 }
6174 else
6175 printf
6176 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6177 }
6178 else
6179 {
6180 if (do_section_details)
6181 {
6182 printf (_(" [Nr] Name\n"));
6183 printf (_(" Type Address Offset Link\n"));
6184 printf (_(" Size EntSize Info Align\n"));
6185 }
6186 else
6187 {
6188 printf (_(" [Nr] Name Type Address Offset\n"));
6189 printf (_(" Size EntSize Flags Link Info Align\n"));
6190 }
6191 }
6192
6193 if (do_section_details)
6194 printf (_(" Flags\n"));
6195
6196 for (i = 0, section = filedata->section_headers;
6197 i < filedata->file_header.e_shnum;
6198 i++, section++)
6199 {
6200 /* Run some sanity checks on the section header. */
6201
6202 /* Check the sh_link field. */
6203 switch (section->sh_type)
6204 {
6205 case SHT_SYMTAB_SHNDX:
6206 case SHT_GROUP:
6207 case SHT_HASH:
6208 case SHT_GNU_HASH:
6209 case SHT_GNU_versym:
6210 case SHT_REL:
6211 case SHT_RELA:
6212 if (section->sh_link < 1
6213 || section->sh_link >= filedata->file_header.e_shnum
6214 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6215 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6216 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6217 i, section->sh_link);
6218 break;
6219
6220 case SHT_DYNAMIC:
6221 case SHT_SYMTAB:
6222 case SHT_DYNSYM:
6223 case SHT_GNU_verneed:
6224 case SHT_GNU_verdef:
6225 case SHT_GNU_LIBLIST:
6226 if (section->sh_link < 1
6227 || section->sh_link >= filedata->file_header.e_shnum
6228 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6229 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6230 i, section->sh_link);
6231 break;
6232
6233 case SHT_INIT_ARRAY:
6234 case SHT_FINI_ARRAY:
6235 case SHT_PREINIT_ARRAY:
6236 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6237 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6238 i, section->sh_link);
6239 break;
6240
6241 default:
6242 /* FIXME: Add support for target specific section types. */
6243 #if 0 /* Currently we do not check other section types as there are too
6244 many special cases. Stab sections for example have a type
6245 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6246 section. */
6247 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6248 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6249 i, section->sh_link);
6250 #endif
6251 break;
6252 }
6253
6254 /* Check the sh_info field. */
6255 switch (section->sh_type)
6256 {
6257 case SHT_REL:
6258 case SHT_RELA:
6259 if (section->sh_info < 1
6260 || section->sh_info >= filedata->file_header.e_shnum
6261 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6262 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6263 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6264 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6265 /* FIXME: Are other section types valid ? */
6266 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6267 {
6268 if (section->sh_info == 0
6269 && (filedata->file_header.e_type == ET_EXEC
6270 || filedata->file_header.e_type == ET_DYN
6271 /* These next two tests may be redundant, but
6272 they have been left in for paranoia's sake. */
6273 || streq (SECTION_NAME (section), ".rel.dyn")
6274 || streq (SECTION_NAME (section), ".rela.dyn")))
6275 /* Dynamic relocations apply to segments, not sections, so
6276 they do not need an sh_info value. */
6277 ;
6278 else
6279 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6280 i, section->sh_info);
6281 }
6282 break;
6283
6284 case SHT_DYNAMIC:
6285 case SHT_HASH:
6286 case SHT_SYMTAB_SHNDX:
6287 case SHT_INIT_ARRAY:
6288 case SHT_FINI_ARRAY:
6289 case SHT_PREINIT_ARRAY:
6290 if (section->sh_info != 0)
6291 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6292 i, section->sh_info);
6293 break;
6294
6295 case SHT_GROUP:
6296 case SHT_SYMTAB:
6297 case SHT_DYNSYM:
6298 /* A symbol index - we assume that it is valid. */
6299 break;
6300
6301 default:
6302 /* FIXME: Add support for target specific section types. */
6303 if (section->sh_type == SHT_NOBITS)
6304 /* NOBITS section headers with non-zero sh_info fields can be
6305 created when a binary is stripped of everything but its debug
6306 information. The stripped sections have their headers
6307 preserved but their types set to SHT_NOBITS. So do not check
6308 this type of section. */
6309 ;
6310 else if (section->sh_flags & SHF_INFO_LINK)
6311 {
6312 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6313 warn (_("[%2u]: Expected link to another section in info field"), i);
6314 }
6315 else if (section->sh_type < SHT_LOOS
6316 && (section->sh_flags & SHF_GNU_MBIND) == 0
6317 && section->sh_info != 0)
6318 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6319 i, section->sh_info);
6320 break;
6321 }
6322
6323 /* Check the sh_size field. */
6324 if (section->sh_size > filedata->file_size
6325 && section->sh_type != SHT_NOBITS
6326 && section->sh_type != SHT_NULL
6327 && section->sh_type < SHT_LOOS)
6328 warn (_("Size of section %u is larger than the entire file!\n"), i);
6329
6330 printf (" [%2u] ", i);
6331 if (do_section_details)
6332 printf ("%s\n ", printable_section_name (filedata, section));
6333 else
6334 print_symbol (-17, SECTION_NAME (section));
6335
6336 printf (do_wide ? " %-15s " : " %-15.15s ",
6337 get_section_type_name (filedata, section->sh_type));
6338
6339 if (is_32bit_elf)
6340 {
6341 const char * link_too_big = NULL;
6342
6343 print_vma (section->sh_addr, LONG_HEX);
6344
6345 printf ( " %6.6lx %6.6lx %2.2lx",
6346 (unsigned long) section->sh_offset,
6347 (unsigned long) section->sh_size,
6348 (unsigned long) section->sh_entsize);
6349
6350 if (do_section_details)
6351 fputs (" ", stdout);
6352 else
6353 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6354
6355 if (section->sh_link >= filedata->file_header.e_shnum)
6356 {
6357 link_too_big = "";
6358 /* The sh_link value is out of range. Normally this indicates
6359 an error but it can have special values in Solaris binaries. */
6360 switch (filedata->file_header.e_machine)
6361 {
6362 case EM_386:
6363 case EM_IAMCU:
6364 case EM_X86_64:
6365 case EM_L1OM:
6366 case EM_K1OM:
6367 case EM_OLD_SPARCV9:
6368 case EM_SPARC32PLUS:
6369 case EM_SPARCV9:
6370 case EM_SPARC:
6371 if (section->sh_link == (SHN_BEFORE & 0xffff))
6372 link_too_big = "BEFORE";
6373 else if (section->sh_link == (SHN_AFTER & 0xffff))
6374 link_too_big = "AFTER";
6375 break;
6376 default:
6377 break;
6378 }
6379 }
6380
6381 if (do_section_details)
6382 {
6383 if (link_too_big != NULL && * link_too_big)
6384 printf ("<%s> ", link_too_big);
6385 else
6386 printf ("%2u ", section->sh_link);
6387 printf ("%3u %2lu\n", section->sh_info,
6388 (unsigned long) section->sh_addralign);
6389 }
6390 else
6391 printf ("%2u %3u %2lu\n",
6392 section->sh_link,
6393 section->sh_info,
6394 (unsigned long) section->sh_addralign);
6395
6396 if (link_too_big && ! * link_too_big)
6397 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6398 i, section->sh_link);
6399 }
6400 else if (do_wide)
6401 {
6402 print_vma (section->sh_addr, LONG_HEX);
6403
6404 if ((long) section->sh_offset == section->sh_offset)
6405 printf (" %6.6lx", (unsigned long) section->sh_offset);
6406 else
6407 {
6408 putchar (' ');
6409 print_vma (section->sh_offset, LONG_HEX);
6410 }
6411
6412 if ((unsigned long) section->sh_size == section->sh_size)
6413 printf (" %6.6lx", (unsigned long) section->sh_size);
6414 else
6415 {
6416 putchar (' ');
6417 print_vma (section->sh_size, LONG_HEX);
6418 }
6419
6420 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6421 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6422 else
6423 {
6424 putchar (' ');
6425 print_vma (section->sh_entsize, LONG_HEX);
6426 }
6427
6428 if (do_section_details)
6429 fputs (" ", stdout);
6430 else
6431 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6432
6433 printf ("%2u %3u ", section->sh_link, section->sh_info);
6434
6435 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6436 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6437 else
6438 {
6439 print_vma (section->sh_addralign, DEC);
6440 putchar ('\n');
6441 }
6442 }
6443 else if (do_section_details)
6444 {
6445 printf (" %-15.15s ",
6446 get_section_type_name (filedata, section->sh_type));
6447 print_vma (section->sh_addr, LONG_HEX);
6448 if ((long) section->sh_offset == section->sh_offset)
6449 printf (" %16.16lx", (unsigned long) section->sh_offset);
6450 else
6451 {
6452 printf (" ");
6453 print_vma (section->sh_offset, LONG_HEX);
6454 }
6455 printf (" %u\n ", section->sh_link);
6456 print_vma (section->sh_size, LONG_HEX);
6457 putchar (' ');
6458 print_vma (section->sh_entsize, LONG_HEX);
6459
6460 printf (" %-16u %lu\n",
6461 section->sh_info,
6462 (unsigned long) section->sh_addralign);
6463 }
6464 else
6465 {
6466 putchar (' ');
6467 print_vma (section->sh_addr, LONG_HEX);
6468 if ((long) section->sh_offset == section->sh_offset)
6469 printf (" %8.8lx", (unsigned long) section->sh_offset);
6470 else
6471 {
6472 printf (" ");
6473 print_vma (section->sh_offset, LONG_HEX);
6474 }
6475 printf ("\n ");
6476 print_vma (section->sh_size, LONG_HEX);
6477 printf (" ");
6478 print_vma (section->sh_entsize, LONG_HEX);
6479
6480 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6481
6482 printf (" %2u %3u %lu\n",
6483 section->sh_link,
6484 section->sh_info,
6485 (unsigned long) section->sh_addralign);
6486 }
6487
6488 if (do_section_details)
6489 {
6490 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6491 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6492 {
6493 /* Minimum section size is 12 bytes for 32-bit compression
6494 header + 12 bytes for compressed data header. */
6495 unsigned char buf[24];
6496
6497 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6498 if (get_data (&buf, filedata, section->sh_offset, 1,
6499 sizeof (buf), _("compression header")))
6500 {
6501 Elf_Internal_Chdr chdr;
6502
6503 (void) get_compression_header (&chdr, buf, sizeof (buf));
6504
6505 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6506 printf (" ZLIB, ");
6507 else
6508 printf (_(" [<unknown>: 0x%x], "),
6509 chdr.ch_type);
6510 print_vma (chdr.ch_size, LONG_HEX);
6511 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6512 }
6513 }
6514 }
6515 }
6516
6517 if (!do_section_details)
6518 {
6519 /* The ordering of the letters shown here matches the ordering of the
6520 corresponding SHF_xxx values, and hence the order in which these
6521 letters will be displayed to the user. */
6522 printf (_("Key to Flags:\n\
6523 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6524 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6525 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6526 if (filedata->file_header.e_machine == EM_X86_64
6527 || filedata->file_header.e_machine == EM_L1OM
6528 || filedata->file_header.e_machine == EM_K1OM)
6529 printf (_("l (large), "));
6530 else if (filedata->file_header.e_machine == EM_ARM)
6531 printf (_("y (purecode), "));
6532 else if (filedata->file_header.e_machine == EM_PPC)
6533 printf (_("v (VLE), "));
6534 printf ("p (processor specific)\n");
6535 }
6536
6537 return TRUE;
6538 }
6539
6540 static const char *
6541 get_group_flags (unsigned int flags)
6542 {
6543 static char buff[128];
6544
6545 if (flags == 0)
6546 return "";
6547 else if (flags == GRP_COMDAT)
6548 return "COMDAT ";
6549
6550 snprintf (buff, 14, _("[0x%x: "), flags);
6551
6552 flags &= ~ GRP_COMDAT;
6553 if (flags & GRP_MASKOS)
6554 {
6555 strcat (buff, "<OS specific>");
6556 flags &= ~ GRP_MASKOS;
6557 }
6558
6559 if (flags & GRP_MASKPROC)
6560 {
6561 strcat (buff, "<PROC specific>");
6562 flags &= ~ GRP_MASKPROC;
6563 }
6564
6565 if (flags)
6566 strcat (buff, "<unknown>");
6567
6568 strcat (buff, "]");
6569 return buff;
6570 }
6571
6572 static bfd_boolean
6573 process_section_groups (Filedata * filedata)
6574 {
6575 Elf_Internal_Shdr * section;
6576 unsigned int i;
6577 struct group * group;
6578 Elf_Internal_Shdr * symtab_sec;
6579 Elf_Internal_Shdr * strtab_sec;
6580 Elf_Internal_Sym * symtab;
6581 unsigned long num_syms;
6582 char * strtab;
6583 size_t strtab_size;
6584
6585 /* Don't process section groups unless needed. */
6586 if (!do_unwind && !do_section_groups)
6587 return TRUE;
6588
6589 if (filedata->file_header.e_shnum == 0)
6590 {
6591 if (do_section_groups)
6592 printf (_("\nThere are no sections to group in this file.\n"));
6593
6594 return TRUE;
6595 }
6596
6597 if (filedata->section_headers == NULL)
6598 {
6599 error (_("Section headers are not available!\n"));
6600 /* PR 13622: This can happen with a corrupt ELF header. */
6601 return FALSE;
6602 }
6603
6604 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6605 sizeof (struct group *));
6606
6607 if (section_headers_groups == NULL)
6608 {
6609 error (_("Out of memory reading %u section group headers\n"),
6610 filedata->file_header.e_shnum);
6611 return FALSE;
6612 }
6613
6614 /* Scan the sections for the group section. */
6615 group_count = 0;
6616 for (i = 0, section = filedata->section_headers;
6617 i < filedata->file_header.e_shnum;
6618 i++, section++)
6619 if (section->sh_type == SHT_GROUP)
6620 group_count++;
6621
6622 if (group_count == 0)
6623 {
6624 if (do_section_groups)
6625 printf (_("\nThere are no section groups in this file.\n"));
6626
6627 return TRUE;
6628 }
6629
6630 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6631
6632 if (section_groups == NULL)
6633 {
6634 error (_("Out of memory reading %lu groups\n"),
6635 (unsigned long) group_count);
6636 return FALSE;
6637 }
6638
6639 symtab_sec = NULL;
6640 strtab_sec = NULL;
6641 symtab = NULL;
6642 num_syms = 0;
6643 strtab = NULL;
6644 strtab_size = 0;
6645 for (i = 0, section = filedata->section_headers, group = section_groups;
6646 i < filedata->file_header.e_shnum;
6647 i++, section++)
6648 {
6649 if (section->sh_type == SHT_GROUP)
6650 {
6651 const char * name = printable_section_name (filedata, section);
6652 const char * group_name;
6653 unsigned char * start;
6654 unsigned char * indices;
6655 unsigned int entry, j, size;
6656 Elf_Internal_Shdr * sec;
6657 Elf_Internal_Sym * sym;
6658
6659 /* Get the symbol table. */
6660 if (section->sh_link >= filedata->file_header.e_shnum
6661 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6662 != SHT_SYMTAB))
6663 {
6664 error (_("Bad sh_link in group section `%s'\n"), name);
6665 continue;
6666 }
6667
6668 if (symtab_sec != sec)
6669 {
6670 symtab_sec = sec;
6671 if (symtab)
6672 free (symtab);
6673 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6674 }
6675
6676 if (symtab == NULL)
6677 {
6678 error (_("Corrupt header in group section `%s'\n"), name);
6679 continue;
6680 }
6681
6682 if (section->sh_info >= num_syms)
6683 {
6684 error (_("Bad sh_info in group section `%s'\n"), name);
6685 continue;
6686 }
6687
6688 sym = symtab + section->sh_info;
6689
6690 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6691 {
6692 if (sym->st_shndx == 0
6693 || sym->st_shndx >= filedata->file_header.e_shnum)
6694 {
6695 error (_("Bad sh_info in group section `%s'\n"), name);
6696 continue;
6697 }
6698
6699 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6700 strtab_sec = NULL;
6701 if (strtab)
6702 free (strtab);
6703 strtab = NULL;
6704 strtab_size = 0;
6705 }
6706 else
6707 {
6708 /* Get the string table. */
6709 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6710 {
6711 strtab_sec = NULL;
6712 if (strtab)
6713 free (strtab);
6714 strtab = NULL;
6715 strtab_size = 0;
6716 }
6717 else if (strtab_sec
6718 != (sec = filedata->section_headers + symtab_sec->sh_link))
6719 {
6720 strtab_sec = sec;
6721 if (strtab)
6722 free (strtab);
6723
6724 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6725 1, strtab_sec->sh_size,
6726 _("string table"));
6727 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6728 }
6729 group_name = sym->st_name < strtab_size
6730 ? strtab + sym->st_name : _("<corrupt>");
6731 }
6732
6733 /* PR 17531: file: loop. */
6734 if (section->sh_entsize > section->sh_size)
6735 {
6736 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6737 printable_section_name (filedata, section),
6738 (unsigned long) section->sh_entsize,
6739 (unsigned long) section->sh_size);
6740 break;
6741 }
6742
6743 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6744 1, section->sh_size,
6745 _("section data"));
6746 if (start == NULL)
6747 continue;
6748
6749 indices = start;
6750 size = (section->sh_size / section->sh_entsize) - 1;
6751 entry = byte_get (indices, 4);
6752 indices += 4;
6753
6754 if (do_section_groups)
6755 {
6756 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6757 get_group_flags (entry), i, name, group_name, size);
6758
6759 printf (_(" [Index] Name\n"));
6760 }
6761
6762 group->group_index = i;
6763
6764 for (j = 0; j < size; j++)
6765 {
6766 struct group_list * g;
6767
6768 entry = byte_get (indices, 4);
6769 indices += 4;
6770
6771 if (entry >= filedata->file_header.e_shnum)
6772 {
6773 static unsigned num_group_errors = 0;
6774
6775 if (num_group_errors ++ < 10)
6776 {
6777 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6778 entry, i, filedata->file_header.e_shnum - 1);
6779 if (num_group_errors == 10)
6780 warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6781 }
6782 continue;
6783 }
6784
6785 if (section_headers_groups [entry] != NULL)
6786 {
6787 if (entry)
6788 {
6789 static unsigned num_errs = 0;
6790
6791 if (num_errs ++ < 10)
6792 {
6793 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6794 entry, i,
6795 section_headers_groups [entry]->group_index);
6796 if (num_errs == 10)
6797 warn (_("Further error messages about already contained group sections suppressed\n"));
6798 }
6799 continue;
6800 }
6801 else
6802 {
6803 /* Intel C/C++ compiler may put section 0 in a
6804 section group. We just warn it the first time
6805 and ignore it afterwards. */
6806 static bfd_boolean warned = FALSE;
6807 if (!warned)
6808 {
6809 error (_("section 0 in group section [%5u]\n"),
6810 section_headers_groups [entry]->group_index);
6811 warned = TRUE;
6812 }
6813 }
6814 }
6815
6816 section_headers_groups [entry] = group;
6817
6818 if (do_section_groups)
6819 {
6820 sec = filedata->section_headers + entry;
6821 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6822 }
6823
6824 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6825 g->section_index = entry;
6826 g->next = group->root;
6827 group->root = g;
6828 }
6829
6830 if (start)
6831 free (start);
6832
6833 group++;
6834 }
6835 }
6836
6837 if (symtab)
6838 free (symtab);
6839 if (strtab)
6840 free (strtab);
6841 return TRUE;
6842 }
6843
6844 /* Data used to display dynamic fixups. */
6845
6846 struct ia64_vms_dynfixup
6847 {
6848 bfd_vma needed_ident; /* Library ident number. */
6849 bfd_vma needed; /* Index in the dstrtab of the library name. */
6850 bfd_vma fixup_needed; /* Index of the library. */
6851 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6852 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6853 };
6854
6855 /* Data used to display dynamic relocations. */
6856
6857 struct ia64_vms_dynimgrela
6858 {
6859 bfd_vma img_rela_cnt; /* Number of relocations. */
6860 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6861 };
6862
6863 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6864 library). */
6865
6866 static bfd_boolean
6867 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6868 struct ia64_vms_dynfixup * fixup,
6869 const char * strtab,
6870 unsigned int strtab_sz)
6871 {
6872 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6873 long i;
6874 const char * lib_name;
6875
6876 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6877 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6878 _("dynamic section image fixups"));
6879 if (!imfs)
6880 return FALSE;
6881
6882 if (fixup->needed < strtab_sz)
6883 lib_name = strtab + fixup->needed;
6884 else
6885 {
6886 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6887 (unsigned long) fixup->needed);
6888 lib_name = "???";
6889 }
6890 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6891 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6892 printf
6893 (_("Seg Offset Type SymVec DataType\n"));
6894
6895 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6896 {
6897 unsigned int type;
6898 const char *rtype;
6899
6900 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6901 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6902 type = BYTE_GET (imfs [i].type);
6903 rtype = elf_ia64_reloc_type (type);
6904 if (rtype == NULL)
6905 printf (" 0x%08x ", type);
6906 else
6907 printf (" %-32s ", rtype);
6908 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6909 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6910 }
6911
6912 free (imfs);
6913 return TRUE;
6914 }
6915
6916 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6917
6918 static bfd_boolean
6919 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6920 {
6921 Elf64_External_VMS_IMAGE_RELA *imrs;
6922 long i;
6923
6924 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6925 1, imgrela->img_rela_cnt * sizeof (*imrs),
6926 _("dynamic section image relocations"));
6927 if (!imrs)
6928 return FALSE;
6929
6930 printf (_("\nImage relocs\n"));
6931 printf
6932 (_("Seg Offset Type Addend Seg Sym Off\n"));
6933
6934 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6935 {
6936 unsigned int type;
6937 const char *rtype;
6938
6939 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6940 printf ("%08" BFD_VMA_FMT "x ",
6941 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6942 type = BYTE_GET (imrs [i].type);
6943 rtype = elf_ia64_reloc_type (type);
6944 if (rtype == NULL)
6945 printf ("0x%08x ", type);
6946 else
6947 printf ("%-31s ", rtype);
6948 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6949 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6950 printf ("%08" BFD_VMA_FMT "x\n",
6951 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6952 }
6953
6954 free (imrs);
6955 return TRUE;
6956 }
6957
6958 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6959
6960 static bfd_boolean
6961 process_ia64_vms_dynamic_relocs (Filedata * filedata)
6962 {
6963 struct ia64_vms_dynfixup fixup;
6964 struct ia64_vms_dynimgrela imgrela;
6965 Elf_Internal_Dyn *entry;
6966 bfd_vma strtab_off = 0;
6967 bfd_vma strtab_sz = 0;
6968 char *strtab = NULL;
6969 bfd_boolean res = TRUE;
6970
6971 memset (&fixup, 0, sizeof (fixup));
6972 memset (&imgrela, 0, sizeof (imgrela));
6973
6974 /* Note: the order of the entries is specified by the OpenVMS specs. */
6975 for (entry = dynamic_section;
6976 entry < dynamic_section + dynamic_nent;
6977 entry++)
6978 {
6979 switch (entry->d_tag)
6980 {
6981 case DT_IA_64_VMS_STRTAB_OFFSET:
6982 strtab_off = entry->d_un.d_val;
6983 break;
6984 case DT_STRSZ:
6985 strtab_sz = entry->d_un.d_val;
6986 if (strtab == NULL)
6987 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
6988 1, strtab_sz, _("dynamic string section"));
6989 break;
6990
6991 case DT_IA_64_VMS_NEEDED_IDENT:
6992 fixup.needed_ident = entry->d_un.d_val;
6993 break;
6994 case DT_NEEDED:
6995 fixup.needed = entry->d_un.d_val;
6996 break;
6997 case DT_IA_64_VMS_FIXUP_NEEDED:
6998 fixup.fixup_needed = entry->d_un.d_val;
6999 break;
7000 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7001 fixup.fixup_rela_cnt = entry->d_un.d_val;
7002 break;
7003 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7004 fixup.fixup_rela_off = entry->d_un.d_val;
7005 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7006 res = FALSE;
7007 break;
7008 case DT_IA_64_VMS_IMG_RELA_CNT:
7009 imgrela.img_rela_cnt = entry->d_un.d_val;
7010 break;
7011 case DT_IA_64_VMS_IMG_RELA_OFF:
7012 imgrela.img_rela_off = entry->d_un.d_val;
7013 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7014 res = FALSE;
7015 break;
7016
7017 default:
7018 break;
7019 }
7020 }
7021
7022 if (strtab != NULL)
7023 free (strtab);
7024
7025 return res;
7026 }
7027
7028 static struct
7029 {
7030 const char * name;
7031 int reloc;
7032 int size;
7033 int rela;
7034 }
7035 dynamic_relocations [] =
7036 {
7037 { "REL", DT_REL, DT_RELSZ, FALSE },
7038 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7039 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7040 };
7041
7042 /* Process the reloc section. */
7043
7044 static bfd_boolean
7045 process_relocs (Filedata * filedata)
7046 {
7047 unsigned long rel_size;
7048 unsigned long rel_offset;
7049
7050 if (!do_reloc)
7051 return TRUE;
7052
7053 if (do_using_dynamic)
7054 {
7055 int is_rela;
7056 const char * name;
7057 bfd_boolean has_dynamic_reloc;
7058 unsigned int i;
7059
7060 has_dynamic_reloc = FALSE;
7061
7062 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7063 {
7064 is_rela = dynamic_relocations [i].rela;
7065 name = dynamic_relocations [i].name;
7066 rel_size = dynamic_info [dynamic_relocations [i].size];
7067 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7068
7069 if (rel_size)
7070 has_dynamic_reloc = TRUE;
7071
7072 if (is_rela == UNKNOWN)
7073 {
7074 if (dynamic_relocations [i].reloc == DT_JMPREL)
7075 switch (dynamic_info[DT_PLTREL])
7076 {
7077 case DT_REL:
7078 is_rela = FALSE;
7079 break;
7080 case DT_RELA:
7081 is_rela = TRUE;
7082 break;
7083 }
7084 }
7085
7086 if (rel_size)
7087 {
7088 printf
7089 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7090 name, rel_offset, rel_size);
7091
7092 dump_relocations (filedata,
7093 offset_from_vma (filedata, rel_offset, rel_size),
7094 rel_size,
7095 dynamic_symbols, num_dynamic_syms,
7096 dynamic_strings, dynamic_strings_length,
7097 is_rela, TRUE /* is_dynamic */);
7098 }
7099 }
7100
7101 if (is_ia64_vms (filedata))
7102 if (process_ia64_vms_dynamic_relocs (filedata))
7103 has_dynamic_reloc = TRUE;
7104
7105 if (! has_dynamic_reloc)
7106 printf (_("\nThere are no dynamic relocations in this file.\n"));
7107 }
7108 else
7109 {
7110 Elf_Internal_Shdr * section;
7111 unsigned long i;
7112 bfd_boolean found = FALSE;
7113
7114 for (i = 0, section = filedata->section_headers;
7115 i < filedata->file_header.e_shnum;
7116 i++, section++)
7117 {
7118 if ( section->sh_type != SHT_RELA
7119 && section->sh_type != SHT_REL)
7120 continue;
7121
7122 rel_offset = section->sh_offset;
7123 rel_size = section->sh_size;
7124
7125 if (rel_size)
7126 {
7127 Elf_Internal_Shdr * strsec;
7128 int is_rela;
7129 unsigned long num_rela;
7130
7131 printf (_("\nRelocation section "));
7132
7133 if (filedata->string_table == NULL)
7134 printf ("%d", section->sh_name);
7135 else
7136 printf ("'%s'", printable_section_name (filedata, section));
7137
7138 num_rela = rel_size / section->sh_entsize;
7139 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7140 " at offset 0x%lx contains %lu entries:\n",
7141 num_rela),
7142 rel_offset, num_rela);
7143
7144 is_rela = section->sh_type == SHT_RELA;
7145
7146 if (section->sh_link != 0
7147 && section->sh_link < filedata->file_header.e_shnum)
7148 {
7149 Elf_Internal_Shdr * symsec;
7150 Elf_Internal_Sym * symtab;
7151 unsigned long nsyms;
7152 unsigned long strtablen = 0;
7153 char * strtab = NULL;
7154
7155 symsec = filedata->section_headers + section->sh_link;
7156 if (symsec->sh_type != SHT_SYMTAB
7157 && symsec->sh_type != SHT_DYNSYM)
7158 continue;
7159
7160 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7161
7162 if (symtab == NULL)
7163 continue;
7164
7165 if (symsec->sh_link != 0
7166 && symsec->sh_link < filedata->file_header.e_shnum)
7167 {
7168 strsec = filedata->section_headers + symsec->sh_link;
7169
7170 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7171 1, strsec->sh_size,
7172 _("string table"));
7173 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7174 }
7175
7176 dump_relocations (filedata, rel_offset, rel_size,
7177 symtab, nsyms, strtab, strtablen,
7178 is_rela,
7179 symsec->sh_type == SHT_DYNSYM);
7180 if (strtab)
7181 free (strtab);
7182 free (symtab);
7183 }
7184 else
7185 dump_relocations (filedata, rel_offset, rel_size,
7186 NULL, 0, NULL, 0, is_rela,
7187 FALSE /* is_dynamic */);
7188
7189 found = TRUE;
7190 }
7191 }
7192
7193 if (! found)
7194 {
7195 /* Users sometimes forget the -D option, so try to be helpful. */
7196 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7197 {
7198 if (dynamic_info [dynamic_relocations [i].size])
7199 {
7200 printf (_("\nThere are no static relocations in this file."));
7201 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7202
7203 break;
7204 }
7205 }
7206 if (i == ARRAY_SIZE (dynamic_relocations))
7207 printf (_("\nThere are no relocations in this file.\n"));
7208 }
7209 }
7210
7211 return TRUE;
7212 }
7213
7214 /* An absolute address consists of a section and an offset. If the
7215 section is NULL, the offset itself is the address, otherwise, the
7216 address equals to LOAD_ADDRESS(section) + offset. */
7217
7218 struct absaddr
7219 {
7220 unsigned short section;
7221 bfd_vma offset;
7222 };
7223
7224 #define ABSADDR(a) \
7225 ((a).section \
7226 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7227 : (a).offset)
7228
7229 /* Find the nearest symbol at or below ADDR. Returns the symbol
7230 name, if found, and the offset from the symbol to ADDR. */
7231
7232 static void
7233 find_symbol_for_address (Filedata * filedata,
7234 Elf_Internal_Sym * symtab,
7235 unsigned long nsyms,
7236 const char * strtab,
7237 unsigned long strtab_size,
7238 struct absaddr addr,
7239 const char ** symname,
7240 bfd_vma * offset)
7241 {
7242 bfd_vma dist = 0x100000;
7243 Elf_Internal_Sym * sym;
7244 Elf_Internal_Sym * beg;
7245 Elf_Internal_Sym * end;
7246 Elf_Internal_Sym * best = NULL;
7247
7248 REMOVE_ARCH_BITS (addr.offset);
7249 beg = symtab;
7250 end = symtab + nsyms;
7251
7252 while (beg < end)
7253 {
7254 bfd_vma value;
7255
7256 sym = beg + (end - beg) / 2;
7257
7258 value = sym->st_value;
7259 REMOVE_ARCH_BITS (value);
7260
7261 if (sym->st_name != 0
7262 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7263 && addr.offset >= value
7264 && addr.offset - value < dist)
7265 {
7266 best = sym;
7267 dist = addr.offset - value;
7268 if (!dist)
7269 break;
7270 }
7271
7272 if (addr.offset < value)
7273 end = sym;
7274 else
7275 beg = sym + 1;
7276 }
7277
7278 if (best)
7279 {
7280 *symname = (best->st_name >= strtab_size
7281 ? _("<corrupt>") : strtab + best->st_name);
7282 *offset = dist;
7283 return;
7284 }
7285
7286 *symname = NULL;
7287 *offset = addr.offset;
7288 }
7289
7290 static /* signed */ int
7291 symcmp (const void *p, const void *q)
7292 {
7293 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7294 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7295
7296 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7297 }
7298
7299 /* Process the unwind section. */
7300
7301 #include "unwind-ia64.h"
7302
7303 struct ia64_unw_table_entry
7304 {
7305 struct absaddr start;
7306 struct absaddr end;
7307 struct absaddr info;
7308 };
7309
7310 struct ia64_unw_aux_info
7311 {
7312 struct ia64_unw_table_entry * table; /* Unwind table. */
7313 unsigned long table_len; /* Length of unwind table. */
7314 unsigned char * info; /* Unwind info. */
7315 unsigned long info_size; /* Size of unwind info. */
7316 bfd_vma info_addr; /* Starting address of unwind info. */
7317 bfd_vma seg_base; /* Starting address of segment. */
7318 Elf_Internal_Sym * symtab; /* The symbol table. */
7319 unsigned long nsyms; /* Number of symbols. */
7320 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7321 unsigned long nfuns; /* Number of entries in funtab. */
7322 char * strtab; /* The string table. */
7323 unsigned long strtab_size; /* Size of string table. */
7324 };
7325
7326 static bfd_boolean
7327 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7328 {
7329 struct ia64_unw_table_entry * tp;
7330 unsigned long j, nfuns;
7331 int in_body;
7332 bfd_boolean res = TRUE;
7333
7334 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7335 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7336 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7337 aux->funtab[nfuns++] = aux->symtab[j];
7338 aux->nfuns = nfuns;
7339 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7340
7341 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7342 {
7343 bfd_vma stamp;
7344 bfd_vma offset;
7345 const unsigned char * dp;
7346 const unsigned char * head;
7347 const unsigned char * end;
7348 const char * procname;
7349
7350 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7351 aux->strtab_size, tp->start, &procname, &offset);
7352
7353 fputs ("\n<", stdout);
7354
7355 if (procname)
7356 {
7357 fputs (procname, stdout);
7358
7359 if (offset)
7360 printf ("+%lx", (unsigned long) offset);
7361 }
7362
7363 fputs (">: [", stdout);
7364 print_vma (tp->start.offset, PREFIX_HEX);
7365 fputc ('-', stdout);
7366 print_vma (tp->end.offset, PREFIX_HEX);
7367 printf ("], info at +0x%lx\n",
7368 (unsigned long) (tp->info.offset - aux->seg_base));
7369
7370 /* PR 17531: file: 86232b32. */
7371 if (aux->info == NULL)
7372 continue;
7373
7374 /* PR 17531: file: 0997b4d1. */
7375 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7376 {
7377 warn (_("Invalid offset %lx in table entry %ld\n"),
7378 (long) tp->info.offset, (long) (tp - aux->table));
7379 res = FALSE;
7380 continue;
7381 }
7382
7383 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7384 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7385
7386 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7387 (unsigned) UNW_VER (stamp),
7388 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7389 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7390 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7391 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7392
7393 if (UNW_VER (stamp) != 1)
7394 {
7395 printf (_("\tUnknown version.\n"));
7396 continue;
7397 }
7398
7399 in_body = 0;
7400 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7401 /* PR 17531: file: 16ceda89. */
7402 if (end > aux->info + aux->info_size)
7403 end = aux->info + aux->info_size;
7404 for (dp = head + 8; dp < end;)
7405 dp = unw_decode (dp, in_body, & in_body, end);
7406 }
7407
7408 free (aux->funtab);
7409
7410 return res;
7411 }
7412
7413 static bfd_boolean
7414 slurp_ia64_unwind_table (Filedata * filedata,
7415 struct ia64_unw_aux_info * aux,
7416 Elf_Internal_Shdr * sec)
7417 {
7418 unsigned long size, nrelas, i;
7419 Elf_Internal_Phdr * seg;
7420 struct ia64_unw_table_entry * tep;
7421 Elf_Internal_Shdr * relsec;
7422 Elf_Internal_Rela * rela;
7423 Elf_Internal_Rela * rp;
7424 unsigned char * table;
7425 unsigned char * tp;
7426 Elf_Internal_Sym * sym;
7427 const char * relname;
7428
7429 aux->table_len = 0;
7430
7431 /* First, find the starting address of the segment that includes
7432 this section: */
7433
7434 if (filedata->file_header.e_phnum)
7435 {
7436 if (! get_program_headers (filedata))
7437 return FALSE;
7438
7439 for (seg = filedata->program_headers;
7440 seg < filedata->program_headers + filedata->file_header.e_phnum;
7441 ++seg)
7442 {
7443 if (seg->p_type != PT_LOAD)
7444 continue;
7445
7446 if (sec->sh_addr >= seg->p_vaddr
7447 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7448 {
7449 aux->seg_base = seg->p_vaddr;
7450 break;
7451 }
7452 }
7453 }
7454
7455 /* Second, build the unwind table from the contents of the unwind section: */
7456 size = sec->sh_size;
7457 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7458 _("unwind table"));
7459 if (!table)
7460 return FALSE;
7461
7462 aux->table_len = size / (3 * eh_addr_size);
7463 aux->table = (struct ia64_unw_table_entry *)
7464 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7465 tep = aux->table;
7466
7467 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7468 {
7469 tep->start.section = SHN_UNDEF;
7470 tep->end.section = SHN_UNDEF;
7471 tep->info.section = SHN_UNDEF;
7472 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7473 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7474 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7475 tep->start.offset += aux->seg_base;
7476 tep->end.offset += aux->seg_base;
7477 tep->info.offset += aux->seg_base;
7478 }
7479 free (table);
7480
7481 /* Third, apply any relocations to the unwind table: */
7482 for (relsec = filedata->section_headers;
7483 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7484 ++relsec)
7485 {
7486 if (relsec->sh_type != SHT_RELA
7487 || relsec->sh_info >= filedata->file_header.e_shnum
7488 || filedata->section_headers + relsec->sh_info != sec)
7489 continue;
7490
7491 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7492 & rela, & nrelas))
7493 {
7494 free (aux->table);
7495 aux->table = NULL;
7496 aux->table_len = 0;
7497 return FALSE;
7498 }
7499
7500 for (rp = rela; rp < rela + nrelas; ++rp)
7501 {
7502 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7503 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7504
7505 /* PR 17531: file: 9fa67536. */
7506 if (relname == NULL)
7507 {
7508 warn (_("Skipping unknown relocation type: %u\n"),
7509 get_reloc_type (filedata, rp->r_info));
7510 continue;
7511 }
7512
7513 if (! const_strneq (relname, "R_IA64_SEGREL"))
7514 {
7515 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7516 continue;
7517 }
7518
7519 i = rp->r_offset / (3 * eh_addr_size);
7520
7521 /* PR 17531: file: 5bc8d9bf. */
7522 if (i >= aux->table_len)
7523 {
7524 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7525 continue;
7526 }
7527
7528 switch (rp->r_offset / eh_addr_size % 3)
7529 {
7530 case 0:
7531 aux->table[i].start.section = sym->st_shndx;
7532 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7533 break;
7534 case 1:
7535 aux->table[i].end.section = sym->st_shndx;
7536 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7537 break;
7538 case 2:
7539 aux->table[i].info.section = sym->st_shndx;
7540 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7541 break;
7542 default:
7543 break;
7544 }
7545 }
7546
7547 free (rela);
7548 }
7549
7550 return TRUE;
7551 }
7552
7553 static bfd_boolean
7554 ia64_process_unwind (Filedata * filedata)
7555 {
7556 Elf_Internal_Shdr * sec;
7557 Elf_Internal_Shdr * unwsec = NULL;
7558 Elf_Internal_Shdr * strsec;
7559 unsigned long i, unwcount = 0, unwstart = 0;
7560 struct ia64_unw_aux_info aux;
7561 bfd_boolean res = TRUE;
7562
7563 memset (& aux, 0, sizeof (aux));
7564
7565 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7566 {
7567 if (sec->sh_type == SHT_SYMTAB
7568 && sec->sh_link < filedata->file_header.e_shnum)
7569 {
7570 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7571
7572 strsec = filedata->section_headers + sec->sh_link;
7573 if (aux.strtab != NULL)
7574 {
7575 error (_("Multiple auxillary string tables encountered\n"));
7576 free (aux.strtab);
7577 res = FALSE;
7578 }
7579 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7580 1, strsec->sh_size,
7581 _("string table"));
7582 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7583 }
7584 else if (sec->sh_type == SHT_IA_64_UNWIND)
7585 unwcount++;
7586 }
7587
7588 if (!unwcount)
7589 printf (_("\nThere are no unwind sections in this file.\n"));
7590
7591 while (unwcount-- > 0)
7592 {
7593 char * suffix;
7594 size_t len, len2;
7595
7596 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7597 i < filedata->file_header.e_shnum; ++i, ++sec)
7598 if (sec->sh_type == SHT_IA_64_UNWIND)
7599 {
7600 unwsec = sec;
7601 break;
7602 }
7603 /* We have already counted the number of SHT_IA64_UNWIND
7604 sections so the loop above should never fail. */
7605 assert (unwsec != NULL);
7606
7607 unwstart = i + 1;
7608 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7609
7610 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7611 {
7612 /* We need to find which section group it is in. */
7613 struct group_list * g;
7614
7615 if (section_headers_groups == NULL
7616 || section_headers_groups [i] == NULL)
7617 i = filedata->file_header.e_shnum;
7618 else
7619 {
7620 g = section_headers_groups [i]->root;
7621
7622 for (; g != NULL; g = g->next)
7623 {
7624 sec = filedata->section_headers + g->section_index;
7625
7626 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7627 break;
7628 }
7629
7630 if (g == NULL)
7631 i = filedata->file_header.e_shnum;
7632 }
7633 }
7634 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7635 {
7636 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7637 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7638 suffix = SECTION_NAME (unwsec) + len;
7639 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7640 ++i, ++sec)
7641 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7642 && streq (SECTION_NAME (sec) + len2, suffix))
7643 break;
7644 }
7645 else
7646 {
7647 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7648 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7649 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7650 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7651 suffix = "";
7652 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7653 suffix = SECTION_NAME (unwsec) + len;
7654 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7655 ++i, ++sec)
7656 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7657 && streq (SECTION_NAME (sec) + len2, suffix))
7658 break;
7659 }
7660
7661 if (i == filedata->file_header.e_shnum)
7662 {
7663 printf (_("\nCould not find unwind info section for "));
7664
7665 if (filedata->string_table == NULL)
7666 printf ("%d", unwsec->sh_name);
7667 else
7668 printf ("'%s'", printable_section_name (filedata, unwsec));
7669 }
7670 else
7671 {
7672 aux.info_addr = sec->sh_addr;
7673 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7674 sec->sh_size,
7675 _("unwind info"));
7676 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7677
7678 printf (_("\nUnwind section "));
7679
7680 if (filedata->string_table == NULL)
7681 printf ("%d", unwsec->sh_name);
7682 else
7683 printf ("'%s'", printable_section_name (filedata, unwsec));
7684
7685 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7686 (unsigned long) unwsec->sh_offset,
7687 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7688
7689 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7690 && aux.table_len > 0)
7691 dump_ia64_unwind (filedata, & aux);
7692
7693 if (aux.table)
7694 free ((char *) aux.table);
7695 if (aux.info)
7696 free ((char *) aux.info);
7697 aux.table = NULL;
7698 aux.info = NULL;
7699 }
7700 }
7701
7702 if (aux.symtab)
7703 free (aux.symtab);
7704 if (aux.strtab)
7705 free ((char *) aux.strtab);
7706
7707 return res;
7708 }
7709
7710 struct hppa_unw_table_entry
7711 {
7712 struct absaddr start;
7713 struct absaddr end;
7714 unsigned int Cannot_unwind:1; /* 0 */
7715 unsigned int Millicode:1; /* 1 */
7716 unsigned int Millicode_save_sr0:1; /* 2 */
7717 unsigned int Region_description:2; /* 3..4 */
7718 unsigned int reserved1:1; /* 5 */
7719 unsigned int Entry_SR:1; /* 6 */
7720 unsigned int Entry_FR:4; /* Number saved 7..10 */
7721 unsigned int Entry_GR:5; /* Number saved 11..15 */
7722 unsigned int Args_stored:1; /* 16 */
7723 unsigned int Variable_Frame:1; /* 17 */
7724 unsigned int Separate_Package_Body:1; /* 18 */
7725 unsigned int Frame_Extension_Millicode:1; /* 19 */
7726 unsigned int Stack_Overflow_Check:1; /* 20 */
7727 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7728 unsigned int Ada_Region:1; /* 22 */
7729 unsigned int cxx_info:1; /* 23 */
7730 unsigned int cxx_try_catch:1; /* 24 */
7731 unsigned int sched_entry_seq:1; /* 25 */
7732 unsigned int reserved2:1; /* 26 */
7733 unsigned int Save_SP:1; /* 27 */
7734 unsigned int Save_RP:1; /* 28 */
7735 unsigned int Save_MRP_in_frame:1; /* 29 */
7736 unsigned int extn_ptr_defined:1; /* 30 */
7737 unsigned int Cleanup_defined:1; /* 31 */
7738
7739 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7740 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7741 unsigned int Large_frame:1; /* 2 */
7742 unsigned int Pseudo_SP_Set:1; /* 3 */
7743 unsigned int reserved4:1; /* 4 */
7744 unsigned int Total_frame_size:27; /* 5..31 */
7745 };
7746
7747 struct hppa_unw_aux_info
7748 {
7749 struct hppa_unw_table_entry * table; /* Unwind table. */
7750 unsigned long table_len; /* Length of unwind table. */
7751 bfd_vma seg_base; /* Starting address of segment. */
7752 Elf_Internal_Sym * symtab; /* The symbol table. */
7753 unsigned long nsyms; /* Number of symbols. */
7754 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7755 unsigned long nfuns; /* Number of entries in funtab. */
7756 char * strtab; /* The string table. */
7757 unsigned long strtab_size; /* Size of string table. */
7758 };
7759
7760 static bfd_boolean
7761 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7762 {
7763 struct hppa_unw_table_entry * tp;
7764 unsigned long j, nfuns;
7765 bfd_boolean res = TRUE;
7766
7767 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7768 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7769 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7770 aux->funtab[nfuns++] = aux->symtab[j];
7771 aux->nfuns = nfuns;
7772 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7773
7774 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7775 {
7776 bfd_vma offset;
7777 const char * procname;
7778
7779 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7780 aux->strtab_size, tp->start, &procname,
7781 &offset);
7782
7783 fputs ("\n<", stdout);
7784
7785 if (procname)
7786 {
7787 fputs (procname, stdout);
7788
7789 if (offset)
7790 printf ("+%lx", (unsigned long) offset);
7791 }
7792
7793 fputs (">: [", stdout);
7794 print_vma (tp->start.offset, PREFIX_HEX);
7795 fputc ('-', stdout);
7796 print_vma (tp->end.offset, PREFIX_HEX);
7797 printf ("]\n\t");
7798
7799 #define PF(_m) if (tp->_m) printf (#_m " ");
7800 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7801 PF(Cannot_unwind);
7802 PF(Millicode);
7803 PF(Millicode_save_sr0);
7804 /* PV(Region_description); */
7805 PF(Entry_SR);
7806 PV(Entry_FR);
7807 PV(Entry_GR);
7808 PF(Args_stored);
7809 PF(Variable_Frame);
7810 PF(Separate_Package_Body);
7811 PF(Frame_Extension_Millicode);
7812 PF(Stack_Overflow_Check);
7813 PF(Two_Instruction_SP_Increment);
7814 PF(Ada_Region);
7815 PF(cxx_info);
7816 PF(cxx_try_catch);
7817 PF(sched_entry_seq);
7818 PF(Save_SP);
7819 PF(Save_RP);
7820 PF(Save_MRP_in_frame);
7821 PF(extn_ptr_defined);
7822 PF(Cleanup_defined);
7823 PF(MPE_XL_interrupt_marker);
7824 PF(HP_UX_interrupt_marker);
7825 PF(Large_frame);
7826 PF(Pseudo_SP_Set);
7827 PV(Total_frame_size);
7828 #undef PF
7829 #undef PV
7830 }
7831
7832 printf ("\n");
7833
7834 free (aux->funtab);
7835
7836 return res;
7837 }
7838
7839 static bfd_boolean
7840 slurp_hppa_unwind_table (Filedata * filedata,
7841 struct hppa_unw_aux_info * aux,
7842 Elf_Internal_Shdr * sec)
7843 {
7844 unsigned long size, unw_ent_size, nentries, nrelas, i;
7845 Elf_Internal_Phdr * seg;
7846 struct hppa_unw_table_entry * tep;
7847 Elf_Internal_Shdr * relsec;
7848 Elf_Internal_Rela * rela;
7849 Elf_Internal_Rela * rp;
7850 unsigned char * table;
7851 unsigned char * tp;
7852 Elf_Internal_Sym * sym;
7853 const char * relname;
7854
7855 /* First, find the starting address of the segment that includes
7856 this section. */
7857 if (filedata->file_header.e_phnum)
7858 {
7859 if (! get_program_headers (filedata))
7860 return FALSE;
7861
7862 for (seg = filedata->program_headers;
7863 seg < filedata->program_headers + filedata->file_header.e_phnum;
7864 ++seg)
7865 {
7866 if (seg->p_type != PT_LOAD)
7867 continue;
7868
7869 if (sec->sh_addr >= seg->p_vaddr
7870 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7871 {
7872 aux->seg_base = seg->p_vaddr;
7873 break;
7874 }
7875 }
7876 }
7877
7878 /* Second, build the unwind table from the contents of the unwind
7879 section. */
7880 size = sec->sh_size;
7881 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7882 _("unwind table"));
7883 if (!table)
7884 return FALSE;
7885
7886 unw_ent_size = 16;
7887 nentries = size / unw_ent_size;
7888 size = unw_ent_size * nentries;
7889
7890 tep = aux->table = (struct hppa_unw_table_entry *)
7891 xcmalloc (nentries, sizeof (aux->table[0]));
7892
7893 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7894 {
7895 unsigned int tmp1, tmp2;
7896
7897 tep->start.section = SHN_UNDEF;
7898 tep->end.section = SHN_UNDEF;
7899
7900 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7901 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7902 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7903 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7904
7905 tep->start.offset += aux->seg_base;
7906 tep->end.offset += aux->seg_base;
7907
7908 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7909 tep->Millicode = (tmp1 >> 30) & 0x1;
7910 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7911 tep->Region_description = (tmp1 >> 27) & 0x3;
7912 tep->reserved1 = (tmp1 >> 26) & 0x1;
7913 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7914 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7915 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7916 tep->Args_stored = (tmp1 >> 15) & 0x1;
7917 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7918 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7919 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7920 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7921 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7922 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7923 tep->cxx_info = (tmp1 >> 8) & 0x1;
7924 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7925 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7926 tep->reserved2 = (tmp1 >> 5) & 0x1;
7927 tep->Save_SP = (tmp1 >> 4) & 0x1;
7928 tep->Save_RP = (tmp1 >> 3) & 0x1;
7929 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7930 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7931 tep->Cleanup_defined = tmp1 & 0x1;
7932
7933 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7934 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7935 tep->Large_frame = (tmp2 >> 29) & 0x1;
7936 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7937 tep->reserved4 = (tmp2 >> 27) & 0x1;
7938 tep->Total_frame_size = tmp2 & 0x7ffffff;
7939 }
7940 free (table);
7941
7942 /* Third, apply any relocations to the unwind table. */
7943 for (relsec = filedata->section_headers;
7944 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7945 ++relsec)
7946 {
7947 if (relsec->sh_type != SHT_RELA
7948 || relsec->sh_info >= filedata->file_header.e_shnum
7949 || filedata->section_headers + relsec->sh_info != sec)
7950 continue;
7951
7952 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7953 & rela, & nrelas))
7954 return FALSE;
7955
7956 for (rp = rela; rp < rela + nrelas; ++rp)
7957 {
7958 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
7959 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7960
7961 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7962 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7963 {
7964 warn (_("Skipping unexpected relocation type %s\n"), relname);
7965 continue;
7966 }
7967
7968 i = rp->r_offset / unw_ent_size;
7969
7970 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7971 {
7972 case 0:
7973 aux->table[i].start.section = sym->st_shndx;
7974 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7975 break;
7976 case 1:
7977 aux->table[i].end.section = sym->st_shndx;
7978 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7979 break;
7980 default:
7981 break;
7982 }
7983 }
7984
7985 free (rela);
7986 }
7987
7988 aux->table_len = nentries;
7989
7990 return TRUE;
7991 }
7992
7993 static bfd_boolean
7994 hppa_process_unwind (Filedata * filedata)
7995 {
7996 struct hppa_unw_aux_info aux;
7997 Elf_Internal_Shdr * unwsec = NULL;
7998 Elf_Internal_Shdr * strsec;
7999 Elf_Internal_Shdr * sec;
8000 unsigned long i;
8001 bfd_boolean res = TRUE;
8002
8003 if (filedata->string_table == NULL)
8004 return FALSE;
8005
8006 memset (& aux, 0, sizeof (aux));
8007
8008 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8009 {
8010 if (sec->sh_type == SHT_SYMTAB
8011 && sec->sh_link < filedata->file_header.e_shnum)
8012 {
8013 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8014
8015 strsec = filedata->section_headers + sec->sh_link;
8016 if (aux.strtab != NULL)
8017 {
8018 error (_("Multiple auxillary string tables encountered\n"));
8019 free (aux.strtab);
8020 res = FALSE;
8021 }
8022 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8023 1, strsec->sh_size,
8024 _("string table"));
8025 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8026 }
8027 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8028 unwsec = sec;
8029 }
8030
8031 if (!unwsec)
8032 printf (_("\nThere are no unwind sections in this file.\n"));
8033
8034 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8035 {
8036 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8037 {
8038 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8039
8040 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8041 "contains %lu entry:\n",
8042 "\nUnwind section '%s' at offset 0x%lx "
8043 "contains %lu entries:\n",
8044 num_unwind),
8045 printable_section_name (filedata, sec),
8046 (unsigned long) sec->sh_offset,
8047 num_unwind);
8048
8049 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8050 res = FALSE;
8051
8052 if (aux.table_len > 0)
8053 {
8054 if (! dump_hppa_unwind (filedata, &aux))
8055 res = FALSE;
8056 }
8057
8058 if (aux.table)
8059 free ((char *) aux.table);
8060 aux.table = NULL;
8061 }
8062 }
8063
8064 if (aux.symtab)
8065 free (aux.symtab);
8066 if (aux.strtab)
8067 free ((char *) aux.strtab);
8068
8069 return res;
8070 }
8071
8072 struct arm_section
8073 {
8074 unsigned char * data; /* The unwind data. */
8075 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8076 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8077 unsigned long nrelas; /* The number of relocations. */
8078 unsigned int rel_type; /* REL or RELA ? */
8079 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8080 };
8081
8082 struct arm_unw_aux_info
8083 {
8084 Filedata * filedata; /* The file containing the unwind sections. */
8085 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8086 unsigned long nsyms; /* Number of symbols. */
8087 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8088 unsigned long nfuns; /* Number of these symbols. */
8089 char * strtab; /* The file's string table. */
8090 unsigned long strtab_size; /* Size of string table. */
8091 };
8092
8093 static const char *
8094 arm_print_vma_and_name (Filedata * filedata,
8095 struct arm_unw_aux_info * aux,
8096 bfd_vma fn,
8097 struct absaddr addr)
8098 {
8099 const char *procname;
8100 bfd_vma sym_offset;
8101
8102 if (addr.section == SHN_UNDEF)
8103 addr.offset = fn;
8104
8105 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8106 aux->strtab_size, addr, &procname,
8107 &sym_offset);
8108
8109 print_vma (fn, PREFIX_HEX);
8110
8111 if (procname)
8112 {
8113 fputs (" <", stdout);
8114 fputs (procname, stdout);
8115
8116 if (sym_offset)
8117 printf ("+0x%lx", (unsigned long) sym_offset);
8118 fputc ('>', stdout);
8119 }
8120
8121 return procname;
8122 }
8123
8124 static void
8125 arm_free_section (struct arm_section *arm_sec)
8126 {
8127 if (arm_sec->data != NULL)
8128 free (arm_sec->data);
8129
8130 if (arm_sec->rela != NULL)
8131 free (arm_sec->rela);
8132 }
8133
8134 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8135 cached section and install SEC instead.
8136 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8137 and return its valued in * WORDP, relocating if necessary.
8138 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8139 relocation's offset in ADDR.
8140 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8141 into the string table of the symbol associated with the reloc. If no
8142 reloc was applied store -1 there.
8143 5) Return TRUE upon success, FALSE otherwise. */
8144
8145 static bfd_boolean
8146 get_unwind_section_word (Filedata * filedata,
8147 struct arm_unw_aux_info * aux,
8148 struct arm_section * arm_sec,
8149 Elf_Internal_Shdr * sec,
8150 bfd_vma word_offset,
8151 unsigned int * wordp,
8152 struct absaddr * addr,
8153 bfd_vma * sym_name)
8154 {
8155 Elf_Internal_Rela *rp;
8156 Elf_Internal_Sym *sym;
8157 const char * relname;
8158 unsigned int word;
8159 bfd_boolean wrapped;
8160
8161 if (sec == NULL || arm_sec == NULL)
8162 return FALSE;
8163
8164 addr->section = SHN_UNDEF;
8165 addr->offset = 0;
8166
8167 if (sym_name != NULL)
8168 *sym_name = (bfd_vma) -1;
8169
8170 /* If necessary, update the section cache. */
8171 if (sec != arm_sec->sec)
8172 {
8173 Elf_Internal_Shdr *relsec;
8174
8175 arm_free_section (arm_sec);
8176
8177 arm_sec->sec = sec;
8178 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8179 sec->sh_size, _("unwind data"));
8180 arm_sec->rela = NULL;
8181 arm_sec->nrelas = 0;
8182
8183 for (relsec = filedata->section_headers;
8184 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8185 ++relsec)
8186 {
8187 if (relsec->sh_info >= filedata->file_header.e_shnum
8188 || filedata->section_headers + relsec->sh_info != sec
8189 /* PR 15745: Check the section type as well. */
8190 || (relsec->sh_type != SHT_REL
8191 && relsec->sh_type != SHT_RELA))
8192 continue;
8193
8194 arm_sec->rel_type = relsec->sh_type;
8195 if (relsec->sh_type == SHT_REL)
8196 {
8197 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8198 relsec->sh_size,
8199 & arm_sec->rela, & arm_sec->nrelas))
8200 return FALSE;
8201 }
8202 else /* relsec->sh_type == SHT_RELA */
8203 {
8204 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8205 relsec->sh_size,
8206 & arm_sec->rela, & arm_sec->nrelas))
8207 return FALSE;
8208 }
8209 break;
8210 }
8211
8212 arm_sec->next_rela = arm_sec->rela;
8213 }
8214
8215 /* If there is no unwind data we can do nothing. */
8216 if (arm_sec->data == NULL)
8217 return FALSE;
8218
8219 /* If the offset is invalid then fail. */
8220 if (/* PR 21343 *//* PR 18879 */
8221 sec->sh_size < 4
8222 || word_offset > (sec->sh_size - 4)
8223 || ((bfd_signed_vma) word_offset) < 0)
8224 return FALSE;
8225
8226 /* Get the word at the required offset. */
8227 word = byte_get (arm_sec->data + word_offset, 4);
8228
8229 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8230 if (arm_sec->rela == NULL)
8231 {
8232 * wordp = word;
8233 return TRUE;
8234 }
8235
8236 /* Look through the relocs to find the one that applies to the provided offset. */
8237 wrapped = FALSE;
8238 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8239 {
8240 bfd_vma prelval, offset;
8241
8242 if (rp->r_offset > word_offset && !wrapped)
8243 {
8244 rp = arm_sec->rela;
8245 wrapped = TRUE;
8246 }
8247 if (rp->r_offset > word_offset)
8248 break;
8249
8250 if (rp->r_offset & 3)
8251 {
8252 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8253 (unsigned long) rp->r_offset);
8254 continue;
8255 }
8256
8257 if (rp->r_offset < word_offset)
8258 continue;
8259
8260 /* PR 17531: file: 027-161405-0.004 */
8261 if (aux->symtab == NULL)
8262 continue;
8263
8264 if (arm_sec->rel_type == SHT_REL)
8265 {
8266 offset = word & 0x7fffffff;
8267 if (offset & 0x40000000)
8268 offset |= ~ (bfd_vma) 0x7fffffff;
8269 }
8270 else if (arm_sec->rel_type == SHT_RELA)
8271 offset = rp->r_addend;
8272 else
8273 {
8274 error (_("Unknown section relocation type %d encountered\n"),
8275 arm_sec->rel_type);
8276 break;
8277 }
8278
8279 /* PR 17531 file: 027-1241568-0.004. */
8280 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8281 {
8282 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8283 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8284 break;
8285 }
8286
8287 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8288 offset += sym->st_value;
8289 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8290
8291 /* Check that we are processing the expected reloc type. */
8292 if (filedata->file_header.e_machine == EM_ARM)
8293 {
8294 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8295 if (relname == NULL)
8296 {
8297 warn (_("Skipping unknown ARM relocation type: %d\n"),
8298 (int) ELF32_R_TYPE (rp->r_info));
8299 continue;
8300 }
8301
8302 if (streq (relname, "R_ARM_NONE"))
8303 continue;
8304
8305 if (! streq (relname, "R_ARM_PREL31"))
8306 {
8307 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8308 continue;
8309 }
8310 }
8311 else if (filedata->file_header.e_machine == EM_TI_C6000)
8312 {
8313 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8314 if (relname == NULL)
8315 {
8316 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8317 (int) ELF32_R_TYPE (rp->r_info));
8318 continue;
8319 }
8320
8321 if (streq (relname, "R_C6000_NONE"))
8322 continue;
8323
8324 if (! streq (relname, "R_C6000_PREL31"))
8325 {
8326 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8327 continue;
8328 }
8329
8330 prelval >>= 1;
8331 }
8332 else
8333 {
8334 /* This function currently only supports ARM and TI unwinders. */
8335 warn (_("Only TI and ARM unwinders are currently supported\n"));
8336 break;
8337 }
8338
8339 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8340 addr->section = sym->st_shndx;
8341 addr->offset = offset;
8342
8343 if (sym_name)
8344 * sym_name = sym->st_name;
8345 break;
8346 }
8347
8348 *wordp = word;
8349 arm_sec->next_rela = rp;
8350
8351 return TRUE;
8352 }
8353
8354 static const char *tic6x_unwind_regnames[16] =
8355 {
8356 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8357 "A14", "A13", "A12", "A11", "A10",
8358 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8359 };
8360
8361 static void
8362 decode_tic6x_unwind_regmask (unsigned int mask)
8363 {
8364 int i;
8365
8366 for (i = 12; mask; mask >>= 1, i--)
8367 {
8368 if (mask & 1)
8369 {
8370 fputs (tic6x_unwind_regnames[i], stdout);
8371 if (mask > 1)
8372 fputs (", ", stdout);
8373 }
8374 }
8375 }
8376
8377 #define ADVANCE \
8378 if (remaining == 0 && more_words) \
8379 { \
8380 data_offset += 4; \
8381 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8382 data_offset, & word, & addr, NULL)) \
8383 return FALSE; \
8384 remaining = 4; \
8385 more_words--; \
8386 } \
8387
8388 #define GET_OP(OP) \
8389 ADVANCE; \
8390 if (remaining) \
8391 { \
8392 remaining--; \
8393 (OP) = word >> 24; \
8394 word <<= 8; \
8395 } \
8396 else \
8397 { \
8398 printf (_("[Truncated opcode]\n")); \
8399 return FALSE; \
8400 } \
8401 printf ("0x%02x ", OP)
8402
8403 static bfd_boolean
8404 decode_arm_unwind_bytecode (Filedata * filedata,
8405 struct arm_unw_aux_info * aux,
8406 unsigned int word,
8407 unsigned int remaining,
8408 unsigned int more_words,
8409 bfd_vma data_offset,
8410 Elf_Internal_Shdr * data_sec,
8411 struct arm_section * data_arm_sec)
8412 {
8413 struct absaddr addr;
8414 bfd_boolean res = TRUE;
8415
8416 /* Decode the unwinding instructions. */
8417 while (1)
8418 {
8419 unsigned int op, op2;
8420
8421 ADVANCE;
8422 if (remaining == 0)
8423 break;
8424 remaining--;
8425 op = word >> 24;
8426 word <<= 8;
8427
8428 printf (" 0x%02x ", op);
8429
8430 if ((op & 0xc0) == 0x00)
8431 {
8432 int offset = ((op & 0x3f) << 2) + 4;
8433
8434 printf (" vsp = vsp + %d", offset);
8435 }
8436 else if ((op & 0xc0) == 0x40)
8437 {
8438 int offset = ((op & 0x3f) << 2) + 4;
8439
8440 printf (" vsp = vsp - %d", offset);
8441 }
8442 else if ((op & 0xf0) == 0x80)
8443 {
8444 GET_OP (op2);
8445 if (op == 0x80 && op2 == 0)
8446 printf (_("Refuse to unwind"));
8447 else
8448 {
8449 unsigned int mask = ((op & 0x0f) << 8) | op2;
8450 bfd_boolean first = TRUE;
8451 int i;
8452
8453 printf ("pop {");
8454 for (i = 0; i < 12; i++)
8455 if (mask & (1 << i))
8456 {
8457 if (first)
8458 first = FALSE;
8459 else
8460 printf (", ");
8461 printf ("r%d", 4 + i);
8462 }
8463 printf ("}");
8464 }
8465 }
8466 else if ((op & 0xf0) == 0x90)
8467 {
8468 if (op == 0x9d || op == 0x9f)
8469 printf (_(" [Reserved]"));
8470 else
8471 printf (" vsp = r%d", op & 0x0f);
8472 }
8473 else if ((op & 0xf0) == 0xa0)
8474 {
8475 int end = 4 + (op & 0x07);
8476 bfd_boolean first = TRUE;
8477 int i;
8478
8479 printf (" pop {");
8480 for (i = 4; i <= end; i++)
8481 {
8482 if (first)
8483 first = FALSE;
8484 else
8485 printf (", ");
8486 printf ("r%d", i);
8487 }
8488 if (op & 0x08)
8489 {
8490 if (!first)
8491 printf (", ");
8492 printf ("r14");
8493 }
8494 printf ("}");
8495 }
8496 else if (op == 0xb0)
8497 printf (_(" finish"));
8498 else if (op == 0xb1)
8499 {
8500 GET_OP (op2);
8501 if (op2 == 0 || (op2 & 0xf0) != 0)
8502 printf (_("[Spare]"));
8503 else
8504 {
8505 unsigned int mask = op2 & 0x0f;
8506 bfd_boolean first = TRUE;
8507 int i;
8508
8509 printf ("pop {");
8510 for (i = 0; i < 12; i++)
8511 if (mask & (1 << i))
8512 {
8513 if (first)
8514 first = FALSE;
8515 else
8516 printf (", ");
8517 printf ("r%d", i);
8518 }
8519 printf ("}");
8520 }
8521 }
8522 else if (op == 0xb2)
8523 {
8524 unsigned char buf[9];
8525 unsigned int i, len;
8526 unsigned long offset;
8527
8528 for (i = 0; i < sizeof (buf); i++)
8529 {
8530 GET_OP (buf[i]);
8531 if ((buf[i] & 0x80) == 0)
8532 break;
8533 }
8534 if (i == sizeof (buf))
8535 {
8536 error (_("corrupt change to vsp"));
8537 res = FALSE;
8538 }
8539 else
8540 {
8541 offset = read_uleb128 (buf, &len, buf + i + 1);
8542 assert (len == i + 1);
8543 offset = offset * 4 + 0x204;
8544 printf ("vsp = vsp + %ld", offset);
8545 }
8546 }
8547 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8548 {
8549 unsigned int first, last;
8550
8551 GET_OP (op2);
8552 first = op2 >> 4;
8553 last = op2 & 0x0f;
8554 if (op == 0xc8)
8555 first = first + 16;
8556 printf ("pop {D%d", first);
8557 if (last)
8558 printf ("-D%d", first + last);
8559 printf ("}");
8560 }
8561 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8562 {
8563 unsigned int count = op & 0x07;
8564
8565 printf ("pop {D8");
8566 if (count)
8567 printf ("-D%d", 8 + count);
8568 printf ("}");
8569 }
8570 else if (op >= 0xc0 && op <= 0xc5)
8571 {
8572 unsigned int count = op & 0x07;
8573
8574 printf (" pop {wR10");
8575 if (count)
8576 printf ("-wR%d", 10 + count);
8577 printf ("}");
8578 }
8579 else if (op == 0xc6)
8580 {
8581 unsigned int first, last;
8582
8583 GET_OP (op2);
8584 first = op2 >> 4;
8585 last = op2 & 0x0f;
8586 printf ("pop {wR%d", first);
8587 if (last)
8588 printf ("-wR%d", first + last);
8589 printf ("}");
8590 }
8591 else if (op == 0xc7)
8592 {
8593 GET_OP (op2);
8594 if (op2 == 0 || (op2 & 0xf0) != 0)
8595 printf (_("[Spare]"));
8596 else
8597 {
8598 unsigned int mask = op2 & 0x0f;
8599 bfd_boolean first = TRUE;
8600 int i;
8601
8602 printf ("pop {");
8603 for (i = 0; i < 4; i++)
8604 if (mask & (1 << i))
8605 {
8606 if (first)
8607 first = FALSE;
8608 else
8609 printf (", ");
8610 printf ("wCGR%d", i);
8611 }
8612 printf ("}");
8613 }
8614 }
8615 else
8616 {
8617 printf (_(" [unsupported opcode]"));
8618 res = FALSE;
8619 }
8620
8621 printf ("\n");
8622 }
8623
8624 return res;
8625 }
8626
8627 static bfd_boolean
8628 decode_tic6x_unwind_bytecode (Filedata * filedata,
8629 struct arm_unw_aux_info * aux,
8630 unsigned int word,
8631 unsigned int remaining,
8632 unsigned int more_words,
8633 bfd_vma data_offset,
8634 Elf_Internal_Shdr * data_sec,
8635 struct arm_section * data_arm_sec)
8636 {
8637 struct absaddr addr;
8638
8639 /* Decode the unwinding instructions. */
8640 while (1)
8641 {
8642 unsigned int op, op2;
8643
8644 ADVANCE;
8645 if (remaining == 0)
8646 break;
8647 remaining--;
8648 op = word >> 24;
8649 word <<= 8;
8650
8651 printf (" 0x%02x ", op);
8652
8653 if ((op & 0xc0) == 0x00)
8654 {
8655 int offset = ((op & 0x3f) << 3) + 8;
8656 printf (" sp = sp + %d", offset);
8657 }
8658 else if ((op & 0xc0) == 0x80)
8659 {
8660 GET_OP (op2);
8661 if (op == 0x80 && op2 == 0)
8662 printf (_("Refuse to unwind"));
8663 else
8664 {
8665 unsigned int mask = ((op & 0x1f) << 8) | op2;
8666 if (op & 0x20)
8667 printf ("pop compact {");
8668 else
8669 printf ("pop {");
8670
8671 decode_tic6x_unwind_regmask (mask);
8672 printf("}");
8673 }
8674 }
8675 else if ((op & 0xf0) == 0xc0)
8676 {
8677 unsigned int reg;
8678 unsigned int nregs;
8679 unsigned int i;
8680 const char *name;
8681 struct
8682 {
8683 unsigned int offset;
8684 unsigned int reg;
8685 } regpos[16];
8686
8687 /* Scan entire instruction first so that GET_OP output is not
8688 interleaved with disassembly. */
8689 nregs = 0;
8690 for (i = 0; nregs < (op & 0xf); i++)
8691 {
8692 GET_OP (op2);
8693 reg = op2 >> 4;
8694 if (reg != 0xf)
8695 {
8696 regpos[nregs].offset = i * 2;
8697 regpos[nregs].reg = reg;
8698 nregs++;
8699 }
8700
8701 reg = op2 & 0xf;
8702 if (reg != 0xf)
8703 {
8704 regpos[nregs].offset = i * 2 + 1;
8705 regpos[nregs].reg = reg;
8706 nregs++;
8707 }
8708 }
8709
8710 printf (_("pop frame {"));
8711 reg = nregs - 1;
8712 for (i = i * 2; i > 0; i--)
8713 {
8714 if (regpos[reg].offset == i - 1)
8715 {
8716 name = tic6x_unwind_regnames[regpos[reg].reg];
8717 if (reg > 0)
8718 reg--;
8719 }
8720 else
8721 name = _("[pad]");
8722
8723 fputs (name, stdout);
8724 if (i > 1)
8725 printf (", ");
8726 }
8727
8728 printf ("}");
8729 }
8730 else if (op == 0xd0)
8731 printf (" MOV FP, SP");
8732 else if (op == 0xd1)
8733 printf (" __c6xabi_pop_rts");
8734 else if (op == 0xd2)
8735 {
8736 unsigned char buf[9];
8737 unsigned int i, len;
8738 unsigned long offset;
8739
8740 for (i = 0; i < sizeof (buf); i++)
8741 {
8742 GET_OP (buf[i]);
8743 if ((buf[i] & 0x80) == 0)
8744 break;
8745 }
8746 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8747 if (i == sizeof (buf))
8748 {
8749 warn (_("Corrupt stack pointer adjustment detected\n"));
8750 return FALSE;
8751 }
8752
8753 offset = read_uleb128 (buf, &len, buf + i + 1);
8754 assert (len == i + 1);
8755 offset = offset * 8 + 0x408;
8756 printf (_("sp = sp + %ld"), offset);
8757 }
8758 else if ((op & 0xf0) == 0xe0)
8759 {
8760 if ((op & 0x0f) == 7)
8761 printf (" RETURN");
8762 else
8763 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8764 }
8765 else
8766 {
8767 printf (_(" [unsupported opcode]"));
8768 }
8769 putchar ('\n');
8770 }
8771
8772 return TRUE;
8773 }
8774
8775 static bfd_vma
8776 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8777 {
8778 bfd_vma offset;
8779
8780 offset = word & 0x7fffffff;
8781 if (offset & 0x40000000)
8782 offset |= ~ (bfd_vma) 0x7fffffff;
8783
8784 if (filedata->file_header.e_machine == EM_TI_C6000)
8785 offset <<= 1;
8786
8787 return offset + where;
8788 }
8789
8790 static bfd_boolean
8791 decode_arm_unwind (Filedata * filedata,
8792 struct arm_unw_aux_info * aux,
8793 unsigned int word,
8794 unsigned int remaining,
8795 bfd_vma data_offset,
8796 Elf_Internal_Shdr * data_sec,
8797 struct arm_section * data_arm_sec)
8798 {
8799 int per_index;
8800 unsigned int more_words = 0;
8801 struct absaddr addr;
8802 bfd_vma sym_name = (bfd_vma) -1;
8803 bfd_boolean res = TRUE;
8804
8805 if (remaining == 0)
8806 {
8807 /* Fetch the first word.
8808 Note - when decoding an object file the address extracted
8809 here will always be 0. So we also pass in the sym_name
8810 parameter so that we can find the symbol associated with
8811 the personality routine. */
8812 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8813 & word, & addr, & sym_name))
8814 return FALSE;
8815
8816 remaining = 4;
8817 }
8818
8819 if ((word & 0x80000000) == 0)
8820 {
8821 /* Expand prel31 for personality routine. */
8822 bfd_vma fn;
8823 const char *procname;
8824
8825 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8826 printf (_(" Personality routine: "));
8827 if (fn == 0
8828 && addr.section == SHN_UNDEF && addr.offset == 0
8829 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8830 {
8831 procname = aux->strtab + sym_name;
8832 print_vma (fn, PREFIX_HEX);
8833 if (procname)
8834 {
8835 fputs (" <", stdout);
8836 fputs (procname, stdout);
8837 fputc ('>', stdout);
8838 }
8839 }
8840 else
8841 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8842 fputc ('\n', stdout);
8843
8844 /* The GCC personality routines use the standard compact
8845 encoding, starting with one byte giving the number of
8846 words. */
8847 if (procname != NULL
8848 && (const_strneq (procname, "__gcc_personality_v0")
8849 || const_strneq (procname, "__gxx_personality_v0")
8850 || const_strneq (procname, "__gcj_personality_v0")
8851 || const_strneq (procname, "__gnu_objc_personality_v0")))
8852 {
8853 remaining = 0;
8854 more_words = 1;
8855 ADVANCE;
8856 if (!remaining)
8857 {
8858 printf (_(" [Truncated data]\n"));
8859 return FALSE;
8860 }
8861 more_words = word >> 24;
8862 word <<= 8;
8863 remaining--;
8864 per_index = -1;
8865 }
8866 else
8867 return TRUE;
8868 }
8869 else
8870 {
8871 /* ARM EHABI Section 6.3:
8872
8873 An exception-handling table entry for the compact model looks like:
8874
8875 31 30-28 27-24 23-0
8876 -- ----- ----- ----
8877 1 0 index Data for personalityRoutine[index] */
8878
8879 if (filedata->file_header.e_machine == EM_ARM
8880 && (word & 0x70000000))
8881 {
8882 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8883 res = FALSE;
8884 }
8885
8886 per_index = (word >> 24) & 0x7f;
8887 printf (_(" Compact model index: %d\n"), per_index);
8888 if (per_index == 0)
8889 {
8890 more_words = 0;
8891 word <<= 8;
8892 remaining--;
8893 }
8894 else if (per_index < 3)
8895 {
8896 more_words = (word >> 16) & 0xff;
8897 word <<= 16;
8898 remaining -= 2;
8899 }
8900 }
8901
8902 switch (filedata->file_header.e_machine)
8903 {
8904 case EM_ARM:
8905 if (per_index < 3)
8906 {
8907 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8908 data_offset, data_sec, data_arm_sec))
8909 res = FALSE;
8910 }
8911 else
8912 {
8913 warn (_("Unknown ARM compact model index encountered\n"));
8914 printf (_(" [reserved]\n"));
8915 res = FALSE;
8916 }
8917 break;
8918
8919 case EM_TI_C6000:
8920 if (per_index < 3)
8921 {
8922 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8923 data_offset, data_sec, data_arm_sec))
8924 res = FALSE;
8925 }
8926 else if (per_index < 5)
8927 {
8928 if (((word >> 17) & 0x7f) == 0x7f)
8929 printf (_(" Restore stack from frame pointer\n"));
8930 else
8931 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8932 printf (_(" Registers restored: "));
8933 if (per_index == 4)
8934 printf (" (compact) ");
8935 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8936 putchar ('\n');
8937 printf (_(" Return register: %s\n"),
8938 tic6x_unwind_regnames[word & 0xf]);
8939 }
8940 else
8941 printf (_(" [reserved (%d)]\n"), per_index);
8942 break;
8943
8944 default:
8945 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8946 filedata->file_header.e_machine);
8947 res = FALSE;
8948 }
8949
8950 /* Decode the descriptors. Not implemented. */
8951
8952 return res;
8953 }
8954
8955 static bfd_boolean
8956 dump_arm_unwind (Filedata * filedata,
8957 struct arm_unw_aux_info * aux,
8958 Elf_Internal_Shdr * exidx_sec)
8959 {
8960 struct arm_section exidx_arm_sec, extab_arm_sec;
8961 unsigned int i, exidx_len;
8962 unsigned long j, nfuns;
8963 bfd_boolean res = TRUE;
8964
8965 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8966 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8967 exidx_len = exidx_sec->sh_size / 8;
8968
8969 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8970 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8971 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8972 aux->funtab[nfuns++] = aux->symtab[j];
8973 aux->nfuns = nfuns;
8974 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8975
8976 for (i = 0; i < exidx_len; i++)
8977 {
8978 unsigned int exidx_fn, exidx_entry;
8979 struct absaddr fn_addr, entry_addr;
8980 bfd_vma fn;
8981
8982 fputc ('\n', stdout);
8983
8984 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8985 8 * i, & exidx_fn, & fn_addr, NULL)
8986 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8987 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8988 {
8989 free (aux->funtab);
8990 arm_free_section (& exidx_arm_sec);
8991 arm_free_section (& extab_arm_sec);
8992 return FALSE;
8993 }
8994
8995 /* ARM EHABI, Section 5:
8996 An index table entry consists of 2 words.
8997 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8998 if (exidx_fn & 0x80000000)
8999 {
9000 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9001 res = FALSE;
9002 }
9003
9004 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9005
9006 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9007 fputs (": ", stdout);
9008
9009 if (exidx_entry == 1)
9010 {
9011 print_vma (exidx_entry, PREFIX_HEX);
9012 fputs (" [cantunwind]\n", stdout);
9013 }
9014 else if (exidx_entry & 0x80000000)
9015 {
9016 print_vma (exidx_entry, PREFIX_HEX);
9017 fputc ('\n', stdout);
9018 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9019 }
9020 else
9021 {
9022 bfd_vma table, table_offset = 0;
9023 Elf_Internal_Shdr *table_sec;
9024
9025 fputs ("@", stdout);
9026 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9027 print_vma (table, PREFIX_HEX);
9028 printf ("\n");
9029
9030 /* Locate the matching .ARM.extab. */
9031 if (entry_addr.section != SHN_UNDEF
9032 && entry_addr.section < filedata->file_header.e_shnum)
9033 {
9034 table_sec = filedata->section_headers + entry_addr.section;
9035 table_offset = entry_addr.offset;
9036 /* PR 18879 */
9037 if (table_offset > table_sec->sh_size
9038 || ((bfd_signed_vma) table_offset) < 0)
9039 {
9040 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9041 (unsigned long) table_offset,
9042 printable_section_name (filedata, table_sec));
9043 res = FALSE;
9044 continue;
9045 }
9046 }
9047 else
9048 {
9049 table_sec = find_section_by_address (filedata, table);
9050 if (table_sec != NULL)
9051 table_offset = table - table_sec->sh_addr;
9052 }
9053
9054 if (table_sec == NULL)
9055 {
9056 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9057 (unsigned long) table);
9058 res = FALSE;
9059 continue;
9060 }
9061
9062 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9063 &extab_arm_sec))
9064 res = FALSE;
9065 }
9066 }
9067
9068 printf ("\n");
9069
9070 free (aux->funtab);
9071 arm_free_section (&exidx_arm_sec);
9072 arm_free_section (&extab_arm_sec);
9073
9074 return res;
9075 }
9076
9077 /* Used for both ARM and C6X unwinding tables. */
9078
9079 static bfd_boolean
9080 arm_process_unwind (Filedata * filedata)
9081 {
9082 struct arm_unw_aux_info aux;
9083 Elf_Internal_Shdr *unwsec = NULL;
9084 Elf_Internal_Shdr *strsec;
9085 Elf_Internal_Shdr *sec;
9086 unsigned long i;
9087 unsigned int sec_type;
9088 bfd_boolean res = TRUE;
9089
9090 switch (filedata->file_header.e_machine)
9091 {
9092 case EM_ARM:
9093 sec_type = SHT_ARM_EXIDX;
9094 break;
9095
9096 case EM_TI_C6000:
9097 sec_type = SHT_C6000_UNWIND;
9098 break;
9099
9100 default:
9101 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9102 filedata->file_header.e_machine);
9103 return FALSE;
9104 }
9105
9106 if (filedata->string_table == NULL)
9107 return FALSE;
9108
9109 memset (& aux, 0, sizeof (aux));
9110 aux.filedata = filedata;
9111
9112 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9113 {
9114 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9115 {
9116 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9117
9118 strsec = filedata->section_headers + sec->sh_link;
9119
9120 /* PR binutils/17531 file: 011-12666-0.004. */
9121 if (aux.strtab != NULL)
9122 {
9123 error (_("Multiple string tables found in file.\n"));
9124 free (aux.strtab);
9125 res = FALSE;
9126 }
9127 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9128 1, strsec->sh_size, _("string table"));
9129 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9130 }
9131 else if (sec->sh_type == sec_type)
9132 unwsec = sec;
9133 }
9134
9135 if (unwsec == NULL)
9136 printf (_("\nThere are no unwind sections in this file.\n"));
9137 else
9138 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9139 {
9140 if (sec->sh_type == sec_type)
9141 {
9142 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9143 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9144 "contains %lu entry:\n",
9145 "\nUnwind section '%s' at offset 0x%lx "
9146 "contains %lu entries:\n",
9147 num_unwind),
9148 printable_section_name (filedata, sec),
9149 (unsigned long) sec->sh_offset,
9150 num_unwind);
9151
9152 if (! dump_arm_unwind (filedata, &aux, sec))
9153 res = FALSE;
9154 }
9155 }
9156
9157 if (aux.symtab)
9158 free (aux.symtab);
9159 if (aux.strtab)
9160 free ((char *) aux.strtab);
9161
9162 return res;
9163 }
9164
9165 static bfd_boolean
9166 process_unwind (Filedata * filedata)
9167 {
9168 struct unwind_handler
9169 {
9170 unsigned int machtype;
9171 bfd_boolean (* handler)(Filedata *);
9172 } handlers[] =
9173 {
9174 { EM_ARM, arm_process_unwind },
9175 { EM_IA_64, ia64_process_unwind },
9176 { EM_PARISC, hppa_process_unwind },
9177 { EM_TI_C6000, arm_process_unwind },
9178 { 0, NULL }
9179 };
9180 int i;
9181
9182 if (!do_unwind)
9183 return TRUE;
9184
9185 for (i = 0; handlers[i].handler != NULL; i++)
9186 if (filedata->file_header.e_machine == handlers[i].machtype)
9187 return handlers[i].handler (filedata);
9188
9189 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9190 get_machine_name (filedata->file_header.e_machine));
9191 return TRUE;
9192 }
9193
9194 static void
9195 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9196 {
9197 switch (entry->d_tag)
9198 {
9199 case DT_MIPS_FLAGS:
9200 if (entry->d_un.d_val == 0)
9201 printf (_("NONE"));
9202 else
9203 {
9204 static const char * opts[] =
9205 {
9206 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9207 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9208 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9209 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9210 "RLD_ORDER_SAFE"
9211 };
9212 unsigned int cnt;
9213 bfd_boolean first = TRUE;
9214
9215 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9216 if (entry->d_un.d_val & (1 << cnt))
9217 {
9218 printf ("%s%s", first ? "" : " ", opts[cnt]);
9219 first = FALSE;
9220 }
9221 }
9222 break;
9223
9224 case DT_MIPS_IVERSION:
9225 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9226 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9227 else
9228 {
9229 char buf[40];
9230 sprintf_vma (buf, entry->d_un.d_ptr);
9231 /* Note: coded this way so that there is a single string for translation. */
9232 printf (_("<corrupt: %s>"), buf);
9233 }
9234 break;
9235
9236 case DT_MIPS_TIME_STAMP:
9237 {
9238 char timebuf[128];
9239 struct tm * tmp;
9240 time_t atime = entry->d_un.d_val;
9241
9242 tmp = gmtime (&atime);
9243 /* PR 17531: file: 6accc532. */
9244 if (tmp == NULL)
9245 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9246 else
9247 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9248 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9249 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9250 printf (_("Time Stamp: %s"), timebuf);
9251 }
9252 break;
9253
9254 case DT_MIPS_RLD_VERSION:
9255 case DT_MIPS_LOCAL_GOTNO:
9256 case DT_MIPS_CONFLICTNO:
9257 case DT_MIPS_LIBLISTNO:
9258 case DT_MIPS_SYMTABNO:
9259 case DT_MIPS_UNREFEXTNO:
9260 case DT_MIPS_HIPAGENO:
9261 case DT_MIPS_DELTA_CLASS_NO:
9262 case DT_MIPS_DELTA_INSTANCE_NO:
9263 case DT_MIPS_DELTA_RELOC_NO:
9264 case DT_MIPS_DELTA_SYM_NO:
9265 case DT_MIPS_DELTA_CLASSSYM_NO:
9266 case DT_MIPS_COMPACT_SIZE:
9267 print_vma (entry->d_un.d_val, DEC);
9268 break;
9269
9270 default:
9271 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9272 }
9273 putchar ('\n');
9274 }
9275
9276 static void
9277 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9278 {
9279 switch (entry->d_tag)
9280 {
9281 case DT_HP_DLD_FLAGS:
9282 {
9283 static struct
9284 {
9285 long int bit;
9286 const char * str;
9287 }
9288 flags[] =
9289 {
9290 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9291 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9292 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9293 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9294 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9295 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9296 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9297 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9298 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9299 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9300 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9301 { DT_HP_GST, "HP_GST" },
9302 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9303 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9304 { DT_HP_NODELETE, "HP_NODELETE" },
9305 { DT_HP_GROUP, "HP_GROUP" },
9306 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9307 };
9308 bfd_boolean first = TRUE;
9309 size_t cnt;
9310 bfd_vma val = entry->d_un.d_val;
9311
9312 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9313 if (val & flags[cnt].bit)
9314 {
9315 if (! first)
9316 putchar (' ');
9317 fputs (flags[cnt].str, stdout);
9318 first = FALSE;
9319 val ^= flags[cnt].bit;
9320 }
9321
9322 if (val != 0 || first)
9323 {
9324 if (! first)
9325 putchar (' ');
9326 print_vma (val, HEX);
9327 }
9328 }
9329 break;
9330
9331 default:
9332 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9333 break;
9334 }
9335 putchar ('\n');
9336 }
9337
9338 #ifdef BFD64
9339
9340 /* VMS vs Unix time offset and factor. */
9341
9342 #define VMS_EPOCH_OFFSET 35067168000000000LL
9343 #define VMS_GRANULARITY_FACTOR 10000000
9344
9345 /* Display a VMS time in a human readable format. */
9346
9347 static void
9348 print_vms_time (bfd_int64_t vmstime)
9349 {
9350 struct tm *tm;
9351 time_t unxtime;
9352
9353 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9354 tm = gmtime (&unxtime);
9355 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9356 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9357 tm->tm_hour, tm->tm_min, tm->tm_sec);
9358 }
9359 #endif /* BFD64 */
9360
9361 static void
9362 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9363 {
9364 switch (entry->d_tag)
9365 {
9366 case DT_IA_64_PLT_RESERVE:
9367 /* First 3 slots reserved. */
9368 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9369 printf (" -- ");
9370 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9371 break;
9372
9373 case DT_IA_64_VMS_LINKTIME:
9374 #ifdef BFD64
9375 print_vms_time (entry->d_un.d_val);
9376 #endif
9377 break;
9378
9379 case DT_IA_64_VMS_LNKFLAGS:
9380 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9381 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9382 printf (" CALL_DEBUG");
9383 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9384 printf (" NOP0BUFS");
9385 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9386 printf (" P0IMAGE");
9387 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9388 printf (" MKTHREADS");
9389 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9390 printf (" UPCALLS");
9391 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9392 printf (" IMGSTA");
9393 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9394 printf (" INITIALIZE");
9395 if (entry->d_un.d_val & VMS_LF_MAIN)
9396 printf (" MAIN");
9397 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9398 printf (" EXE_INIT");
9399 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9400 printf (" TBK_IN_IMG");
9401 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9402 printf (" DBG_IN_IMG");
9403 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9404 printf (" TBK_IN_DSF");
9405 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9406 printf (" DBG_IN_DSF");
9407 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9408 printf (" SIGNATURES");
9409 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9410 printf (" REL_SEG_OFF");
9411 break;
9412
9413 default:
9414 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9415 break;
9416 }
9417 putchar ('\n');
9418 }
9419
9420 static bfd_boolean
9421 get_32bit_dynamic_section (Filedata * filedata)
9422 {
9423 Elf32_External_Dyn * edyn;
9424 Elf32_External_Dyn * ext;
9425 Elf_Internal_Dyn * entry;
9426
9427 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9428 dynamic_size, _("dynamic section"));
9429 if (!edyn)
9430 return FALSE;
9431
9432 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9433 might not have the luxury of section headers. Look for the DT_NULL
9434 terminator to determine the number of entries. */
9435 for (ext = edyn, dynamic_nent = 0;
9436 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9437 ext++)
9438 {
9439 dynamic_nent++;
9440 if (BYTE_GET (ext->d_tag) == DT_NULL)
9441 break;
9442 }
9443
9444 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9445 sizeof (* entry));
9446 if (dynamic_section == NULL)
9447 {
9448 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9449 (unsigned long) dynamic_nent);
9450 free (edyn);
9451 return FALSE;
9452 }
9453
9454 for (ext = edyn, entry = dynamic_section;
9455 entry < dynamic_section + dynamic_nent;
9456 ext++, entry++)
9457 {
9458 entry->d_tag = BYTE_GET (ext->d_tag);
9459 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9460 }
9461
9462 free (edyn);
9463
9464 return TRUE;
9465 }
9466
9467 static bfd_boolean
9468 get_64bit_dynamic_section (Filedata * filedata)
9469 {
9470 Elf64_External_Dyn * edyn;
9471 Elf64_External_Dyn * ext;
9472 Elf_Internal_Dyn * entry;
9473
9474 /* Read in the data. */
9475 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9476 dynamic_size, _("dynamic section"));
9477 if (!edyn)
9478 return FALSE;
9479
9480 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9481 might not have the luxury of section headers. Look for the DT_NULL
9482 terminator to determine the number of entries. */
9483 for (ext = edyn, dynamic_nent = 0;
9484 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9485 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9486 ext++)
9487 {
9488 dynamic_nent++;
9489 if (BYTE_GET (ext->d_tag) == DT_NULL)
9490 break;
9491 }
9492
9493 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9494 sizeof (* entry));
9495 if (dynamic_section == NULL)
9496 {
9497 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9498 (unsigned long) dynamic_nent);
9499 free (edyn);
9500 return FALSE;
9501 }
9502
9503 /* Convert from external to internal formats. */
9504 for (ext = edyn, entry = dynamic_section;
9505 entry < dynamic_section + dynamic_nent;
9506 ext++, entry++)
9507 {
9508 entry->d_tag = BYTE_GET (ext->d_tag);
9509 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9510 }
9511
9512 free (edyn);
9513
9514 return TRUE;
9515 }
9516
9517 static void
9518 print_dynamic_flags (bfd_vma flags)
9519 {
9520 bfd_boolean first = TRUE;
9521
9522 while (flags)
9523 {
9524 bfd_vma flag;
9525
9526 flag = flags & - flags;
9527 flags &= ~ flag;
9528
9529 if (first)
9530 first = FALSE;
9531 else
9532 putc (' ', stdout);
9533
9534 switch (flag)
9535 {
9536 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9537 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9538 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9539 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9540 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9541 default: fputs (_("unknown"), stdout); break;
9542 }
9543 }
9544 puts ("");
9545 }
9546
9547 /* Parse and display the contents of the dynamic section. */
9548
9549 static bfd_boolean
9550 process_dynamic_section (Filedata * filedata)
9551 {
9552 Elf_Internal_Dyn * entry;
9553
9554 if (dynamic_size == 0)
9555 {
9556 if (do_dynamic)
9557 printf (_("\nThere is no dynamic section in this file.\n"));
9558
9559 return TRUE;
9560 }
9561
9562 if (is_32bit_elf)
9563 {
9564 if (! get_32bit_dynamic_section (filedata))
9565 return FALSE;
9566 }
9567 else
9568 {
9569 if (! get_64bit_dynamic_section (filedata))
9570 return FALSE;
9571 }
9572
9573 /* Find the appropriate symbol table. */
9574 if (dynamic_symbols == NULL)
9575 {
9576 for (entry = dynamic_section;
9577 entry < dynamic_section + dynamic_nent;
9578 ++entry)
9579 {
9580 Elf_Internal_Shdr section;
9581
9582 if (entry->d_tag != DT_SYMTAB)
9583 continue;
9584
9585 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9586
9587 /* Since we do not know how big the symbol table is,
9588 we default to reading in the entire file (!) and
9589 processing that. This is overkill, I know, but it
9590 should work. */
9591 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9592 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9593 {
9594 /* See PR 21379 for a reproducer. */
9595 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9596 return FALSE;
9597 }
9598
9599 if (archive_file_offset != 0)
9600 section.sh_size = archive_file_size - section.sh_offset;
9601 else
9602 section.sh_size = filedata->file_size - section.sh_offset;
9603
9604 if (is_32bit_elf)
9605 section.sh_entsize = sizeof (Elf32_External_Sym);
9606 else
9607 section.sh_entsize = sizeof (Elf64_External_Sym);
9608 section.sh_name = filedata->string_table_length;
9609
9610 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9611 if (num_dynamic_syms < 1)
9612 {
9613 error (_("Unable to determine the number of symbols to load\n"));
9614 continue;
9615 }
9616 }
9617 }
9618
9619 /* Similarly find a string table. */
9620 if (dynamic_strings == NULL)
9621 {
9622 for (entry = dynamic_section;
9623 entry < dynamic_section + dynamic_nent;
9624 ++entry)
9625 {
9626 unsigned long offset;
9627 long str_tab_len;
9628
9629 if (entry->d_tag != DT_STRTAB)
9630 continue;
9631
9632 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9633
9634 /* Since we do not know how big the string table is,
9635 we default to reading in the entire file (!) and
9636 processing that. This is overkill, I know, but it
9637 should work. */
9638
9639 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9640
9641 if (archive_file_offset != 0)
9642 str_tab_len = archive_file_size - offset;
9643 else
9644 str_tab_len = filedata->file_size - offset;
9645
9646 if (str_tab_len < 1)
9647 {
9648 error
9649 (_("Unable to determine the length of the dynamic string table\n"));
9650 continue;
9651 }
9652
9653 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9654 str_tab_len,
9655 _("dynamic string table"));
9656 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9657 break;
9658 }
9659 }
9660
9661 /* And find the syminfo section if available. */
9662 if (dynamic_syminfo == NULL)
9663 {
9664 unsigned long syminsz = 0;
9665
9666 for (entry = dynamic_section;
9667 entry < dynamic_section + dynamic_nent;
9668 ++entry)
9669 {
9670 if (entry->d_tag == DT_SYMINENT)
9671 {
9672 /* Note: these braces are necessary to avoid a syntax
9673 error from the SunOS4 C compiler. */
9674 /* PR binutils/17531: A corrupt file can trigger this test.
9675 So do not use an assert, instead generate an error message. */
9676 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9677 error (_("Bad value (%d) for SYMINENT entry\n"),
9678 (int) entry->d_un.d_val);
9679 }
9680 else if (entry->d_tag == DT_SYMINSZ)
9681 syminsz = entry->d_un.d_val;
9682 else if (entry->d_tag == DT_SYMINFO)
9683 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9684 syminsz);
9685 }
9686
9687 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9688 {
9689 Elf_External_Syminfo * extsyminfo;
9690 Elf_External_Syminfo * extsym;
9691 Elf_Internal_Syminfo * syminfo;
9692
9693 /* There is a syminfo section. Read the data. */
9694 extsyminfo = (Elf_External_Syminfo *)
9695 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9696 _("symbol information"));
9697 if (!extsyminfo)
9698 return FALSE;
9699
9700 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9701 if (dynamic_syminfo == NULL)
9702 {
9703 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9704 (unsigned long) syminsz);
9705 return FALSE;
9706 }
9707
9708 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9709 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9710 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9711 ++syminfo, ++extsym)
9712 {
9713 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9714 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9715 }
9716
9717 free (extsyminfo);
9718 }
9719 }
9720
9721 if (do_dynamic && dynamic_addr)
9722 printf (ngettext ("\nDynamic section at offset 0x%lx "
9723 "contains %lu entry:\n",
9724 "\nDynamic section at offset 0x%lx "
9725 "contains %lu entries:\n",
9726 dynamic_nent),
9727 dynamic_addr, (unsigned long) dynamic_nent);
9728 if (do_dynamic)
9729 printf (_(" Tag Type Name/Value\n"));
9730
9731 for (entry = dynamic_section;
9732 entry < dynamic_section + dynamic_nent;
9733 entry++)
9734 {
9735 if (do_dynamic)
9736 {
9737 const char * dtype;
9738
9739 putchar (' ');
9740 print_vma (entry->d_tag, FULL_HEX);
9741 dtype = get_dynamic_type (filedata, entry->d_tag);
9742 printf (" (%s)%*s", dtype,
9743 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9744 }
9745
9746 switch (entry->d_tag)
9747 {
9748 case DT_FLAGS:
9749 if (do_dynamic)
9750 print_dynamic_flags (entry->d_un.d_val);
9751 break;
9752
9753 case DT_AUXILIARY:
9754 case DT_FILTER:
9755 case DT_CONFIG:
9756 case DT_DEPAUDIT:
9757 case DT_AUDIT:
9758 if (do_dynamic)
9759 {
9760 switch (entry->d_tag)
9761 {
9762 case DT_AUXILIARY:
9763 printf (_("Auxiliary library"));
9764 break;
9765
9766 case DT_FILTER:
9767 printf (_("Filter library"));
9768 break;
9769
9770 case DT_CONFIG:
9771 printf (_("Configuration file"));
9772 break;
9773
9774 case DT_DEPAUDIT:
9775 printf (_("Dependency audit library"));
9776 break;
9777
9778 case DT_AUDIT:
9779 printf (_("Audit library"));
9780 break;
9781 }
9782
9783 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9784 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9785 else
9786 {
9787 printf (": ");
9788 print_vma (entry->d_un.d_val, PREFIX_HEX);
9789 putchar ('\n');
9790 }
9791 }
9792 break;
9793
9794 case DT_FEATURE:
9795 if (do_dynamic)
9796 {
9797 printf (_("Flags:"));
9798
9799 if (entry->d_un.d_val == 0)
9800 printf (_(" None\n"));
9801 else
9802 {
9803 unsigned long int val = entry->d_un.d_val;
9804
9805 if (val & DTF_1_PARINIT)
9806 {
9807 printf (" PARINIT");
9808 val ^= DTF_1_PARINIT;
9809 }
9810 if (val & DTF_1_CONFEXP)
9811 {
9812 printf (" CONFEXP");
9813 val ^= DTF_1_CONFEXP;
9814 }
9815 if (val != 0)
9816 printf (" %lx", val);
9817 puts ("");
9818 }
9819 }
9820 break;
9821
9822 case DT_POSFLAG_1:
9823 if (do_dynamic)
9824 {
9825 printf (_("Flags:"));
9826
9827 if (entry->d_un.d_val == 0)
9828 printf (_(" None\n"));
9829 else
9830 {
9831 unsigned long int val = entry->d_un.d_val;
9832
9833 if (val & DF_P1_LAZYLOAD)
9834 {
9835 printf (" LAZYLOAD");
9836 val ^= DF_P1_LAZYLOAD;
9837 }
9838 if (val & DF_P1_GROUPPERM)
9839 {
9840 printf (" GROUPPERM");
9841 val ^= DF_P1_GROUPPERM;
9842 }
9843 if (val != 0)
9844 printf (" %lx", val);
9845 puts ("");
9846 }
9847 }
9848 break;
9849
9850 case DT_FLAGS_1:
9851 if (do_dynamic)
9852 {
9853 printf (_("Flags:"));
9854 if (entry->d_un.d_val == 0)
9855 printf (_(" None\n"));
9856 else
9857 {
9858 unsigned long int val = entry->d_un.d_val;
9859
9860 if (val & DF_1_NOW)
9861 {
9862 printf (" NOW");
9863 val ^= DF_1_NOW;
9864 }
9865 if (val & DF_1_GLOBAL)
9866 {
9867 printf (" GLOBAL");
9868 val ^= DF_1_GLOBAL;
9869 }
9870 if (val & DF_1_GROUP)
9871 {
9872 printf (" GROUP");
9873 val ^= DF_1_GROUP;
9874 }
9875 if (val & DF_1_NODELETE)
9876 {
9877 printf (" NODELETE");
9878 val ^= DF_1_NODELETE;
9879 }
9880 if (val & DF_1_LOADFLTR)
9881 {
9882 printf (" LOADFLTR");
9883 val ^= DF_1_LOADFLTR;
9884 }
9885 if (val & DF_1_INITFIRST)
9886 {
9887 printf (" INITFIRST");
9888 val ^= DF_1_INITFIRST;
9889 }
9890 if (val & DF_1_NOOPEN)
9891 {
9892 printf (" NOOPEN");
9893 val ^= DF_1_NOOPEN;
9894 }
9895 if (val & DF_1_ORIGIN)
9896 {
9897 printf (" ORIGIN");
9898 val ^= DF_1_ORIGIN;
9899 }
9900 if (val & DF_1_DIRECT)
9901 {
9902 printf (" DIRECT");
9903 val ^= DF_1_DIRECT;
9904 }
9905 if (val & DF_1_TRANS)
9906 {
9907 printf (" TRANS");
9908 val ^= DF_1_TRANS;
9909 }
9910 if (val & DF_1_INTERPOSE)
9911 {
9912 printf (" INTERPOSE");
9913 val ^= DF_1_INTERPOSE;
9914 }
9915 if (val & DF_1_NODEFLIB)
9916 {
9917 printf (" NODEFLIB");
9918 val ^= DF_1_NODEFLIB;
9919 }
9920 if (val & DF_1_NODUMP)
9921 {
9922 printf (" NODUMP");
9923 val ^= DF_1_NODUMP;
9924 }
9925 if (val & DF_1_CONFALT)
9926 {
9927 printf (" CONFALT");
9928 val ^= DF_1_CONFALT;
9929 }
9930 if (val & DF_1_ENDFILTEE)
9931 {
9932 printf (" ENDFILTEE");
9933 val ^= DF_1_ENDFILTEE;
9934 }
9935 if (val & DF_1_DISPRELDNE)
9936 {
9937 printf (" DISPRELDNE");
9938 val ^= DF_1_DISPRELDNE;
9939 }
9940 if (val & DF_1_DISPRELPND)
9941 {
9942 printf (" DISPRELPND");
9943 val ^= DF_1_DISPRELPND;
9944 }
9945 if (val & DF_1_NODIRECT)
9946 {
9947 printf (" NODIRECT");
9948 val ^= DF_1_NODIRECT;
9949 }
9950 if (val & DF_1_IGNMULDEF)
9951 {
9952 printf (" IGNMULDEF");
9953 val ^= DF_1_IGNMULDEF;
9954 }
9955 if (val & DF_1_NOKSYMS)
9956 {
9957 printf (" NOKSYMS");
9958 val ^= DF_1_NOKSYMS;
9959 }
9960 if (val & DF_1_NOHDR)
9961 {
9962 printf (" NOHDR");
9963 val ^= DF_1_NOHDR;
9964 }
9965 if (val & DF_1_EDITED)
9966 {
9967 printf (" EDITED");
9968 val ^= DF_1_EDITED;
9969 }
9970 if (val & DF_1_NORELOC)
9971 {
9972 printf (" NORELOC");
9973 val ^= DF_1_NORELOC;
9974 }
9975 if (val & DF_1_SYMINTPOSE)
9976 {
9977 printf (" SYMINTPOSE");
9978 val ^= DF_1_SYMINTPOSE;
9979 }
9980 if (val & DF_1_GLOBAUDIT)
9981 {
9982 printf (" GLOBAUDIT");
9983 val ^= DF_1_GLOBAUDIT;
9984 }
9985 if (val & DF_1_SINGLETON)
9986 {
9987 printf (" SINGLETON");
9988 val ^= DF_1_SINGLETON;
9989 }
9990 if (val & DF_1_STUB)
9991 {
9992 printf (" STUB");
9993 val ^= DF_1_STUB;
9994 }
9995 if (val & DF_1_PIE)
9996 {
9997 printf (" PIE");
9998 val ^= DF_1_PIE;
9999 }
10000 if (val & DF_1_KMOD)
10001 {
10002 printf (" KMOD");
10003 val ^= DF_1_KMOD;
10004 }
10005 if (val & DF_1_WEAKFILTER)
10006 {
10007 printf (" WEAKFILTER");
10008 val ^= DF_1_WEAKFILTER;
10009 }
10010 if (val & DF_1_NOCOMMON)
10011 {
10012 printf (" NOCOMMON");
10013 val ^= DF_1_NOCOMMON;
10014 }
10015 if (val != 0)
10016 printf (" %lx", val);
10017 puts ("");
10018 }
10019 }
10020 break;
10021
10022 case DT_PLTREL:
10023 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10024 if (do_dynamic)
10025 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10026 break;
10027
10028 case DT_NULL :
10029 case DT_NEEDED :
10030 case DT_PLTGOT :
10031 case DT_HASH :
10032 case DT_STRTAB :
10033 case DT_SYMTAB :
10034 case DT_RELA :
10035 case DT_INIT :
10036 case DT_FINI :
10037 case DT_SONAME :
10038 case DT_RPATH :
10039 case DT_SYMBOLIC:
10040 case DT_REL :
10041 case DT_DEBUG :
10042 case DT_TEXTREL :
10043 case DT_JMPREL :
10044 case DT_RUNPATH :
10045 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10046
10047 if (do_dynamic)
10048 {
10049 char * name;
10050
10051 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10052 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10053 else
10054 name = NULL;
10055
10056 if (name)
10057 {
10058 switch (entry->d_tag)
10059 {
10060 case DT_NEEDED:
10061 printf (_("Shared library: [%s]"), name);
10062
10063 if (streq (name, program_interpreter))
10064 printf (_(" program interpreter"));
10065 break;
10066
10067 case DT_SONAME:
10068 printf (_("Library soname: [%s]"), name);
10069 break;
10070
10071 case DT_RPATH:
10072 printf (_("Library rpath: [%s]"), name);
10073 break;
10074
10075 case DT_RUNPATH:
10076 printf (_("Library runpath: [%s]"), name);
10077 break;
10078
10079 default:
10080 print_vma (entry->d_un.d_val, PREFIX_HEX);
10081 break;
10082 }
10083 }
10084 else
10085 print_vma (entry->d_un.d_val, PREFIX_HEX);
10086
10087 putchar ('\n');
10088 }
10089 break;
10090
10091 case DT_PLTRELSZ:
10092 case DT_RELASZ :
10093 case DT_STRSZ :
10094 case DT_RELSZ :
10095 case DT_RELAENT :
10096 case DT_SYMENT :
10097 case DT_RELENT :
10098 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10099 /* Fall through. */
10100 case DT_PLTPADSZ:
10101 case DT_MOVEENT :
10102 case DT_MOVESZ :
10103 case DT_INIT_ARRAYSZ:
10104 case DT_FINI_ARRAYSZ:
10105 case DT_GNU_CONFLICTSZ:
10106 case DT_GNU_LIBLISTSZ:
10107 if (do_dynamic)
10108 {
10109 print_vma (entry->d_un.d_val, UNSIGNED);
10110 printf (_(" (bytes)\n"));
10111 }
10112 break;
10113
10114 case DT_VERDEFNUM:
10115 case DT_VERNEEDNUM:
10116 case DT_RELACOUNT:
10117 case DT_RELCOUNT:
10118 if (do_dynamic)
10119 {
10120 print_vma (entry->d_un.d_val, UNSIGNED);
10121 putchar ('\n');
10122 }
10123 break;
10124
10125 case DT_SYMINSZ:
10126 case DT_SYMINENT:
10127 case DT_SYMINFO:
10128 case DT_USED:
10129 case DT_INIT_ARRAY:
10130 case DT_FINI_ARRAY:
10131 if (do_dynamic)
10132 {
10133 if (entry->d_tag == DT_USED
10134 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10135 {
10136 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10137
10138 if (*name)
10139 {
10140 printf (_("Not needed object: [%s]\n"), name);
10141 break;
10142 }
10143 }
10144
10145 print_vma (entry->d_un.d_val, PREFIX_HEX);
10146 putchar ('\n');
10147 }
10148 break;
10149
10150 case DT_BIND_NOW:
10151 /* The value of this entry is ignored. */
10152 if (do_dynamic)
10153 putchar ('\n');
10154 break;
10155
10156 case DT_GNU_PRELINKED:
10157 if (do_dynamic)
10158 {
10159 struct tm * tmp;
10160 time_t atime = entry->d_un.d_val;
10161
10162 tmp = gmtime (&atime);
10163 /* PR 17533 file: 041-1244816-0.004. */
10164 if (tmp == NULL)
10165 printf (_("<corrupt time val: %lx"),
10166 (unsigned long) atime);
10167 else
10168 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10169 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10170 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10171
10172 }
10173 break;
10174
10175 case DT_GNU_HASH:
10176 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10177 if (do_dynamic)
10178 {
10179 print_vma (entry->d_un.d_val, PREFIX_HEX);
10180 putchar ('\n');
10181 }
10182 break;
10183
10184 default:
10185 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10186 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10187 entry->d_un.d_val;
10188
10189 if (do_dynamic)
10190 {
10191 switch (filedata->file_header.e_machine)
10192 {
10193 case EM_MIPS:
10194 case EM_MIPS_RS3_LE:
10195 dynamic_section_mips_val (entry);
10196 break;
10197 case EM_PARISC:
10198 dynamic_section_parisc_val (entry);
10199 break;
10200 case EM_IA_64:
10201 dynamic_section_ia64_val (entry);
10202 break;
10203 default:
10204 print_vma (entry->d_un.d_val, PREFIX_HEX);
10205 putchar ('\n');
10206 }
10207 }
10208 break;
10209 }
10210 }
10211
10212 return TRUE;
10213 }
10214
10215 static char *
10216 get_ver_flags (unsigned int flags)
10217 {
10218 static char buff[128];
10219
10220 buff[0] = 0;
10221
10222 if (flags == 0)
10223 return _("none");
10224
10225 if (flags & VER_FLG_BASE)
10226 strcat (buff, "BASE");
10227
10228 if (flags & VER_FLG_WEAK)
10229 {
10230 if (flags & VER_FLG_BASE)
10231 strcat (buff, " | ");
10232
10233 strcat (buff, "WEAK");
10234 }
10235
10236 if (flags & VER_FLG_INFO)
10237 {
10238 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10239 strcat (buff, " | ");
10240
10241 strcat (buff, "INFO");
10242 }
10243
10244 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10245 {
10246 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10247 strcat (buff, " | ");
10248
10249 strcat (buff, _("<unknown>"));
10250 }
10251
10252 return buff;
10253 }
10254
10255 /* Display the contents of the version sections. */
10256
10257 static bfd_boolean
10258 process_version_sections (Filedata * filedata)
10259 {
10260 Elf_Internal_Shdr * section;
10261 unsigned i;
10262 bfd_boolean found = FALSE;
10263
10264 if (! do_version)
10265 return TRUE;
10266
10267 for (i = 0, section = filedata->section_headers;
10268 i < filedata->file_header.e_shnum;
10269 i++, section++)
10270 {
10271 switch (section->sh_type)
10272 {
10273 case SHT_GNU_verdef:
10274 {
10275 Elf_External_Verdef * edefs;
10276 unsigned long idx;
10277 unsigned long cnt;
10278 char * endbuf;
10279
10280 found = TRUE;
10281
10282 printf (ngettext ("\nVersion definition section '%s' "
10283 "contains %u entry:\n",
10284 "\nVersion definition section '%s' "
10285 "contains %u entries:\n",
10286 section->sh_info),
10287 printable_section_name (filedata, section),
10288 section->sh_info);
10289
10290 printf (_(" Addr: 0x"));
10291 printf_vma (section->sh_addr);
10292 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10293 (unsigned long) section->sh_offset, section->sh_link,
10294 printable_section_name_from_index (filedata, section->sh_link));
10295
10296 edefs = (Elf_External_Verdef *)
10297 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10298 _("version definition section"));
10299 if (!edefs)
10300 break;
10301 endbuf = (char *) edefs + section->sh_size;
10302
10303 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10304 {
10305 char * vstart;
10306 Elf_External_Verdef * edef;
10307 Elf_Internal_Verdef ent;
10308 Elf_External_Verdaux * eaux;
10309 Elf_Internal_Verdaux aux;
10310 unsigned long isum;
10311 int j;
10312
10313 vstart = ((char *) edefs) + idx;
10314 if (vstart + sizeof (*edef) > endbuf)
10315 break;
10316
10317 edef = (Elf_External_Verdef *) vstart;
10318
10319 ent.vd_version = BYTE_GET (edef->vd_version);
10320 ent.vd_flags = BYTE_GET (edef->vd_flags);
10321 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10322 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10323 ent.vd_hash = BYTE_GET (edef->vd_hash);
10324 ent.vd_aux = BYTE_GET (edef->vd_aux);
10325 ent.vd_next = BYTE_GET (edef->vd_next);
10326
10327 printf (_(" %#06lx: Rev: %d Flags: %s"),
10328 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10329
10330 printf (_(" Index: %d Cnt: %d "),
10331 ent.vd_ndx, ent.vd_cnt);
10332
10333 /* Check for overflow. */
10334 if (ent.vd_aux > (size_t) (endbuf - vstart))
10335 break;
10336
10337 vstart += ent.vd_aux;
10338
10339 if (vstart + sizeof (*eaux) > endbuf)
10340 break;
10341 eaux = (Elf_External_Verdaux *) vstart;
10342
10343 aux.vda_name = BYTE_GET (eaux->vda_name);
10344 aux.vda_next = BYTE_GET (eaux->vda_next);
10345
10346 if (VALID_DYNAMIC_NAME (aux.vda_name))
10347 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10348 else
10349 printf (_("Name index: %ld\n"), aux.vda_name);
10350
10351 isum = idx + ent.vd_aux;
10352
10353 for (j = 1; j < ent.vd_cnt; j++)
10354 {
10355 if (aux.vda_next < sizeof (*eaux)
10356 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10357 {
10358 warn (_("Invalid vda_next field of %lx\n"),
10359 aux.vda_next);
10360 j = ent.vd_cnt;
10361 break;
10362 }
10363 /* Check for overflow. */
10364 if (aux.vda_next > (size_t) (endbuf - vstart))
10365 break;
10366
10367 isum += aux.vda_next;
10368 vstart += aux.vda_next;
10369
10370 if (vstart + sizeof (*eaux) > endbuf)
10371 break;
10372 eaux = (Elf_External_Verdaux *) vstart;
10373
10374 aux.vda_name = BYTE_GET (eaux->vda_name);
10375 aux.vda_next = BYTE_GET (eaux->vda_next);
10376
10377 if (VALID_DYNAMIC_NAME (aux.vda_name))
10378 printf (_(" %#06lx: Parent %d: %s\n"),
10379 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10380 else
10381 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10382 isum, j, aux.vda_name);
10383 }
10384
10385 if (j < ent.vd_cnt)
10386 printf (_(" Version def aux past end of section\n"));
10387
10388 /* PR 17531:
10389 file: id:000001,src:000172+005151,op:splice,rep:2. */
10390 if (ent.vd_next < sizeof (*edef)
10391 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10392 {
10393 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10394 cnt = section->sh_info;
10395 break;
10396 }
10397 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10398 break;
10399
10400 idx += ent.vd_next;
10401 }
10402
10403 if (cnt < section->sh_info)
10404 printf (_(" Version definition past end of section\n"));
10405
10406 free (edefs);
10407 }
10408 break;
10409
10410 case SHT_GNU_verneed:
10411 {
10412 Elf_External_Verneed * eneed;
10413 unsigned long idx;
10414 unsigned long cnt;
10415 char * endbuf;
10416
10417 found = TRUE;
10418
10419 printf (ngettext ("\nVersion needs section '%s' "
10420 "contains %u entry:\n",
10421 "\nVersion needs section '%s' "
10422 "contains %u entries:\n",
10423 section->sh_info),
10424 printable_section_name (filedata, section), section->sh_info);
10425
10426 printf (_(" Addr: 0x"));
10427 printf_vma (section->sh_addr);
10428 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10429 (unsigned long) section->sh_offset, section->sh_link,
10430 printable_section_name_from_index (filedata, section->sh_link));
10431
10432 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10433 section->sh_offset, 1,
10434 section->sh_size,
10435 _("Version Needs section"));
10436 if (!eneed)
10437 break;
10438 endbuf = (char *) eneed + section->sh_size;
10439
10440 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10441 {
10442 Elf_External_Verneed * entry;
10443 Elf_Internal_Verneed ent;
10444 unsigned long isum;
10445 int j;
10446 char * vstart;
10447
10448 vstart = ((char *) eneed) + idx;
10449 if (vstart + sizeof (*entry) > endbuf)
10450 break;
10451
10452 entry = (Elf_External_Verneed *) vstart;
10453
10454 ent.vn_version = BYTE_GET (entry->vn_version);
10455 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10456 ent.vn_file = BYTE_GET (entry->vn_file);
10457 ent.vn_aux = BYTE_GET (entry->vn_aux);
10458 ent.vn_next = BYTE_GET (entry->vn_next);
10459
10460 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10461
10462 if (VALID_DYNAMIC_NAME (ent.vn_file))
10463 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10464 else
10465 printf (_(" File: %lx"), ent.vn_file);
10466
10467 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10468
10469 /* Check for overflow. */
10470 if (ent.vn_aux > (size_t) (endbuf - vstart))
10471 break;
10472 vstart += ent.vn_aux;
10473
10474 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10475 {
10476 Elf_External_Vernaux * eaux;
10477 Elf_Internal_Vernaux aux;
10478
10479 if (vstart + sizeof (*eaux) > endbuf)
10480 break;
10481 eaux = (Elf_External_Vernaux *) vstart;
10482
10483 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10484 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10485 aux.vna_other = BYTE_GET (eaux->vna_other);
10486 aux.vna_name = BYTE_GET (eaux->vna_name);
10487 aux.vna_next = BYTE_GET (eaux->vna_next);
10488
10489 if (VALID_DYNAMIC_NAME (aux.vna_name))
10490 printf (_(" %#06lx: Name: %s"),
10491 isum, GET_DYNAMIC_NAME (aux.vna_name));
10492 else
10493 printf (_(" %#06lx: Name index: %lx"),
10494 isum, aux.vna_name);
10495
10496 printf (_(" Flags: %s Version: %d\n"),
10497 get_ver_flags (aux.vna_flags), aux.vna_other);
10498
10499 if (aux.vna_next < sizeof (*eaux)
10500 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10501 {
10502 warn (_("Invalid vna_next field of %lx\n"),
10503 aux.vna_next);
10504 j = ent.vn_cnt;
10505 break;
10506 }
10507 /* Check for overflow. */
10508 if (aux.vna_next > (size_t) (endbuf - vstart))
10509 break;
10510 isum += aux.vna_next;
10511 vstart += aux.vna_next;
10512 }
10513
10514 if (j < ent.vn_cnt)
10515 warn (_("Missing Version Needs auxillary information\n"));
10516
10517 if (ent.vn_next < sizeof (*entry)
10518 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10519 {
10520 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10521 cnt = section->sh_info;
10522 break;
10523 }
10524 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10525 break;
10526 idx += ent.vn_next;
10527 }
10528
10529 if (cnt < section->sh_info)
10530 warn (_("Missing Version Needs information\n"));
10531
10532 free (eneed);
10533 }
10534 break;
10535
10536 case SHT_GNU_versym:
10537 {
10538 Elf_Internal_Shdr * link_section;
10539 size_t total;
10540 unsigned int cnt;
10541 unsigned char * edata;
10542 unsigned short * data;
10543 char * strtab;
10544 Elf_Internal_Sym * symbols;
10545 Elf_Internal_Shdr * string_sec;
10546 unsigned long num_syms;
10547 long off;
10548
10549 if (section->sh_link >= filedata->file_header.e_shnum)
10550 break;
10551
10552 link_section = filedata->section_headers + section->sh_link;
10553 total = section->sh_size / sizeof (Elf_External_Versym);
10554
10555 if (link_section->sh_link >= filedata->file_header.e_shnum)
10556 break;
10557
10558 found = TRUE;
10559
10560 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10561 if (symbols == NULL)
10562 break;
10563
10564 string_sec = filedata->section_headers + link_section->sh_link;
10565
10566 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10567 string_sec->sh_size,
10568 _("version string table"));
10569 if (!strtab)
10570 {
10571 free (symbols);
10572 break;
10573 }
10574
10575 printf (ngettext ("\nVersion symbols section '%s' "
10576 "contains %lu entry:\n",
10577 "\nVersion symbols section '%s' "
10578 "contains %lu entries:\n",
10579 total),
10580 printable_section_name (filedata, section), (unsigned long) total);
10581
10582 printf (_(" Addr: "));
10583 printf_vma (section->sh_addr);
10584 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10585 (unsigned long) section->sh_offset, section->sh_link,
10586 printable_section_name (filedata, link_section));
10587
10588 off = offset_from_vma (filedata,
10589 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10590 total * sizeof (short));
10591 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10592 sizeof (short),
10593 _("version symbol data"));
10594 if (!edata)
10595 {
10596 free (strtab);
10597 free (symbols);
10598 break;
10599 }
10600
10601 data = (short unsigned int *) cmalloc (total, sizeof (short));
10602
10603 for (cnt = total; cnt --;)
10604 data[cnt] = byte_get (edata + cnt * sizeof (short),
10605 sizeof (short));
10606
10607 free (edata);
10608
10609 for (cnt = 0; cnt < total; cnt += 4)
10610 {
10611 int j, nn;
10612 char *name;
10613 char *invalid = _("*invalid*");
10614
10615 printf (" %03x:", cnt);
10616
10617 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10618 switch (data[cnt + j])
10619 {
10620 case 0:
10621 fputs (_(" 0 (*local*) "), stdout);
10622 break;
10623
10624 case 1:
10625 fputs (_(" 1 (*global*) "), stdout);
10626 break;
10627
10628 default:
10629 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10630 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10631
10632 /* If this index value is greater than the size of the symbols
10633 array, break to avoid an out-of-bounds read. */
10634 if ((unsigned long)(cnt + j) >= num_syms)
10635 {
10636 warn (_("invalid index into symbol array\n"));
10637 break;
10638 }
10639
10640 name = NULL;
10641 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10642 {
10643 Elf_Internal_Verneed ivn;
10644 unsigned long offset;
10645
10646 offset = offset_from_vma
10647 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10648 sizeof (Elf_External_Verneed));
10649
10650 do
10651 {
10652 Elf_Internal_Vernaux ivna;
10653 Elf_External_Verneed evn;
10654 Elf_External_Vernaux evna;
10655 unsigned long a_off;
10656
10657 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10658 _("version need")) == NULL)
10659 break;
10660
10661 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10662 ivn.vn_next = BYTE_GET (evn.vn_next);
10663
10664 a_off = offset + ivn.vn_aux;
10665
10666 do
10667 {
10668 if (get_data (&evna, filedata, a_off, sizeof (evna),
10669 1, _("version need aux (2)")) == NULL)
10670 {
10671 ivna.vna_next = 0;
10672 ivna.vna_other = 0;
10673 }
10674 else
10675 {
10676 ivna.vna_next = BYTE_GET (evna.vna_next);
10677 ivna.vna_other = BYTE_GET (evna.vna_other);
10678 }
10679
10680 a_off += ivna.vna_next;
10681 }
10682 while (ivna.vna_other != data[cnt + j]
10683 && ivna.vna_next != 0);
10684
10685 if (ivna.vna_other == data[cnt + j])
10686 {
10687 ivna.vna_name = BYTE_GET (evna.vna_name);
10688
10689 if (ivna.vna_name >= string_sec->sh_size)
10690 name = invalid;
10691 else
10692 name = strtab + ivna.vna_name;
10693 break;
10694 }
10695
10696 offset += ivn.vn_next;
10697 }
10698 while (ivn.vn_next);
10699 }
10700
10701 if (data[cnt + j] != 0x8001
10702 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10703 {
10704 Elf_Internal_Verdef ivd;
10705 Elf_External_Verdef evd;
10706 unsigned long offset;
10707
10708 offset = offset_from_vma
10709 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10710 sizeof evd);
10711
10712 do
10713 {
10714 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10715 _("version def")) == NULL)
10716 {
10717 ivd.vd_next = 0;
10718 /* PR 17531: file: 046-1082287-0.004. */
10719 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10720 break;
10721 }
10722 else
10723 {
10724 ivd.vd_next = BYTE_GET (evd.vd_next);
10725 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10726 }
10727
10728 offset += ivd.vd_next;
10729 }
10730 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10731 && ivd.vd_next != 0);
10732
10733 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10734 {
10735 Elf_External_Verdaux evda;
10736 Elf_Internal_Verdaux ivda;
10737
10738 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10739
10740 if (get_data (&evda, filedata,
10741 offset - ivd.vd_next + ivd.vd_aux,
10742 sizeof (evda), 1,
10743 _("version def aux")) == NULL)
10744 break;
10745
10746 ivda.vda_name = BYTE_GET (evda.vda_name);
10747
10748 if (ivda.vda_name >= string_sec->sh_size)
10749 name = invalid;
10750 else if (name != NULL && name != invalid)
10751 name = _("*both*");
10752 else
10753 name = strtab + ivda.vda_name;
10754 }
10755 }
10756 if (name != NULL)
10757 nn += printf ("(%s%-*s",
10758 name,
10759 12 - (int) strlen (name),
10760 ")");
10761
10762 if (nn < 18)
10763 printf ("%*c", 18 - nn, ' ');
10764 }
10765
10766 putchar ('\n');
10767 }
10768
10769 free (data);
10770 free (strtab);
10771 free (symbols);
10772 }
10773 break;
10774
10775 default:
10776 break;
10777 }
10778 }
10779
10780 if (! found)
10781 printf (_("\nNo version information found in this file.\n"));
10782
10783 return TRUE;
10784 }
10785
10786 static const char *
10787 get_symbol_binding (Filedata * filedata, unsigned int binding)
10788 {
10789 static char buff[32];
10790
10791 switch (binding)
10792 {
10793 case STB_LOCAL: return "LOCAL";
10794 case STB_GLOBAL: return "GLOBAL";
10795 case STB_WEAK: return "WEAK";
10796 default:
10797 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10798 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10799 binding);
10800 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10801 {
10802 if (binding == STB_GNU_UNIQUE
10803 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10804 /* GNU is still using the default value 0. */
10805 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10806 return "UNIQUE";
10807 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10808 }
10809 else
10810 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10811 return buff;
10812 }
10813 }
10814
10815 static const char *
10816 get_symbol_type (Filedata * filedata, unsigned int type)
10817 {
10818 static char buff[32];
10819
10820 switch (type)
10821 {
10822 case STT_NOTYPE: return "NOTYPE";
10823 case STT_OBJECT: return "OBJECT";
10824 case STT_FUNC: return "FUNC";
10825 case STT_SECTION: return "SECTION";
10826 case STT_FILE: return "FILE";
10827 case STT_COMMON: return "COMMON";
10828 case STT_TLS: return "TLS";
10829 case STT_RELC: return "RELC";
10830 case STT_SRELC: return "SRELC";
10831 default:
10832 if (type >= STT_LOPROC && type <= STT_HIPROC)
10833 {
10834 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10835 return "THUMB_FUNC";
10836
10837 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10838 return "REGISTER";
10839
10840 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10841 return "PARISC_MILLI";
10842
10843 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10844 }
10845 else if (type >= STT_LOOS && type <= STT_HIOS)
10846 {
10847 if (filedata->file_header.e_machine == EM_PARISC)
10848 {
10849 if (type == STT_HP_OPAQUE)
10850 return "HP_OPAQUE";
10851 if (type == STT_HP_STUB)
10852 return "HP_STUB";
10853 }
10854
10855 if (type == STT_GNU_IFUNC
10856 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10857 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10858 /* GNU is still using the default value 0. */
10859 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10860 return "IFUNC";
10861
10862 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10863 }
10864 else
10865 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10866 return buff;
10867 }
10868 }
10869
10870 static const char *
10871 get_symbol_visibility (unsigned int visibility)
10872 {
10873 switch (visibility)
10874 {
10875 case STV_DEFAULT: return "DEFAULT";
10876 case STV_INTERNAL: return "INTERNAL";
10877 case STV_HIDDEN: return "HIDDEN";
10878 case STV_PROTECTED: return "PROTECTED";
10879 default:
10880 error (_("Unrecognized visibility value: %u"), visibility);
10881 return _("<unknown>");
10882 }
10883 }
10884
10885 static const char *
10886 get_solaris_symbol_visibility (unsigned int visibility)
10887 {
10888 switch (visibility)
10889 {
10890 case 4: return "EXPORTED";
10891 case 5: return "SINGLETON";
10892 case 6: return "ELIMINATE";
10893 default: return get_symbol_visibility (visibility);
10894 }
10895 }
10896
10897 static const char *
10898 get_mips_symbol_other (unsigned int other)
10899 {
10900 switch (other)
10901 {
10902 case STO_OPTIONAL: return "OPTIONAL";
10903 case STO_MIPS_PLT: return "MIPS PLT";
10904 case STO_MIPS_PIC: return "MIPS PIC";
10905 case STO_MICROMIPS: return "MICROMIPS";
10906 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10907 case STO_MIPS16: return "MIPS16";
10908 default: return NULL;
10909 }
10910 }
10911
10912 static const char *
10913 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10914 {
10915 if (is_ia64_vms (filedata))
10916 {
10917 static char res[32];
10918
10919 res[0] = 0;
10920
10921 /* Function types is for images and .STB files only. */
10922 switch (filedata->file_header.e_type)
10923 {
10924 case ET_DYN:
10925 case ET_EXEC:
10926 switch (VMS_ST_FUNC_TYPE (other))
10927 {
10928 case VMS_SFT_CODE_ADDR:
10929 strcat (res, " CA");
10930 break;
10931 case VMS_SFT_SYMV_IDX:
10932 strcat (res, " VEC");
10933 break;
10934 case VMS_SFT_FD:
10935 strcat (res, " FD");
10936 break;
10937 case VMS_SFT_RESERVE:
10938 strcat (res, " RSV");
10939 break;
10940 default:
10941 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10942 VMS_ST_FUNC_TYPE (other));
10943 strcat (res, " <unknown>");
10944 break;
10945 }
10946 break;
10947 default:
10948 break;
10949 }
10950 switch (VMS_ST_LINKAGE (other))
10951 {
10952 case VMS_STL_IGNORE:
10953 strcat (res, " IGN");
10954 break;
10955 case VMS_STL_RESERVE:
10956 strcat (res, " RSV");
10957 break;
10958 case VMS_STL_STD:
10959 strcat (res, " STD");
10960 break;
10961 case VMS_STL_LNK:
10962 strcat (res, " LNK");
10963 break;
10964 default:
10965 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10966 VMS_ST_LINKAGE (other));
10967 strcat (res, " <unknown>");
10968 break;
10969 }
10970
10971 if (res[0] != 0)
10972 return res + 1;
10973 else
10974 return res;
10975 }
10976 return NULL;
10977 }
10978
10979 static const char *
10980 get_ppc64_symbol_other (unsigned int other)
10981 {
10982 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10983 {
10984 static char buf[32];
10985 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10986 PPC64_LOCAL_ENTRY_OFFSET (other));
10987 return buf;
10988 }
10989 return NULL;
10990 }
10991
10992 static const char *
10993 get_symbol_other (Filedata * filedata, unsigned int other)
10994 {
10995 const char * result = NULL;
10996 static char buff [32];
10997
10998 if (other == 0)
10999 return "";
11000
11001 switch (filedata->file_header.e_machine)
11002 {
11003 case EM_MIPS:
11004 result = get_mips_symbol_other (other);
11005 break;
11006 case EM_IA_64:
11007 result = get_ia64_symbol_other (filedata, other);
11008 break;
11009 case EM_PPC64:
11010 result = get_ppc64_symbol_other (other);
11011 break;
11012 default:
11013 result = NULL;
11014 break;
11015 }
11016
11017 if (result)
11018 return result;
11019
11020 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11021 return buff;
11022 }
11023
11024 static const char *
11025 get_symbol_index_type (Filedata * filedata, unsigned int type)
11026 {
11027 static char buff[32];
11028
11029 switch (type)
11030 {
11031 case SHN_UNDEF: return "UND";
11032 case SHN_ABS: return "ABS";
11033 case SHN_COMMON: return "COM";
11034 default:
11035 if (type == SHN_IA_64_ANSI_COMMON
11036 && filedata->file_header.e_machine == EM_IA_64
11037 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11038 return "ANSI_COM";
11039 else if ((filedata->file_header.e_machine == EM_X86_64
11040 || filedata->file_header.e_machine == EM_L1OM
11041 || filedata->file_header.e_machine == EM_K1OM)
11042 && type == SHN_X86_64_LCOMMON)
11043 return "LARGE_COM";
11044 else if ((type == SHN_MIPS_SCOMMON
11045 && filedata->file_header.e_machine == EM_MIPS)
11046 || (type == SHN_TIC6X_SCOMMON
11047 && filedata->file_header.e_machine == EM_TI_C6000))
11048 return "SCOM";
11049 else if (type == SHN_MIPS_SUNDEFINED
11050 && filedata->file_header.e_machine == EM_MIPS)
11051 return "SUND";
11052 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11053 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11054 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11055 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11056 else if (type >= SHN_LORESERVE)
11057 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11058 else if (type >= filedata->file_header.e_shnum)
11059 sprintf (buff, _("bad section index[%3d]"), type);
11060 else
11061 sprintf (buff, "%3d", type);
11062 break;
11063 }
11064
11065 return buff;
11066 }
11067
11068 static bfd_vma *
11069 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11070 {
11071 unsigned char * e_data;
11072 bfd_vma * i_data;
11073
11074 /* If the size_t type is smaller than the bfd_size_type, eg because
11075 you are building a 32-bit tool on a 64-bit host, then make sure
11076 that when (number) is cast to (size_t) no information is lost. */
11077 if (sizeof (size_t) < sizeof (bfd_size_type)
11078 && (bfd_size_type) ((size_t) number) != number)
11079 {
11080 error (_("Size truncation prevents reading %s elements of size %u\n"),
11081 bfd_vmatoa ("u", number), ent_size);
11082 return NULL;
11083 }
11084
11085 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11086 attempting to allocate memory when the read is bound to fail. */
11087 if (ent_size * number > filedata->file_size)
11088 {
11089 error (_("Invalid number of dynamic entries: %s\n"),
11090 bfd_vmatoa ("u", number));
11091 return NULL;
11092 }
11093
11094 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11095 if (e_data == NULL)
11096 {
11097 error (_("Out of memory reading %s dynamic entries\n"),
11098 bfd_vmatoa ("u", number));
11099 return NULL;
11100 }
11101
11102 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11103 {
11104 error (_("Unable to read in %s bytes of dynamic data\n"),
11105 bfd_vmatoa ("u", number * ent_size));
11106 free (e_data);
11107 return NULL;
11108 }
11109
11110 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11111 if (i_data == NULL)
11112 {
11113 error (_("Out of memory allocating space for %s dynamic entries\n"),
11114 bfd_vmatoa ("u", number));
11115 free (e_data);
11116 return NULL;
11117 }
11118
11119 while (number--)
11120 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11121
11122 free (e_data);
11123
11124 return i_data;
11125 }
11126
11127 static void
11128 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11129 {
11130 Elf_Internal_Sym * psym;
11131 int n;
11132
11133 n = print_vma (si, DEC_5);
11134 if (n < 5)
11135 fputs (&" "[n], stdout);
11136 printf (" %3lu: ", hn);
11137
11138 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11139 {
11140 printf (_("<No info available for dynamic symbol number %lu>\n"),
11141 (unsigned long) si);
11142 return;
11143 }
11144
11145 psym = dynamic_symbols + si;
11146 print_vma (psym->st_value, LONG_HEX);
11147 putchar (' ');
11148 print_vma (psym->st_size, DEC_5);
11149
11150 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11151 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11152
11153 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11154 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11155 else
11156 {
11157 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11158
11159 printf (" %-7s", get_symbol_visibility (vis));
11160 /* Check to see if any other bits in the st_other field are set.
11161 Note - displaying this information disrupts the layout of the
11162 table being generated, but for the moment this case is very
11163 rare. */
11164 if (psym->st_other ^ vis)
11165 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11166 }
11167
11168 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11169 if (VALID_DYNAMIC_NAME (psym->st_name))
11170 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11171 else
11172 printf (_(" <corrupt: %14ld>"), psym->st_name);
11173 putchar ('\n');
11174 }
11175
11176 static const char *
11177 get_symbol_version_string (Filedata * filedata,
11178 bfd_boolean is_dynsym,
11179 const char * strtab,
11180 unsigned long int strtab_size,
11181 unsigned int si,
11182 Elf_Internal_Sym * psym,
11183 enum versioned_symbol_info * sym_info,
11184 unsigned short * vna_other)
11185 {
11186 unsigned char data[2];
11187 unsigned short vers_data;
11188 unsigned long offset;
11189
11190 if (!is_dynsym
11191 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11192 return NULL;
11193
11194 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11195 sizeof data + si * sizeof (vers_data));
11196
11197 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11198 sizeof (data), 1, _("version data")) == NULL)
11199 return NULL;
11200
11201 vers_data = byte_get (data, 2);
11202
11203 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11204 return NULL;
11205
11206 /* Usually we'd only see verdef for defined symbols, and verneed for
11207 undefined symbols. However, symbols defined by the linker in
11208 .dynbss for variables copied from a shared library in order to
11209 avoid text relocations are defined yet have verneed. We could
11210 use a heuristic to detect the special case, for example, check
11211 for verneed first on symbols defined in SHT_NOBITS sections, but
11212 it is simpler and more reliable to just look for both verdef and
11213 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11214
11215 if (psym->st_shndx != SHN_UNDEF
11216 && vers_data != 0x8001
11217 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11218 {
11219 Elf_Internal_Verdef ivd;
11220 Elf_Internal_Verdaux ivda;
11221 Elf_External_Verdaux evda;
11222 unsigned long off;
11223
11224 off = offset_from_vma (filedata,
11225 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11226 sizeof (Elf_External_Verdef));
11227
11228 do
11229 {
11230 Elf_External_Verdef evd;
11231
11232 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11233 _("version def")) == NULL)
11234 {
11235 ivd.vd_ndx = 0;
11236 ivd.vd_aux = 0;
11237 ivd.vd_next = 0;
11238 }
11239 else
11240 {
11241 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11242 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11243 ivd.vd_next = BYTE_GET (evd.vd_next);
11244 }
11245
11246 off += ivd.vd_next;
11247 }
11248 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11249
11250 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11251 {
11252 off -= ivd.vd_next;
11253 off += ivd.vd_aux;
11254
11255 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11256 _("version def aux")) != NULL)
11257 {
11258 ivda.vda_name = BYTE_GET (evda.vda_name);
11259
11260 if (psym->st_name != ivda.vda_name)
11261 {
11262 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11263 ? symbol_hidden : symbol_public);
11264 return (ivda.vda_name < strtab_size
11265 ? strtab + ivda.vda_name : _("<corrupt>"));
11266 }
11267 }
11268 }
11269 }
11270
11271 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11272 {
11273 Elf_External_Verneed evn;
11274 Elf_Internal_Verneed ivn;
11275 Elf_Internal_Vernaux ivna;
11276
11277 offset = offset_from_vma (filedata,
11278 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11279 sizeof evn);
11280 do
11281 {
11282 unsigned long vna_off;
11283
11284 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11285 _("version need")) == NULL)
11286 {
11287 ivna.vna_next = 0;
11288 ivna.vna_other = 0;
11289 ivna.vna_name = 0;
11290 break;
11291 }
11292
11293 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11294 ivn.vn_next = BYTE_GET (evn.vn_next);
11295
11296 vna_off = offset + ivn.vn_aux;
11297
11298 do
11299 {
11300 Elf_External_Vernaux evna;
11301
11302 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11303 _("version need aux (3)")) == NULL)
11304 {
11305 ivna.vna_next = 0;
11306 ivna.vna_other = 0;
11307 ivna.vna_name = 0;
11308 }
11309 else
11310 {
11311 ivna.vna_other = BYTE_GET (evna.vna_other);
11312 ivna.vna_next = BYTE_GET (evna.vna_next);
11313 ivna.vna_name = BYTE_GET (evna.vna_name);
11314 }
11315
11316 vna_off += ivna.vna_next;
11317 }
11318 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11319
11320 if (ivna.vna_other == vers_data)
11321 break;
11322
11323 offset += ivn.vn_next;
11324 }
11325 while (ivn.vn_next != 0);
11326
11327 if (ivna.vna_other == vers_data)
11328 {
11329 *sym_info = symbol_undefined;
11330 *vna_other = ivna.vna_other;
11331 return (ivna.vna_name < strtab_size
11332 ? strtab + ivna.vna_name : _("<corrupt>"));
11333 }
11334 }
11335 return NULL;
11336 }
11337
11338 /* Dump the symbol table. */
11339 static bfd_boolean
11340 process_symbol_table (Filedata * filedata)
11341 {
11342 Elf_Internal_Shdr * section;
11343 bfd_size_type nbuckets = 0;
11344 bfd_size_type nchains = 0;
11345 bfd_vma * buckets = NULL;
11346 bfd_vma * chains = NULL;
11347 bfd_vma ngnubuckets = 0;
11348 bfd_vma * gnubuckets = NULL;
11349 bfd_vma * gnuchains = NULL;
11350 bfd_vma gnusymidx = 0;
11351 bfd_size_type ngnuchains = 0;
11352
11353 if (!do_syms && !do_dyn_syms && !do_histogram)
11354 return TRUE;
11355
11356 if (dynamic_info[DT_HASH]
11357 && (do_histogram
11358 || (do_using_dynamic
11359 && !do_dyn_syms
11360 && dynamic_strings != NULL)))
11361 {
11362 unsigned char nb[8];
11363 unsigned char nc[8];
11364 unsigned int hash_ent_size = 4;
11365
11366 if ((filedata->file_header.e_machine == EM_ALPHA
11367 || filedata->file_header.e_machine == EM_S390
11368 || filedata->file_header.e_machine == EM_S390_OLD)
11369 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11370 hash_ent_size = 8;
11371
11372 if (fseek (filedata->handle,
11373 (archive_file_offset
11374 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11375 sizeof nb + sizeof nc)),
11376 SEEK_SET))
11377 {
11378 error (_("Unable to seek to start of dynamic information\n"));
11379 goto no_hash;
11380 }
11381
11382 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11383 {
11384 error (_("Failed to read in number of buckets\n"));
11385 goto no_hash;
11386 }
11387
11388 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11389 {
11390 error (_("Failed to read in number of chains\n"));
11391 goto no_hash;
11392 }
11393
11394 nbuckets = byte_get (nb, hash_ent_size);
11395 nchains = byte_get (nc, hash_ent_size);
11396
11397 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11398 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11399
11400 no_hash:
11401 if (buckets == NULL || chains == NULL)
11402 {
11403 if (do_using_dynamic)
11404 return FALSE;
11405 free (buckets);
11406 free (chains);
11407 buckets = NULL;
11408 chains = NULL;
11409 nbuckets = 0;
11410 nchains = 0;
11411 }
11412 }
11413
11414 if (dynamic_info_DT_GNU_HASH
11415 && (do_histogram
11416 || (do_using_dynamic
11417 && !do_dyn_syms
11418 && dynamic_strings != NULL)))
11419 {
11420 unsigned char nb[16];
11421 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11422 bfd_vma buckets_vma;
11423
11424 if (fseek (filedata->handle,
11425 (archive_file_offset
11426 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11427 sizeof nb)),
11428 SEEK_SET))
11429 {
11430 error (_("Unable to seek to start of dynamic information\n"));
11431 goto no_gnu_hash;
11432 }
11433
11434 if (fread (nb, 16, 1, filedata->handle) != 1)
11435 {
11436 error (_("Failed to read in number of buckets\n"));
11437 goto no_gnu_hash;
11438 }
11439
11440 ngnubuckets = byte_get (nb, 4);
11441 gnusymidx = byte_get (nb + 4, 4);
11442 bitmaskwords = byte_get (nb + 8, 4);
11443 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11444 if (is_32bit_elf)
11445 buckets_vma += bitmaskwords * 4;
11446 else
11447 buckets_vma += bitmaskwords * 8;
11448
11449 if (fseek (filedata->handle,
11450 (archive_file_offset
11451 + offset_from_vma (filedata, buckets_vma, 4)),
11452 SEEK_SET))
11453 {
11454 error (_("Unable to seek to start of dynamic information\n"));
11455 goto no_gnu_hash;
11456 }
11457
11458 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11459
11460 if (gnubuckets == NULL)
11461 goto no_gnu_hash;
11462
11463 for (i = 0; i < ngnubuckets; i++)
11464 if (gnubuckets[i] != 0)
11465 {
11466 if (gnubuckets[i] < gnusymidx)
11467 return FALSE;
11468
11469 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11470 maxchain = gnubuckets[i];
11471 }
11472
11473 if (maxchain == 0xffffffff)
11474 goto no_gnu_hash;
11475
11476 maxchain -= gnusymidx;
11477
11478 if (fseek (filedata->handle,
11479 (archive_file_offset
11480 + offset_from_vma (filedata, buckets_vma
11481 + 4 * (ngnubuckets + maxchain), 4)),
11482 SEEK_SET))
11483 {
11484 error (_("Unable to seek to start of dynamic information\n"));
11485 goto no_gnu_hash;
11486 }
11487
11488 do
11489 {
11490 if (fread (nb, 4, 1, filedata->handle) != 1)
11491 {
11492 error (_("Failed to determine last chain length\n"));
11493 goto no_gnu_hash;
11494 }
11495
11496 if (maxchain + 1 == 0)
11497 goto no_gnu_hash;
11498
11499 ++maxchain;
11500 }
11501 while ((byte_get (nb, 4) & 1) == 0);
11502
11503 if (fseek (filedata->handle,
11504 (archive_file_offset
11505 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11506 SEEK_SET))
11507 {
11508 error (_("Unable to seek to start of dynamic information\n"));
11509 goto no_gnu_hash;
11510 }
11511
11512 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11513 ngnuchains = maxchain;
11514
11515 no_gnu_hash:
11516 if (gnuchains == NULL)
11517 {
11518 free (gnubuckets);
11519 gnubuckets = NULL;
11520 ngnubuckets = 0;
11521 if (do_using_dynamic)
11522 return FALSE;
11523 }
11524 }
11525
11526 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11527 && do_syms
11528 && do_using_dynamic
11529 && dynamic_strings != NULL
11530 && dynamic_symbols != NULL)
11531 {
11532 unsigned long hn;
11533
11534 if (dynamic_info[DT_HASH])
11535 {
11536 bfd_vma si;
11537 char *visited;
11538
11539 printf (_("\nSymbol table for image:\n"));
11540 if (is_32bit_elf)
11541 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11542 else
11543 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11544
11545 visited = xcmalloc (nchains, 1);
11546 memset (visited, 0, nchains);
11547 for (hn = 0; hn < nbuckets; hn++)
11548 {
11549 for (si = buckets[hn]; si > 0; si = chains[si])
11550 {
11551 print_dynamic_symbol (filedata, si, hn);
11552 if (si >= nchains || visited[si])
11553 {
11554 error (_("histogram chain is corrupt\n"));
11555 break;
11556 }
11557 visited[si] = 1;
11558 }
11559 }
11560 free (visited);
11561 }
11562
11563 if (dynamic_info_DT_GNU_HASH)
11564 {
11565 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11566 if (is_32bit_elf)
11567 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11568 else
11569 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11570
11571 for (hn = 0; hn < ngnubuckets; ++hn)
11572 if (gnubuckets[hn] != 0)
11573 {
11574 bfd_vma si = gnubuckets[hn];
11575 bfd_vma off = si - gnusymidx;
11576
11577 do
11578 {
11579 print_dynamic_symbol (filedata, si, hn);
11580 si++;
11581 }
11582 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11583 }
11584 }
11585 }
11586 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11587 && filedata->section_headers != NULL)
11588 {
11589 unsigned int i;
11590
11591 for (i = 0, section = filedata->section_headers;
11592 i < filedata->file_header.e_shnum;
11593 i++, section++)
11594 {
11595 unsigned int si;
11596 char * strtab = NULL;
11597 unsigned long int strtab_size = 0;
11598 Elf_Internal_Sym * symtab;
11599 Elf_Internal_Sym * psym;
11600 unsigned long num_syms;
11601
11602 if ((section->sh_type != SHT_SYMTAB
11603 && section->sh_type != SHT_DYNSYM)
11604 || (!do_syms
11605 && section->sh_type == SHT_SYMTAB))
11606 continue;
11607
11608 if (section->sh_entsize == 0)
11609 {
11610 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11611 printable_section_name (filedata, section));
11612 continue;
11613 }
11614
11615 num_syms = section->sh_size / section->sh_entsize;
11616 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11617 "\nSymbol table '%s' contains %lu entries:\n",
11618 num_syms),
11619 printable_section_name (filedata, section),
11620 num_syms);
11621
11622 if (is_32bit_elf)
11623 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11624 else
11625 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11626
11627 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11628 if (symtab == NULL)
11629 continue;
11630
11631 if (section->sh_link == filedata->file_header.e_shstrndx)
11632 {
11633 strtab = filedata->string_table;
11634 strtab_size = filedata->string_table_length;
11635 }
11636 else if (section->sh_link < filedata->file_header.e_shnum)
11637 {
11638 Elf_Internal_Shdr * string_sec;
11639
11640 string_sec = filedata->section_headers + section->sh_link;
11641
11642 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11643 1, string_sec->sh_size,
11644 _("string table"));
11645 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11646 }
11647
11648 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11649 {
11650 const char *version_string;
11651 enum versioned_symbol_info sym_info;
11652 unsigned short vna_other;
11653
11654 printf ("%6d: ", si);
11655 print_vma (psym->st_value, LONG_HEX);
11656 putchar (' ');
11657 print_vma (psym->st_size, DEC_5);
11658 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11659 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11660 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11661 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11662 else
11663 {
11664 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11665
11666 printf (" %-7s", get_symbol_visibility (vis));
11667 /* Check to see if any other bits in the st_other field are set.
11668 Note - displaying this information disrupts the layout of the
11669 table being generated, but for the moment this case is very rare. */
11670 if (psym->st_other ^ vis)
11671 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11672 }
11673 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11674 print_symbol (25, psym->st_name < strtab_size
11675 ? strtab + psym->st_name : _("<corrupt>"));
11676
11677 version_string
11678 = get_symbol_version_string (filedata,
11679 section->sh_type == SHT_DYNSYM,
11680 strtab, strtab_size, si,
11681 psym, &sym_info, &vna_other);
11682 if (version_string)
11683 {
11684 if (sym_info == symbol_undefined)
11685 printf ("@%s (%d)", version_string, vna_other);
11686 else
11687 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11688 version_string);
11689 }
11690
11691 putchar ('\n');
11692
11693 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11694 && si >= section->sh_info
11695 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11696 && filedata->file_header.e_machine != EM_MIPS
11697 /* Solaris binaries have been found to violate this requirement as
11698 well. Not sure if this is a bug or an ABI requirement. */
11699 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11700 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11701 si, printable_section_name (filedata, section), section->sh_info);
11702 }
11703
11704 free (symtab);
11705 if (strtab != filedata->string_table)
11706 free (strtab);
11707 }
11708 }
11709 else if (do_syms)
11710 printf
11711 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11712
11713 if (do_histogram && buckets != NULL)
11714 {
11715 unsigned long * lengths;
11716 unsigned long * counts;
11717 unsigned long hn;
11718 bfd_vma si;
11719 unsigned long maxlength = 0;
11720 unsigned long nzero_counts = 0;
11721 unsigned long nsyms = 0;
11722 char *visited;
11723
11724 printf (ngettext ("\nHistogram for bucket list length "
11725 "(total of %lu bucket):\n",
11726 "\nHistogram for bucket list length "
11727 "(total of %lu buckets):\n",
11728 (unsigned long) nbuckets),
11729 (unsigned long) nbuckets);
11730
11731 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11732 if (lengths == NULL)
11733 {
11734 error (_("Out of memory allocating space for histogram buckets\n"));
11735 return FALSE;
11736 }
11737 visited = xcmalloc (nchains, 1);
11738 memset (visited, 0, nchains);
11739
11740 printf (_(" Length Number %% of total Coverage\n"));
11741 for (hn = 0; hn < nbuckets; ++hn)
11742 {
11743 for (si = buckets[hn]; si > 0; si = chains[si])
11744 {
11745 ++nsyms;
11746 if (maxlength < ++lengths[hn])
11747 ++maxlength;
11748 if (si >= nchains || visited[si])
11749 {
11750 error (_("histogram chain is corrupt\n"));
11751 break;
11752 }
11753 visited[si] = 1;
11754 }
11755 }
11756 free (visited);
11757
11758 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11759 if (counts == NULL)
11760 {
11761 free (lengths);
11762 error (_("Out of memory allocating space for histogram counts\n"));
11763 return FALSE;
11764 }
11765
11766 for (hn = 0; hn < nbuckets; ++hn)
11767 ++counts[lengths[hn]];
11768
11769 if (nbuckets > 0)
11770 {
11771 unsigned long i;
11772 printf (" 0 %-10lu (%5.1f%%)\n",
11773 counts[0], (counts[0] * 100.0) / nbuckets);
11774 for (i = 1; i <= maxlength; ++i)
11775 {
11776 nzero_counts += counts[i] * i;
11777 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11778 i, counts[i], (counts[i] * 100.0) / nbuckets,
11779 (nzero_counts * 100.0) / nsyms);
11780 }
11781 }
11782
11783 free (counts);
11784 free (lengths);
11785 }
11786
11787 if (buckets != NULL)
11788 {
11789 free (buckets);
11790 free (chains);
11791 }
11792
11793 if (do_histogram && gnubuckets != NULL)
11794 {
11795 unsigned long * lengths;
11796 unsigned long * counts;
11797 unsigned long hn;
11798 unsigned long maxlength = 0;
11799 unsigned long nzero_counts = 0;
11800 unsigned long nsyms = 0;
11801
11802 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11803 "(total of %lu bucket):\n",
11804 "\nHistogram for `.gnu.hash' bucket list length "
11805 "(total of %lu buckets):\n",
11806 (unsigned long) ngnubuckets),
11807 (unsigned long) ngnubuckets);
11808
11809 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11810 if (lengths == NULL)
11811 {
11812 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11813 return FALSE;
11814 }
11815
11816 printf (_(" Length Number %% of total Coverage\n"));
11817
11818 for (hn = 0; hn < ngnubuckets; ++hn)
11819 if (gnubuckets[hn] != 0)
11820 {
11821 bfd_vma off, length = 1;
11822
11823 for (off = gnubuckets[hn] - gnusymidx;
11824 /* PR 17531 file: 010-77222-0.004. */
11825 off < ngnuchains && (gnuchains[off] & 1) == 0;
11826 ++off)
11827 ++length;
11828 lengths[hn] = length;
11829 if (length > maxlength)
11830 maxlength = length;
11831 nsyms += length;
11832 }
11833
11834 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11835 if (counts == NULL)
11836 {
11837 free (lengths);
11838 error (_("Out of memory allocating space for gnu histogram counts\n"));
11839 return FALSE;
11840 }
11841
11842 for (hn = 0; hn < ngnubuckets; ++hn)
11843 ++counts[lengths[hn]];
11844
11845 if (ngnubuckets > 0)
11846 {
11847 unsigned long j;
11848 printf (" 0 %-10lu (%5.1f%%)\n",
11849 counts[0], (counts[0] * 100.0) / ngnubuckets);
11850 for (j = 1; j <= maxlength; ++j)
11851 {
11852 nzero_counts += counts[j] * j;
11853 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11854 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11855 (nzero_counts * 100.0) / nsyms);
11856 }
11857 }
11858
11859 free (counts);
11860 free (lengths);
11861 free (gnubuckets);
11862 free (gnuchains);
11863 }
11864
11865 return TRUE;
11866 }
11867
11868 static bfd_boolean
11869 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11870 {
11871 unsigned int i;
11872
11873 if (dynamic_syminfo == NULL
11874 || !do_dynamic)
11875 /* No syminfo, this is ok. */
11876 return TRUE;
11877
11878 /* There better should be a dynamic symbol section. */
11879 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11880 return FALSE;
11881
11882 if (dynamic_addr)
11883 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11884 "contains %d entry:\n",
11885 "\nDynamic info segment at offset 0x%lx "
11886 "contains %d entries:\n",
11887 dynamic_syminfo_nent),
11888 dynamic_syminfo_offset, dynamic_syminfo_nent);
11889
11890 printf (_(" Num: Name BoundTo Flags\n"));
11891 for (i = 0; i < dynamic_syminfo_nent; ++i)
11892 {
11893 unsigned short int flags = dynamic_syminfo[i].si_flags;
11894
11895 printf ("%4d: ", i);
11896 if (i >= num_dynamic_syms)
11897 printf (_("<corrupt index>"));
11898 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11899 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11900 else
11901 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11902 putchar (' ');
11903
11904 switch (dynamic_syminfo[i].si_boundto)
11905 {
11906 case SYMINFO_BT_SELF:
11907 fputs ("SELF ", stdout);
11908 break;
11909 case SYMINFO_BT_PARENT:
11910 fputs ("PARENT ", stdout);
11911 break;
11912 default:
11913 if (dynamic_syminfo[i].si_boundto > 0
11914 && dynamic_syminfo[i].si_boundto < dynamic_nent
11915 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11916 {
11917 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11918 putchar (' ' );
11919 }
11920 else
11921 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11922 break;
11923 }
11924
11925 if (flags & SYMINFO_FLG_DIRECT)
11926 printf (" DIRECT");
11927 if (flags & SYMINFO_FLG_PASSTHRU)
11928 printf (" PASSTHRU");
11929 if (flags & SYMINFO_FLG_COPY)
11930 printf (" COPY");
11931 if (flags & SYMINFO_FLG_LAZYLOAD)
11932 printf (" LAZYLOAD");
11933
11934 puts ("");
11935 }
11936
11937 return TRUE;
11938 }
11939
11940 #define IN_RANGE(START,END,ADDR,OFF) \
11941 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11942
11943 /* Check to see if the given reloc needs to be handled in a target specific
11944 manner. If so then process the reloc and return TRUE otherwise return
11945 FALSE.
11946
11947 If called with reloc == NULL, then this is a signal that reloc processing
11948 for the current section has finished, and any saved state should be
11949 discarded. */
11950
11951 static bfd_boolean
11952 target_specific_reloc_handling (Filedata * filedata,
11953 Elf_Internal_Rela * reloc,
11954 unsigned char * start,
11955 unsigned char * end,
11956 Elf_Internal_Sym * symtab,
11957 unsigned long num_syms)
11958 {
11959 unsigned int reloc_type = 0;
11960 unsigned long sym_index = 0;
11961
11962 if (reloc)
11963 {
11964 reloc_type = get_reloc_type (filedata, reloc->r_info);
11965 sym_index = get_reloc_symindex (reloc->r_info);
11966 }
11967
11968 switch (filedata->file_header.e_machine)
11969 {
11970 case EM_MSP430:
11971 case EM_MSP430_OLD:
11972 {
11973 static Elf_Internal_Sym * saved_sym = NULL;
11974
11975 if (reloc == NULL)
11976 {
11977 saved_sym = NULL;
11978 return TRUE;
11979 }
11980
11981 switch (reloc_type)
11982 {
11983 case 10: /* R_MSP430_SYM_DIFF */
11984 if (uses_msp430x_relocs (filedata))
11985 break;
11986 /* Fall through. */
11987 case 21: /* R_MSP430X_SYM_DIFF */
11988 /* PR 21139. */
11989 if (sym_index >= num_syms)
11990 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11991 sym_index);
11992 else
11993 saved_sym = symtab + sym_index;
11994 return TRUE;
11995
11996 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11997 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11998 goto handle_sym_diff;
11999
12000 case 5: /* R_MSP430_16_BYTE */
12001 case 9: /* R_MSP430_8 */
12002 if (uses_msp430x_relocs (filedata))
12003 break;
12004 goto handle_sym_diff;
12005
12006 case 2: /* R_MSP430_ABS16 */
12007 case 15: /* R_MSP430X_ABS16 */
12008 if (! uses_msp430x_relocs (filedata))
12009 break;
12010 goto handle_sym_diff;
12011
12012 handle_sym_diff:
12013 if (saved_sym != NULL)
12014 {
12015 int reloc_size = reloc_type == 1 ? 4 : 2;
12016 bfd_vma value;
12017
12018 if (sym_index >= num_syms)
12019 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12020 sym_index);
12021 else
12022 {
12023 value = reloc->r_addend + (symtab[sym_index].st_value
12024 - saved_sym->st_value);
12025
12026 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12027 byte_put (start + reloc->r_offset, value, reloc_size);
12028 else
12029 /* PR 21137 */
12030 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12031 (long) reloc->r_offset);
12032 }
12033
12034 saved_sym = NULL;
12035 return TRUE;
12036 }
12037 break;
12038
12039 default:
12040 if (saved_sym != NULL)
12041 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12042 break;
12043 }
12044 break;
12045 }
12046
12047 case EM_MN10300:
12048 case EM_CYGNUS_MN10300:
12049 {
12050 static Elf_Internal_Sym * saved_sym = NULL;
12051
12052 if (reloc == NULL)
12053 {
12054 saved_sym = NULL;
12055 return TRUE;
12056 }
12057
12058 switch (reloc_type)
12059 {
12060 case 34: /* R_MN10300_ALIGN */
12061 return TRUE;
12062 case 33: /* R_MN10300_SYM_DIFF */
12063 if (sym_index >= num_syms)
12064 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12065 sym_index);
12066 else
12067 saved_sym = symtab + sym_index;
12068 return TRUE;
12069
12070 case 1: /* R_MN10300_32 */
12071 case 2: /* R_MN10300_16 */
12072 if (saved_sym != NULL)
12073 {
12074 int reloc_size = reloc_type == 1 ? 4 : 2;
12075 bfd_vma value;
12076
12077 if (sym_index >= num_syms)
12078 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12079 sym_index);
12080 else
12081 {
12082 value = reloc->r_addend + (symtab[sym_index].st_value
12083 - saved_sym->st_value);
12084
12085 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12086 byte_put (start + reloc->r_offset, value, reloc_size);
12087 else
12088 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12089 (long) reloc->r_offset);
12090 }
12091
12092 saved_sym = NULL;
12093 return TRUE;
12094 }
12095 break;
12096 default:
12097 if (saved_sym != NULL)
12098 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12099 break;
12100 }
12101 break;
12102 }
12103
12104 case EM_RL78:
12105 {
12106 static bfd_vma saved_sym1 = 0;
12107 static bfd_vma saved_sym2 = 0;
12108 static bfd_vma value;
12109
12110 if (reloc == NULL)
12111 {
12112 saved_sym1 = saved_sym2 = 0;
12113 return TRUE;
12114 }
12115
12116 switch (reloc_type)
12117 {
12118 case 0x80: /* R_RL78_SYM. */
12119 saved_sym1 = saved_sym2;
12120 if (sym_index >= num_syms)
12121 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12122 sym_index);
12123 else
12124 {
12125 saved_sym2 = symtab[sym_index].st_value;
12126 saved_sym2 += reloc->r_addend;
12127 }
12128 return TRUE;
12129
12130 case 0x83: /* R_RL78_OPsub. */
12131 value = saved_sym1 - saved_sym2;
12132 saved_sym2 = saved_sym1 = 0;
12133 return TRUE;
12134 break;
12135
12136 case 0x41: /* R_RL78_ABS32. */
12137 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12138 byte_put (start + reloc->r_offset, value, 4);
12139 else
12140 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12141 (long) reloc->r_offset);
12142 value = 0;
12143 return TRUE;
12144
12145 case 0x43: /* R_RL78_ABS16. */
12146 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12147 byte_put (start + reloc->r_offset, value, 2);
12148 else
12149 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12150 (long) reloc->r_offset);
12151 value = 0;
12152 return TRUE;
12153
12154 default:
12155 break;
12156 }
12157 break;
12158 }
12159 }
12160
12161 return FALSE;
12162 }
12163
12164 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12165 DWARF debug sections. This is a target specific test. Note - we do not
12166 go through the whole including-target-headers-multiple-times route, (as
12167 we have already done with <elf/h8.h>) because this would become very
12168 messy and even then this function would have to contain target specific
12169 information (the names of the relocs instead of their numeric values).
12170 FIXME: This is not the correct way to solve this problem. The proper way
12171 is to have target specific reloc sizing and typing functions created by
12172 the reloc-macros.h header, in the same way that it already creates the
12173 reloc naming functions. */
12174
12175 static bfd_boolean
12176 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12177 {
12178 /* Please keep this table alpha-sorted for ease of visual lookup. */
12179 switch (filedata->file_header.e_machine)
12180 {
12181 case EM_386:
12182 case EM_IAMCU:
12183 return reloc_type == 1; /* R_386_32. */
12184 case EM_68K:
12185 return reloc_type == 1; /* R_68K_32. */
12186 case EM_AARCH64:
12187 return (reloc_type == 258
12188 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12189 case EM_ADAPTEVA_EPIPHANY:
12190 return reloc_type == 3;
12191 case EM_ALPHA:
12192 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12193 case EM_ARC:
12194 return reloc_type == 1; /* R_ARC_32. */
12195 case EM_ARC_COMPACT:
12196 case EM_ARC_COMPACT2:
12197 return reloc_type == 4; /* R_ARC_32. */
12198 case EM_ARM:
12199 return reloc_type == 2; /* R_ARM_ABS32 */
12200 case EM_AVR_OLD:
12201 case EM_AVR:
12202 return reloc_type == 1;
12203 case EM_BLACKFIN:
12204 return reloc_type == 0x12; /* R_byte4_data. */
12205 case EM_CRIS:
12206 return reloc_type == 3; /* R_CRIS_32. */
12207 case EM_CR16:
12208 return reloc_type == 3; /* R_CR16_NUM32. */
12209 case EM_CRX:
12210 return reloc_type == 15; /* R_CRX_NUM32. */
12211 case EM_CYGNUS_FRV:
12212 return reloc_type == 1;
12213 case EM_CYGNUS_D10V:
12214 case EM_D10V:
12215 return reloc_type == 6; /* R_D10V_32. */
12216 case EM_CYGNUS_D30V:
12217 case EM_D30V:
12218 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12219 case EM_DLX:
12220 return reloc_type == 3; /* R_DLX_RELOC_32. */
12221 case EM_CYGNUS_FR30:
12222 case EM_FR30:
12223 return reloc_type == 3; /* R_FR30_32. */
12224 case EM_FT32:
12225 return reloc_type == 1; /* R_FT32_32. */
12226 case EM_H8S:
12227 case EM_H8_300:
12228 case EM_H8_300H:
12229 return reloc_type == 1; /* R_H8_DIR32. */
12230 case EM_IA_64:
12231 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12232 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12233 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12234 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12235 case EM_IP2K_OLD:
12236 case EM_IP2K:
12237 return reloc_type == 2; /* R_IP2K_32. */
12238 case EM_IQ2000:
12239 return reloc_type == 2; /* R_IQ2000_32. */
12240 case EM_LATTICEMICO32:
12241 return reloc_type == 3; /* R_LM32_32. */
12242 case EM_M32C_OLD:
12243 case EM_M32C:
12244 return reloc_type == 3; /* R_M32C_32. */
12245 case EM_M32R:
12246 return reloc_type == 34; /* R_M32R_32_RELA. */
12247 case EM_68HC11:
12248 case EM_68HC12:
12249 return reloc_type == 6; /* R_M68HC11_32. */
12250 case EM_MCORE:
12251 return reloc_type == 1; /* R_MCORE_ADDR32. */
12252 case EM_CYGNUS_MEP:
12253 return reloc_type == 4; /* R_MEP_32. */
12254 case EM_METAG:
12255 return reloc_type == 2; /* R_METAG_ADDR32. */
12256 case EM_MICROBLAZE:
12257 return reloc_type == 1; /* R_MICROBLAZE_32. */
12258 case EM_MIPS:
12259 return reloc_type == 2; /* R_MIPS_32. */
12260 case EM_MMIX:
12261 return reloc_type == 4; /* R_MMIX_32. */
12262 case EM_CYGNUS_MN10200:
12263 case EM_MN10200:
12264 return reloc_type == 1; /* R_MN10200_32. */
12265 case EM_CYGNUS_MN10300:
12266 case EM_MN10300:
12267 return reloc_type == 1; /* R_MN10300_32. */
12268 case EM_MOXIE:
12269 return reloc_type == 1; /* R_MOXIE_32. */
12270 case EM_MSP430_OLD:
12271 case EM_MSP430:
12272 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12273 case EM_MT:
12274 return reloc_type == 2; /* R_MT_32. */
12275 case EM_NDS32:
12276 return reloc_type == 20; /* R_NDS32_RELA. */
12277 case EM_ALTERA_NIOS2:
12278 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12279 case EM_NIOS32:
12280 return reloc_type == 1; /* R_NIOS_32. */
12281 case EM_OR1K:
12282 return reloc_type == 1; /* R_OR1K_32. */
12283 case EM_PARISC:
12284 return (reloc_type == 1 /* R_PARISC_DIR32. */
12285 || reloc_type == 41); /* R_PARISC_SECREL32. */
12286 case EM_PJ:
12287 case EM_PJ_OLD:
12288 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12289 case EM_PPC64:
12290 return reloc_type == 1; /* R_PPC64_ADDR32. */
12291 case EM_PPC:
12292 return reloc_type == 1; /* R_PPC_ADDR32. */
12293 case EM_TI_PRU:
12294 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12295 case EM_RISCV:
12296 return reloc_type == 1; /* R_RISCV_32. */
12297 case EM_RL78:
12298 return reloc_type == 1; /* R_RL78_DIR32. */
12299 case EM_RX:
12300 return reloc_type == 1; /* R_RX_DIR32. */
12301 case EM_S370:
12302 return reloc_type == 1; /* R_I370_ADDR31. */
12303 case EM_S390_OLD:
12304 case EM_S390:
12305 return reloc_type == 4; /* R_S390_32. */
12306 case EM_SCORE:
12307 return reloc_type == 8; /* R_SCORE_ABS32. */
12308 case EM_SH:
12309 return reloc_type == 1; /* R_SH_DIR32. */
12310 case EM_SPARC32PLUS:
12311 case EM_SPARCV9:
12312 case EM_SPARC:
12313 return reloc_type == 3 /* R_SPARC_32. */
12314 || reloc_type == 23; /* R_SPARC_UA32. */
12315 case EM_SPU:
12316 return reloc_type == 6; /* R_SPU_ADDR32 */
12317 case EM_TI_C6000:
12318 return reloc_type == 1; /* R_C6000_ABS32. */
12319 case EM_TILEGX:
12320 return reloc_type == 2; /* R_TILEGX_32. */
12321 case EM_TILEPRO:
12322 return reloc_type == 1; /* R_TILEPRO_32. */
12323 case EM_CYGNUS_V850:
12324 case EM_V850:
12325 return reloc_type == 6; /* R_V850_ABS32. */
12326 case EM_V800:
12327 return reloc_type == 0x33; /* R_V810_WORD. */
12328 case EM_VAX:
12329 return reloc_type == 1; /* R_VAX_32. */
12330 case EM_VISIUM:
12331 return reloc_type == 3; /* R_VISIUM_32. */
12332 case EM_WEBASSEMBLY:
12333 return reloc_type == 1; /* R_WASM32_32. */
12334 case EM_X86_64:
12335 case EM_L1OM:
12336 case EM_K1OM:
12337 return reloc_type == 10; /* R_X86_64_32. */
12338 case EM_XC16X:
12339 case EM_C166:
12340 return reloc_type == 3; /* R_XC16C_ABS_32. */
12341 case EM_XGATE:
12342 return reloc_type == 4; /* R_XGATE_32. */
12343 case EM_XSTORMY16:
12344 return reloc_type == 1; /* R_XSTROMY16_32. */
12345 case EM_XTENSA_OLD:
12346 case EM_XTENSA:
12347 return reloc_type == 1; /* R_XTENSA_32. */
12348 default:
12349 {
12350 static unsigned int prev_warn = 0;
12351
12352 /* Avoid repeating the same warning multiple times. */
12353 if (prev_warn != filedata->file_header.e_machine)
12354 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12355 filedata->file_header.e_machine);
12356 prev_warn = filedata->file_header.e_machine;
12357 return FALSE;
12358 }
12359 }
12360 }
12361
12362 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12363 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12364
12365 static bfd_boolean
12366 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12367 {
12368 switch (filedata->file_header.e_machine)
12369 /* Please keep this table alpha-sorted for ease of visual lookup. */
12370 {
12371 case EM_386:
12372 case EM_IAMCU:
12373 return reloc_type == 2; /* R_386_PC32. */
12374 case EM_68K:
12375 return reloc_type == 4; /* R_68K_PC32. */
12376 case EM_AARCH64:
12377 return reloc_type == 261; /* R_AARCH64_PREL32 */
12378 case EM_ADAPTEVA_EPIPHANY:
12379 return reloc_type == 6;
12380 case EM_ALPHA:
12381 return reloc_type == 10; /* R_ALPHA_SREL32. */
12382 case EM_ARC_COMPACT:
12383 case EM_ARC_COMPACT2:
12384 return reloc_type == 49; /* R_ARC_32_PCREL. */
12385 case EM_ARM:
12386 return reloc_type == 3; /* R_ARM_REL32 */
12387 case EM_AVR_OLD:
12388 case EM_AVR:
12389 return reloc_type == 36; /* R_AVR_32_PCREL. */
12390 case EM_MICROBLAZE:
12391 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12392 case EM_OR1K:
12393 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12394 case EM_PARISC:
12395 return reloc_type == 9; /* R_PARISC_PCREL32. */
12396 case EM_PPC:
12397 return reloc_type == 26; /* R_PPC_REL32. */
12398 case EM_PPC64:
12399 return reloc_type == 26; /* R_PPC64_REL32. */
12400 case EM_S390_OLD:
12401 case EM_S390:
12402 return reloc_type == 5; /* R_390_PC32. */
12403 case EM_SH:
12404 return reloc_type == 2; /* R_SH_REL32. */
12405 case EM_SPARC32PLUS:
12406 case EM_SPARCV9:
12407 case EM_SPARC:
12408 return reloc_type == 6; /* R_SPARC_DISP32. */
12409 case EM_SPU:
12410 return reloc_type == 13; /* R_SPU_REL32. */
12411 case EM_TILEGX:
12412 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12413 case EM_TILEPRO:
12414 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12415 case EM_VISIUM:
12416 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12417 case EM_X86_64:
12418 case EM_L1OM:
12419 case EM_K1OM:
12420 return reloc_type == 2; /* R_X86_64_PC32. */
12421 case EM_XTENSA_OLD:
12422 case EM_XTENSA:
12423 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12424 default:
12425 /* Do not abort or issue an error message here. Not all targets use
12426 pc-relative 32-bit relocs in their DWARF debug information and we
12427 have already tested for target coverage in is_32bit_abs_reloc. A
12428 more helpful warning message will be generated by apply_relocations
12429 anyway, so just return. */
12430 return FALSE;
12431 }
12432 }
12433
12434 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12435 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12436
12437 static bfd_boolean
12438 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12439 {
12440 switch (filedata->file_header.e_machine)
12441 {
12442 case EM_AARCH64:
12443 return reloc_type == 257; /* R_AARCH64_ABS64. */
12444 case EM_ALPHA:
12445 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12446 case EM_IA_64:
12447 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12448 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12449 case EM_PARISC:
12450 return reloc_type == 80; /* R_PARISC_DIR64. */
12451 case EM_PPC64:
12452 return reloc_type == 38; /* R_PPC64_ADDR64. */
12453 case EM_RISCV:
12454 return reloc_type == 2; /* R_RISCV_64. */
12455 case EM_SPARC32PLUS:
12456 case EM_SPARCV9:
12457 case EM_SPARC:
12458 return reloc_type == 32 /* R_SPARC_64. */
12459 || reloc_type == 54; /* R_SPARC_UA64. */
12460 case EM_X86_64:
12461 case EM_L1OM:
12462 case EM_K1OM:
12463 return reloc_type == 1; /* R_X86_64_64. */
12464 case EM_S390_OLD:
12465 case EM_S390:
12466 return reloc_type == 22; /* R_S390_64. */
12467 case EM_TILEGX:
12468 return reloc_type == 1; /* R_TILEGX_64. */
12469 case EM_MIPS:
12470 return reloc_type == 18; /* R_MIPS_64. */
12471 default:
12472 return FALSE;
12473 }
12474 }
12475
12476 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12477 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12478
12479 static bfd_boolean
12480 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12481 {
12482 switch (filedata->file_header.e_machine)
12483 {
12484 case EM_AARCH64:
12485 return reloc_type == 260; /* R_AARCH64_PREL64. */
12486 case EM_ALPHA:
12487 return reloc_type == 11; /* R_ALPHA_SREL64. */
12488 case EM_IA_64:
12489 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12490 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12491 case EM_PARISC:
12492 return reloc_type == 72; /* R_PARISC_PCREL64. */
12493 case EM_PPC64:
12494 return reloc_type == 44; /* R_PPC64_REL64. */
12495 case EM_SPARC32PLUS:
12496 case EM_SPARCV9:
12497 case EM_SPARC:
12498 return reloc_type == 46; /* R_SPARC_DISP64. */
12499 case EM_X86_64:
12500 case EM_L1OM:
12501 case EM_K1OM:
12502 return reloc_type == 24; /* R_X86_64_PC64. */
12503 case EM_S390_OLD:
12504 case EM_S390:
12505 return reloc_type == 23; /* R_S390_PC64. */
12506 case EM_TILEGX:
12507 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12508 default:
12509 return FALSE;
12510 }
12511 }
12512
12513 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12514 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12515
12516 static bfd_boolean
12517 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12518 {
12519 switch (filedata->file_header.e_machine)
12520 {
12521 case EM_CYGNUS_MN10200:
12522 case EM_MN10200:
12523 return reloc_type == 4; /* R_MN10200_24. */
12524 case EM_FT32:
12525 return reloc_type == 5; /* R_FT32_20. */
12526 default:
12527 return FALSE;
12528 }
12529 }
12530
12531 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12532 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12533
12534 static bfd_boolean
12535 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12536 {
12537 /* Please keep this table alpha-sorted for ease of visual lookup. */
12538 switch (filedata->file_header.e_machine)
12539 {
12540 case EM_ARC:
12541 case EM_ARC_COMPACT:
12542 case EM_ARC_COMPACT2:
12543 return reloc_type == 2; /* R_ARC_16. */
12544 case EM_ADAPTEVA_EPIPHANY:
12545 return reloc_type == 5;
12546 case EM_AVR_OLD:
12547 case EM_AVR:
12548 return reloc_type == 4; /* R_AVR_16. */
12549 case EM_CYGNUS_D10V:
12550 case EM_D10V:
12551 return reloc_type == 3; /* R_D10V_16. */
12552 case EM_FT32:
12553 return reloc_type == 2; /* R_FT32_16. */
12554 case EM_H8S:
12555 case EM_H8_300:
12556 case EM_H8_300H:
12557 return reloc_type == R_H8_DIR16;
12558 case EM_IP2K_OLD:
12559 case EM_IP2K:
12560 return reloc_type == 1; /* R_IP2K_16. */
12561 case EM_M32C_OLD:
12562 case EM_M32C:
12563 return reloc_type == 1; /* R_M32C_16 */
12564 case EM_CYGNUS_MN10200:
12565 case EM_MN10200:
12566 return reloc_type == 2; /* R_MN10200_16. */
12567 case EM_CYGNUS_MN10300:
12568 case EM_MN10300:
12569 return reloc_type == 2; /* R_MN10300_16. */
12570 case EM_MSP430:
12571 if (uses_msp430x_relocs (filedata))
12572 return reloc_type == 2; /* R_MSP430_ABS16. */
12573 /* Fall through. */
12574 case EM_MSP430_OLD:
12575 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12576 case EM_NDS32:
12577 return reloc_type == 19; /* R_NDS32_RELA. */
12578 case EM_ALTERA_NIOS2:
12579 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12580 case EM_NIOS32:
12581 return reloc_type == 9; /* R_NIOS_16. */
12582 case EM_OR1K:
12583 return reloc_type == 2; /* R_OR1K_16. */
12584 case EM_TI_PRU:
12585 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12586 case EM_TI_C6000:
12587 return reloc_type == 2; /* R_C6000_ABS16. */
12588 case EM_VISIUM:
12589 return reloc_type == 2; /* R_VISIUM_16. */
12590 case EM_XC16X:
12591 case EM_C166:
12592 return reloc_type == 2; /* R_XC16C_ABS_16. */
12593 case EM_XGATE:
12594 return reloc_type == 3; /* R_XGATE_16. */
12595 default:
12596 return FALSE;
12597 }
12598 }
12599
12600 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12601 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12602
12603 static bfd_boolean
12604 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12605 {
12606 /* Please keep this table alpha-sorted for ease of visual lookup. */
12607 switch (filedata->file_header.e_machine)
12608 {
12609 case EM_RISCV:
12610 return reloc_type == 35; /* R_RISCV_ADD32. */
12611 default:
12612 return FALSE;
12613 }
12614 }
12615
12616 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12617 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12618
12619 static bfd_boolean
12620 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12621 {
12622 /* Please keep this table alpha-sorted for ease of visual lookup. */
12623 switch (filedata->file_header.e_machine)
12624 {
12625 case EM_RISCV:
12626 return reloc_type == 39; /* R_RISCV_SUB32. */
12627 default:
12628 return FALSE;
12629 }
12630 }
12631
12632 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12633 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12634
12635 static bfd_boolean
12636 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12637 {
12638 /* Please keep this table alpha-sorted for ease of visual lookup. */
12639 switch (filedata->file_header.e_machine)
12640 {
12641 case EM_RISCV:
12642 return reloc_type == 36; /* R_RISCV_ADD64. */
12643 default:
12644 return FALSE;
12645 }
12646 }
12647
12648 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12649 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12650
12651 static bfd_boolean
12652 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12653 {
12654 /* Please keep this table alpha-sorted for ease of visual lookup. */
12655 switch (filedata->file_header.e_machine)
12656 {
12657 case EM_RISCV:
12658 return reloc_type == 40; /* R_RISCV_SUB64. */
12659 default:
12660 return FALSE;
12661 }
12662 }
12663
12664 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12665 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12666
12667 static bfd_boolean
12668 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12669 {
12670 /* Please keep this table alpha-sorted for ease of visual lookup. */
12671 switch (filedata->file_header.e_machine)
12672 {
12673 case EM_RISCV:
12674 return reloc_type == 34; /* R_RISCV_ADD16. */
12675 default:
12676 return FALSE;
12677 }
12678 }
12679
12680 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12681 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12682
12683 static bfd_boolean
12684 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12685 {
12686 /* Please keep this table alpha-sorted for ease of visual lookup. */
12687 switch (filedata->file_header.e_machine)
12688 {
12689 case EM_RISCV:
12690 return reloc_type == 38; /* R_RISCV_SUB16. */
12691 default:
12692 return FALSE;
12693 }
12694 }
12695
12696 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12697 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12698
12699 static bfd_boolean
12700 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12701 {
12702 /* Please keep this table alpha-sorted for ease of visual lookup. */
12703 switch (filedata->file_header.e_machine)
12704 {
12705 case EM_RISCV:
12706 return reloc_type == 33; /* R_RISCV_ADD8. */
12707 default:
12708 return FALSE;
12709 }
12710 }
12711
12712 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12713 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12714
12715 static bfd_boolean
12716 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12717 {
12718 /* Please keep this table alpha-sorted for ease of visual lookup. */
12719 switch (filedata->file_header.e_machine)
12720 {
12721 case EM_RISCV:
12722 return reloc_type == 37; /* R_RISCV_SUB8. */
12723 default:
12724 return FALSE;
12725 }
12726 }
12727
12728 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12729 relocation entries (possibly formerly used for SHT_GROUP sections). */
12730
12731 static bfd_boolean
12732 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12733 {
12734 switch (filedata->file_header.e_machine)
12735 {
12736 case EM_386: /* R_386_NONE. */
12737 case EM_68K: /* R_68K_NONE. */
12738 case EM_ADAPTEVA_EPIPHANY:
12739 case EM_ALPHA: /* R_ALPHA_NONE. */
12740 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12741 case EM_ARC: /* R_ARC_NONE. */
12742 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12743 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12744 case EM_ARM: /* R_ARM_NONE. */
12745 case EM_C166: /* R_XC16X_NONE. */
12746 case EM_CRIS: /* R_CRIS_NONE. */
12747 case EM_FT32: /* R_FT32_NONE. */
12748 case EM_IA_64: /* R_IA64_NONE. */
12749 case EM_K1OM: /* R_X86_64_NONE. */
12750 case EM_L1OM: /* R_X86_64_NONE. */
12751 case EM_M32R: /* R_M32R_NONE. */
12752 case EM_MIPS: /* R_MIPS_NONE. */
12753 case EM_MN10300: /* R_MN10300_NONE. */
12754 case EM_MOXIE: /* R_MOXIE_NONE. */
12755 case EM_NIOS32: /* R_NIOS_NONE. */
12756 case EM_OR1K: /* R_OR1K_NONE. */
12757 case EM_PARISC: /* R_PARISC_NONE. */
12758 case EM_PPC64: /* R_PPC64_NONE. */
12759 case EM_PPC: /* R_PPC_NONE. */
12760 case EM_RISCV: /* R_RISCV_NONE. */
12761 case EM_S390: /* R_390_NONE. */
12762 case EM_S390_OLD:
12763 case EM_SH: /* R_SH_NONE. */
12764 case EM_SPARC32PLUS:
12765 case EM_SPARC: /* R_SPARC_NONE. */
12766 case EM_SPARCV9:
12767 case EM_TILEGX: /* R_TILEGX_NONE. */
12768 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12769 case EM_TI_C6000:/* R_C6000_NONE. */
12770 case EM_X86_64: /* R_X86_64_NONE. */
12771 case EM_XC16X:
12772 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
12773 return reloc_type == 0;
12774
12775 case EM_AARCH64:
12776 return reloc_type == 0 || reloc_type == 256;
12777 case EM_AVR_OLD:
12778 case EM_AVR:
12779 return (reloc_type == 0 /* R_AVR_NONE. */
12780 || reloc_type == 30 /* R_AVR_DIFF8. */
12781 || reloc_type == 31 /* R_AVR_DIFF16. */
12782 || reloc_type == 32 /* R_AVR_DIFF32. */);
12783 case EM_METAG:
12784 return reloc_type == 3; /* R_METAG_NONE. */
12785 case EM_NDS32:
12786 return (reloc_type == 0 /* R_XTENSA_NONE. */
12787 || reloc_type == 204 /* R_NDS32_DIFF8. */
12788 || reloc_type == 205 /* R_NDS32_DIFF16. */
12789 || reloc_type == 206 /* R_NDS32_DIFF32. */
12790 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12791 case EM_TI_PRU:
12792 return (reloc_type == 0 /* R_PRU_NONE. */
12793 || reloc_type == 65 /* R_PRU_DIFF8. */
12794 || reloc_type == 66 /* R_PRU_DIFF16. */
12795 || reloc_type == 67 /* R_PRU_DIFF32. */);
12796 case EM_XTENSA_OLD:
12797 case EM_XTENSA:
12798 return (reloc_type == 0 /* R_XTENSA_NONE. */
12799 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12800 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12801 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12802 }
12803 return FALSE;
12804 }
12805
12806 /* Returns TRUE if there is a relocation against
12807 section NAME at OFFSET bytes. */
12808
12809 bfd_boolean
12810 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12811 {
12812 Elf_Internal_Rela * relocs;
12813 Elf_Internal_Rela * rp;
12814
12815 if (dsec == NULL || dsec->reloc_info == NULL)
12816 return FALSE;
12817
12818 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12819
12820 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12821 if (rp->r_offset == offset)
12822 return TRUE;
12823
12824 return FALSE;
12825 }
12826
12827 /* Apply relocations to a section.
12828 Returns TRUE upon success, FALSE otherwise.
12829 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12830 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12831 will be set to the number of relocs loaded.
12832
12833 Note: So far support has been added only for those relocations
12834 which can be found in debug sections. FIXME: Add support for
12835 more relocations ? */
12836
12837 static bfd_boolean
12838 apply_relocations (Filedata * filedata,
12839 const Elf_Internal_Shdr * section,
12840 unsigned char * start,
12841 bfd_size_type size,
12842 void ** relocs_return,
12843 unsigned long * num_relocs_return)
12844 {
12845 Elf_Internal_Shdr * relsec;
12846 unsigned char * end = start + size;
12847 bfd_boolean res = TRUE;
12848
12849 if (relocs_return != NULL)
12850 {
12851 * (Elf_Internal_Rela **) relocs_return = NULL;
12852 * num_relocs_return = 0;
12853 }
12854
12855 if (filedata->file_header.e_type != ET_REL)
12856 /* No relocs to apply. */
12857 return TRUE;
12858
12859 /* Find the reloc section associated with the section. */
12860 for (relsec = filedata->section_headers;
12861 relsec < filedata->section_headers + filedata->file_header.e_shnum;
12862 ++relsec)
12863 {
12864 bfd_boolean is_rela;
12865 unsigned long num_relocs;
12866 Elf_Internal_Rela * relocs;
12867 Elf_Internal_Rela * rp;
12868 Elf_Internal_Shdr * symsec;
12869 Elf_Internal_Sym * symtab;
12870 unsigned long num_syms;
12871 Elf_Internal_Sym * sym;
12872
12873 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12874 || relsec->sh_info >= filedata->file_header.e_shnum
12875 || filedata->section_headers + relsec->sh_info != section
12876 || relsec->sh_size == 0
12877 || relsec->sh_link >= filedata->file_header.e_shnum)
12878 continue;
12879
12880 is_rela = relsec->sh_type == SHT_RELA;
12881
12882 if (is_rela)
12883 {
12884 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
12885 relsec->sh_size, & relocs, & num_relocs))
12886 return FALSE;
12887 }
12888 else
12889 {
12890 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
12891 relsec->sh_size, & relocs, & num_relocs))
12892 return FALSE;
12893 }
12894
12895 /* SH uses RELA but uses in place value instead of the addend field. */
12896 if (filedata->file_header.e_machine == EM_SH)
12897 is_rela = FALSE;
12898
12899 symsec = filedata->section_headers + relsec->sh_link;
12900 if (symsec->sh_type != SHT_SYMTAB
12901 && symsec->sh_type != SHT_DYNSYM)
12902 return FALSE;
12903 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
12904
12905 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12906 {
12907 bfd_vma addend;
12908 unsigned int reloc_type;
12909 unsigned int reloc_size;
12910 bfd_boolean reloc_inplace = FALSE;
12911 bfd_boolean reloc_subtract = FALSE;
12912 unsigned char * rloc;
12913 unsigned long sym_index;
12914
12915 reloc_type = get_reloc_type (filedata, rp->r_info);
12916
12917 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
12918 continue;
12919 else if (is_none_reloc (filedata, reloc_type))
12920 continue;
12921 else if (is_32bit_abs_reloc (filedata, reloc_type)
12922 || is_32bit_pcrel_reloc (filedata, reloc_type))
12923 reloc_size = 4;
12924 else if (is_64bit_abs_reloc (filedata, reloc_type)
12925 || is_64bit_pcrel_reloc (filedata, reloc_type))
12926 reloc_size = 8;
12927 else if (is_24bit_abs_reloc (filedata, reloc_type))
12928 reloc_size = 3;
12929 else if (is_16bit_abs_reloc (filedata, reloc_type))
12930 reloc_size = 2;
12931 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
12932 reloc_type))
12933 || is_32bit_inplace_add_reloc (filedata, reloc_type))
12934 {
12935 reloc_size = 4;
12936 reloc_inplace = TRUE;
12937 }
12938 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
12939 reloc_type))
12940 || is_64bit_inplace_add_reloc (filedata, reloc_type))
12941 {
12942 reloc_size = 8;
12943 reloc_inplace = TRUE;
12944 }
12945 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
12946 reloc_type))
12947 || is_16bit_inplace_add_reloc (filedata, reloc_type))
12948 {
12949 reloc_size = 2;
12950 reloc_inplace = TRUE;
12951 }
12952 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
12953 reloc_type))
12954 || is_8bit_inplace_add_reloc (filedata, reloc_type))
12955 {
12956 reloc_size = 1;
12957 reloc_inplace = TRUE;
12958 }
12959 else
12960 {
12961 static unsigned int prev_reloc = 0;
12962
12963 if (reloc_type != prev_reloc)
12964 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12965 reloc_type, printable_section_name (filedata, section));
12966 prev_reloc = reloc_type;
12967 res = FALSE;
12968 continue;
12969 }
12970
12971 rloc = start + rp->r_offset;
12972 if ((rloc + reloc_size) > end || (rloc < start))
12973 {
12974 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12975 (unsigned long) rp->r_offset,
12976 printable_section_name (filedata, section));
12977 res = FALSE;
12978 continue;
12979 }
12980
12981 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12982 if (sym_index >= num_syms)
12983 {
12984 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12985 sym_index, printable_section_name (filedata, section));
12986 res = FALSE;
12987 continue;
12988 }
12989 sym = symtab + sym_index;
12990
12991 /* If the reloc has a symbol associated with it,
12992 make sure that it is of an appropriate type.
12993
12994 Relocations against symbols without type can happen.
12995 Gcc -feliminate-dwarf2-dups may generate symbols
12996 without type for debug info.
12997
12998 Icc generates relocations against function symbols
12999 instead of local labels.
13000
13001 Relocations against object symbols can happen, eg when
13002 referencing a global array. For an example of this see
13003 the _clz.o binary in libgcc.a. */
13004 if (sym != symtab
13005 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13006 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13007 {
13008 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13009 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13010 printable_section_name (filedata, relsec),
13011 (long int)(rp - relocs));
13012 res = FALSE;
13013 continue;
13014 }
13015
13016 addend = 0;
13017 if (is_rela)
13018 addend += rp->r_addend;
13019 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13020 partial_inplace. */
13021 if (!is_rela
13022 || (filedata->file_header.e_machine == EM_XTENSA
13023 && reloc_type == 1)
13024 || ((filedata->file_header.e_machine == EM_PJ
13025 || filedata->file_header.e_machine == EM_PJ_OLD)
13026 && reloc_type == 1)
13027 || ((filedata->file_header.e_machine == EM_D30V
13028 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13029 && reloc_type == 12)
13030 || reloc_inplace)
13031 addend += byte_get (rloc, reloc_size);
13032
13033 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13034 || is_64bit_pcrel_reloc (filedata, reloc_type))
13035 {
13036 /* On HPPA, all pc-relative relocations are biased by 8. */
13037 if (filedata->file_header.e_machine == EM_PARISC)
13038 addend -= 8;
13039 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13040 reloc_size);
13041 }
13042 else if (reloc_subtract)
13043 byte_put (rloc, addend - sym->st_value, reloc_size);
13044 else
13045 byte_put (rloc, addend + sym->st_value, reloc_size);
13046 }
13047
13048 free (symtab);
13049 /* Let the target specific reloc processing code know that
13050 we have finished with these relocs. */
13051 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13052
13053 if (relocs_return)
13054 {
13055 * (Elf_Internal_Rela **) relocs_return = relocs;
13056 * num_relocs_return = num_relocs;
13057 }
13058 else
13059 free (relocs);
13060
13061 break;
13062 }
13063
13064 return res;
13065 }
13066
13067 #ifdef SUPPORT_DISASSEMBLY
13068 static bfd_boolean
13069 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13070 {
13071 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13072
13073 /* FIXME: XXX -- to be done --- XXX */
13074
13075 return TRUE;
13076 }
13077 #endif
13078
13079 /* Reads in the contents of SECTION from FILE, returning a pointer
13080 to a malloc'ed buffer or NULL if something went wrong. */
13081
13082 static char *
13083 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13084 {
13085 bfd_size_type num_bytes = section->sh_size;
13086
13087 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13088 {
13089 printf (_("Section '%s' has no data to dump.\n"),
13090 printable_section_name (filedata, section));
13091 return NULL;
13092 }
13093
13094 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13095 _("section contents"));
13096 }
13097
13098 /* Uncompresses a section that was compressed using zlib, in place. */
13099
13100 static bfd_boolean
13101 uncompress_section_contents (unsigned char ** buffer,
13102 dwarf_size_type uncompressed_size,
13103 dwarf_size_type * size)
13104 {
13105 dwarf_size_type compressed_size = *size;
13106 unsigned char * compressed_buffer = *buffer;
13107 unsigned char * uncompressed_buffer;
13108 z_stream strm;
13109 int rc;
13110
13111 /* It is possible the section consists of several compressed
13112 buffers concatenated together, so we uncompress in a loop. */
13113 /* PR 18313: The state field in the z_stream structure is supposed
13114 to be invisible to the user (ie us), but some compilers will
13115 still complain about it being used without initialisation. So
13116 we first zero the entire z_stream structure and then set the fields
13117 that we need. */
13118 memset (& strm, 0, sizeof strm);
13119 strm.avail_in = compressed_size;
13120 strm.next_in = (Bytef *) compressed_buffer;
13121 strm.avail_out = uncompressed_size;
13122 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13123
13124 rc = inflateInit (& strm);
13125 while (strm.avail_in > 0)
13126 {
13127 if (rc != Z_OK)
13128 goto fail;
13129 strm.next_out = ((Bytef *) uncompressed_buffer
13130 + (uncompressed_size - strm.avail_out));
13131 rc = inflate (&strm, Z_FINISH);
13132 if (rc != Z_STREAM_END)
13133 goto fail;
13134 rc = inflateReset (& strm);
13135 }
13136 rc = inflateEnd (& strm);
13137 if (rc != Z_OK
13138 || strm.avail_out != 0)
13139 goto fail;
13140
13141 *buffer = uncompressed_buffer;
13142 *size = uncompressed_size;
13143 return TRUE;
13144
13145 fail:
13146 free (uncompressed_buffer);
13147 /* Indicate decompression failure. */
13148 *buffer = NULL;
13149 return FALSE;
13150 }
13151
13152 static bfd_boolean
13153 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13154 {
13155 Elf_Internal_Shdr * relsec;
13156 bfd_size_type num_bytes;
13157 unsigned char * data;
13158 unsigned char * end;
13159 unsigned char * real_start;
13160 unsigned char * start;
13161 bfd_boolean some_strings_shown;
13162
13163 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13164 if (start == NULL)
13165 /* PR 21820: Do not fail if the section was empty. */
13166 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13167
13168 num_bytes = section->sh_size;
13169
13170 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13171
13172 if (decompress_dumps)
13173 {
13174 dwarf_size_type new_size = num_bytes;
13175 dwarf_size_type uncompressed_size = 0;
13176
13177 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13178 {
13179 Elf_Internal_Chdr chdr;
13180 unsigned int compression_header_size
13181 = get_compression_header (& chdr, (unsigned char *) start,
13182 num_bytes);
13183
13184 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13185 {
13186 warn (_("section '%s' has unsupported compress type: %d\n"),
13187 printable_section_name (filedata, section), chdr.ch_type);
13188 return FALSE;
13189 }
13190 else if (chdr.ch_addralign != section->sh_addralign)
13191 {
13192 warn (_("compressed section '%s' is corrupted\n"),
13193 printable_section_name (filedata, section));
13194 return FALSE;
13195 }
13196 uncompressed_size = chdr.ch_size;
13197 start += compression_header_size;
13198 new_size -= compression_header_size;
13199 }
13200 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13201 {
13202 /* Read the zlib header. In this case, it should be "ZLIB"
13203 followed by the uncompressed section size, 8 bytes in
13204 big-endian order. */
13205 uncompressed_size = start[4]; uncompressed_size <<= 8;
13206 uncompressed_size += start[5]; uncompressed_size <<= 8;
13207 uncompressed_size += start[6]; uncompressed_size <<= 8;
13208 uncompressed_size += start[7]; uncompressed_size <<= 8;
13209 uncompressed_size += start[8]; uncompressed_size <<= 8;
13210 uncompressed_size += start[9]; uncompressed_size <<= 8;
13211 uncompressed_size += start[10]; uncompressed_size <<= 8;
13212 uncompressed_size += start[11];
13213 start += 12;
13214 new_size -= 12;
13215 }
13216
13217 if (uncompressed_size)
13218 {
13219 if (uncompress_section_contents (& start,
13220 uncompressed_size, & new_size))
13221 num_bytes = new_size;
13222 else
13223 {
13224 error (_("Unable to decompress section %s\n"),
13225 printable_section_name (filedata, section));
13226 return FALSE;
13227 }
13228 }
13229 else
13230 start = real_start;
13231 }
13232
13233 /* If the section being dumped has relocations against it the user might
13234 be expecting these relocations to have been applied. Check for this
13235 case and issue a warning message in order to avoid confusion.
13236 FIXME: Maybe we ought to have an option that dumps a section with
13237 relocs applied ? */
13238 for (relsec = filedata->section_headers;
13239 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13240 ++relsec)
13241 {
13242 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13243 || relsec->sh_info >= filedata->file_header.e_shnum
13244 || filedata->section_headers + relsec->sh_info != section
13245 || relsec->sh_size == 0
13246 || relsec->sh_link >= filedata->file_header.e_shnum)
13247 continue;
13248
13249 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13250 break;
13251 }
13252
13253 data = start;
13254 end = start + num_bytes;
13255 some_strings_shown = FALSE;
13256
13257 while (data < end)
13258 {
13259 while (!ISPRINT (* data))
13260 if (++ data >= end)
13261 break;
13262
13263 if (data < end)
13264 {
13265 size_t maxlen = end - data;
13266
13267 #ifndef __MSVCRT__
13268 /* PR 11128: Use two separate invocations in order to work
13269 around bugs in the Solaris 8 implementation of printf. */
13270 printf (" [%6tx] ", data - start);
13271 #else
13272 printf (" [%6Ix] ", (size_t) (data - start));
13273 #endif
13274 if (maxlen > 0)
13275 {
13276 print_symbol ((int) maxlen, (const char *) data);
13277 putchar ('\n');
13278 data += strnlen ((const char *) data, maxlen);
13279 }
13280 else
13281 {
13282 printf (_("<corrupt>\n"));
13283 data = end;
13284 }
13285 some_strings_shown = TRUE;
13286 }
13287 }
13288
13289 if (! some_strings_shown)
13290 printf (_(" No strings found in this section."));
13291
13292 free (real_start);
13293
13294 putchar ('\n');
13295 return TRUE;
13296 }
13297
13298 static bfd_boolean
13299 dump_section_as_bytes (Elf_Internal_Shdr * section,
13300 Filedata * filedata,
13301 bfd_boolean relocate)
13302 {
13303 Elf_Internal_Shdr * relsec;
13304 bfd_size_type bytes;
13305 bfd_size_type section_size;
13306 bfd_vma addr;
13307 unsigned char * data;
13308 unsigned char * real_start;
13309 unsigned char * start;
13310
13311 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13312 if (start == NULL)
13313 /* PR 21820: Do not fail if the section was empty. */
13314 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13315
13316 section_size = section->sh_size;
13317
13318 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13319
13320 if (decompress_dumps)
13321 {
13322 dwarf_size_type new_size = section_size;
13323 dwarf_size_type uncompressed_size = 0;
13324
13325 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13326 {
13327 Elf_Internal_Chdr chdr;
13328 unsigned int compression_header_size
13329 = get_compression_header (& chdr, start, section_size);
13330
13331 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13332 {
13333 warn (_("section '%s' has unsupported compress type: %d\n"),
13334 printable_section_name (filedata, section), chdr.ch_type);
13335 return FALSE;
13336 }
13337 else if (chdr.ch_addralign != section->sh_addralign)
13338 {
13339 warn (_("compressed section '%s' is corrupted\n"),
13340 printable_section_name (filedata, section));
13341 return FALSE;
13342 }
13343 uncompressed_size = chdr.ch_size;
13344 start += compression_header_size;
13345 new_size -= compression_header_size;
13346 }
13347 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13348 {
13349 /* Read the zlib header. In this case, it should be "ZLIB"
13350 followed by the uncompressed section size, 8 bytes in
13351 big-endian order. */
13352 uncompressed_size = start[4]; uncompressed_size <<= 8;
13353 uncompressed_size += start[5]; uncompressed_size <<= 8;
13354 uncompressed_size += start[6]; uncompressed_size <<= 8;
13355 uncompressed_size += start[7]; uncompressed_size <<= 8;
13356 uncompressed_size += start[8]; uncompressed_size <<= 8;
13357 uncompressed_size += start[9]; uncompressed_size <<= 8;
13358 uncompressed_size += start[10]; uncompressed_size <<= 8;
13359 uncompressed_size += start[11];
13360 start += 12;
13361 new_size -= 12;
13362 }
13363
13364 if (uncompressed_size)
13365 {
13366 if (uncompress_section_contents (& start, uncompressed_size,
13367 & new_size))
13368 {
13369 section_size = new_size;
13370 }
13371 else
13372 {
13373 error (_("Unable to decompress section %s\n"),
13374 printable_section_name (filedata, section));
13375 /* FIXME: Print the section anyway ? */
13376 return FALSE;
13377 }
13378 }
13379 else
13380 start = real_start;
13381 }
13382
13383 if (relocate)
13384 {
13385 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13386 return FALSE;
13387 }
13388 else
13389 {
13390 /* If the section being dumped has relocations against it the user might
13391 be expecting these relocations to have been applied. Check for this
13392 case and issue a warning message in order to avoid confusion.
13393 FIXME: Maybe we ought to have an option that dumps a section with
13394 relocs applied ? */
13395 for (relsec = filedata->section_headers;
13396 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13397 ++relsec)
13398 {
13399 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13400 || relsec->sh_info >= filedata->file_header.e_shnum
13401 || filedata->section_headers + relsec->sh_info != section
13402 || relsec->sh_size == 0
13403 || relsec->sh_link >= filedata->file_header.e_shnum)
13404 continue;
13405
13406 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13407 break;
13408 }
13409 }
13410
13411 addr = section->sh_addr;
13412 bytes = section_size;
13413 data = start;
13414
13415 while (bytes)
13416 {
13417 int j;
13418 int k;
13419 int lbytes;
13420
13421 lbytes = (bytes > 16 ? 16 : bytes);
13422
13423 printf (" 0x%8.8lx ", (unsigned long) addr);
13424
13425 for (j = 0; j < 16; j++)
13426 {
13427 if (j < lbytes)
13428 printf ("%2.2x", data[j]);
13429 else
13430 printf (" ");
13431
13432 if ((j & 3) == 3)
13433 printf (" ");
13434 }
13435
13436 for (j = 0; j < lbytes; j++)
13437 {
13438 k = data[j];
13439 if (k >= ' ' && k < 0x7f)
13440 printf ("%c", k);
13441 else
13442 printf (".");
13443 }
13444
13445 putchar ('\n');
13446
13447 data += lbytes;
13448 addr += lbytes;
13449 bytes -= lbytes;
13450 }
13451
13452 free (real_start);
13453
13454 putchar ('\n');
13455 return TRUE;
13456 }
13457
13458 static bfd_boolean
13459 load_specific_debug_section (enum dwarf_section_display_enum debug,
13460 const Elf_Internal_Shdr * sec,
13461 void * data)
13462 {
13463 struct dwarf_section * section = &debug_displays [debug].section;
13464 char buf [64];
13465 Filedata * filedata = (Filedata *) data;
13466
13467 if (section->start != NULL)
13468 {
13469 /* If it is already loaded, do nothing. */
13470 if (streq (section->filename, filedata->file_name))
13471 return TRUE;
13472 free (section->start);
13473 }
13474
13475 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13476 section->address = sec->sh_addr;
13477 section->user_data = NULL;
13478 section->filename = filedata->file_name;
13479 section->start = (unsigned char *) get_data (NULL, filedata,
13480 sec->sh_offset, 1,
13481 sec->sh_size, buf);
13482 if (section->start == NULL)
13483 section->size = 0;
13484 else
13485 {
13486 unsigned char *start = section->start;
13487 dwarf_size_type size = sec->sh_size;
13488 dwarf_size_type uncompressed_size = 0;
13489
13490 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13491 {
13492 Elf_Internal_Chdr chdr;
13493 unsigned int compression_header_size;
13494
13495 if (size < (is_32bit_elf
13496 ? sizeof (Elf32_External_Chdr)
13497 : sizeof (Elf64_External_Chdr)))
13498 {
13499 warn (_("compressed section %s is too small to contain a compression header"),
13500 section->name);
13501 return FALSE;
13502 }
13503
13504 compression_header_size = get_compression_header (&chdr, start, size);
13505
13506 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13507 {
13508 warn (_("section '%s' has unsupported compress type: %d\n"),
13509 section->name, chdr.ch_type);
13510 return FALSE;
13511 }
13512 else if (chdr.ch_addralign != sec->sh_addralign)
13513 {
13514 warn (_("compressed section '%s' is corrupted\n"),
13515 section->name);
13516 return FALSE;
13517 }
13518 uncompressed_size = chdr.ch_size;
13519 start += compression_header_size;
13520 size -= compression_header_size;
13521 }
13522 else if (size > 12 && streq ((char *) start, "ZLIB"))
13523 {
13524 /* Read the zlib header. In this case, it should be "ZLIB"
13525 followed by the uncompressed section size, 8 bytes in
13526 big-endian order. */
13527 uncompressed_size = start[4]; uncompressed_size <<= 8;
13528 uncompressed_size += start[5]; uncompressed_size <<= 8;
13529 uncompressed_size += start[6]; uncompressed_size <<= 8;
13530 uncompressed_size += start[7]; uncompressed_size <<= 8;
13531 uncompressed_size += start[8]; uncompressed_size <<= 8;
13532 uncompressed_size += start[9]; uncompressed_size <<= 8;
13533 uncompressed_size += start[10]; uncompressed_size <<= 8;
13534 uncompressed_size += start[11];
13535 start += 12;
13536 size -= 12;
13537 }
13538
13539 if (uncompressed_size)
13540 {
13541 if (uncompress_section_contents (&start, uncompressed_size,
13542 &size))
13543 {
13544 /* Free the compressed buffer, update the section buffer
13545 and the section size if uncompress is successful. */
13546 free (section->start);
13547 section->start = start;
13548 }
13549 else
13550 {
13551 error (_("Unable to decompress section %s\n"),
13552 printable_section_name (filedata, sec));
13553 return FALSE;
13554 }
13555 }
13556
13557 section->size = size;
13558 }
13559
13560 if (section->start == NULL)
13561 return FALSE;
13562
13563 if (debug_displays [debug].relocate)
13564 {
13565 if (! apply_relocations (filedata, sec, section->start, section->size,
13566 & section->reloc_info, & section->num_relocs))
13567 return FALSE;
13568 }
13569 else
13570 {
13571 section->reloc_info = NULL;
13572 section->num_relocs = 0;
13573 }
13574
13575 return TRUE;
13576 }
13577
13578 /* If this is not NULL, load_debug_section will only look for sections
13579 within the list of sections given here. */
13580 static unsigned int * section_subset = NULL;
13581
13582 bfd_boolean
13583 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13584 {
13585 struct dwarf_section * section = &debug_displays [debug].section;
13586 Elf_Internal_Shdr * sec;
13587 Filedata * filedata = (Filedata *) data;
13588
13589 /* Without section headers we cannot find any sections. */
13590 if (filedata->section_headers == NULL)
13591 return FALSE;
13592
13593 if (filedata->string_table == NULL
13594 && filedata->file_header.e_shstrndx != SHN_UNDEF
13595 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13596 {
13597 Elf_Internal_Shdr * strs;
13598
13599 /* Read in the string table, so that we have section names to scan. */
13600 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13601
13602 if (strs != NULL && strs->sh_size != 0)
13603 {
13604 filedata->string_table
13605 = (char *) get_data (NULL, filedata, strs->sh_offset,
13606 1, strs->sh_size, _("string table"));
13607
13608 filedata->string_table_length
13609 = filedata->string_table != NULL ? strs->sh_size : 0;
13610 }
13611 }
13612
13613 /* Locate the debug section. */
13614 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13615 if (sec != NULL)
13616 section->name = section->uncompressed_name;
13617 else
13618 {
13619 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13620 if (sec != NULL)
13621 section->name = section->compressed_name;
13622 }
13623 if (sec == NULL)
13624 return FALSE;
13625
13626 /* If we're loading from a subset of sections, and we've loaded
13627 a section matching this name before, it's likely that it's a
13628 different one. */
13629 if (section_subset != NULL)
13630 free_debug_section (debug);
13631
13632 return load_specific_debug_section (debug, sec, data);
13633 }
13634
13635 void
13636 free_debug_section (enum dwarf_section_display_enum debug)
13637 {
13638 struct dwarf_section * section = &debug_displays [debug].section;
13639
13640 if (section->start == NULL)
13641 return;
13642
13643 free ((char *) section->start);
13644 section->start = NULL;
13645 section->address = 0;
13646 section->size = 0;
13647 }
13648
13649 static bfd_boolean
13650 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13651 {
13652 char * name = SECTION_NAME (section);
13653 const char * print_name = printable_section_name (filedata, section);
13654 bfd_size_type length;
13655 bfd_boolean result = TRUE;
13656 int i;
13657
13658 length = section->sh_size;
13659 if (length == 0)
13660 {
13661 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13662 return TRUE;
13663 }
13664 if (section->sh_type == SHT_NOBITS)
13665 {
13666 /* There is no point in dumping the contents of a debugging section
13667 which has the NOBITS type - the bits in the file will be random.
13668 This can happen when a file containing a .eh_frame section is
13669 stripped with the --only-keep-debug command line option. */
13670 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13671 print_name);
13672 return FALSE;
13673 }
13674
13675 if (const_strneq (name, ".gnu.linkonce.wi."))
13676 name = ".debug_info";
13677
13678 /* See if we know how to display the contents of this section. */
13679 for (i = 0; i < max; i++)
13680 {
13681 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13682 struct dwarf_section_display * display = debug_displays + i;
13683 struct dwarf_section * sec = & display->section;
13684
13685 if (streq (sec->uncompressed_name, name)
13686 || (id == line && const_strneq (name, ".debug_line."))
13687 || streq (sec->compressed_name, name))
13688 {
13689 bfd_boolean secondary = (section != find_section (filedata, name));
13690
13691 if (secondary)
13692 free_debug_section (id);
13693
13694 if (i == line && const_strneq (name, ".debug_line."))
13695 sec->name = name;
13696 else if (streq (sec->uncompressed_name, name))
13697 sec->name = sec->uncompressed_name;
13698 else
13699 sec->name = sec->compressed_name;
13700
13701 if (load_specific_debug_section (id, section, filedata))
13702 {
13703 /* If this debug section is part of a CU/TU set in a .dwp file,
13704 restrict load_debug_section to the sections in that set. */
13705 section_subset = find_cu_tu_set (filedata, shndx);
13706
13707 result &= display->display (sec, filedata);
13708
13709 section_subset = NULL;
13710
13711 if (secondary || (id != info && id != abbrev))
13712 free_debug_section (id);
13713 }
13714 break;
13715 }
13716 }
13717
13718 if (i == max)
13719 {
13720 printf (_("Unrecognized debug section: %s\n"), print_name);
13721 result = FALSE;
13722 }
13723
13724 return result;
13725 }
13726
13727 /* Set DUMP_SECTS for all sections where dumps were requested
13728 based on section name. */
13729
13730 static void
13731 initialise_dumps_byname (Filedata * filedata)
13732 {
13733 struct dump_list_entry * cur;
13734
13735 for (cur = dump_sects_byname; cur; cur = cur->next)
13736 {
13737 unsigned int i;
13738 bfd_boolean any = FALSE;
13739
13740 for (i = 0; i < filedata->file_header.e_shnum; i++)
13741 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13742 {
13743 request_dump_bynumber (filedata, i, cur->type);
13744 any = TRUE;
13745 }
13746
13747 if (!any)
13748 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13749 cur->name);
13750 }
13751 }
13752
13753 static bfd_boolean
13754 process_section_contents (Filedata * filedata)
13755 {
13756 Elf_Internal_Shdr * section;
13757 unsigned int i;
13758 bfd_boolean res = TRUE;
13759
13760 if (! do_dump)
13761 return TRUE;
13762
13763 initialise_dumps_byname (filedata);
13764
13765 for (i = 0, section = filedata->section_headers;
13766 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13767 i++, section++)
13768 {
13769 dump_type dump = filedata->dump_sects[i];
13770
13771 #ifdef SUPPORT_DISASSEMBLY
13772 if (dump & DISASS_DUMP)
13773 {
13774 if (! disassemble_section (section, filedata))
13775 res = FALSE;
13776 }
13777 #endif
13778 if (dump & HEX_DUMP)
13779 {
13780 if (! dump_section_as_bytes (section, filedata, FALSE))
13781 res = FALSE;
13782 }
13783
13784 if (dump & RELOC_DUMP)
13785 {
13786 if (! dump_section_as_bytes (section, filedata, TRUE))
13787 res = FALSE;
13788 }
13789
13790 if (dump & STRING_DUMP)
13791 {
13792 if (! dump_section_as_strings (section, filedata))
13793 res = FALSE;
13794 }
13795
13796 if (dump & DEBUG_DUMP)
13797 {
13798 if (! display_debug_section (i, section, filedata))
13799 res = FALSE;
13800 }
13801 }
13802
13803 /* Check to see if the user requested a
13804 dump of a section that does not exist. */
13805 while (i < filedata->num_dump_sects)
13806 {
13807 if (filedata->dump_sects[i])
13808 {
13809 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13810 res = FALSE;
13811 }
13812 i++;
13813 }
13814
13815 return res;
13816 }
13817
13818 static void
13819 process_mips_fpe_exception (int mask)
13820 {
13821 if (mask)
13822 {
13823 bfd_boolean first = TRUE;
13824
13825 if (mask & OEX_FPU_INEX)
13826 fputs ("INEX", stdout), first = FALSE;
13827 if (mask & OEX_FPU_UFLO)
13828 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13829 if (mask & OEX_FPU_OFLO)
13830 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13831 if (mask & OEX_FPU_DIV0)
13832 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13833 if (mask & OEX_FPU_INVAL)
13834 printf ("%sINVAL", first ? "" : "|");
13835 }
13836 else
13837 fputs ("0", stdout);
13838 }
13839
13840 /* Display's the value of TAG at location P. If TAG is
13841 greater than 0 it is assumed to be an unknown tag, and
13842 a message is printed to this effect. Otherwise it is
13843 assumed that a message has already been printed.
13844
13845 If the bottom bit of TAG is set it assumed to have a
13846 string value, otherwise it is assumed to have an integer
13847 value.
13848
13849 Returns an updated P pointing to the first unread byte
13850 beyond the end of TAG's value.
13851
13852 Reads at or beyond END will not be made. */
13853
13854 static unsigned char *
13855 display_tag_value (signed int tag,
13856 unsigned char * p,
13857 const unsigned char * const end)
13858 {
13859 unsigned long val;
13860
13861 if (tag > 0)
13862 printf (" Tag_unknown_%d: ", tag);
13863
13864 if (p >= end)
13865 {
13866 warn (_("<corrupt tag>\n"));
13867 }
13868 else if (tag & 1)
13869 {
13870 /* PR 17531 file: 027-19978-0.004. */
13871 size_t maxlen = (end - p) - 1;
13872
13873 putchar ('"');
13874 if (maxlen > 0)
13875 {
13876 print_symbol ((int) maxlen, (const char *) p);
13877 p += strnlen ((char *) p, maxlen) + 1;
13878 }
13879 else
13880 {
13881 printf (_("<corrupt string tag>"));
13882 p = (unsigned char *) end;
13883 }
13884 printf ("\"\n");
13885 }
13886 else
13887 {
13888 unsigned int len;
13889
13890 val = read_uleb128 (p, &len, end);
13891 p += len;
13892 printf ("%ld (0x%lx)\n", val, val);
13893 }
13894
13895 assert (p <= end);
13896 return p;
13897 }
13898
13899 /* ARC ABI attributes section. */
13900
13901 static unsigned char *
13902 display_arc_attribute (unsigned char * p,
13903 const unsigned char * const end)
13904 {
13905 unsigned int tag;
13906 unsigned int len;
13907 unsigned int val;
13908
13909 tag = read_uleb128 (p, &len, end);
13910 p += len;
13911
13912 switch (tag)
13913 {
13914 case Tag_ARC_PCS_config:
13915 val = read_uleb128 (p, &len, end);
13916 p += len;
13917 printf (" Tag_ARC_PCS_config: ");
13918 switch (val)
13919 {
13920 case 0:
13921 printf (_("Absent/Non standard\n"));
13922 break;
13923 case 1:
13924 printf (_("Bare metal/mwdt\n"));
13925 break;
13926 case 2:
13927 printf (_("Bare metal/newlib\n"));
13928 break;
13929 case 3:
13930 printf (_("Linux/uclibc\n"));
13931 break;
13932 case 4:
13933 printf (_("Linux/glibc\n"));
13934 break;
13935 default:
13936 printf (_("Unknown\n"));
13937 break;
13938 }
13939 break;
13940
13941 case Tag_ARC_CPU_base:
13942 val = read_uleb128 (p, &len, end);
13943 p += len;
13944 printf (" Tag_ARC_CPU_base: ");
13945 switch (val)
13946 {
13947 default:
13948 case TAG_CPU_NONE:
13949 printf (_("Absent\n"));
13950 break;
13951 case TAG_CPU_ARC6xx:
13952 printf ("ARC6xx\n");
13953 break;
13954 case TAG_CPU_ARC7xx:
13955 printf ("ARC7xx\n");
13956 break;
13957 case TAG_CPU_ARCEM:
13958 printf ("ARCEM\n");
13959 break;
13960 case TAG_CPU_ARCHS:
13961 printf ("ARCHS\n");
13962 break;
13963 }
13964 break;
13965
13966 case Tag_ARC_CPU_variation:
13967 val = read_uleb128 (p, &len, end);
13968 p += len;
13969 printf (" Tag_ARC_CPU_variation: ");
13970 switch (val)
13971 {
13972 default:
13973 if (val > 0 && val < 16)
13974 printf ("Core%d\n", val);
13975 else
13976 printf ("Unknown\n");
13977 break;
13978
13979 case 0:
13980 printf (_("Absent\n"));
13981 break;
13982 }
13983 break;
13984
13985 case Tag_ARC_CPU_name:
13986 printf (" Tag_ARC_CPU_name: ");
13987 p = display_tag_value (-1, p, end);
13988 break;
13989
13990 case Tag_ARC_ABI_rf16:
13991 val = read_uleb128 (p, &len, end);
13992 p += len;
13993 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
13994 break;
13995
13996 case Tag_ARC_ABI_osver:
13997 val = read_uleb128 (p, &len, end);
13998 p += len;
13999 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14000 break;
14001
14002 case Tag_ARC_ABI_pic:
14003 case Tag_ARC_ABI_sda:
14004 val = read_uleb128 (p, &len, end);
14005 p += len;
14006 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14007 : " Tag_ARC_ABI_pic: ");
14008 switch (val)
14009 {
14010 case 0:
14011 printf (_("Absent\n"));
14012 break;
14013 case 1:
14014 printf ("MWDT\n");
14015 break;
14016 case 2:
14017 printf ("GNU\n");
14018 break;
14019 default:
14020 printf (_("Unknown\n"));
14021 break;
14022 }
14023 break;
14024
14025 case Tag_ARC_ABI_tls:
14026 val = read_uleb128 (p, &len, end);
14027 p += len;
14028 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14029 break;
14030
14031 case Tag_ARC_ABI_enumsize:
14032 val = read_uleb128 (p, &len, end);
14033 p += len;
14034 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14035 _("smallest"));
14036 break;
14037
14038 case Tag_ARC_ABI_exceptions:
14039 val = read_uleb128 (p, &len, end);
14040 p += len;
14041 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14042 : _("default"));
14043 break;
14044
14045 case Tag_ARC_ABI_double_size:
14046 val = read_uleb128 (p, &len, end);
14047 p += len;
14048 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14049 break;
14050
14051 case Tag_ARC_ISA_config:
14052 printf (" Tag_ARC_ISA_config: ");
14053 p = display_tag_value (-1, p, end);
14054 break;
14055
14056 case Tag_ARC_ISA_apex:
14057 printf (" Tag_ARC_ISA_apex: ");
14058 p = display_tag_value (-1, p, end);
14059 break;
14060
14061 case Tag_ARC_ISA_mpy_option:
14062 val = read_uleb128 (p, &len, end);
14063 p += len;
14064 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14065 break;
14066
14067 default:
14068 return display_tag_value (tag & 1, p, end);
14069 }
14070
14071 return p;
14072 }
14073
14074 /* ARM EABI attributes section. */
14075 typedef struct
14076 {
14077 unsigned int tag;
14078 const char * name;
14079 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14080 unsigned int type;
14081 const char ** table;
14082 } arm_attr_public_tag;
14083
14084 static const char * arm_attr_tag_CPU_arch[] =
14085 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14086 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14087 "v8-M.mainline"};
14088 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14089 static const char * arm_attr_tag_THUMB_ISA_use[] =
14090 {"No", "Thumb-1", "Thumb-2", "Yes"};
14091 static const char * arm_attr_tag_FP_arch[] =
14092 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14093 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14094 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14095 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14096 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14097 "NEON for ARMv8.1"};
14098 static const char * arm_attr_tag_PCS_config[] =
14099 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14100 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14101 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14102 {"V6", "SB", "TLS", "Unused"};
14103 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14104 {"Absolute", "PC-relative", "SB-relative", "None"};
14105 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14106 {"Absolute", "PC-relative", "None"};
14107 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14108 {"None", "direct", "GOT-indirect"};
14109 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14110 {"None", "??? 1", "2", "??? 3", "4"};
14111 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14112 static const char * arm_attr_tag_ABI_FP_denormal[] =
14113 {"Unused", "Needed", "Sign only"};
14114 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14115 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14116 static const char * arm_attr_tag_ABI_FP_number_model[] =
14117 {"Unused", "Finite", "RTABI", "IEEE 754"};
14118 static const char * arm_attr_tag_ABI_enum_size[] =
14119 {"Unused", "small", "int", "forced to int"};
14120 static const char * arm_attr_tag_ABI_HardFP_use[] =
14121 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14122 static const char * arm_attr_tag_ABI_VFP_args[] =
14123 {"AAPCS", "VFP registers", "custom", "compatible"};
14124 static const char * arm_attr_tag_ABI_WMMX_args[] =
14125 {"AAPCS", "WMMX registers", "custom"};
14126 static const char * arm_attr_tag_ABI_optimization_goals[] =
14127 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14128 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14129 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14130 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14131 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14132 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14133 static const char * arm_attr_tag_FP_HP_extension[] =
14134 {"Not Allowed", "Allowed"};
14135 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14136 {"None", "IEEE 754", "Alternative Format"};
14137 static const char * arm_attr_tag_DSP_extension[] =
14138 {"Follow architecture", "Allowed"};
14139 static const char * arm_attr_tag_MPextension_use[] =
14140 {"Not Allowed", "Allowed"};
14141 static const char * arm_attr_tag_DIV_use[] =
14142 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14143 "Allowed in v7-A with integer division extension"};
14144 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14145 static const char * arm_attr_tag_Virtualization_use[] =
14146 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14147 "TrustZone and Virtualization Extensions"};
14148 static const char * arm_attr_tag_MPextension_use_legacy[] =
14149 {"Not Allowed", "Allowed"};
14150
14151 #define LOOKUP(id, name) \
14152 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14153 static arm_attr_public_tag arm_attr_public_tags[] =
14154 {
14155 {4, "CPU_raw_name", 1, NULL},
14156 {5, "CPU_name", 1, NULL},
14157 LOOKUP(6, CPU_arch),
14158 {7, "CPU_arch_profile", 0, NULL},
14159 LOOKUP(8, ARM_ISA_use),
14160 LOOKUP(9, THUMB_ISA_use),
14161 LOOKUP(10, FP_arch),
14162 LOOKUP(11, WMMX_arch),
14163 LOOKUP(12, Advanced_SIMD_arch),
14164 LOOKUP(13, PCS_config),
14165 LOOKUP(14, ABI_PCS_R9_use),
14166 LOOKUP(15, ABI_PCS_RW_data),
14167 LOOKUP(16, ABI_PCS_RO_data),
14168 LOOKUP(17, ABI_PCS_GOT_use),
14169 LOOKUP(18, ABI_PCS_wchar_t),
14170 LOOKUP(19, ABI_FP_rounding),
14171 LOOKUP(20, ABI_FP_denormal),
14172 LOOKUP(21, ABI_FP_exceptions),
14173 LOOKUP(22, ABI_FP_user_exceptions),
14174 LOOKUP(23, ABI_FP_number_model),
14175 {24, "ABI_align_needed", 0, NULL},
14176 {25, "ABI_align_preserved", 0, NULL},
14177 LOOKUP(26, ABI_enum_size),
14178 LOOKUP(27, ABI_HardFP_use),
14179 LOOKUP(28, ABI_VFP_args),
14180 LOOKUP(29, ABI_WMMX_args),
14181 LOOKUP(30, ABI_optimization_goals),
14182 LOOKUP(31, ABI_FP_optimization_goals),
14183 {32, "compatibility", 0, NULL},
14184 LOOKUP(34, CPU_unaligned_access),
14185 LOOKUP(36, FP_HP_extension),
14186 LOOKUP(38, ABI_FP_16bit_format),
14187 LOOKUP(42, MPextension_use),
14188 LOOKUP(44, DIV_use),
14189 LOOKUP(46, DSP_extension),
14190 {64, "nodefaults", 0, NULL},
14191 {65, "also_compatible_with", 0, NULL},
14192 LOOKUP(66, T2EE_use),
14193 {67, "conformance", 1, NULL},
14194 LOOKUP(68, Virtualization_use),
14195 LOOKUP(70, MPextension_use_legacy)
14196 };
14197 #undef LOOKUP
14198
14199 static unsigned char *
14200 display_arm_attribute (unsigned char * p,
14201 const unsigned char * const end)
14202 {
14203 unsigned int tag;
14204 unsigned int len;
14205 unsigned int val;
14206 arm_attr_public_tag * attr;
14207 unsigned i;
14208 unsigned int type;
14209
14210 tag = read_uleb128 (p, &len, end);
14211 p += len;
14212 attr = NULL;
14213 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14214 {
14215 if (arm_attr_public_tags[i].tag == tag)
14216 {
14217 attr = &arm_attr_public_tags[i];
14218 break;
14219 }
14220 }
14221
14222 if (attr)
14223 {
14224 printf (" Tag_%s: ", attr->name);
14225 switch (attr->type)
14226 {
14227 case 0:
14228 switch (tag)
14229 {
14230 case 7: /* Tag_CPU_arch_profile. */
14231 val = read_uleb128 (p, &len, end);
14232 p += len;
14233 switch (val)
14234 {
14235 case 0: printf (_("None\n")); break;
14236 case 'A': printf (_("Application\n")); break;
14237 case 'R': printf (_("Realtime\n")); break;
14238 case 'M': printf (_("Microcontroller\n")); break;
14239 case 'S': printf (_("Application or Realtime\n")); break;
14240 default: printf ("??? (%d)\n", val); break;
14241 }
14242 break;
14243
14244 case 24: /* Tag_align_needed. */
14245 val = read_uleb128 (p, &len, end);
14246 p += len;
14247 switch (val)
14248 {
14249 case 0: printf (_("None\n")); break;
14250 case 1: printf (_("8-byte\n")); break;
14251 case 2: printf (_("4-byte\n")); break;
14252 case 3: printf ("??? 3\n"); break;
14253 default:
14254 if (val <= 12)
14255 printf (_("8-byte and up to %d-byte extended\n"),
14256 1 << val);
14257 else
14258 printf ("??? (%d)\n", val);
14259 break;
14260 }
14261 break;
14262
14263 case 25: /* Tag_align_preserved. */
14264 val = read_uleb128 (p, &len, end);
14265 p += len;
14266 switch (val)
14267 {
14268 case 0: printf (_("None\n")); break;
14269 case 1: printf (_("8-byte, except leaf SP\n")); break;
14270 case 2: printf (_("8-byte\n")); break;
14271 case 3: printf ("??? 3\n"); break;
14272 default:
14273 if (val <= 12)
14274 printf (_("8-byte and up to %d-byte extended\n"),
14275 1 << val);
14276 else
14277 printf ("??? (%d)\n", val);
14278 break;
14279 }
14280 break;
14281
14282 case 32: /* Tag_compatibility. */
14283 {
14284 val = read_uleb128 (p, &len, end);
14285 p += len;
14286 printf (_("flag = %d, vendor = "), val);
14287 if (p < end - 1)
14288 {
14289 size_t maxlen = (end - p) - 1;
14290
14291 print_symbol ((int) maxlen, (const char *) p);
14292 p += strnlen ((char *) p, maxlen) + 1;
14293 }
14294 else
14295 {
14296 printf (_("<corrupt>"));
14297 p = (unsigned char *) end;
14298 }
14299 putchar ('\n');
14300 }
14301 break;
14302
14303 case 64: /* Tag_nodefaults. */
14304 /* PR 17531: file: 001-505008-0.01. */
14305 if (p < end)
14306 p++;
14307 printf (_("True\n"));
14308 break;
14309
14310 case 65: /* Tag_also_compatible_with. */
14311 val = read_uleb128 (p, &len, end);
14312 p += len;
14313 if (val == 6 /* Tag_CPU_arch. */)
14314 {
14315 val = read_uleb128 (p, &len, end);
14316 p += len;
14317 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14318 printf ("??? (%d)\n", val);
14319 else
14320 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14321 }
14322 else
14323 printf ("???\n");
14324 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14325 ;
14326 break;
14327
14328 default:
14329 printf (_("<unknown: %d>\n"), tag);
14330 break;
14331 }
14332 return p;
14333
14334 case 1:
14335 return display_tag_value (-1, p, end);
14336 case 2:
14337 return display_tag_value (0, p, end);
14338
14339 default:
14340 assert (attr->type & 0x80);
14341 val = read_uleb128 (p, &len, end);
14342 p += len;
14343 type = attr->type & 0x7f;
14344 if (val >= type)
14345 printf ("??? (%d)\n", val);
14346 else
14347 printf ("%s\n", attr->table[val]);
14348 return p;
14349 }
14350 }
14351
14352 return display_tag_value (tag, p, end);
14353 }
14354
14355 static unsigned char *
14356 display_gnu_attribute (unsigned char * p,
14357 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14358 const unsigned char * const end)
14359 {
14360 int tag;
14361 unsigned int len;
14362 unsigned int val;
14363
14364 tag = read_uleb128 (p, &len, end);
14365 p += len;
14366
14367 /* Tag_compatibility is the only generic GNU attribute defined at
14368 present. */
14369 if (tag == 32)
14370 {
14371 val = read_uleb128 (p, &len, end);
14372 p += len;
14373
14374 printf (_("flag = %d, vendor = "), val);
14375 if (p == end)
14376 {
14377 printf (_("<corrupt>\n"));
14378 warn (_("corrupt vendor attribute\n"));
14379 }
14380 else
14381 {
14382 if (p < end - 1)
14383 {
14384 size_t maxlen = (end - p) - 1;
14385
14386 print_symbol ((int) maxlen, (const char *) p);
14387 p += strnlen ((char *) p, maxlen) + 1;
14388 }
14389 else
14390 {
14391 printf (_("<corrupt>"));
14392 p = (unsigned char *) end;
14393 }
14394 putchar ('\n');
14395 }
14396 return p;
14397 }
14398
14399 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14400 return display_proc_gnu_attribute (p, tag, end);
14401
14402 return display_tag_value (tag, p, end);
14403 }
14404
14405 static unsigned char *
14406 display_power_gnu_attribute (unsigned char * p,
14407 unsigned int tag,
14408 const unsigned char * const end)
14409 {
14410 unsigned int len;
14411 unsigned int val;
14412
14413 if (tag == Tag_GNU_Power_ABI_FP)
14414 {
14415 val = read_uleb128 (p, &len, end);
14416 p += len;
14417 printf (" Tag_GNU_Power_ABI_FP: ");
14418 if (len == 0)
14419 {
14420 printf (_("<corrupt>\n"));
14421 return p;
14422 }
14423
14424 if (val > 15)
14425 printf ("(%#x), ", val);
14426
14427 switch (val & 3)
14428 {
14429 case 0:
14430 printf (_("unspecified hard/soft float, "));
14431 break;
14432 case 1:
14433 printf (_("hard float, "));
14434 break;
14435 case 2:
14436 printf (_("soft float, "));
14437 break;
14438 case 3:
14439 printf (_("single-precision hard float, "));
14440 break;
14441 }
14442
14443 switch (val & 0xC)
14444 {
14445 case 0:
14446 printf (_("unspecified long double\n"));
14447 break;
14448 case 4:
14449 printf (_("128-bit IBM long double\n"));
14450 break;
14451 case 8:
14452 printf (_("64-bit long double\n"));
14453 break;
14454 case 12:
14455 printf (_("128-bit IEEE long double\n"));
14456 break;
14457 }
14458 return p;
14459 }
14460
14461 if (tag == Tag_GNU_Power_ABI_Vector)
14462 {
14463 val = read_uleb128 (p, &len, end);
14464 p += len;
14465 printf (" Tag_GNU_Power_ABI_Vector: ");
14466 if (len == 0)
14467 {
14468 printf (_("<corrupt>\n"));
14469 return p;
14470 }
14471
14472 if (val > 3)
14473 printf ("(%#x), ", val);
14474
14475 switch (val & 3)
14476 {
14477 case 0:
14478 printf (_("unspecified\n"));
14479 break;
14480 case 1:
14481 printf (_("generic\n"));
14482 break;
14483 case 2:
14484 printf ("AltiVec\n");
14485 break;
14486 case 3:
14487 printf ("SPE\n");
14488 break;
14489 }
14490 return p;
14491 }
14492
14493 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14494 {
14495 val = read_uleb128 (p, &len, end);
14496 p += len;
14497 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14498 if (len == 0)
14499 {
14500 printf (_("<corrupt>\n"));
14501 return p;
14502 }
14503
14504 if (val > 2)
14505 printf ("(%#x), ", val);
14506
14507 switch (val & 3)
14508 {
14509 case 0:
14510 printf (_("unspecified\n"));
14511 break;
14512 case 1:
14513 printf ("r3/r4\n");
14514 break;
14515 case 2:
14516 printf (_("memory\n"));
14517 break;
14518 case 3:
14519 printf ("???\n");
14520 break;
14521 }
14522 return p;
14523 }
14524
14525 return display_tag_value (tag & 1, p, end);
14526 }
14527
14528 static unsigned char *
14529 display_s390_gnu_attribute (unsigned char * p,
14530 unsigned int tag,
14531 const unsigned char * const end)
14532 {
14533 unsigned int len;
14534 int val;
14535
14536 if (tag == Tag_GNU_S390_ABI_Vector)
14537 {
14538 val = read_uleb128 (p, &len, end);
14539 p += len;
14540 printf (" Tag_GNU_S390_ABI_Vector: ");
14541
14542 switch (val)
14543 {
14544 case 0:
14545 printf (_("any\n"));
14546 break;
14547 case 1:
14548 printf (_("software\n"));
14549 break;
14550 case 2:
14551 printf (_("hardware\n"));
14552 break;
14553 default:
14554 printf ("??? (%d)\n", val);
14555 break;
14556 }
14557 return p;
14558 }
14559
14560 return display_tag_value (tag & 1, p, end);
14561 }
14562
14563 static void
14564 display_sparc_hwcaps (unsigned int mask)
14565 {
14566 if (mask)
14567 {
14568 bfd_boolean first = TRUE;
14569
14570 if (mask & ELF_SPARC_HWCAP_MUL32)
14571 fputs ("mul32", stdout), first = FALSE;
14572 if (mask & ELF_SPARC_HWCAP_DIV32)
14573 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14574 if (mask & ELF_SPARC_HWCAP_FSMULD)
14575 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14576 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14577 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14578 if (mask & ELF_SPARC_HWCAP_POPC)
14579 printf ("%spopc", first ? "" : "|"), first = FALSE;
14580 if (mask & ELF_SPARC_HWCAP_VIS)
14581 printf ("%svis", first ? "" : "|"), first = FALSE;
14582 if (mask & ELF_SPARC_HWCAP_VIS2)
14583 printf ("%svis2", first ? "" : "|"), first = FALSE;
14584 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14585 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14586 if (mask & ELF_SPARC_HWCAP_FMAF)
14587 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14588 if (mask & ELF_SPARC_HWCAP_VIS3)
14589 printf ("%svis3", first ? "" : "|"), first = FALSE;
14590 if (mask & ELF_SPARC_HWCAP_HPC)
14591 printf ("%shpc", first ? "" : "|"), first = FALSE;
14592 if (mask & ELF_SPARC_HWCAP_RANDOM)
14593 printf ("%srandom", first ? "" : "|"), first = FALSE;
14594 if (mask & ELF_SPARC_HWCAP_TRANS)
14595 printf ("%strans", first ? "" : "|"), first = FALSE;
14596 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14597 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14598 if (mask & ELF_SPARC_HWCAP_IMA)
14599 printf ("%sima", first ? "" : "|"), first = FALSE;
14600 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14601 printf ("%scspare", first ? "" : "|"), first = FALSE;
14602 }
14603 else
14604 fputc ('0', stdout);
14605 fputc ('\n', stdout);
14606 }
14607
14608 static void
14609 display_sparc_hwcaps2 (unsigned int mask)
14610 {
14611 if (mask)
14612 {
14613 bfd_boolean first = TRUE;
14614
14615 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14616 fputs ("fjathplus", stdout), first = FALSE;
14617 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14618 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14619 if (mask & ELF_SPARC_HWCAP2_ADP)
14620 printf ("%sadp", first ? "" : "|"), first = FALSE;
14621 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14622 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14623 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14624 printf ("%smwait", first ? "" : "|"), first = FALSE;
14625 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14626 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14627 if (mask & ELF_SPARC_HWCAP2_XMONT)
14628 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14629 if (mask & ELF_SPARC_HWCAP2_NSEC)
14630 printf ("%snsec", first ? "" : "|"), first = FALSE;
14631 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14632 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14633 if (mask & ELF_SPARC_HWCAP2_FJDES)
14634 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14635 if (mask & ELF_SPARC_HWCAP2_FJAES)
14636 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14637 }
14638 else
14639 fputc ('0', stdout);
14640 fputc ('\n', stdout);
14641 }
14642
14643 static unsigned char *
14644 display_sparc_gnu_attribute (unsigned char * p,
14645 unsigned int tag,
14646 const unsigned char * const end)
14647 {
14648 unsigned int len;
14649 int val;
14650
14651 if (tag == Tag_GNU_Sparc_HWCAPS)
14652 {
14653 val = read_uleb128 (p, &len, end);
14654 p += len;
14655 printf (" Tag_GNU_Sparc_HWCAPS: ");
14656 display_sparc_hwcaps (val);
14657 return p;
14658 }
14659 if (tag == Tag_GNU_Sparc_HWCAPS2)
14660 {
14661 val = read_uleb128 (p, &len, end);
14662 p += len;
14663 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14664 display_sparc_hwcaps2 (val);
14665 return p;
14666 }
14667
14668 return display_tag_value (tag, p, end);
14669 }
14670
14671 static void
14672 print_mips_fp_abi_value (unsigned int val)
14673 {
14674 switch (val)
14675 {
14676 case Val_GNU_MIPS_ABI_FP_ANY:
14677 printf (_("Hard or soft float\n"));
14678 break;
14679 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14680 printf (_("Hard float (double precision)\n"));
14681 break;
14682 case Val_GNU_MIPS_ABI_FP_SINGLE:
14683 printf (_("Hard float (single precision)\n"));
14684 break;
14685 case Val_GNU_MIPS_ABI_FP_SOFT:
14686 printf (_("Soft float\n"));
14687 break;
14688 case Val_GNU_MIPS_ABI_FP_OLD_64:
14689 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14690 break;
14691 case Val_GNU_MIPS_ABI_FP_XX:
14692 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14693 break;
14694 case Val_GNU_MIPS_ABI_FP_64:
14695 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14696 break;
14697 case Val_GNU_MIPS_ABI_FP_64A:
14698 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14699 break;
14700 case Val_GNU_MIPS_ABI_FP_NAN2008:
14701 printf (_("NaN 2008 compatibility\n"));
14702 break;
14703 default:
14704 printf ("??? (%d)\n", val);
14705 break;
14706 }
14707 }
14708
14709 static unsigned char *
14710 display_mips_gnu_attribute (unsigned char * p,
14711 unsigned int tag,
14712 const unsigned char * const end)
14713 {
14714 if (tag == Tag_GNU_MIPS_ABI_FP)
14715 {
14716 unsigned int len;
14717 unsigned int val;
14718
14719 val = read_uleb128 (p, &len, end);
14720 p += len;
14721 printf (" Tag_GNU_MIPS_ABI_FP: ");
14722
14723 print_mips_fp_abi_value (val);
14724
14725 return p;
14726 }
14727
14728 if (tag == Tag_GNU_MIPS_ABI_MSA)
14729 {
14730 unsigned int len;
14731 unsigned int val;
14732
14733 val = read_uleb128 (p, &len, end);
14734 p += len;
14735 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14736
14737 switch (val)
14738 {
14739 case Val_GNU_MIPS_ABI_MSA_ANY:
14740 printf (_("Any MSA or not\n"));
14741 break;
14742 case Val_GNU_MIPS_ABI_MSA_128:
14743 printf (_("128-bit MSA\n"));
14744 break;
14745 default:
14746 printf ("??? (%d)\n", val);
14747 break;
14748 }
14749 return p;
14750 }
14751
14752 return display_tag_value (tag & 1, p, end);
14753 }
14754
14755 static unsigned char *
14756 display_tic6x_attribute (unsigned char * p,
14757 const unsigned char * const end)
14758 {
14759 unsigned int tag;
14760 unsigned int len;
14761 int val;
14762
14763 tag = read_uleb128 (p, &len, end);
14764 p += len;
14765
14766 switch (tag)
14767 {
14768 case Tag_ISA:
14769 val = read_uleb128 (p, &len, end);
14770 p += len;
14771 printf (" Tag_ISA: ");
14772
14773 switch (val)
14774 {
14775 case C6XABI_Tag_ISA_none:
14776 printf (_("None\n"));
14777 break;
14778 case C6XABI_Tag_ISA_C62X:
14779 printf ("C62x\n");
14780 break;
14781 case C6XABI_Tag_ISA_C67X:
14782 printf ("C67x\n");
14783 break;
14784 case C6XABI_Tag_ISA_C67XP:
14785 printf ("C67x+\n");
14786 break;
14787 case C6XABI_Tag_ISA_C64X:
14788 printf ("C64x\n");
14789 break;
14790 case C6XABI_Tag_ISA_C64XP:
14791 printf ("C64x+\n");
14792 break;
14793 case C6XABI_Tag_ISA_C674X:
14794 printf ("C674x\n");
14795 break;
14796 default:
14797 printf ("??? (%d)\n", val);
14798 break;
14799 }
14800 return p;
14801
14802 case Tag_ABI_wchar_t:
14803 val = read_uleb128 (p, &len, end);
14804 p += len;
14805 printf (" Tag_ABI_wchar_t: ");
14806 switch (val)
14807 {
14808 case 0:
14809 printf (_("Not used\n"));
14810 break;
14811 case 1:
14812 printf (_("2 bytes\n"));
14813 break;
14814 case 2:
14815 printf (_("4 bytes\n"));
14816 break;
14817 default:
14818 printf ("??? (%d)\n", val);
14819 break;
14820 }
14821 return p;
14822
14823 case Tag_ABI_stack_align_needed:
14824 val = read_uleb128 (p, &len, end);
14825 p += len;
14826 printf (" Tag_ABI_stack_align_needed: ");
14827 switch (val)
14828 {
14829 case 0:
14830 printf (_("8-byte\n"));
14831 break;
14832 case 1:
14833 printf (_("16-byte\n"));
14834 break;
14835 default:
14836 printf ("??? (%d)\n", val);
14837 break;
14838 }
14839 return p;
14840
14841 case Tag_ABI_stack_align_preserved:
14842 val = read_uleb128 (p, &len, end);
14843 p += len;
14844 printf (" Tag_ABI_stack_align_preserved: ");
14845 switch (val)
14846 {
14847 case 0:
14848 printf (_("8-byte\n"));
14849 break;
14850 case 1:
14851 printf (_("16-byte\n"));
14852 break;
14853 default:
14854 printf ("??? (%d)\n", val);
14855 break;
14856 }
14857 return p;
14858
14859 case Tag_ABI_DSBT:
14860 val = read_uleb128 (p, &len, end);
14861 p += len;
14862 printf (" Tag_ABI_DSBT: ");
14863 switch (val)
14864 {
14865 case 0:
14866 printf (_("DSBT addressing not used\n"));
14867 break;
14868 case 1:
14869 printf (_("DSBT addressing used\n"));
14870 break;
14871 default:
14872 printf ("??? (%d)\n", val);
14873 break;
14874 }
14875 return p;
14876
14877 case Tag_ABI_PID:
14878 val = read_uleb128 (p, &len, end);
14879 p += len;
14880 printf (" Tag_ABI_PID: ");
14881 switch (val)
14882 {
14883 case 0:
14884 printf (_("Data addressing position-dependent\n"));
14885 break;
14886 case 1:
14887 printf (_("Data addressing position-independent, GOT near DP\n"));
14888 break;
14889 case 2:
14890 printf (_("Data addressing position-independent, GOT far from DP\n"));
14891 break;
14892 default:
14893 printf ("??? (%d)\n", val);
14894 break;
14895 }
14896 return p;
14897
14898 case Tag_ABI_PIC:
14899 val = read_uleb128 (p, &len, end);
14900 p += len;
14901 printf (" Tag_ABI_PIC: ");
14902 switch (val)
14903 {
14904 case 0:
14905 printf (_("Code addressing position-dependent\n"));
14906 break;
14907 case 1:
14908 printf (_("Code addressing position-independent\n"));
14909 break;
14910 default:
14911 printf ("??? (%d)\n", val);
14912 break;
14913 }
14914 return p;
14915
14916 case Tag_ABI_array_object_alignment:
14917 val = read_uleb128 (p, &len, end);
14918 p += len;
14919 printf (" Tag_ABI_array_object_alignment: ");
14920 switch (val)
14921 {
14922 case 0:
14923 printf (_("8-byte\n"));
14924 break;
14925 case 1:
14926 printf (_("4-byte\n"));
14927 break;
14928 case 2:
14929 printf (_("16-byte\n"));
14930 break;
14931 default:
14932 printf ("??? (%d)\n", val);
14933 break;
14934 }
14935 return p;
14936
14937 case Tag_ABI_array_object_align_expected:
14938 val = read_uleb128 (p, &len, end);
14939 p += len;
14940 printf (" Tag_ABI_array_object_align_expected: ");
14941 switch (val)
14942 {
14943 case 0:
14944 printf (_("8-byte\n"));
14945 break;
14946 case 1:
14947 printf (_("4-byte\n"));
14948 break;
14949 case 2:
14950 printf (_("16-byte\n"));
14951 break;
14952 default:
14953 printf ("??? (%d)\n", val);
14954 break;
14955 }
14956 return p;
14957
14958 case Tag_ABI_compatibility:
14959 {
14960 val = read_uleb128 (p, &len, end);
14961 p += len;
14962 printf (" Tag_ABI_compatibility: ");
14963 printf (_("flag = %d, vendor = "), val);
14964 if (p < end - 1)
14965 {
14966 size_t maxlen = (end - p) - 1;
14967
14968 print_symbol ((int) maxlen, (const char *) p);
14969 p += strnlen ((char *) p, maxlen) + 1;
14970 }
14971 else
14972 {
14973 printf (_("<corrupt>"));
14974 p = (unsigned char *) end;
14975 }
14976 putchar ('\n');
14977 return p;
14978 }
14979
14980 case Tag_ABI_conformance:
14981 {
14982 printf (" Tag_ABI_conformance: \"");
14983 if (p < end - 1)
14984 {
14985 size_t maxlen = (end - p) - 1;
14986
14987 print_symbol ((int) maxlen, (const char *) p);
14988 p += strnlen ((char *) p, maxlen) + 1;
14989 }
14990 else
14991 {
14992 printf (_("<corrupt>"));
14993 p = (unsigned char *) end;
14994 }
14995 printf ("\"\n");
14996 return p;
14997 }
14998 }
14999
15000 return display_tag_value (tag, p, end);
15001 }
15002
15003 static void
15004 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15005 {
15006 unsigned long addr = 0;
15007 size_t bytes = end - p;
15008
15009 assert (end > p);
15010 while (bytes)
15011 {
15012 int j;
15013 int k;
15014 int lbytes = (bytes > 16 ? 16 : bytes);
15015
15016 printf (" 0x%8.8lx ", addr);
15017
15018 for (j = 0; j < 16; j++)
15019 {
15020 if (j < lbytes)
15021 printf ("%2.2x", p[j]);
15022 else
15023 printf (" ");
15024
15025 if ((j & 3) == 3)
15026 printf (" ");
15027 }
15028
15029 for (j = 0; j < lbytes; j++)
15030 {
15031 k = p[j];
15032 if (k >= ' ' && k < 0x7f)
15033 printf ("%c", k);
15034 else
15035 printf (".");
15036 }
15037
15038 putchar ('\n');
15039
15040 p += lbytes;
15041 bytes -= lbytes;
15042 addr += lbytes;
15043 }
15044
15045 putchar ('\n');
15046 }
15047
15048 static unsigned char *
15049 display_msp430x_attribute (unsigned char * p,
15050 const unsigned char * const end)
15051 {
15052 unsigned int len;
15053 unsigned int val;
15054 unsigned int tag;
15055
15056 tag = read_uleb128 (p, & len, end);
15057 p += len;
15058
15059 switch (tag)
15060 {
15061 case OFBA_MSPABI_Tag_ISA:
15062 val = read_uleb128 (p, &len, end);
15063 p += len;
15064 printf (" Tag_ISA: ");
15065 switch (val)
15066 {
15067 case 0: printf (_("None\n")); break;
15068 case 1: printf (_("MSP430\n")); break;
15069 case 2: printf (_("MSP430X\n")); break;
15070 default: printf ("??? (%d)\n", val); break;
15071 }
15072 break;
15073
15074 case OFBA_MSPABI_Tag_Code_Model:
15075 val = read_uleb128 (p, &len, end);
15076 p += len;
15077 printf (" Tag_Code_Model: ");
15078 switch (val)
15079 {
15080 case 0: printf (_("None\n")); break;
15081 case 1: printf (_("Small\n")); break;
15082 case 2: printf (_("Large\n")); break;
15083 default: printf ("??? (%d)\n", val); break;
15084 }
15085 break;
15086
15087 case OFBA_MSPABI_Tag_Data_Model:
15088 val = read_uleb128 (p, &len, end);
15089 p += len;
15090 printf (" Tag_Data_Model: ");
15091 switch (val)
15092 {
15093 case 0: printf (_("None\n")); break;
15094 case 1: printf (_("Small\n")); break;
15095 case 2: printf (_("Large\n")); break;
15096 case 3: printf (_("Restricted Large\n")); break;
15097 default: printf ("??? (%d)\n", val); break;
15098 }
15099 break;
15100
15101 default:
15102 printf (_(" <unknown tag %d>: "), tag);
15103
15104 if (tag & 1)
15105 {
15106 putchar ('"');
15107 if (p < end - 1)
15108 {
15109 size_t maxlen = (end - p) - 1;
15110
15111 print_symbol ((int) maxlen, (const char *) p);
15112 p += strnlen ((char *) p, maxlen) + 1;
15113 }
15114 else
15115 {
15116 printf (_("<corrupt>"));
15117 p = (unsigned char *) end;
15118 }
15119 printf ("\"\n");
15120 }
15121 else
15122 {
15123 val = read_uleb128 (p, &len, end);
15124 p += len;
15125 printf ("%d (0x%x)\n", val, val);
15126 }
15127 break;
15128 }
15129
15130 assert (p <= end);
15131 return p;
15132 }
15133
15134 static bfd_boolean
15135 process_attributes (Filedata * filedata,
15136 const char * public_name,
15137 unsigned int proc_type,
15138 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15139 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15140 {
15141 Elf_Internal_Shdr * sect;
15142 unsigned i;
15143 bfd_boolean res = TRUE;
15144
15145 /* Find the section header so that we get the size. */
15146 for (i = 0, sect = filedata->section_headers;
15147 i < filedata->file_header.e_shnum;
15148 i++, sect++)
15149 {
15150 unsigned char * contents;
15151 unsigned char * p;
15152
15153 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15154 continue;
15155
15156 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15157 sect->sh_size, _("attributes"));
15158 if (contents == NULL)
15159 {
15160 res = FALSE;
15161 continue;
15162 }
15163
15164 p = contents;
15165 /* The first character is the version of the attributes.
15166 Currently only version 1, (aka 'A') is recognised here. */
15167 if (*p != 'A')
15168 {
15169 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15170 res = FALSE;
15171 }
15172 else
15173 {
15174 bfd_vma section_len;
15175
15176 section_len = sect->sh_size - 1;
15177 p++;
15178
15179 while (section_len > 0)
15180 {
15181 bfd_vma attr_len;
15182 unsigned int namelen;
15183 bfd_boolean public_section;
15184 bfd_boolean gnu_section;
15185
15186 if (section_len <= 4)
15187 {
15188 error (_("Tag section ends prematurely\n"));
15189 res = FALSE;
15190 break;
15191 }
15192 attr_len = byte_get (p, 4);
15193 p += 4;
15194
15195 if (attr_len > section_len)
15196 {
15197 error (_("Bad attribute length (%u > %u)\n"),
15198 (unsigned) attr_len, (unsigned) section_len);
15199 attr_len = section_len;
15200 res = FALSE;
15201 }
15202 /* PR 17531: file: 001-101425-0.004 */
15203 else if (attr_len < 5)
15204 {
15205 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15206 res = FALSE;
15207 break;
15208 }
15209
15210 section_len -= attr_len;
15211 attr_len -= 4;
15212
15213 namelen = strnlen ((char *) p, attr_len) + 1;
15214 if (namelen == 0 || namelen >= attr_len)
15215 {
15216 error (_("Corrupt attribute section name\n"));
15217 res = FALSE;
15218 break;
15219 }
15220
15221 printf (_("Attribute Section: "));
15222 print_symbol (INT_MAX, (const char *) p);
15223 putchar ('\n');
15224
15225 if (public_name && streq ((char *) p, public_name))
15226 public_section = TRUE;
15227 else
15228 public_section = FALSE;
15229
15230 if (streq ((char *) p, "gnu"))
15231 gnu_section = TRUE;
15232 else
15233 gnu_section = FALSE;
15234
15235 p += namelen;
15236 attr_len -= namelen;
15237
15238 while (attr_len > 0 && p < contents + sect->sh_size)
15239 {
15240 int tag;
15241 int val;
15242 bfd_vma size;
15243 unsigned char * end;
15244
15245 /* PR binutils/17531: Safe handling of corrupt files. */
15246 if (attr_len < 6)
15247 {
15248 error (_("Unused bytes at end of section\n"));
15249 res = FALSE;
15250 section_len = 0;
15251 break;
15252 }
15253
15254 tag = *(p++);
15255 size = byte_get (p, 4);
15256 if (size > attr_len)
15257 {
15258 error (_("Bad subsection length (%u > %u)\n"),
15259 (unsigned) size, (unsigned) attr_len);
15260 res = FALSE;
15261 size = attr_len;
15262 }
15263 /* PR binutils/17531: Safe handling of corrupt files. */
15264 if (size < 6)
15265 {
15266 error (_("Bad subsection length (%u < 6)\n"),
15267 (unsigned) size);
15268 res = FALSE;
15269 section_len = 0;
15270 break;
15271 }
15272
15273 attr_len -= size;
15274 end = p + size - 1;
15275 assert (end <= contents + sect->sh_size);
15276 p += 4;
15277
15278 switch (tag)
15279 {
15280 case 1:
15281 printf (_("File Attributes\n"));
15282 break;
15283 case 2:
15284 printf (_("Section Attributes:"));
15285 goto do_numlist;
15286 case 3:
15287 printf (_("Symbol Attributes:"));
15288 /* Fall through. */
15289 do_numlist:
15290 for (;;)
15291 {
15292 unsigned int j;
15293
15294 val = read_uleb128 (p, &j, end);
15295 p += j;
15296 if (val == 0)
15297 break;
15298 printf (" %d", val);
15299 }
15300 printf ("\n");
15301 break;
15302 default:
15303 printf (_("Unknown tag: %d\n"), tag);
15304 public_section = FALSE;
15305 break;
15306 }
15307
15308 if (public_section && display_pub_attribute != NULL)
15309 {
15310 while (p < end)
15311 p = display_pub_attribute (p, end);
15312 assert (p == end);
15313 }
15314 else if (gnu_section && display_proc_gnu_attribute != NULL)
15315 {
15316 while (p < end)
15317 p = display_gnu_attribute (p,
15318 display_proc_gnu_attribute,
15319 end);
15320 assert (p == end);
15321 }
15322 else if (p < end)
15323 {
15324 printf (_(" Unknown attribute:\n"));
15325 display_raw_attribute (p, end);
15326 p = end;
15327 }
15328 else
15329 attr_len = 0;
15330 }
15331 }
15332 }
15333
15334 free (contents);
15335 }
15336
15337 return res;
15338 }
15339
15340 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15341 Print the Address, Access and Initial fields of an entry at VMA ADDR
15342 and return the VMA of the next entry, or -1 if there was a problem.
15343 Does not read from DATA_END or beyond. */
15344
15345 static bfd_vma
15346 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15347 unsigned char * data_end)
15348 {
15349 printf (" ");
15350 print_vma (addr, LONG_HEX);
15351 printf (" ");
15352 if (addr < pltgot + 0xfff0)
15353 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15354 else
15355 printf ("%10s", "");
15356 printf (" ");
15357 if (data == NULL)
15358 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15359 else
15360 {
15361 bfd_vma entry;
15362 unsigned char * from = data + addr - pltgot;
15363
15364 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15365 {
15366 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15367 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15368 return (bfd_vma) -1;
15369 }
15370 else
15371 {
15372 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15373 print_vma (entry, LONG_HEX);
15374 }
15375 }
15376 return addr + (is_32bit_elf ? 4 : 8);
15377 }
15378
15379 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15380 PLTGOT. Print the Address and Initial fields of an entry at VMA
15381 ADDR and return the VMA of the next entry. */
15382
15383 static bfd_vma
15384 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15385 {
15386 printf (" ");
15387 print_vma (addr, LONG_HEX);
15388 printf (" ");
15389 if (data == NULL)
15390 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15391 else
15392 {
15393 bfd_vma entry;
15394
15395 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15396 print_vma (entry, LONG_HEX);
15397 }
15398 return addr + (is_32bit_elf ? 4 : 8);
15399 }
15400
15401 static void
15402 print_mips_ases (unsigned int mask)
15403 {
15404 if (mask & AFL_ASE_DSP)
15405 fputs ("\n\tDSP ASE", stdout);
15406 if (mask & AFL_ASE_DSPR2)
15407 fputs ("\n\tDSP R2 ASE", stdout);
15408 if (mask & AFL_ASE_DSPR3)
15409 fputs ("\n\tDSP R3 ASE", stdout);
15410 if (mask & AFL_ASE_EVA)
15411 fputs ("\n\tEnhanced VA Scheme", stdout);
15412 if (mask & AFL_ASE_MCU)
15413 fputs ("\n\tMCU (MicroController) ASE", stdout);
15414 if (mask & AFL_ASE_MDMX)
15415 fputs ("\n\tMDMX ASE", stdout);
15416 if (mask & AFL_ASE_MIPS3D)
15417 fputs ("\n\tMIPS-3D ASE", stdout);
15418 if (mask & AFL_ASE_MT)
15419 fputs ("\n\tMT ASE", stdout);
15420 if (mask & AFL_ASE_SMARTMIPS)
15421 fputs ("\n\tSmartMIPS ASE", stdout);
15422 if (mask & AFL_ASE_VIRT)
15423 fputs ("\n\tVZ ASE", stdout);
15424 if (mask & AFL_ASE_MSA)
15425 fputs ("\n\tMSA ASE", stdout);
15426 if (mask & AFL_ASE_MIPS16)
15427 fputs ("\n\tMIPS16 ASE", stdout);
15428 if (mask & AFL_ASE_MICROMIPS)
15429 fputs ("\n\tMICROMIPS ASE", stdout);
15430 if (mask & AFL_ASE_XPA)
15431 fputs ("\n\tXPA ASE", stdout);
15432 if (mask & AFL_ASE_MIPS16E2)
15433 fputs ("\n\tMIPS16e2 ASE", stdout);
15434 if (mask == 0)
15435 fprintf (stdout, "\n\t%s", _("None"));
15436 else if ((mask & ~AFL_ASE_MASK) != 0)
15437 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15438 }
15439
15440 static void
15441 print_mips_isa_ext (unsigned int isa_ext)
15442 {
15443 switch (isa_ext)
15444 {
15445 case 0:
15446 fputs (_("None"), stdout);
15447 break;
15448 case AFL_EXT_XLR:
15449 fputs ("RMI XLR", stdout);
15450 break;
15451 case AFL_EXT_OCTEON3:
15452 fputs ("Cavium Networks Octeon3", stdout);
15453 break;
15454 case AFL_EXT_OCTEON2:
15455 fputs ("Cavium Networks Octeon2", stdout);
15456 break;
15457 case AFL_EXT_OCTEONP:
15458 fputs ("Cavium Networks OcteonP", stdout);
15459 break;
15460 case AFL_EXT_LOONGSON_3A:
15461 fputs ("Loongson 3A", stdout);
15462 break;
15463 case AFL_EXT_OCTEON:
15464 fputs ("Cavium Networks Octeon", stdout);
15465 break;
15466 case AFL_EXT_5900:
15467 fputs ("Toshiba R5900", stdout);
15468 break;
15469 case AFL_EXT_4650:
15470 fputs ("MIPS R4650", stdout);
15471 break;
15472 case AFL_EXT_4010:
15473 fputs ("LSI R4010", stdout);
15474 break;
15475 case AFL_EXT_4100:
15476 fputs ("NEC VR4100", stdout);
15477 break;
15478 case AFL_EXT_3900:
15479 fputs ("Toshiba R3900", stdout);
15480 break;
15481 case AFL_EXT_10000:
15482 fputs ("MIPS R10000", stdout);
15483 break;
15484 case AFL_EXT_SB1:
15485 fputs ("Broadcom SB-1", stdout);
15486 break;
15487 case AFL_EXT_4111:
15488 fputs ("NEC VR4111/VR4181", stdout);
15489 break;
15490 case AFL_EXT_4120:
15491 fputs ("NEC VR4120", stdout);
15492 break;
15493 case AFL_EXT_5400:
15494 fputs ("NEC VR5400", stdout);
15495 break;
15496 case AFL_EXT_5500:
15497 fputs ("NEC VR5500", stdout);
15498 break;
15499 case AFL_EXT_LOONGSON_2E:
15500 fputs ("ST Microelectronics Loongson 2E", stdout);
15501 break;
15502 case AFL_EXT_LOONGSON_2F:
15503 fputs ("ST Microelectronics Loongson 2F", stdout);
15504 break;
15505 case AFL_EXT_INTERAPTIV_MR2:
15506 fputs ("Imagination interAptiv MR2", stdout);
15507 break;
15508 default:
15509 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15510 }
15511 }
15512
15513 static signed int
15514 get_mips_reg_size (int reg_size)
15515 {
15516 return (reg_size == AFL_REG_NONE) ? 0
15517 : (reg_size == AFL_REG_32) ? 32
15518 : (reg_size == AFL_REG_64) ? 64
15519 : (reg_size == AFL_REG_128) ? 128
15520 : -1;
15521 }
15522
15523 static bfd_boolean
15524 process_mips_specific (Filedata * filedata)
15525 {
15526 Elf_Internal_Dyn * entry;
15527 Elf_Internal_Shdr *sect = NULL;
15528 size_t liblist_offset = 0;
15529 size_t liblistno = 0;
15530 size_t conflictsno = 0;
15531 size_t options_offset = 0;
15532 size_t conflicts_offset = 0;
15533 size_t pltrelsz = 0;
15534 size_t pltrel = 0;
15535 bfd_vma pltgot = 0;
15536 bfd_vma mips_pltgot = 0;
15537 bfd_vma jmprel = 0;
15538 bfd_vma local_gotno = 0;
15539 bfd_vma gotsym = 0;
15540 bfd_vma symtabno = 0;
15541 bfd_boolean res = TRUE;
15542
15543 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15544 display_mips_gnu_attribute))
15545 res = FALSE;
15546
15547 sect = find_section (filedata, ".MIPS.abiflags");
15548
15549 if (sect != NULL)
15550 {
15551 Elf_External_ABIFlags_v0 *abiflags_ext;
15552 Elf_Internal_ABIFlags_v0 abiflags_in;
15553
15554 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15555 {
15556 error (_("Corrupt MIPS ABI Flags section.\n"));
15557 res = FALSE;
15558 }
15559 else
15560 {
15561 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15562 sect->sh_size, _("MIPS ABI Flags section"));
15563 if (abiflags_ext)
15564 {
15565 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15566 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15567 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15568 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15569 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15570 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15571 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15572 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15573 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15574 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15575 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15576
15577 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15578 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15579 if (abiflags_in.isa_rev > 1)
15580 printf ("r%d", abiflags_in.isa_rev);
15581 printf ("\nGPR size: %d",
15582 get_mips_reg_size (abiflags_in.gpr_size));
15583 printf ("\nCPR1 size: %d",
15584 get_mips_reg_size (abiflags_in.cpr1_size));
15585 printf ("\nCPR2 size: %d",
15586 get_mips_reg_size (abiflags_in.cpr2_size));
15587 fputs ("\nFP ABI: ", stdout);
15588 print_mips_fp_abi_value (abiflags_in.fp_abi);
15589 fputs ("ISA Extension: ", stdout);
15590 print_mips_isa_ext (abiflags_in.isa_ext);
15591 fputs ("\nASEs:", stdout);
15592 print_mips_ases (abiflags_in.ases);
15593 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15594 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15595 fputc ('\n', stdout);
15596 free (abiflags_ext);
15597 }
15598 }
15599 }
15600
15601 /* We have a lot of special sections. Thanks SGI! */
15602 if (dynamic_section == NULL)
15603 {
15604 /* No dynamic information available. See if there is static GOT. */
15605 sect = find_section (filedata, ".got");
15606 if (sect != NULL)
15607 {
15608 unsigned char *data_end;
15609 unsigned char *data;
15610 bfd_vma ent, end;
15611 int addr_size;
15612
15613 pltgot = sect->sh_addr;
15614
15615 ent = pltgot;
15616 addr_size = (is_32bit_elf ? 4 : 8);
15617 end = pltgot + sect->sh_size;
15618
15619 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15620 end - pltgot, 1,
15621 _("Global Offset Table data"));
15622 /* PR 12855: Null data is handled gracefully throughout. */
15623 data_end = data + (end - pltgot);
15624
15625 printf (_("\nStatic GOT:\n"));
15626 printf (_(" Canonical gp value: "));
15627 print_vma (ent + 0x7ff0, LONG_HEX);
15628 printf ("\n\n");
15629
15630 /* In a dynamic binary GOT[0] is reserved for the dynamic
15631 loader to store the lazy resolver pointer, however in
15632 a static binary it may well have been omitted and GOT
15633 reduced to a table of addresses.
15634 PR 21344: Check for the entry being fully available
15635 before fetching it. */
15636 if (data
15637 && data + ent - pltgot + addr_size <= data_end
15638 && byte_get (data + ent - pltgot, addr_size) == 0)
15639 {
15640 printf (_(" Reserved entries:\n"));
15641 printf (_(" %*s %10s %*s\n"),
15642 addr_size * 2, _("Address"), _("Access"),
15643 addr_size * 2, _("Value"));
15644 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15645 printf ("\n");
15646 if (ent == (bfd_vma) -1)
15647 goto sgot_print_fail;
15648
15649 /* Check for the MSB of GOT[1] being set, identifying a
15650 GNU object. This entry will be used by some runtime
15651 loaders, to store the module pointer. Otherwise this
15652 is an ordinary local entry.
15653 PR 21344: Check for the entry being fully available
15654 before fetching it. */
15655 if (data
15656 && data + ent - pltgot + addr_size <= data_end
15657 && (byte_get (data + ent - pltgot, addr_size)
15658 >> (addr_size * 8 - 1)) != 0)
15659 {
15660 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15661 printf ("\n");
15662 if (ent == (bfd_vma) -1)
15663 goto sgot_print_fail;
15664 }
15665 printf ("\n");
15666 }
15667
15668 if (data != NULL && ent < end)
15669 {
15670 printf (_(" Local entries:\n"));
15671 printf (" %*s %10s %*s\n",
15672 addr_size * 2, _("Address"), _("Access"),
15673 addr_size * 2, _("Value"));
15674 while (ent < end)
15675 {
15676 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15677 printf ("\n");
15678 if (ent == (bfd_vma) -1)
15679 goto sgot_print_fail;
15680 }
15681 printf ("\n");
15682 }
15683
15684 sgot_print_fail:
15685 if (data)
15686 free (data);
15687 }
15688 return res;
15689 }
15690
15691 for (entry = dynamic_section;
15692 /* PR 17531 file: 012-50589-0.004. */
15693 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15694 ++entry)
15695 switch (entry->d_tag)
15696 {
15697 case DT_MIPS_LIBLIST:
15698 liblist_offset
15699 = offset_from_vma (filedata, entry->d_un.d_val,
15700 liblistno * sizeof (Elf32_External_Lib));
15701 break;
15702 case DT_MIPS_LIBLISTNO:
15703 liblistno = entry->d_un.d_val;
15704 break;
15705 case DT_MIPS_OPTIONS:
15706 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15707 break;
15708 case DT_MIPS_CONFLICT:
15709 conflicts_offset
15710 = offset_from_vma (filedata, entry->d_un.d_val,
15711 conflictsno * sizeof (Elf32_External_Conflict));
15712 break;
15713 case DT_MIPS_CONFLICTNO:
15714 conflictsno = entry->d_un.d_val;
15715 break;
15716 case DT_PLTGOT:
15717 pltgot = entry->d_un.d_ptr;
15718 break;
15719 case DT_MIPS_LOCAL_GOTNO:
15720 local_gotno = entry->d_un.d_val;
15721 break;
15722 case DT_MIPS_GOTSYM:
15723 gotsym = entry->d_un.d_val;
15724 break;
15725 case DT_MIPS_SYMTABNO:
15726 symtabno = entry->d_un.d_val;
15727 break;
15728 case DT_MIPS_PLTGOT:
15729 mips_pltgot = entry->d_un.d_ptr;
15730 break;
15731 case DT_PLTREL:
15732 pltrel = entry->d_un.d_val;
15733 break;
15734 case DT_PLTRELSZ:
15735 pltrelsz = entry->d_un.d_val;
15736 break;
15737 case DT_JMPREL:
15738 jmprel = entry->d_un.d_ptr;
15739 break;
15740 default:
15741 break;
15742 }
15743
15744 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15745 {
15746 Elf32_External_Lib * elib;
15747 size_t cnt;
15748
15749 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15750 liblistno,
15751 sizeof (Elf32_External_Lib),
15752 _("liblist section data"));
15753 if (elib)
15754 {
15755 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15756 "\nSection '.liblist' contains %lu entries:\n",
15757 (unsigned long) liblistno),
15758 (unsigned long) liblistno);
15759 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15760 stdout);
15761
15762 for (cnt = 0; cnt < liblistno; ++cnt)
15763 {
15764 Elf32_Lib liblist;
15765 time_t atime;
15766 char timebuf[128];
15767 struct tm * tmp;
15768
15769 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15770 atime = BYTE_GET (elib[cnt].l_time_stamp);
15771 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15772 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15773 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15774
15775 tmp = gmtime (&atime);
15776 snprintf (timebuf, sizeof (timebuf),
15777 "%04u-%02u-%02uT%02u:%02u:%02u",
15778 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15779 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15780
15781 printf ("%3lu: ", (unsigned long) cnt);
15782 if (VALID_DYNAMIC_NAME (liblist.l_name))
15783 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15784 else
15785 printf (_("<corrupt: %9ld>"), liblist.l_name);
15786 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15787 liblist.l_version);
15788
15789 if (liblist.l_flags == 0)
15790 puts (_(" NONE"));
15791 else
15792 {
15793 static const struct
15794 {
15795 const char * name;
15796 int bit;
15797 }
15798 l_flags_vals[] =
15799 {
15800 { " EXACT_MATCH", LL_EXACT_MATCH },
15801 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15802 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15803 { " EXPORTS", LL_EXPORTS },
15804 { " DELAY_LOAD", LL_DELAY_LOAD },
15805 { " DELTA", LL_DELTA }
15806 };
15807 int flags = liblist.l_flags;
15808 size_t fcnt;
15809
15810 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15811 if ((flags & l_flags_vals[fcnt].bit) != 0)
15812 {
15813 fputs (l_flags_vals[fcnt].name, stdout);
15814 flags ^= l_flags_vals[fcnt].bit;
15815 }
15816 if (flags != 0)
15817 printf (" %#x", (unsigned int) flags);
15818
15819 puts ("");
15820 }
15821 }
15822
15823 free (elib);
15824 }
15825 else
15826 res = FALSE;
15827 }
15828
15829 if (options_offset != 0)
15830 {
15831 Elf_External_Options * eopt;
15832 Elf_Internal_Options * iopt;
15833 Elf_Internal_Options * option;
15834 size_t offset;
15835 int cnt;
15836 sect = filedata->section_headers;
15837
15838 /* Find the section header so that we get the size. */
15839 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15840 /* PR 17533 file: 012-277276-0.004. */
15841 if (sect == NULL)
15842 {
15843 error (_("No MIPS_OPTIONS header found\n"));
15844 return FALSE;
15845 }
15846
15847 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
15848 sect->sh_size, _("options"));
15849 if (eopt)
15850 {
15851 iopt = (Elf_Internal_Options *)
15852 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15853 if (iopt == NULL)
15854 {
15855 error (_("Out of memory allocating space for MIPS options\n"));
15856 return FALSE;
15857 }
15858
15859 offset = cnt = 0;
15860 option = iopt;
15861
15862 while (offset <= sect->sh_size - sizeof (* eopt))
15863 {
15864 Elf_External_Options * eoption;
15865
15866 eoption = (Elf_External_Options *) ((char *) eopt + offset);
15867
15868 option->kind = BYTE_GET (eoption->kind);
15869 option->size = BYTE_GET (eoption->size);
15870 option->section = BYTE_GET (eoption->section);
15871 option->info = BYTE_GET (eoption->info);
15872
15873 /* PR 17531: file: ffa0fa3b. */
15874 if (option->size < sizeof (* eopt)
15875 || offset + option->size > sect->sh_size)
15876 {
15877 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15878 return FALSE;
15879 }
15880 offset += option->size;
15881
15882 ++option;
15883 ++cnt;
15884 }
15885
15886 printf (ngettext ("\nSection '%s' contains %d entry:\n",
15887 "\nSection '%s' contains %d entries:\n",
15888 cnt),
15889 printable_section_name (filedata, sect), cnt);
15890
15891 option = iopt;
15892 offset = 0;
15893
15894 while (cnt-- > 0)
15895 {
15896 size_t len;
15897
15898 switch (option->kind)
15899 {
15900 case ODK_NULL:
15901 /* This shouldn't happen. */
15902 printf (" NULL %d %lx", option->section, option->info);
15903 break;
15904 case ODK_REGINFO:
15905 printf (" REGINFO ");
15906 if (filedata->file_header.e_machine == EM_MIPS)
15907 {
15908 /* 32bit form. */
15909 Elf32_External_RegInfo * ereg;
15910 Elf32_RegInfo reginfo;
15911
15912 ereg = (Elf32_External_RegInfo *) (option + 1);
15913 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15914 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15915 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15916 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15917 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15918 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15919
15920 printf ("GPR %08lx GP 0x%lx\n",
15921 reginfo.ri_gprmask,
15922 (unsigned long) reginfo.ri_gp_value);
15923 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15924 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15925 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15926 }
15927 else
15928 {
15929 /* 64 bit form. */
15930 Elf64_External_RegInfo * ereg;
15931 Elf64_Internal_RegInfo reginfo;
15932
15933 ereg = (Elf64_External_RegInfo *) (option + 1);
15934 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15935 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15936 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15937 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15938 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15939 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15940
15941 printf ("GPR %08lx GP 0x",
15942 reginfo.ri_gprmask);
15943 printf_vma (reginfo.ri_gp_value);
15944 printf ("\n");
15945
15946 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15947 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15948 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15949 }
15950 ++option;
15951 continue;
15952 case ODK_EXCEPTIONS:
15953 fputs (" EXCEPTIONS fpe_min(", stdout);
15954 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15955 fputs (") fpe_max(", stdout);
15956 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15957 fputs (")", stdout);
15958
15959 if (option->info & OEX_PAGE0)
15960 fputs (" PAGE0", stdout);
15961 if (option->info & OEX_SMM)
15962 fputs (" SMM", stdout);
15963 if (option->info & OEX_FPDBUG)
15964 fputs (" FPDBUG", stdout);
15965 if (option->info & OEX_DISMISS)
15966 fputs (" DISMISS", stdout);
15967 break;
15968 case ODK_PAD:
15969 fputs (" PAD ", stdout);
15970 if (option->info & OPAD_PREFIX)
15971 fputs (" PREFIX", stdout);
15972 if (option->info & OPAD_POSTFIX)
15973 fputs (" POSTFIX", stdout);
15974 if (option->info & OPAD_SYMBOL)
15975 fputs (" SYMBOL", stdout);
15976 break;
15977 case ODK_HWPATCH:
15978 fputs (" HWPATCH ", stdout);
15979 if (option->info & OHW_R4KEOP)
15980 fputs (" R4KEOP", stdout);
15981 if (option->info & OHW_R8KPFETCH)
15982 fputs (" R8KPFETCH", stdout);
15983 if (option->info & OHW_R5KEOP)
15984 fputs (" R5KEOP", stdout);
15985 if (option->info & OHW_R5KCVTL)
15986 fputs (" R5KCVTL", stdout);
15987 break;
15988 case ODK_FILL:
15989 fputs (" FILL ", stdout);
15990 /* XXX Print content of info word? */
15991 break;
15992 case ODK_TAGS:
15993 fputs (" TAGS ", stdout);
15994 /* XXX Print content of info word? */
15995 break;
15996 case ODK_HWAND:
15997 fputs (" HWAND ", stdout);
15998 if (option->info & OHWA0_R4KEOP_CHECKED)
15999 fputs (" R4KEOP_CHECKED", stdout);
16000 if (option->info & OHWA0_R4KEOP_CLEAN)
16001 fputs (" R4KEOP_CLEAN", stdout);
16002 break;
16003 case ODK_HWOR:
16004 fputs (" HWOR ", stdout);
16005 if (option->info & OHWA0_R4KEOP_CHECKED)
16006 fputs (" R4KEOP_CHECKED", stdout);
16007 if (option->info & OHWA0_R4KEOP_CLEAN)
16008 fputs (" R4KEOP_CLEAN", stdout);
16009 break;
16010 case ODK_GP_GROUP:
16011 printf (" GP_GROUP %#06lx self-contained %#06lx",
16012 option->info & OGP_GROUP,
16013 (option->info & OGP_SELF) >> 16);
16014 break;
16015 case ODK_IDENT:
16016 printf (" IDENT %#06lx self-contained %#06lx",
16017 option->info & OGP_GROUP,
16018 (option->info & OGP_SELF) >> 16);
16019 break;
16020 default:
16021 /* This shouldn't happen. */
16022 printf (" %3d ??? %d %lx",
16023 option->kind, option->section, option->info);
16024 break;
16025 }
16026
16027 len = sizeof (* eopt);
16028 while (len < option->size)
16029 {
16030 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16031
16032 if (ISPRINT (datum))
16033 printf ("%c", datum);
16034 else
16035 printf ("\\%03o", datum);
16036 len ++;
16037 }
16038 fputs ("\n", stdout);
16039
16040 offset += option->size;
16041 ++option;
16042 }
16043
16044 free (eopt);
16045 }
16046 else
16047 res = FALSE;
16048 }
16049
16050 if (conflicts_offset != 0 && conflictsno != 0)
16051 {
16052 Elf32_Conflict * iconf;
16053 size_t cnt;
16054
16055 if (dynamic_symbols == NULL)
16056 {
16057 error (_("conflict list found without a dynamic symbol table\n"));
16058 return FALSE;
16059 }
16060
16061 /* PR 21345 - print a slightly more helpful error message
16062 if we are sure that the cmalloc will fail. */
16063 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16064 {
16065 error (_("Overlarge number of conflicts detected: %lx\n"),
16066 (long) conflictsno);
16067 return FALSE;
16068 }
16069
16070 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16071 if (iconf == NULL)
16072 {
16073 error (_("Out of memory allocating space for dynamic conflicts\n"));
16074 return FALSE;
16075 }
16076
16077 if (is_32bit_elf)
16078 {
16079 Elf32_External_Conflict * econf32;
16080
16081 econf32 = (Elf32_External_Conflict *)
16082 get_data (NULL, filedata, conflicts_offset, conflictsno,
16083 sizeof (* econf32), _("conflict"));
16084 if (!econf32)
16085 return FALSE;
16086
16087 for (cnt = 0; cnt < conflictsno; ++cnt)
16088 iconf[cnt] = BYTE_GET (econf32[cnt]);
16089
16090 free (econf32);
16091 }
16092 else
16093 {
16094 Elf64_External_Conflict * econf64;
16095
16096 econf64 = (Elf64_External_Conflict *)
16097 get_data (NULL, filedata, conflicts_offset, conflictsno,
16098 sizeof (* econf64), _("conflict"));
16099 if (!econf64)
16100 return FALSE;
16101
16102 for (cnt = 0; cnt < conflictsno; ++cnt)
16103 iconf[cnt] = BYTE_GET (econf64[cnt]);
16104
16105 free (econf64);
16106 }
16107
16108 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16109 "\nSection '.conflict' contains %lu entries:\n",
16110 (unsigned long) conflictsno),
16111 (unsigned long) conflictsno);
16112 puts (_(" Num: Index Value Name"));
16113
16114 for (cnt = 0; cnt < conflictsno; ++cnt)
16115 {
16116 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16117
16118 if (iconf[cnt] >= num_dynamic_syms)
16119 printf (_("<corrupt symbol index>"));
16120 else
16121 {
16122 Elf_Internal_Sym * psym;
16123
16124 psym = & dynamic_symbols[iconf[cnt]];
16125 print_vma (psym->st_value, FULL_HEX);
16126 putchar (' ');
16127 if (VALID_DYNAMIC_NAME (psym->st_name))
16128 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16129 else
16130 printf (_("<corrupt: %14ld>"), psym->st_name);
16131 }
16132 putchar ('\n');
16133 }
16134
16135 free (iconf);
16136 }
16137
16138 if (pltgot != 0 && local_gotno != 0)
16139 {
16140 bfd_vma ent, local_end, global_end;
16141 size_t i, offset;
16142 unsigned char * data;
16143 unsigned char * data_end;
16144 int addr_size;
16145
16146 ent = pltgot;
16147 addr_size = (is_32bit_elf ? 4 : 8);
16148 local_end = pltgot + local_gotno * addr_size;
16149
16150 /* PR binutils/17533 file: 012-111227-0.004 */
16151 if (symtabno < gotsym)
16152 {
16153 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16154 (unsigned long) gotsym, (unsigned long) symtabno);
16155 return FALSE;
16156 }
16157
16158 global_end = local_end + (symtabno - gotsym) * addr_size;
16159 /* PR 17531: file: 54c91a34. */
16160 if (global_end < local_end)
16161 {
16162 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16163 return FALSE;
16164 }
16165
16166 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16167 data = (unsigned char *) get_data (NULL, filedata, offset,
16168 global_end - pltgot, 1,
16169 _("Global Offset Table data"));
16170 /* PR 12855: Null data is handled gracefully throughout. */
16171 data_end = data + (global_end - pltgot);
16172
16173 printf (_("\nPrimary GOT:\n"));
16174 printf (_(" Canonical gp value: "));
16175 print_vma (pltgot + 0x7ff0, LONG_HEX);
16176 printf ("\n\n");
16177
16178 printf (_(" Reserved entries:\n"));
16179 printf (_(" %*s %10s %*s Purpose\n"),
16180 addr_size * 2, _("Address"), _("Access"),
16181 addr_size * 2, _("Initial"));
16182 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16183 printf (_(" Lazy resolver\n"));
16184 if (ent == (bfd_vma) -1)
16185 goto got_print_fail;
16186
16187 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16188 This entry will be used by some runtime loaders, to store the
16189 module pointer. Otherwise this is an ordinary local entry.
16190 PR 21344: Check for the entry being fully available before
16191 fetching it. */
16192 if (data
16193 && data + ent - pltgot + addr_size <= data_end
16194 && (byte_get (data + ent - pltgot, addr_size)
16195 >> (addr_size * 8 - 1)) != 0)
16196 {
16197 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16198 printf (_(" Module pointer (GNU extension)\n"));
16199 if (ent == (bfd_vma) -1)
16200 goto got_print_fail;
16201 }
16202 printf ("\n");
16203
16204 if (data != NULL && ent < local_end)
16205 {
16206 printf (_(" Local entries:\n"));
16207 printf (" %*s %10s %*s\n",
16208 addr_size * 2, _("Address"), _("Access"),
16209 addr_size * 2, _("Initial"));
16210 while (ent < local_end)
16211 {
16212 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16213 printf ("\n");
16214 if (ent == (bfd_vma) -1)
16215 goto got_print_fail;
16216 }
16217 printf ("\n");
16218 }
16219
16220 if (data != NULL && gotsym < symtabno)
16221 {
16222 int sym_width;
16223
16224 printf (_(" Global entries:\n"));
16225 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16226 addr_size * 2, _("Address"),
16227 _("Access"),
16228 addr_size * 2, _("Initial"),
16229 addr_size * 2, _("Sym.Val."),
16230 _("Type"),
16231 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16232 _("Ndx"), _("Name"));
16233
16234 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16235
16236 for (i = gotsym; i < symtabno; i++)
16237 {
16238 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16239 printf (" ");
16240
16241 if (dynamic_symbols == NULL)
16242 printf (_("<no dynamic symbols>"));
16243 else if (i < num_dynamic_syms)
16244 {
16245 Elf_Internal_Sym * psym = dynamic_symbols + i;
16246
16247 print_vma (psym->st_value, LONG_HEX);
16248 printf (" %-7s %3s ",
16249 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16250 get_symbol_index_type (filedata, psym->st_shndx));
16251
16252 if (VALID_DYNAMIC_NAME (psym->st_name))
16253 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16254 else
16255 printf (_("<corrupt: %14ld>"), psym->st_name);
16256 }
16257 else
16258 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16259 (unsigned long) i);
16260
16261 printf ("\n");
16262 if (ent == (bfd_vma) -1)
16263 break;
16264 }
16265 printf ("\n");
16266 }
16267
16268 got_print_fail:
16269 if (data)
16270 free (data);
16271 }
16272
16273 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16274 {
16275 bfd_vma ent, end;
16276 size_t offset, rel_offset;
16277 unsigned long count, i;
16278 unsigned char * data;
16279 int addr_size, sym_width;
16280 Elf_Internal_Rela * rels;
16281
16282 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16283 if (pltrel == DT_RELA)
16284 {
16285 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16286 return FALSE;
16287 }
16288 else
16289 {
16290 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16291 return FALSE;
16292 }
16293
16294 ent = mips_pltgot;
16295 addr_size = (is_32bit_elf ? 4 : 8);
16296 end = mips_pltgot + (2 + count) * addr_size;
16297
16298 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16299 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16300 1, _("Procedure Linkage Table data"));
16301 if (data == NULL)
16302 return FALSE;
16303
16304 printf ("\nPLT GOT:\n\n");
16305 printf (_(" Reserved entries:\n"));
16306 printf (_(" %*s %*s Purpose\n"),
16307 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16308 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16309 printf (_(" PLT lazy resolver\n"));
16310 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16311 printf (_(" Module pointer\n"));
16312 printf ("\n");
16313
16314 printf (_(" Entries:\n"));
16315 printf (" %*s %*s %*s %-7s %3s %s\n",
16316 addr_size * 2, _("Address"),
16317 addr_size * 2, _("Initial"),
16318 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16319 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16320 for (i = 0; i < count; i++)
16321 {
16322 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16323
16324 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16325 printf (" ");
16326
16327 if (idx >= num_dynamic_syms)
16328 printf (_("<corrupt symbol index: %lu>"), idx);
16329 else
16330 {
16331 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16332
16333 print_vma (psym->st_value, LONG_HEX);
16334 printf (" %-7s %3s ",
16335 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16336 get_symbol_index_type (filedata, psym->st_shndx));
16337 if (VALID_DYNAMIC_NAME (psym->st_name))
16338 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16339 else
16340 printf (_("<corrupt: %14ld>"), psym->st_name);
16341 }
16342 printf ("\n");
16343 }
16344 printf ("\n");
16345
16346 if (data)
16347 free (data);
16348 free (rels);
16349 }
16350
16351 return res;
16352 }
16353
16354 static bfd_boolean
16355 process_nds32_specific (Filedata * filedata)
16356 {
16357 Elf_Internal_Shdr *sect = NULL;
16358
16359 sect = find_section (filedata, ".nds32_e_flags");
16360 if (sect != NULL)
16361 {
16362 unsigned int *flag;
16363
16364 printf ("\nNDS32 elf flags section:\n");
16365 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16366 sect->sh_size, _("NDS32 elf flags section"));
16367
16368 if (! flag)
16369 return FALSE;
16370
16371 switch ((*flag) & 0x3)
16372 {
16373 case 0:
16374 printf ("(VEC_SIZE):\tNo entry.\n");
16375 break;
16376 case 1:
16377 printf ("(VEC_SIZE):\t4 bytes\n");
16378 break;
16379 case 2:
16380 printf ("(VEC_SIZE):\t16 bytes\n");
16381 break;
16382 case 3:
16383 printf ("(VEC_SIZE):\treserved\n");
16384 break;
16385 }
16386 }
16387
16388 return TRUE;
16389 }
16390
16391 static bfd_boolean
16392 process_gnu_liblist (Filedata * filedata)
16393 {
16394 Elf_Internal_Shdr * section;
16395 Elf_Internal_Shdr * string_sec;
16396 Elf32_External_Lib * elib;
16397 char * strtab;
16398 size_t strtab_size;
16399 size_t cnt;
16400 unsigned long num_liblist;
16401 unsigned i;
16402 bfd_boolean res = TRUE;
16403
16404 if (! do_arch)
16405 return TRUE;
16406
16407 for (i = 0, section = filedata->section_headers;
16408 i < filedata->file_header.e_shnum;
16409 i++, section++)
16410 {
16411 switch (section->sh_type)
16412 {
16413 case SHT_GNU_LIBLIST:
16414 if (section->sh_link >= filedata->file_header.e_shnum)
16415 break;
16416
16417 elib = (Elf32_External_Lib *)
16418 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16419 _("liblist section data"));
16420
16421 if (elib == NULL)
16422 {
16423 res = FALSE;
16424 break;
16425 }
16426
16427 string_sec = filedata->section_headers + section->sh_link;
16428 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16429 string_sec->sh_size,
16430 _("liblist string table"));
16431 if (strtab == NULL
16432 || section->sh_entsize != sizeof (Elf32_External_Lib))
16433 {
16434 free (elib);
16435 free (strtab);
16436 res = FALSE;
16437 break;
16438 }
16439 strtab_size = string_sec->sh_size;
16440
16441 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16442 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16443 "\nLibrary list section '%s' contains %lu entries:\n",
16444 num_liblist),
16445 printable_section_name (filedata, section),
16446 num_liblist);
16447
16448 puts (_(" Library Time Stamp Checksum Version Flags"));
16449
16450 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16451 ++cnt)
16452 {
16453 Elf32_Lib liblist;
16454 time_t atime;
16455 char timebuf[128];
16456 struct tm * tmp;
16457
16458 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16459 atime = BYTE_GET (elib[cnt].l_time_stamp);
16460 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16461 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16462 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16463
16464 tmp = gmtime (&atime);
16465 snprintf (timebuf, sizeof (timebuf),
16466 "%04u-%02u-%02uT%02u:%02u:%02u",
16467 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16468 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16469
16470 printf ("%3lu: ", (unsigned long) cnt);
16471 if (do_wide)
16472 printf ("%-20s", liblist.l_name < strtab_size
16473 ? strtab + liblist.l_name : _("<corrupt>"));
16474 else
16475 printf ("%-20.20s", liblist.l_name < strtab_size
16476 ? strtab + liblist.l_name : _("<corrupt>"));
16477 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16478 liblist.l_version, liblist.l_flags);
16479 }
16480
16481 free (elib);
16482 free (strtab);
16483 }
16484 }
16485
16486 return res;
16487 }
16488
16489 static const char *
16490 get_note_type (Filedata * filedata, unsigned e_type)
16491 {
16492 static char buff[64];
16493
16494 if (filedata->file_header.e_type == ET_CORE)
16495 switch (e_type)
16496 {
16497 case NT_AUXV:
16498 return _("NT_AUXV (auxiliary vector)");
16499 case NT_PRSTATUS:
16500 return _("NT_PRSTATUS (prstatus structure)");
16501 case NT_FPREGSET:
16502 return _("NT_FPREGSET (floating point registers)");
16503 case NT_PRPSINFO:
16504 return _("NT_PRPSINFO (prpsinfo structure)");
16505 case NT_TASKSTRUCT:
16506 return _("NT_TASKSTRUCT (task structure)");
16507 case NT_PRXFPREG:
16508 return _("NT_PRXFPREG (user_xfpregs structure)");
16509 case NT_PPC_VMX:
16510 return _("NT_PPC_VMX (ppc Altivec registers)");
16511 case NT_PPC_VSX:
16512 return _("NT_PPC_VSX (ppc VSX registers)");
16513 case NT_PPC_TAR:
16514 return _("NT_PPC_TAR (ppc TAR register)");
16515 case NT_PPC_PPR:
16516 return _("NT_PPC_PPR (ppc PPR register)");
16517 case NT_PPC_DSCR:
16518 return _("NT_PPC_DSCR (ppc DSCR register)");
16519 case NT_PPC_EBB:
16520 return _("NT_PPC_EBB (ppc EBB registers)");
16521 case NT_PPC_PMU:
16522 return _("NT_PPC_PMU (ppc PMU registers)");
16523 case NT_PPC_TM_CGPR:
16524 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16525 case NT_PPC_TM_CFPR:
16526 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16527 case NT_PPC_TM_CVMX:
16528 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16529 case NT_PPC_TM_CVSX:
16530 return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16531 case NT_PPC_TM_SPR:
16532 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16533 case NT_PPC_TM_CTAR:
16534 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16535 case NT_PPC_TM_CPPR:
16536 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16537 case NT_PPC_TM_CDSCR:
16538 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16539 case NT_386_TLS:
16540 return _("NT_386_TLS (x86 TLS information)");
16541 case NT_386_IOPERM:
16542 return _("NT_386_IOPERM (x86 I/O permissions)");
16543 case NT_X86_XSTATE:
16544 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16545 case NT_S390_HIGH_GPRS:
16546 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16547 case NT_S390_TIMER:
16548 return _("NT_S390_TIMER (s390 timer register)");
16549 case NT_S390_TODCMP:
16550 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16551 case NT_S390_TODPREG:
16552 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16553 case NT_S390_CTRS:
16554 return _("NT_S390_CTRS (s390 control registers)");
16555 case NT_S390_PREFIX:
16556 return _("NT_S390_PREFIX (s390 prefix register)");
16557 case NT_S390_LAST_BREAK:
16558 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16559 case NT_S390_SYSTEM_CALL:
16560 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16561 case NT_S390_TDB:
16562 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16563 case NT_S390_VXRS_LOW:
16564 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16565 case NT_S390_VXRS_HIGH:
16566 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16567 case NT_S390_GS_CB:
16568 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16569 case NT_S390_GS_BC:
16570 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16571 case NT_ARM_VFP:
16572 return _("NT_ARM_VFP (arm VFP registers)");
16573 case NT_ARM_TLS:
16574 return _("NT_ARM_TLS (AArch TLS registers)");
16575 case NT_ARM_HW_BREAK:
16576 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16577 case NT_ARM_HW_WATCH:
16578 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16579 case NT_PSTATUS:
16580 return _("NT_PSTATUS (pstatus structure)");
16581 case NT_FPREGS:
16582 return _("NT_FPREGS (floating point registers)");
16583 case NT_PSINFO:
16584 return _("NT_PSINFO (psinfo structure)");
16585 case NT_LWPSTATUS:
16586 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16587 case NT_LWPSINFO:
16588 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16589 case NT_WIN32PSTATUS:
16590 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16591 case NT_SIGINFO:
16592 return _("NT_SIGINFO (siginfo_t data)");
16593 case NT_FILE:
16594 return _("NT_FILE (mapped files)");
16595 default:
16596 break;
16597 }
16598 else
16599 switch (e_type)
16600 {
16601 case NT_VERSION:
16602 return _("NT_VERSION (version)");
16603 case NT_ARCH:
16604 return _("NT_ARCH (architecture)");
16605 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16606 return _("OPEN");
16607 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16608 return _("func");
16609 default:
16610 break;
16611 }
16612
16613 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16614 return buff;
16615 }
16616
16617 static bfd_boolean
16618 print_core_note (Elf_Internal_Note *pnote)
16619 {
16620 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16621 bfd_vma count, page_size;
16622 unsigned char *descdata, *filenames, *descend;
16623
16624 if (pnote->type != NT_FILE)
16625 {
16626 if (do_wide)
16627 printf ("\n");
16628 return TRUE;
16629 }
16630
16631 #ifndef BFD64
16632 if (!is_32bit_elf)
16633 {
16634 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16635 /* Still "successful". */
16636 return TRUE;
16637 }
16638 #endif
16639
16640 if (pnote->descsz < 2 * addr_size)
16641 {
16642 error (_(" Malformed note - too short for header\n"));
16643 return FALSE;
16644 }
16645
16646 descdata = (unsigned char *) pnote->descdata;
16647 descend = descdata + pnote->descsz;
16648
16649 if (descdata[pnote->descsz - 1] != '\0')
16650 {
16651 error (_(" Malformed note - does not end with \\0\n"));
16652 return FALSE;
16653 }
16654
16655 count = byte_get (descdata, addr_size);
16656 descdata += addr_size;
16657
16658 page_size = byte_get (descdata, addr_size);
16659 descdata += addr_size;
16660
16661 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16662 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16663 {
16664 error (_(" Malformed note - too short for supplied file count\n"));
16665 return FALSE;
16666 }
16667
16668 printf (_(" Page size: "));
16669 print_vma (page_size, DEC);
16670 printf ("\n");
16671
16672 printf (_(" %*s%*s%*s\n"),
16673 (int) (2 + 2 * addr_size), _("Start"),
16674 (int) (4 + 2 * addr_size), _("End"),
16675 (int) (4 + 2 * addr_size), _("Page Offset"));
16676 filenames = descdata + count * 3 * addr_size;
16677 while (count-- > 0)
16678 {
16679 bfd_vma start, end, file_ofs;
16680
16681 if (filenames == descend)
16682 {
16683 error (_(" Malformed note - filenames end too early\n"));
16684 return FALSE;
16685 }
16686
16687 start = byte_get (descdata, addr_size);
16688 descdata += addr_size;
16689 end = byte_get (descdata, addr_size);
16690 descdata += addr_size;
16691 file_ofs = byte_get (descdata, addr_size);
16692 descdata += addr_size;
16693
16694 printf (" ");
16695 print_vma (start, FULL_HEX);
16696 printf (" ");
16697 print_vma (end, FULL_HEX);
16698 printf (" ");
16699 print_vma (file_ofs, FULL_HEX);
16700 printf ("\n %s\n", filenames);
16701
16702 filenames += 1 + strlen ((char *) filenames);
16703 }
16704
16705 return TRUE;
16706 }
16707
16708 static const char *
16709 get_gnu_elf_note_type (unsigned e_type)
16710 {
16711 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
16712 switch (e_type)
16713 {
16714 case NT_GNU_ABI_TAG:
16715 return _("NT_GNU_ABI_TAG (ABI version tag)");
16716 case NT_GNU_HWCAP:
16717 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16718 case NT_GNU_BUILD_ID:
16719 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16720 case NT_GNU_GOLD_VERSION:
16721 return _("NT_GNU_GOLD_VERSION (gold version)");
16722 case NT_GNU_PROPERTY_TYPE_0:
16723 return _("NT_GNU_PROPERTY_TYPE_0");
16724 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16725 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16726 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16727 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16728 default:
16729 {
16730 static char buff[64];
16731
16732 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16733 return buff;
16734 }
16735 }
16736 }
16737
16738 static void
16739 decode_x86_isa (unsigned int bitmask)
16740 {
16741 while (bitmask)
16742 {
16743 unsigned int bit = bitmask & (- bitmask);
16744
16745 bitmask &= ~ bit;
16746 switch (bit)
16747 {
16748 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16749 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16750 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16751 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16752 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16753 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16754 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16755 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16756 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16757 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16758 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16759 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16760 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16761 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16762 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16763 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16764 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16765 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16766 default: printf (_("<unknown: %x>"), bit); break;
16767 }
16768 if (bitmask)
16769 printf (", ");
16770 }
16771 }
16772
16773 static void
16774 decode_x86_feature (unsigned int type, unsigned int bitmask)
16775 {
16776 while (bitmask)
16777 {
16778 unsigned int bit = bitmask & (- bitmask);
16779
16780 bitmask &= ~ bit;
16781 switch (bit)
16782 {
16783 case GNU_PROPERTY_X86_FEATURE_1_IBT:
16784 switch (type)
16785 {
16786 case GNU_PROPERTY_X86_FEATURE_1_AND:
16787 printf ("IBT");
16788 break;
16789 default:
16790 /* This should never happen. */
16791 abort ();
16792 }
16793 break;
16794 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16795 switch (type)
16796 {
16797 case GNU_PROPERTY_X86_FEATURE_1_AND:
16798 printf ("SHSTK");
16799 break;
16800 default:
16801 /* This should never happen. */
16802 abort ();
16803 }
16804 break;
16805 default:
16806 printf (_("<unknown: %x>"), bit);
16807 break;
16808 }
16809 if (bitmask)
16810 printf (", ");
16811 }
16812 }
16813
16814 static void
16815 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16816 {
16817 unsigned char * ptr = (unsigned char *) pnote->descdata;
16818 unsigned char * ptr_end = ptr + pnote->descsz;
16819 unsigned int size = is_32bit_elf ? 4 : 8;
16820
16821 printf (_(" Properties: "));
16822
16823 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16824 {
16825 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16826 return;
16827 }
16828
16829 while (ptr < ptr_end)
16830 {
16831 unsigned int j;
16832 unsigned int type;
16833 unsigned int datasz;
16834
16835 if ((size_t) (ptr_end - ptr) < 8)
16836 {
16837 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16838 break;
16839 }
16840
16841 type = byte_get (ptr, 4);
16842 datasz = byte_get (ptr + 4, 4);
16843
16844 ptr += 8;
16845
16846 if (datasz > (size_t) (ptr_end - ptr))
16847 {
16848 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16849 type, datasz);
16850 break;
16851 }
16852
16853 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16854 {
16855 if (filedata->file_header.e_machine == EM_X86_64
16856 || filedata->file_header.e_machine == EM_IAMCU
16857 || filedata->file_header.e_machine == EM_386)
16858 {
16859 switch (type)
16860 {
16861 case GNU_PROPERTY_X86_ISA_1_USED:
16862 printf ("x86 ISA used: ");
16863 if (datasz != 4)
16864 printf (_("<corrupt length: %#x> "), datasz);
16865 else
16866 decode_x86_isa (byte_get (ptr, 4));
16867 goto next;
16868
16869 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16870 printf ("x86 ISA needed: ");
16871 if (datasz != 4)
16872 printf (_("<corrupt length: %#x> "), datasz);
16873 else
16874 decode_x86_isa (byte_get (ptr, 4));
16875 goto next;
16876
16877 case GNU_PROPERTY_X86_FEATURE_1_AND:
16878 printf ("x86 feature: ");
16879 if (datasz != 4)
16880 printf (_("<corrupt length: %#x> "), datasz);
16881 else
16882 decode_x86_feature (type, byte_get (ptr, 4));
16883 goto next;
16884
16885 default:
16886 break;
16887 }
16888 }
16889 }
16890 else
16891 {
16892 switch (type)
16893 {
16894 case GNU_PROPERTY_STACK_SIZE:
16895 printf (_("stack size: "));
16896 if (datasz != size)
16897 printf (_("<corrupt length: %#x> "), datasz);
16898 else
16899 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16900 goto next;
16901
16902 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16903 printf ("no copy on protected ");
16904 if (datasz)
16905 printf (_("<corrupt length: %#x> "), datasz);
16906 goto next;
16907
16908 default:
16909 break;
16910 }
16911 }
16912
16913 if (type < GNU_PROPERTY_LOPROC)
16914 printf (_("<unknown type %#x data: "), type);
16915 else if (type < GNU_PROPERTY_LOUSER)
16916 printf (_("<procesor-specific type %#x data: "), type);
16917 else
16918 printf (_("<application-specific type %#x data: "), type);
16919 for (j = 0; j < datasz; ++j)
16920 printf ("%02x ", ptr[j] & 0xff);
16921 printf (">");
16922
16923 next:
16924 ptr += ((datasz + (size - 1)) & ~ (size - 1));
16925 if (ptr == ptr_end)
16926 break;
16927
16928 if (do_wide)
16929 printf (", ");
16930 else
16931 printf ("\n\t");
16932 }
16933
16934 printf ("\n");
16935 }
16936
16937 static bfd_boolean
16938 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
16939 {
16940 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
16941 switch (pnote->type)
16942 {
16943 case NT_GNU_BUILD_ID:
16944 {
16945 unsigned long i;
16946
16947 printf (_(" Build ID: "));
16948 for (i = 0; i < pnote->descsz; ++i)
16949 printf ("%02x", pnote->descdata[i] & 0xff);
16950 printf ("\n");
16951 }
16952 break;
16953
16954 case NT_GNU_ABI_TAG:
16955 {
16956 unsigned long os, major, minor, subminor;
16957 const char *osname;
16958
16959 /* PR 17531: file: 030-599401-0.004. */
16960 if (pnote->descsz < 16)
16961 {
16962 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16963 break;
16964 }
16965
16966 os = byte_get ((unsigned char *) pnote->descdata, 4);
16967 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16968 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16969 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16970
16971 switch (os)
16972 {
16973 case GNU_ABI_TAG_LINUX:
16974 osname = "Linux";
16975 break;
16976 case GNU_ABI_TAG_HURD:
16977 osname = "Hurd";
16978 break;
16979 case GNU_ABI_TAG_SOLARIS:
16980 osname = "Solaris";
16981 break;
16982 case GNU_ABI_TAG_FREEBSD:
16983 osname = "FreeBSD";
16984 break;
16985 case GNU_ABI_TAG_NETBSD:
16986 osname = "NetBSD";
16987 break;
16988 case GNU_ABI_TAG_SYLLABLE:
16989 osname = "Syllable";
16990 break;
16991 case GNU_ABI_TAG_NACL:
16992 osname = "NaCl";
16993 break;
16994 default:
16995 osname = "Unknown";
16996 break;
16997 }
16998
16999 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17000 major, minor, subminor);
17001 }
17002 break;
17003
17004 case NT_GNU_GOLD_VERSION:
17005 {
17006 unsigned long i;
17007
17008 printf (_(" Version: "));
17009 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17010 printf ("%c", pnote->descdata[i]);
17011 printf ("\n");
17012 }
17013 break;
17014
17015 case NT_GNU_HWCAP:
17016 {
17017 unsigned long num_entries, mask;
17018
17019 /* Hardware capabilities information. Word 0 is the number of entries.
17020 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17021 is a series of entries, where each entry is a single byte followed
17022 by a nul terminated string. The byte gives the bit number to test
17023 if enabled in the bitmask. */
17024 printf (_(" Hardware Capabilities: "));
17025 if (pnote->descsz < 8)
17026 {
17027 error (_("<corrupt GNU_HWCAP>\n"));
17028 return FALSE;
17029 }
17030 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17031 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17032 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17033 /* FIXME: Add code to display the entries... */
17034 }
17035 break;
17036
17037 case NT_GNU_PROPERTY_TYPE_0:
17038 print_gnu_property_note (filedata, pnote);
17039 break;
17040
17041 default:
17042 /* Handle unrecognised types. An error message should have already been
17043 created by get_gnu_elf_note_type(), so all that we need to do is to
17044 display the data. */
17045 {
17046 unsigned long i;
17047
17048 printf (_(" Description data: "));
17049 for (i = 0; i < pnote->descsz; ++i)
17050 printf ("%02x ", pnote->descdata[i] & 0xff);
17051 printf ("\n");
17052 }
17053 break;
17054 }
17055
17056 return TRUE;
17057 }
17058
17059 static const char *
17060 get_v850_elf_note_type (enum v850_notes n_type)
17061 {
17062 static char buff[64];
17063
17064 switch (n_type)
17065 {
17066 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17067 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17068 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17069 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17070 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17071 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17072 default:
17073 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17074 return buff;
17075 }
17076 }
17077
17078 static bfd_boolean
17079 print_v850_note (Elf_Internal_Note * pnote)
17080 {
17081 unsigned int val;
17082
17083 if (pnote->descsz != 4)
17084 return FALSE;
17085
17086 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17087
17088 if (val == 0)
17089 {
17090 printf (_("not set\n"));
17091 return TRUE;
17092 }
17093
17094 switch (pnote->type)
17095 {
17096 case V850_NOTE_ALIGNMENT:
17097 switch (val)
17098 {
17099 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17100 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17101 }
17102 break;
17103
17104 case V850_NOTE_DATA_SIZE:
17105 switch (val)
17106 {
17107 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17108 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17109 }
17110 break;
17111
17112 case V850_NOTE_FPU_INFO:
17113 switch (val)
17114 {
17115 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17116 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17117 }
17118 break;
17119
17120 case V850_NOTE_MMU_INFO:
17121 case V850_NOTE_CACHE_INFO:
17122 case V850_NOTE_SIMD_INFO:
17123 if (val == EF_RH850_SIMD)
17124 {
17125 printf (_("yes\n"));
17126 return TRUE;
17127 }
17128 break;
17129
17130 default:
17131 /* An 'unknown note type' message will already have been displayed. */
17132 break;
17133 }
17134
17135 printf (_("unknown value: %x\n"), val);
17136 return FALSE;
17137 }
17138
17139 static bfd_boolean
17140 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17141 {
17142 unsigned int version;
17143
17144 switch (pnote->type)
17145 {
17146 case NT_NETBSD_IDENT:
17147 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17148 if ((version / 10000) % 100)
17149 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17150 version, version / 100000000, (version / 1000000) % 100,
17151 (version / 10000) % 100 > 26 ? "Z" : "",
17152 'A' + (version / 10000) % 26);
17153 else
17154 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17155 version, version / 100000000, (version / 1000000) % 100,
17156 (version / 100) % 100);
17157 return TRUE;
17158
17159 case NT_NETBSD_MARCH:
17160 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17161 pnote->descdata);
17162 return TRUE;
17163
17164 default:
17165 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17166 pnote->type);
17167 return FALSE;
17168 }
17169 }
17170
17171 static const char *
17172 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17173 {
17174 switch (e_type)
17175 {
17176 case NT_FREEBSD_THRMISC:
17177 return _("NT_THRMISC (thrmisc structure)");
17178 case NT_FREEBSD_PROCSTAT_PROC:
17179 return _("NT_PROCSTAT_PROC (proc data)");
17180 case NT_FREEBSD_PROCSTAT_FILES:
17181 return _("NT_PROCSTAT_FILES (files data)");
17182 case NT_FREEBSD_PROCSTAT_VMMAP:
17183 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17184 case NT_FREEBSD_PROCSTAT_GROUPS:
17185 return _("NT_PROCSTAT_GROUPS (groups data)");
17186 case NT_FREEBSD_PROCSTAT_UMASK:
17187 return _("NT_PROCSTAT_UMASK (umask data)");
17188 case NT_FREEBSD_PROCSTAT_RLIMIT:
17189 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17190 case NT_FREEBSD_PROCSTAT_OSREL:
17191 return _("NT_PROCSTAT_OSREL (osreldate data)");
17192 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17193 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17194 case NT_FREEBSD_PROCSTAT_AUXV:
17195 return _("NT_PROCSTAT_AUXV (auxv data)");
17196 case NT_FREEBSD_PTLWPINFO:
17197 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17198 }
17199 return get_note_type (filedata, e_type);
17200 }
17201
17202 static const char *
17203 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17204 {
17205 static char buff[64];
17206
17207 if (e_type == NT_NETBSDCORE_PROCINFO)
17208 return _("NetBSD procinfo structure");
17209
17210 /* As of Jan 2002 there are no other machine-independent notes
17211 defined for NetBSD core files. If the note type is less
17212 than the start of the machine-dependent note types, we don't
17213 understand it. */
17214
17215 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17216 {
17217 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17218 return buff;
17219 }
17220
17221 switch (filedata->file_header.e_machine)
17222 {
17223 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17224 and PT_GETFPREGS == mach+2. */
17225
17226 case EM_OLD_ALPHA:
17227 case EM_ALPHA:
17228 case EM_SPARC:
17229 case EM_SPARC32PLUS:
17230 case EM_SPARCV9:
17231 switch (e_type)
17232 {
17233 case NT_NETBSDCORE_FIRSTMACH + 0:
17234 return _("PT_GETREGS (reg structure)");
17235 case NT_NETBSDCORE_FIRSTMACH + 2:
17236 return _("PT_GETFPREGS (fpreg structure)");
17237 default:
17238 break;
17239 }
17240 break;
17241
17242 /* On all other arch's, PT_GETREGS == mach+1 and
17243 PT_GETFPREGS == mach+3. */
17244 default:
17245 switch (e_type)
17246 {
17247 case NT_NETBSDCORE_FIRSTMACH + 1:
17248 return _("PT_GETREGS (reg structure)");
17249 case NT_NETBSDCORE_FIRSTMACH + 3:
17250 return _("PT_GETFPREGS (fpreg structure)");
17251 default:
17252 break;
17253 }
17254 }
17255
17256 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17257 e_type - NT_NETBSDCORE_FIRSTMACH);
17258 return buff;
17259 }
17260
17261 static const char *
17262 get_stapsdt_note_type (unsigned e_type)
17263 {
17264 static char buff[64];
17265
17266 switch (e_type)
17267 {
17268 case NT_STAPSDT:
17269 return _("NT_STAPSDT (SystemTap probe descriptors)");
17270
17271 default:
17272 break;
17273 }
17274
17275 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17276 return buff;
17277 }
17278
17279 static bfd_boolean
17280 print_stapsdt_note (Elf_Internal_Note *pnote)
17281 {
17282 int addr_size = is_32bit_elf ? 4 : 8;
17283 char *data = pnote->descdata;
17284 char *data_end = pnote->descdata + pnote->descsz;
17285 bfd_vma pc, base_addr, semaphore;
17286 char *provider, *probe, *arg_fmt;
17287
17288 pc = byte_get ((unsigned char *) data, addr_size);
17289 data += addr_size;
17290 base_addr = byte_get ((unsigned char *) data, addr_size);
17291 data += addr_size;
17292 semaphore = byte_get ((unsigned char *) data, addr_size);
17293 data += addr_size;
17294
17295 provider = data;
17296 data += strlen (data) + 1;
17297 probe = data;
17298 data += strlen (data) + 1;
17299 arg_fmt = data;
17300 data += strlen (data) + 1;
17301
17302 printf (_(" Provider: %s\n"), provider);
17303 printf (_(" Name: %s\n"), probe);
17304 printf (_(" Location: "));
17305 print_vma (pc, FULL_HEX);
17306 printf (_(", Base: "));
17307 print_vma (base_addr, FULL_HEX);
17308 printf (_(", Semaphore: "));
17309 print_vma (semaphore, FULL_HEX);
17310 printf ("\n");
17311 printf (_(" Arguments: %s\n"), arg_fmt);
17312
17313 return data == data_end;
17314 }
17315
17316 static const char *
17317 get_ia64_vms_note_type (unsigned e_type)
17318 {
17319 static char buff[64];
17320
17321 switch (e_type)
17322 {
17323 case NT_VMS_MHD:
17324 return _("NT_VMS_MHD (module header)");
17325 case NT_VMS_LNM:
17326 return _("NT_VMS_LNM (language name)");
17327 case NT_VMS_SRC:
17328 return _("NT_VMS_SRC (source files)");
17329 case NT_VMS_TITLE:
17330 return "NT_VMS_TITLE";
17331 case NT_VMS_EIDC:
17332 return _("NT_VMS_EIDC (consistency check)");
17333 case NT_VMS_FPMODE:
17334 return _("NT_VMS_FPMODE (FP mode)");
17335 case NT_VMS_LINKTIME:
17336 return "NT_VMS_LINKTIME";
17337 case NT_VMS_IMGNAM:
17338 return _("NT_VMS_IMGNAM (image name)");
17339 case NT_VMS_IMGID:
17340 return _("NT_VMS_IMGID (image id)");
17341 case NT_VMS_LINKID:
17342 return _("NT_VMS_LINKID (link id)");
17343 case NT_VMS_IMGBID:
17344 return _("NT_VMS_IMGBID (build id)");
17345 case NT_VMS_GSTNAM:
17346 return _("NT_VMS_GSTNAM (sym table name)");
17347 case NT_VMS_ORIG_DYN:
17348 return "NT_VMS_ORIG_DYN";
17349 case NT_VMS_PATCHTIME:
17350 return "NT_VMS_PATCHTIME";
17351 default:
17352 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17353 return buff;
17354 }
17355 }
17356
17357 static bfd_boolean
17358 print_ia64_vms_note (Elf_Internal_Note * pnote)
17359 {
17360 switch (pnote->type)
17361 {
17362 case NT_VMS_MHD:
17363 if (pnote->descsz > 36)
17364 {
17365 size_t l = strlen (pnote->descdata + 34);
17366 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17367 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17368 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17369 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17370 }
17371 else
17372 printf (_(" Invalid size\n"));
17373 break;
17374 case NT_VMS_LNM:
17375 printf (_(" Language: %s\n"), pnote->descdata);
17376 break;
17377 #ifdef BFD64
17378 case NT_VMS_FPMODE:
17379 printf (_(" Floating Point mode: "));
17380 printf ("0x%016" BFD_VMA_FMT "x\n",
17381 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17382 break;
17383 case NT_VMS_LINKTIME:
17384 printf (_(" Link time: "));
17385 print_vms_time
17386 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17387 printf ("\n");
17388 break;
17389 case NT_VMS_PATCHTIME:
17390 printf (_(" Patch time: "));
17391 print_vms_time
17392 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17393 printf ("\n");
17394 break;
17395 case NT_VMS_ORIG_DYN:
17396 printf (_(" Major id: %u, minor id: %u\n"),
17397 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17398 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17399 printf (_(" Last modified : "));
17400 print_vms_time
17401 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17402 printf (_("\n Link flags : "));
17403 printf ("0x%016" BFD_VMA_FMT "x\n",
17404 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17405 printf (_(" Header flags: 0x%08x\n"),
17406 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17407 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17408 break;
17409 #endif
17410 case NT_VMS_IMGNAM:
17411 printf (_(" Image name: %s\n"), pnote->descdata);
17412 break;
17413 case NT_VMS_GSTNAM:
17414 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17415 break;
17416 case NT_VMS_IMGID:
17417 printf (_(" Image id: %s\n"), pnote->descdata);
17418 break;
17419 case NT_VMS_LINKID:
17420 printf (_(" Linker id: %s\n"), pnote->descdata);
17421 break;
17422 default:
17423 return FALSE;
17424 }
17425 return TRUE;
17426 }
17427
17428 /* Find the symbol associated with a build attribute that is attached
17429 to address OFFSET. If PNAME is non-NULL then store the name of
17430 the symbol (if found) in the provided pointer, Returns NULL if a
17431 symbol could not be found. */
17432
17433 static Elf_Internal_Sym *
17434 get_symbol_for_build_attribute (Filedata * filedata,
17435 unsigned long offset,
17436 bfd_boolean is_open_attr,
17437 const char ** pname)
17438 {
17439 static Filedata * saved_filedata = NULL;
17440 static char * strtab;
17441 static unsigned long strtablen;
17442 static Elf_Internal_Sym * symtab;
17443 static unsigned long nsyms;
17444 Elf_Internal_Sym * saved_sym = NULL;
17445 Elf_Internal_Sym * sym;
17446
17447 if (filedata->section_headers != NULL
17448 && (saved_filedata == NULL || filedata != saved_filedata))
17449 {
17450 Elf_Internal_Shdr * symsec;
17451
17452 /* Load the symbol and string sections. */
17453 for (symsec = filedata->section_headers;
17454 symsec < filedata->section_headers + filedata->file_header.e_shnum;
17455 symsec ++)
17456 {
17457 if (symsec->sh_type == SHT_SYMTAB)
17458 {
17459 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17460
17461 if (symsec->sh_link < filedata->file_header.e_shnum)
17462 {
17463 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17464
17465 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17466 1, strtab_sec->sh_size,
17467 _("string table"));
17468 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17469 }
17470 }
17471 }
17472 saved_filedata = filedata;
17473 }
17474
17475 if (symtab == NULL || strtab == NULL)
17476 return NULL;
17477
17478 /* Find a symbol whose value matches offset. */
17479 for (sym = symtab; sym < symtab + nsyms; sym ++)
17480 if (sym->st_value == offset)
17481 {
17482 if (sym->st_name >= strtablen)
17483 /* Huh ? This should not happen. */
17484 continue;
17485
17486 if (strtab[sym->st_name] == 0)
17487 continue;
17488
17489 /* The AArch64 and ARM architectures define mapping symbols
17490 (eg $d, $x, $t) which we want to ignore. */
17491 if (strtab[sym->st_name] == '$'
17492 && strtab[sym->st_name + 1] != 0
17493 && strtab[sym->st_name + 2] == 0)
17494 continue;
17495
17496 if (is_open_attr)
17497 {
17498 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17499 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17500 FUNC symbols entirely. */
17501 switch (ELF_ST_TYPE (sym->st_info))
17502 {
17503 case STT_OBJECT:
17504 case STT_FILE:
17505 saved_sym = sym;
17506 if (sym->st_size)
17507 {
17508 /* If the symbol has a size associated
17509 with it then we can stop searching. */
17510 sym = symtab + nsyms;
17511 }
17512 continue;
17513
17514 case STT_FUNC:
17515 /* Ignore function symbols. */
17516 continue;
17517
17518 default:
17519 break;
17520 }
17521
17522 switch (ELF_ST_BIND (sym->st_info))
17523 {
17524 case STB_GLOBAL:
17525 if (saved_sym == NULL
17526 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17527 saved_sym = sym;
17528 break;
17529
17530 case STB_LOCAL:
17531 if (saved_sym == NULL)
17532 saved_sym = sym;
17533 break;
17534
17535 default:
17536 break;
17537 }
17538 }
17539 else
17540 {
17541 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17542 continue;
17543
17544 saved_sym = sym;
17545 break;
17546 }
17547 }
17548
17549 if (saved_sym && pname)
17550 * pname = strtab + saved_sym->st_name;
17551
17552 return saved_sym;
17553 }
17554
17555 static bfd_boolean
17556 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
17557 Filedata * filedata)
17558 {
17559 static unsigned long global_offset = 0;
17560 static unsigned long global_end = 0;
17561 static unsigned long func_offset = 0;
17562 static unsigned long func_end = 0;
17563
17564 Elf_Internal_Sym * sym;
17565 const char * name;
17566 unsigned long start;
17567 unsigned long end;
17568 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17569
17570 switch (pnote->descsz)
17571 {
17572 case 0:
17573 /* A zero-length description means that the range of
17574 the previous note of the same type should be used. */
17575 if (is_open_attr)
17576 {
17577 if (global_end > global_offset)
17578 printf (_(" Applies to region from %#lx to %#lx\n"),
17579 global_offset, global_end);
17580 else
17581 printf (_(" Applies to region from %#lx\n"), global_offset);
17582 }
17583 else
17584 {
17585 if (func_end > func_offset)
17586 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17587 else
17588 printf (_(" Applies to region from %#lx\n"), func_offset);
17589 }
17590 return TRUE;
17591
17592 case 4:
17593 start = byte_get ((unsigned char *) pnote->descdata, 4);
17594 end = 0;
17595 break;
17596
17597 case 8:
17598 if (is_32bit_elf)
17599 {
17600 /* FIXME: We should check that version 3+ notes are being used here... */
17601 start = byte_get ((unsigned char *) pnote->descdata, 4);
17602 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17603 }
17604 else
17605 {
17606 start = byte_get ((unsigned char *) pnote->descdata, 8);
17607 end = 0;
17608 }
17609 break;
17610
17611 case 16:
17612 start = byte_get ((unsigned char *) pnote->descdata, 8);
17613 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17614 break;
17615
17616 default:
17617 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
17618 printf (_(" <invalid descsz>"));
17619 return FALSE;
17620 }
17621
17622 name = NULL;
17623 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17624 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
17625 in order to avoid them being confused with the start address of the
17626 first function in the file... */
17627 if (sym == NULL && is_open_attr)
17628 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
17629 & name);
17630
17631 if (end == 0 && sym != NULL && sym->st_size > 0)
17632 end = start + sym->st_size;
17633
17634 if (is_open_attr)
17635 {
17636 /* FIXME: Need to properly allow for section alignment. 16 is just the alignment used on x86_64. */
17637 if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17638 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17639 global_end + 1, start - 1);
17640
17641 printf (_(" Applies to region from %#lx"), start);
17642 global_offset = start;
17643
17644 if (end)
17645 {
17646 printf (_(" to %#lx"), end);
17647 global_end = end;
17648 }
17649 }
17650 else
17651 {
17652 printf (_(" Applies to region from %#lx"), start);
17653 func_offset = start;
17654
17655 if (end)
17656 {
17657 printf (_(" to %#lx"), end);
17658 func_end = end;
17659 }
17660 }
17661
17662 if (sym && name)
17663 printf (_(" (%s)"), name);
17664
17665 printf ("\n");
17666 return TRUE;
17667 }
17668
17669 static bfd_boolean
17670 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17671 {
17672 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17673 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17674 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17675 char name_type;
17676 char name_attribute;
17677 const char * expected_types;
17678 const char * name = pnote->namedata;
17679 const char * text;
17680 signed int left;
17681
17682 if (name == NULL || pnote->namesz < 2)
17683 {
17684 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17685 print_symbol (-20, _(" <corrupt name>"));
17686 return FALSE;
17687 }
17688
17689 if (do_wide)
17690 left = 28;
17691 else
17692 left = 20;
17693
17694 /* Version 2 of the spec adds a "GA" prefix to the name field. */
17695 if (name[0] == 'G' && name[1] == 'A')
17696 {
17697 if (pnote->namesz < 4)
17698 {
17699 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17700 print_symbol (-20, _(" <corrupt name>"));
17701 return FALSE;
17702 }
17703
17704 printf ("GA");
17705 name += 2;
17706 left -= 2;
17707 }
17708
17709 switch ((name_type = * name))
17710 {
17711 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17712 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17713 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17714 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17715 printf ("%c", * name);
17716 left --;
17717 break;
17718 default:
17719 error (_("unrecognised attribute type in name field: %d\n"), name_type);
17720 print_symbol (-20, _("<unknown name type>"));
17721 return FALSE;
17722 }
17723
17724 ++ name;
17725 text = NULL;
17726
17727 switch ((name_attribute = * name))
17728 {
17729 case GNU_BUILD_ATTRIBUTE_VERSION:
17730 text = _("<version>");
17731 expected_types = string_expected;
17732 ++ name;
17733 break;
17734 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17735 text = _("<stack prot>");
17736 expected_types = "!+*";
17737 ++ name;
17738 break;
17739 case GNU_BUILD_ATTRIBUTE_RELRO:
17740 text = _("<relro>");
17741 expected_types = bool_expected;
17742 ++ name;
17743 break;
17744 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17745 text = _("<stack size>");
17746 expected_types = number_expected;
17747 ++ name;
17748 break;
17749 case GNU_BUILD_ATTRIBUTE_TOOL:
17750 text = _("<tool>");
17751 expected_types = string_expected;
17752 ++ name;
17753 break;
17754 case GNU_BUILD_ATTRIBUTE_ABI:
17755 text = _("<ABI>");
17756 expected_types = "$*";
17757 ++ name;
17758 break;
17759 case GNU_BUILD_ATTRIBUTE_PIC:
17760 text = _("<PIC>");
17761 expected_types = number_expected;
17762 ++ name;
17763 break;
17764 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17765 text = _("<short enum>");
17766 expected_types = bool_expected;
17767 ++ name;
17768 break;
17769 default:
17770 if (ISPRINT (* name))
17771 {
17772 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17773
17774 if (len > left && ! do_wide)
17775 len = left;
17776 printf ("%.*s:", len, name);
17777 left -= len;
17778 name += len;
17779 }
17780 else
17781 {
17782 static char tmpbuf [128];
17783
17784 error (_("unrecognised byte in name field: %d\n"), * name);
17785 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17786 text = tmpbuf;
17787 name ++;
17788 }
17789 expected_types = "*$!+";
17790 break;
17791 }
17792
17793 if (text)
17794 left -= printf ("%s", text);
17795
17796 if (strchr (expected_types, name_type) == NULL)
17797 warn (_("attribute does not have an expected type (%c)\n"), name_type);
17798
17799 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17800 {
17801 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17802 (unsigned long) pnote->namesz,
17803 (long) (name - pnote->namedata));
17804 return FALSE;
17805 }
17806
17807 if (left < 1 && ! do_wide)
17808 return TRUE;
17809
17810 switch (name_type)
17811 {
17812 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17813 {
17814 unsigned int bytes;
17815 unsigned long long val = 0;
17816 unsigned int shift = 0;
17817 char * decoded = NULL;
17818
17819 bytes = pnote->namesz - (name - pnote->namedata);
17820 if (bytes > 0)
17821 /* The -1 is because the name field is always 0 terminated, and we
17822 want to be able to ensure that the shift in the while loop below
17823 will not overflow. */
17824 -- bytes;
17825
17826 if (bytes > sizeof (val))
17827 {
17828 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17829 bytes);
17830 bytes = sizeof (val);
17831 }
17832 /* We do not bother to warn if bytes == 0 as this can
17833 happen with some early versions of the gcc plugin. */
17834
17835 while (bytes --)
17836 {
17837 unsigned long byte = (* name ++) & 0xff;
17838
17839 val |= byte << shift;
17840 shift += 8;
17841 }
17842
17843 switch (name_attribute)
17844 {
17845 case GNU_BUILD_ATTRIBUTE_PIC:
17846 switch (val)
17847 {
17848 case 0: decoded = "static"; break;
17849 case 1: decoded = "pic"; break;
17850 case 2: decoded = "PIC"; break;
17851 case 3: decoded = "pie"; break;
17852 case 4: decoded = "PIE"; break;
17853 default: break;
17854 }
17855 break;
17856 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17857 switch (val)
17858 {
17859 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
17860 case 0: decoded = "off"; break;
17861 case 1: decoded = "on"; break;
17862 case 2: decoded = "all"; break;
17863 case 3: decoded = "strong"; break;
17864 case 4: decoded = "explicit"; break;
17865 default: break;
17866 }
17867 break;
17868 default:
17869 break;
17870 }
17871
17872 if (decoded != NULL)
17873 {
17874 print_symbol (-left, decoded);
17875 left = 0;
17876 }
17877 else if (val == 0)
17878 {
17879 printf ("0x0");
17880 left -= 3;
17881 }
17882 else
17883 {
17884 if (do_wide)
17885 left -= printf ("0x%llx", val);
17886 else
17887 left -= printf ("0x%-.*llx", left, val);
17888 }
17889 }
17890 break;
17891 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17892 left -= print_symbol (- left, name);
17893 break;
17894 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17895 left -= print_symbol (- left, "true");
17896 break;
17897 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17898 left -= print_symbol (- left, "false");
17899 break;
17900 }
17901
17902 if (do_wide && left > 0)
17903 printf ("%-*s", left, " ");
17904
17905 return TRUE;
17906 }
17907
17908 /* Note that by the ELF standard, the name field is already null byte
17909 terminated, and namesz includes the terminating null byte.
17910 I.E. the value of namesz for the name "FSF" is 4.
17911
17912 If the value of namesz is zero, there is no name present. */
17913
17914 static bfd_boolean
17915 process_note (Elf_Internal_Note * pnote,
17916 Filedata * filedata)
17917 {
17918 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17919 const char * nt;
17920
17921 if (pnote->namesz == 0)
17922 /* If there is no note name, then use the default set of
17923 note type strings. */
17924 nt = get_note_type (filedata, pnote->type);
17925
17926 else if (const_strneq (pnote->namedata, "GNU"))
17927 /* GNU-specific object file notes. */
17928 nt = get_gnu_elf_note_type (pnote->type);
17929
17930 else if (const_strneq (pnote->namedata, "FreeBSD"))
17931 /* FreeBSD-specific core file notes. */
17932 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
17933
17934 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
17935 /* NetBSD-specific core file notes. */
17936 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
17937
17938 else if (const_strneq (pnote->namedata, "NetBSD"))
17939 /* NetBSD-specific core file notes. */
17940 return process_netbsd_elf_note (pnote);
17941
17942 else if (strneq (pnote->namedata, "SPU/", 4))
17943 {
17944 /* SPU-specific core file notes. */
17945 nt = pnote->namedata + 4;
17946 name = "SPU";
17947 }
17948
17949 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17950 /* VMS/ia64-specific file notes. */
17951 nt = get_ia64_vms_note_type (pnote->type);
17952
17953 else if (const_strneq (pnote->namedata, "stapsdt"))
17954 nt = get_stapsdt_note_type (pnote->type);
17955
17956 else
17957 /* Don't recognize this note name; just use the default set of
17958 note type strings. */
17959 nt = get_note_type (filedata, pnote->type);
17960
17961 printf (" ");
17962
17963 if (((const_strneq (pnote->namedata, "GA")
17964 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17965 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17966 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17967 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17968 print_gnu_build_attribute_name (pnote);
17969 else
17970 print_symbol (-20, name);
17971
17972 if (do_wide)
17973 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17974 else
17975 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
17976
17977 if (const_strneq (pnote->namedata, "IPF/VMS"))
17978 return print_ia64_vms_note (pnote);
17979 else if (const_strneq (pnote->namedata, "GNU"))
17980 return print_gnu_note (filedata, pnote);
17981 else if (const_strneq (pnote->namedata, "stapsdt"))
17982 return print_stapsdt_note (pnote);
17983 else if (const_strneq (pnote->namedata, "CORE"))
17984 return print_core_note (pnote);
17985 else if (((const_strneq (pnote->namedata, "GA")
17986 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17987 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17988 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17989 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17990 return print_gnu_build_attribute_description (pnote, filedata);
17991
17992 if (pnote->descsz)
17993 {
17994 unsigned long i;
17995
17996 printf (_(" description data: "));
17997 for (i = 0; i < pnote->descsz; i++)
17998 printf ("%02x ", pnote->descdata[i]);
17999 if (!do_wide)
18000 printf ("\n");
18001 }
18002
18003 if (do_wide)
18004 printf ("\n");
18005
18006 return TRUE;
18007 }
18008
18009 static bfd_boolean
18010 process_notes_at (Filedata * filedata,
18011 Elf_Internal_Shdr * section,
18012 bfd_vma offset,
18013 bfd_vma length,
18014 bfd_vma align)
18015 {
18016 Elf_External_Note * pnotes;
18017 Elf_External_Note * external;
18018 char * end;
18019 bfd_boolean res = TRUE;
18020
18021 if (length <= 0)
18022 return FALSE;
18023
18024 if (section)
18025 {
18026 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18027 if (pnotes)
18028 {
18029 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18030 return FALSE;
18031 }
18032 }
18033 else
18034 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18035 _("notes"));
18036
18037 if (pnotes == NULL)
18038 return FALSE;
18039
18040 external = pnotes;
18041
18042 if (section)
18043 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18044 else
18045 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18046 (unsigned long) offset, (unsigned long) length);
18047
18048 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18049 specifies that notes should be aligned to 4 bytes in 32-bit
18050 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18051 we also support 4 byte alignment in 64-bit objects. If section
18052 alignment is less than 4, we treate alignment as 4 bytes. */
18053 if (align < 4)
18054 align = 4;
18055 else if (align != 4 && align != 8)
18056 {
18057 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18058 (long) align);
18059 return FALSE;
18060 }
18061
18062 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18063
18064 end = (char *) pnotes + length;
18065 while ((char *) external < end)
18066 {
18067 Elf_Internal_Note inote;
18068 size_t min_notesz;
18069 char * next;
18070 char * temp = NULL;
18071 size_t data_remaining = end - (char *) external;
18072
18073 if (!is_ia64_vms (filedata))
18074 {
18075 /* PR binutils/15191
18076 Make sure that there is enough data to read. */
18077 min_notesz = offsetof (Elf_External_Note, name);
18078 if (data_remaining < min_notesz)
18079 {
18080 warn (ngettext ("Corrupt note: only %ld byte remains, "
18081 "not enough for a full note\n",
18082 "Corrupt note: only %ld bytes remain, "
18083 "not enough for a full note\n",
18084 data_remaining),
18085 (long) data_remaining);
18086 break;
18087 }
18088 data_remaining -= min_notesz;
18089
18090 inote.type = BYTE_GET (external->type);
18091 inote.namesz = BYTE_GET (external->namesz);
18092 inote.namedata = external->name;
18093 inote.descsz = BYTE_GET (external->descsz);
18094 inote.descdata = ((char *) external
18095 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18096 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18097 next = ((char *) external
18098 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18099 }
18100 else
18101 {
18102 Elf64_External_VMS_Note *vms_external;
18103
18104 /* PR binutils/15191
18105 Make sure that there is enough data to read. */
18106 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18107 if (data_remaining < min_notesz)
18108 {
18109 warn (ngettext ("Corrupt note: only %ld byte remains, "
18110 "not enough for a full note\n",
18111 "Corrupt note: only %ld bytes remain, "
18112 "not enough for a full note\n",
18113 data_remaining),
18114 (long) data_remaining);
18115 break;
18116 }
18117 data_remaining -= min_notesz;
18118
18119 vms_external = (Elf64_External_VMS_Note *) external;
18120 inote.type = BYTE_GET (vms_external->type);
18121 inote.namesz = BYTE_GET (vms_external->namesz);
18122 inote.namedata = vms_external->name;
18123 inote.descsz = BYTE_GET (vms_external->descsz);
18124 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18125 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18126 next = inote.descdata + align_power (inote.descsz, 3);
18127 }
18128
18129 /* PR 17531: file: 3443835e. */
18130 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18131 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18132 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18133 || (size_t) (next - inote.descdata) < inote.descsz
18134 || ((size_t) (next - inote.descdata)
18135 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18136 {
18137 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18138 (unsigned long) ((char *) external - (char *) pnotes));
18139 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18140 inote.type, inote.namesz, inote.descsz, (int) align);
18141 break;
18142 }
18143
18144 external = (Elf_External_Note *) next;
18145
18146 /* Verify that name is null terminated. It appears that at least
18147 one version of Linux (RedHat 6.0) generates corefiles that don't
18148 comply with the ELF spec by failing to include the null byte in
18149 namesz. */
18150 if (inote.namedata[inote.namesz - 1] != '\0')
18151 {
18152 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18153 {
18154 temp = (char *) malloc (inote.namesz + 1);
18155 if (temp == NULL)
18156 {
18157 error (_("Out of memory allocating space for inote name\n"));
18158 res = FALSE;
18159 break;
18160 }
18161
18162 memcpy (temp, inote.namedata, inote.namesz);
18163 inote.namedata = temp;
18164 }
18165 inote.namedata[inote.namesz] = 0;
18166 }
18167
18168 if (! process_note (& inote, filedata))
18169 res = FALSE;
18170
18171 if (temp != NULL)
18172 {
18173 free (temp);
18174 temp = NULL;
18175 }
18176 }
18177
18178 free (pnotes);
18179
18180 return res;
18181 }
18182
18183 static bfd_boolean
18184 process_corefile_note_segments (Filedata * filedata)
18185 {
18186 Elf_Internal_Phdr * segment;
18187 unsigned int i;
18188 bfd_boolean res = TRUE;
18189
18190 if (! get_program_headers (filedata))
18191 return TRUE;
18192
18193 for (i = 0, segment = filedata->program_headers;
18194 i < filedata->file_header.e_phnum;
18195 i++, segment++)
18196 {
18197 if (segment->p_type == PT_NOTE)
18198 if (! process_notes_at (filedata, NULL,
18199 (bfd_vma) segment->p_offset,
18200 (bfd_vma) segment->p_filesz,
18201 (bfd_vma) segment->p_align))
18202 res = FALSE;
18203 }
18204
18205 return res;
18206 }
18207
18208 static bfd_boolean
18209 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18210 {
18211 Elf_External_Note * pnotes;
18212 Elf_External_Note * external;
18213 char * end;
18214 bfd_boolean res = TRUE;
18215
18216 if (length <= 0)
18217 return FALSE;
18218
18219 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18220 _("v850 notes"));
18221 if (pnotes == NULL)
18222 return FALSE;
18223
18224 external = pnotes;
18225 end = (char*) pnotes + length;
18226
18227 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18228 (unsigned long) offset, (unsigned long) length);
18229
18230 while ((char *) external + sizeof (Elf_External_Note) < end)
18231 {
18232 Elf_External_Note * next;
18233 Elf_Internal_Note inote;
18234
18235 inote.type = BYTE_GET (external->type);
18236 inote.namesz = BYTE_GET (external->namesz);
18237 inote.namedata = external->name;
18238 inote.descsz = BYTE_GET (external->descsz);
18239 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18240 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18241
18242 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18243 {
18244 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18245 inote.descdata = inote.namedata;
18246 inote.namesz = 0;
18247 }
18248
18249 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18250
18251 if ( ((char *) next > end)
18252 || ((char *) next < (char *) pnotes))
18253 {
18254 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18255 (unsigned long) ((char *) external - (char *) pnotes));
18256 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18257 inote.type, inote.namesz, inote.descsz);
18258 break;
18259 }
18260
18261 external = next;
18262
18263 /* Prevent out-of-bounds indexing. */
18264 if ( inote.namedata + inote.namesz > end
18265 || inote.namedata + inote.namesz < inote.namedata)
18266 {
18267 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18268 (unsigned long) ((char *) external - (char *) pnotes));
18269 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18270 inote.type, inote.namesz, inote.descsz);
18271 break;
18272 }
18273
18274 printf (" %s: ", get_v850_elf_note_type (inote.type));
18275
18276 if (! print_v850_note (& inote))
18277 {
18278 res = FALSE;
18279 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18280 inote.namesz, inote.descsz);
18281 }
18282 }
18283
18284 free (pnotes);
18285
18286 return res;
18287 }
18288
18289 static bfd_boolean
18290 process_note_sections (Filedata * filedata)
18291 {
18292 Elf_Internal_Shdr * section;
18293 unsigned long i;
18294 unsigned int n = 0;
18295 bfd_boolean res = TRUE;
18296
18297 for (i = 0, section = filedata->section_headers;
18298 i < filedata->file_header.e_shnum && section != NULL;
18299 i++, section++)
18300 {
18301 if (section->sh_type == SHT_NOTE)
18302 {
18303 if (! process_notes_at (filedata, section,
18304 (bfd_vma) section->sh_offset,
18305 (bfd_vma) section->sh_size,
18306 (bfd_vma) section->sh_addralign))
18307 res = FALSE;
18308 n++;
18309 }
18310
18311 if (( filedata->file_header.e_machine == EM_V800
18312 || filedata->file_header.e_machine == EM_V850
18313 || filedata->file_header.e_machine == EM_CYGNUS_V850)
18314 && section->sh_type == SHT_RENESAS_INFO)
18315 {
18316 if (! process_v850_notes (filedata,
18317 (bfd_vma) section->sh_offset,
18318 (bfd_vma) section->sh_size))
18319 res = FALSE;
18320 n++;
18321 }
18322 }
18323
18324 if (n == 0)
18325 /* Try processing NOTE segments instead. */
18326 return process_corefile_note_segments (filedata);
18327
18328 return res;
18329 }
18330
18331 static bfd_boolean
18332 process_notes (Filedata * filedata)
18333 {
18334 /* If we have not been asked to display the notes then do nothing. */
18335 if (! do_notes)
18336 return TRUE;
18337
18338 if (filedata->file_header.e_type != ET_CORE)
18339 return process_note_sections (filedata);
18340
18341 /* No program headers means no NOTE segment. */
18342 if (filedata->file_header.e_phnum > 0)
18343 return process_corefile_note_segments (filedata);
18344
18345 printf (_("No note segments present in the core file.\n"));
18346 return TRUE;
18347 }
18348
18349 static unsigned char *
18350 display_public_gnu_attributes (unsigned char * start,
18351 const unsigned char * const end)
18352 {
18353 printf (_(" Unknown GNU attribute: %s\n"), start);
18354
18355 start += strnlen ((char *) start, end - start);
18356 display_raw_attribute (start, end);
18357
18358 return (unsigned char *) end;
18359 }
18360
18361 static unsigned char *
18362 display_generic_attribute (unsigned char * start,
18363 unsigned int tag,
18364 const unsigned char * const end)
18365 {
18366 if (tag == 0)
18367 return (unsigned char *) end;
18368
18369 return display_tag_value (tag, start, end);
18370 }
18371
18372 static bfd_boolean
18373 process_arch_specific (Filedata * filedata)
18374 {
18375 if (! do_arch)
18376 return TRUE;
18377
18378 switch (filedata->file_header.e_machine)
18379 {
18380 case EM_ARC:
18381 case EM_ARC_COMPACT:
18382 case EM_ARC_COMPACT2:
18383 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18384 display_arc_attribute,
18385 display_generic_attribute);
18386 case EM_ARM:
18387 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18388 display_arm_attribute,
18389 display_generic_attribute);
18390
18391 case EM_MIPS:
18392 case EM_MIPS_RS3_LE:
18393 return process_mips_specific (filedata);
18394
18395 case EM_MSP430:
18396 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18397 display_msp430x_attribute,
18398 display_generic_attribute);
18399
18400 case EM_NDS32:
18401 return process_nds32_specific (filedata);
18402
18403 case EM_PPC:
18404 case EM_PPC64:
18405 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18406 display_power_gnu_attribute);
18407
18408 case EM_S390:
18409 case EM_S390_OLD:
18410 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18411 display_s390_gnu_attribute);
18412
18413 case EM_SPARC:
18414 case EM_SPARC32PLUS:
18415 case EM_SPARCV9:
18416 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18417 display_sparc_gnu_attribute);
18418
18419 case EM_TI_C6000:
18420 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18421 display_tic6x_attribute,
18422 display_generic_attribute);
18423
18424 default:
18425 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18426 display_public_gnu_attributes,
18427 display_generic_attribute);
18428 }
18429 }
18430
18431 static bfd_boolean
18432 get_file_header (Filedata * filedata)
18433 {
18434 /* Read in the identity array. */
18435 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18436 return FALSE;
18437
18438 /* Determine how to read the rest of the header. */
18439 switch (filedata->file_header.e_ident[EI_DATA])
18440 {
18441 default:
18442 case ELFDATANONE:
18443 case ELFDATA2LSB:
18444 byte_get = byte_get_little_endian;
18445 byte_put = byte_put_little_endian;
18446 break;
18447 case ELFDATA2MSB:
18448 byte_get = byte_get_big_endian;
18449 byte_put = byte_put_big_endian;
18450 break;
18451 }
18452
18453 /* For now we only support 32 bit and 64 bit ELF files. */
18454 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18455
18456 /* Read in the rest of the header. */
18457 if (is_32bit_elf)
18458 {
18459 Elf32_External_Ehdr ehdr32;
18460
18461 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18462 return FALSE;
18463
18464 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18465 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18466 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18467 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18468 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18469 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18470 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18471 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18472 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18473 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18474 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18475 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18476 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
18477 }
18478 else
18479 {
18480 Elf64_External_Ehdr ehdr64;
18481
18482 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18483 we will not be able to cope with the 64bit data found in
18484 64 ELF files. Detect this now and abort before we start
18485 overwriting things. */
18486 if (sizeof (bfd_vma) < 8)
18487 {
18488 error (_("This instance of readelf has been built without support for a\n\
18489 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18490 return FALSE;
18491 }
18492
18493 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18494 return FALSE;
18495
18496 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18497 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18498 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18499 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18500 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18501 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18502 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18503 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18504 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18505 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
18506 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18507 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
18508 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
18509 }
18510
18511 if (filedata->file_header.e_shoff)
18512 {
18513 /* There may be some extensions in the first section header. Don't
18514 bomb if we can't read it. */
18515 if (is_32bit_elf)
18516 get_32bit_section_headers (filedata, TRUE);
18517 else
18518 get_64bit_section_headers (filedata, TRUE);
18519 }
18520
18521 return TRUE;
18522 }
18523
18524 static void
18525 close_file (Filedata * filedata)
18526 {
18527 if (filedata)
18528 {
18529 if (filedata->handle)
18530 fclose (filedata->handle);
18531 free (filedata);
18532 }
18533 }
18534
18535 void
18536 close_debug_file (void * data)
18537 {
18538 close_file ((Filedata *) data);
18539 }
18540
18541 static Filedata *
18542 open_file (const char * pathname)
18543 {
18544 struct stat statbuf;
18545 Filedata * filedata = NULL;
18546
18547 if (stat (pathname, & statbuf) < 0
18548 || ! S_ISREG (statbuf.st_mode))
18549 goto fail;
18550
18551 filedata = calloc (1, sizeof * filedata);
18552 if (filedata == NULL)
18553 goto fail;
18554
18555 filedata->handle = fopen (pathname, "rb");
18556 if (filedata->handle == NULL)
18557 goto fail;
18558
18559 filedata->file_size = (bfd_size_type) statbuf.st_size;
18560 filedata->file_name = pathname;
18561
18562 if (! get_file_header (filedata))
18563 goto fail;
18564
18565 if (filedata->file_header.e_shoff)
18566 {
18567 bfd_boolean res;
18568
18569 /* Read the section headers again, this time for real. */
18570 if (is_32bit_elf)
18571 res = get_32bit_section_headers (filedata, FALSE);
18572 else
18573 res = get_64bit_section_headers (filedata, FALSE);
18574
18575 if (!res)
18576 goto fail;
18577 }
18578
18579 return filedata;
18580
18581 fail:
18582 if (filedata)
18583 {
18584 if (filedata->handle)
18585 fclose (filedata->handle);
18586 free (filedata);
18587 }
18588 return NULL;
18589 }
18590
18591 void *
18592 open_debug_file (const char * pathname)
18593 {
18594 return open_file (pathname);
18595 }
18596
18597 /* Process one ELF object file according to the command line options.
18598 This file may actually be stored in an archive. The file is
18599 positioned at the start of the ELF object. Returns TRUE if no
18600 problems were encountered, FALSE otherwise. */
18601
18602 static bfd_boolean
18603 process_object (Filedata * filedata)
18604 {
18605 Filedata * separates;
18606 unsigned int i;
18607 bfd_boolean res = TRUE;
18608
18609 if (! get_file_header (filedata))
18610 {
18611 error (_("%s: Failed to read file header\n"), filedata->file_name);
18612 return FALSE;
18613 }
18614
18615 /* Initialise per file variables. */
18616 for (i = ARRAY_SIZE (version_info); i--;)
18617 version_info[i] = 0;
18618
18619 for (i = ARRAY_SIZE (dynamic_info); i--;)
18620 dynamic_info[i] = 0;
18621 dynamic_info_DT_GNU_HASH = 0;
18622
18623 /* Process the file. */
18624 if (show_name)
18625 printf (_("\nFile: %s\n"), filedata->file_name);
18626
18627 /* Initialise the dump_sects array from the cmdline_dump_sects array.
18628 Note we do this even if cmdline_dump_sects is empty because we
18629 must make sure that the dump_sets array is zeroed out before each
18630 object file is processed. */
18631 if (filedata->num_dump_sects > cmdline.num_dump_sects)
18632 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18633
18634 if (cmdline.num_dump_sects > 0)
18635 {
18636 if (filedata->num_dump_sects == 0)
18637 /* A sneaky way of allocating the dump_sects array. */
18638 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18639
18640 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18641 memcpy (filedata->dump_sects, cmdline.dump_sects,
18642 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18643 }
18644
18645 if (! process_file_header (filedata))
18646 return FALSE;
18647
18648 if (! process_section_headers (filedata))
18649 {
18650 /* Without loaded section headers we cannot process lots of things. */
18651 do_unwind = do_version = do_dump = do_arch = FALSE;
18652
18653 if (! do_using_dynamic)
18654 do_syms = do_dyn_syms = do_reloc = FALSE;
18655 }
18656
18657 if (! process_section_groups (filedata))
18658 /* Without loaded section groups we cannot process unwind. */
18659 do_unwind = FALSE;
18660
18661 if (process_program_headers (filedata))
18662 process_dynamic_section (filedata);
18663 else
18664 res = FALSE;
18665
18666 if (! process_relocs (filedata))
18667 res = FALSE;
18668
18669 if (! process_unwind (filedata))
18670 res = FALSE;
18671
18672 if (! process_symbol_table (filedata))
18673 res = FALSE;
18674
18675 if (! process_syminfo (filedata))
18676 res = FALSE;
18677
18678 if (! process_version_sections (filedata))
18679 res = FALSE;
18680
18681 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18682 separates = load_separate_debug_file (filedata, filedata->file_name);
18683 else
18684 separates = NULL;
18685
18686 if (! process_section_contents (filedata))
18687 res = FALSE;
18688
18689 if (separates)
18690 {
18691 if (! process_section_headers (separates))
18692 res = FALSE;
18693 else if (! process_section_contents (separates))
18694 res = FALSE;
18695 }
18696
18697 if (! process_notes (filedata))
18698 res = FALSE;
18699
18700 if (! process_gnu_liblist (filedata))
18701 res = FALSE;
18702
18703 if (! process_arch_specific (filedata))
18704 res = FALSE;
18705
18706 free (filedata->program_headers);
18707 filedata->program_headers = NULL;
18708
18709 free (filedata->section_headers);
18710 filedata->section_headers = NULL;
18711
18712 free (filedata->string_table);
18713 filedata->string_table = NULL;
18714 filedata->string_table_length = 0;
18715
18716 if (dynamic_strings)
18717 {
18718 free (dynamic_strings);
18719 dynamic_strings = NULL;
18720 dynamic_strings_length = 0;
18721 }
18722
18723 if (dynamic_symbols)
18724 {
18725 free (dynamic_symbols);
18726 dynamic_symbols = NULL;
18727 num_dynamic_syms = 0;
18728 }
18729
18730 if (dynamic_syminfo)
18731 {
18732 free (dynamic_syminfo);
18733 dynamic_syminfo = NULL;
18734 }
18735
18736 if (dynamic_section)
18737 {
18738 free (dynamic_section);
18739 dynamic_section = NULL;
18740 }
18741
18742 if (section_headers_groups)
18743 {
18744 free (section_headers_groups);
18745 section_headers_groups = NULL;
18746 }
18747
18748 if (section_groups)
18749 {
18750 struct group_list * g;
18751 struct group_list * next;
18752
18753 for (i = 0; i < group_count; i++)
18754 {
18755 for (g = section_groups [i].root; g != NULL; g = next)
18756 {
18757 next = g->next;
18758 free (g);
18759 }
18760 }
18761
18762 free (section_groups);
18763 section_groups = NULL;
18764 }
18765
18766 free_debug_memory ();
18767
18768 return res;
18769 }
18770
18771 /* Process an ELF archive.
18772 On entry the file is positioned just after the ARMAG string.
18773 Returns TRUE upon success, FALSE otherwise. */
18774
18775 static bfd_boolean
18776 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18777 {
18778 struct archive_info arch;
18779 struct archive_info nested_arch;
18780 size_t got;
18781 bfd_boolean ret = TRUE;
18782
18783 show_name = TRUE;
18784
18785 /* The ARCH structure is used to hold information about this archive. */
18786 arch.file_name = NULL;
18787 arch.file = NULL;
18788 arch.index_array = NULL;
18789 arch.sym_table = NULL;
18790 arch.longnames = NULL;
18791
18792 /* The NESTED_ARCH structure is used as a single-item cache of information
18793 about a nested archive (when members of a thin archive reside within
18794 another regular archive file). */
18795 nested_arch.file_name = NULL;
18796 nested_arch.file = NULL;
18797 nested_arch.index_array = NULL;
18798 nested_arch.sym_table = NULL;
18799 nested_arch.longnames = NULL;
18800
18801 if (setup_archive (&arch, filedata->file_name, filedata->handle,
18802 is_thin_archive, do_archive_index) != 0)
18803 {
18804 ret = FALSE;
18805 goto out;
18806 }
18807
18808 if (do_archive_index)
18809 {
18810 if (arch.sym_table == NULL)
18811 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18812 else
18813 {
18814 unsigned long i, l;
18815 unsigned long current_pos;
18816
18817 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18818 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18819
18820 current_pos = ftell (filedata->handle);
18821
18822 for (i = l = 0; i < arch.index_num; i++)
18823 {
18824 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18825 {
18826 char * member_name;
18827
18828 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18829
18830 if (member_name != NULL)
18831 {
18832 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18833
18834 if (qualified_name != NULL)
18835 {
18836 printf (_("Contents of binary %s at offset "), qualified_name);
18837 (void) print_vma (arch.index_array[i], PREFIX_HEX);
18838 putchar ('\n');
18839 free (qualified_name);
18840 }
18841 }
18842 }
18843
18844 if (l >= arch.sym_size)
18845 {
18846 error (_("%s: end of the symbol table reached before the end of the index\n"),
18847 filedata->file_name);
18848 ret = FALSE;
18849 break;
18850 }
18851 /* PR 17531: file: 0b6630b2. */
18852 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18853 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
18854 }
18855
18856 if (arch.uses_64bit_indicies)
18857 l = (l + 7) & ~ 7;
18858 else
18859 l += l & 1;
18860
18861 if (l < arch.sym_size)
18862 {
18863 error (ngettext ("%s: %ld byte remains in the symbol table, "
18864 "but without corresponding entries in "
18865 "the index table\n",
18866 "%s: %ld bytes remain in the symbol table, "
18867 "but without corresponding entries in "
18868 "the index table\n",
18869 arch.sym_size - l),
18870 filedata->file_name, arch.sym_size - l);
18871 ret = FALSE;
18872 }
18873
18874 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
18875 {
18876 error (_("%s: failed to seek back to start of object files in the archive\n"),
18877 filedata->file_name);
18878 ret = FALSE;
18879 goto out;
18880 }
18881 }
18882
18883 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18884 && !do_segments && !do_header && !do_dump && !do_version
18885 && !do_histogram && !do_debugging && !do_arch && !do_notes
18886 && !do_section_groups && !do_dyn_syms)
18887 {
18888 ret = TRUE; /* Archive index only. */
18889 goto out;
18890 }
18891 }
18892
18893 while (1)
18894 {
18895 char * name;
18896 size_t namelen;
18897 char * qualified_name;
18898
18899 /* Read the next archive header. */
18900 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
18901 {
18902 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
18903 return FALSE;
18904 }
18905 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
18906 if (got != sizeof arch.arhdr)
18907 {
18908 if (got == 0)
18909 break;
18910 error (_("%s: failed to read archive header\n"), filedata->file_name);
18911 ret = FALSE;
18912 break;
18913 }
18914 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18915 {
18916 error (_("%s: did not find a valid archive header\n"), arch.file_name);
18917 ret = FALSE;
18918 break;
18919 }
18920
18921 arch.next_arhdr_offset += sizeof arch.arhdr;
18922
18923 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18924 if (archive_file_size & 01)
18925 ++archive_file_size;
18926
18927 name = get_archive_member_name (&arch, &nested_arch);
18928 if (name == NULL)
18929 {
18930 error (_("%s: bad archive file name\n"), filedata->file_name);
18931 ret = FALSE;
18932 break;
18933 }
18934 namelen = strlen (name);
18935
18936 qualified_name = make_qualified_name (&arch, &nested_arch, name);
18937 if (qualified_name == NULL)
18938 {
18939 error (_("%s: bad archive file name\n"), filedata->file_name);
18940 ret = FALSE;
18941 break;
18942 }
18943
18944 if (is_thin_archive && arch.nested_member_origin == 0)
18945 {
18946 /* This is a proxy for an external member of a thin archive. */
18947 Filedata * member_filedata;
18948 char * member_file_name = adjust_relative_path
18949 (filedata->file_name, name, namelen);
18950
18951 if (member_file_name == NULL)
18952 {
18953 ret = FALSE;
18954 break;
18955 }
18956
18957 member_filedata = open_file (member_file_name);
18958 if (member_filedata == NULL)
18959 {
18960 error (_("Input file '%s' is not readable.\n"), member_file_name);
18961 free (member_file_name);
18962 ret = FALSE;
18963 break;
18964 }
18965
18966 archive_file_offset = arch.nested_member_origin;
18967 member_filedata->file_name = qualified_name;
18968
18969 if (! process_object (member_filedata))
18970 ret = FALSE;
18971
18972 close_file (member_filedata);
18973 free (member_file_name);
18974 }
18975 else if (is_thin_archive)
18976 {
18977 Filedata thin_filedata;
18978
18979 memset (&thin_filedata, 0, sizeof (thin_filedata));
18980
18981 /* PR 15140: Allow for corrupt thin archives. */
18982 if (nested_arch.file == NULL)
18983 {
18984 error (_("%s: contains corrupt thin archive: %s\n"),
18985 filedata->file_name, name);
18986 ret = FALSE;
18987 break;
18988 }
18989
18990 /* This is a proxy for a member of a nested archive. */
18991 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
18992
18993 /* The nested archive file will have been opened and setup by
18994 get_archive_member_name. */
18995 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
18996 {
18997 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
18998 ret = FALSE;
18999 break;
19000 }
19001
19002 thin_filedata.handle = nested_arch.file;
19003 thin_filedata.file_name = qualified_name;
19004
19005 if (! process_object (& thin_filedata))
19006 ret = FALSE;
19007 }
19008 else
19009 {
19010 archive_file_offset = arch.next_arhdr_offset;
19011 arch.next_arhdr_offset += archive_file_size;
19012
19013 filedata->file_name = qualified_name;
19014 if (! process_object (filedata))
19015 ret = FALSE;
19016 }
19017
19018 if (filedata->dump_sects != NULL)
19019 {
19020 free (filedata->dump_sects);
19021 filedata->dump_sects = NULL;
19022 filedata->num_dump_sects = 0;
19023 }
19024
19025 free (qualified_name);
19026 }
19027
19028 out:
19029 if (nested_arch.file != NULL)
19030 fclose (nested_arch.file);
19031 release_archive (&nested_arch);
19032 release_archive (&arch);
19033
19034 return ret;
19035 }
19036
19037 static bfd_boolean
19038 process_file (char * file_name)
19039 {
19040 Filedata * filedata = NULL;
19041 struct stat statbuf;
19042 char armag[SARMAG];
19043 bfd_boolean ret = TRUE;
19044
19045 if (stat (file_name, &statbuf) < 0)
19046 {
19047 if (errno == ENOENT)
19048 error (_("'%s': No such file\n"), file_name);
19049 else
19050 error (_("Could not locate '%s'. System error message: %s\n"),
19051 file_name, strerror (errno));
19052 return FALSE;
19053 }
19054
19055 if (! S_ISREG (statbuf.st_mode))
19056 {
19057 error (_("'%s' is not an ordinary file\n"), file_name);
19058 return FALSE;
19059 }
19060
19061 filedata = calloc (1, sizeof * filedata);
19062 if (filedata == NULL)
19063 {
19064 error (_("Out of memory allocating file data structure\n"));
19065 return FALSE;
19066 }
19067
19068 filedata->file_name = file_name;
19069 filedata->handle = fopen (file_name, "rb");
19070 if (filedata->handle == NULL)
19071 {
19072 error (_("Input file '%s' is not readable.\n"), file_name);
19073 free (filedata);
19074 return FALSE;
19075 }
19076
19077 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19078 {
19079 error (_("%s: Failed to read file's magic number\n"), file_name);
19080 fclose (filedata->handle);
19081 free (filedata);
19082 return FALSE;
19083 }
19084
19085 filedata->file_size = (bfd_size_type) statbuf.st_size;
19086
19087 if (memcmp (armag, ARMAG, SARMAG) == 0)
19088 {
19089 if (! process_archive (filedata, FALSE))
19090 ret = FALSE;
19091 }
19092 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19093 {
19094 if ( ! process_archive (filedata, TRUE))
19095 ret = FALSE;
19096 }
19097 else
19098 {
19099 if (do_archive_index)
19100 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19101 file_name);
19102
19103 rewind (filedata->handle);
19104 archive_file_size = archive_file_offset = 0;
19105
19106 if (! process_object (filedata))
19107 ret = FALSE;
19108 }
19109
19110 fclose (filedata->handle);
19111 free (filedata);
19112
19113 return ret;
19114 }
19115
19116 #ifdef SUPPORT_DISASSEMBLY
19117 /* Needed by the i386 disassembler. For extra credit, someone could
19118 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19119 symbols. */
19120
19121 void
19122 print_address (unsigned int addr, FILE * outfile)
19123 {
19124 fprintf (outfile,"0x%8.8x", addr);
19125 }
19126
19127 /* Needed by the i386 disassembler. */
19128
19129 void
19130 db_task_printsym (unsigned int addr)
19131 {
19132 print_address (addr, stderr);
19133 }
19134 #endif
19135
19136 int
19137 main (int argc, char ** argv)
19138 {
19139 int err;
19140
19141 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19142 setlocale (LC_MESSAGES, "");
19143 #endif
19144 #if defined (HAVE_SETLOCALE)
19145 setlocale (LC_CTYPE, "");
19146 #endif
19147 bindtextdomain (PACKAGE, LOCALEDIR);
19148 textdomain (PACKAGE);
19149
19150 expandargv (&argc, &argv);
19151
19152 cmdline.file_name = "<cmdline>";
19153 parse_args (& cmdline, argc, argv);
19154
19155 if (optind < (argc - 1))
19156 show_name = TRUE;
19157 else if (optind >= argc)
19158 {
19159 warn (_("Nothing to do.\n"));
19160 usage (stderr);
19161 }
19162
19163 err = FALSE;
19164 while (optind < argc)
19165 if (! process_file (argv[optind++]))
19166 err = TRUE;
19167
19168 if (cmdline.dump_sects != NULL)
19169 free (cmdline.dump_sects);
19170
19171 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19172 }
This page took 0.486911 seconds and 4 git commands to generate.