Add basic recognition of new EM_ ELF machine numbers.
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2017 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/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/riscv.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nios2.h"
136 #include "elf/or1k.h"
137 #include "elf/pj.h"
138 #include "elf/ppc.h"
139 #include "elf/ppc64.h"
140 #include "elf/pru.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/x86-64.h"
155 #include "elf/xc16x.h"
156 #include "elf/xgate.h"
157 #include "elf/xstormy16.h"
158 #include "elf/xtensa.h"
159
160 #include "getopt.h"
161 #include "libiberty.h"
162 #include "safe-ctype.h"
163 #include "filenames.h"
164
165 #ifndef offsetof
166 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 #endif
168
169 typedef struct elf_section_list
170 {
171 Elf_Internal_Shdr * hdr;
172 struct elf_section_list * next;
173 } elf_section_list;
174
175 char * program_name = "readelf";
176 static unsigned long archive_file_offset;
177 static unsigned long archive_file_size;
178 static bfd_size_type current_file_size;
179 static unsigned long dynamic_addr;
180 static bfd_size_type dynamic_size;
181 static size_t dynamic_nent;
182 static char * dynamic_strings;
183 static unsigned long dynamic_strings_length;
184 static char * string_table;
185 static unsigned long string_table_length;
186 static unsigned long num_dynamic_syms;
187 static Elf_Internal_Sym * dynamic_symbols;
188 static Elf_Internal_Syminfo * dynamic_syminfo;
189 static unsigned long dynamic_syminfo_offset;
190 static unsigned int dynamic_syminfo_nent;
191 static char program_interpreter[PATH_MAX];
192 static bfd_vma dynamic_info[DT_ENCODING];
193 static bfd_vma dynamic_info_DT_GNU_HASH;
194 static bfd_vma version_info[16];
195 static Elf_Internal_Ehdr elf_header;
196 static Elf_Internal_Shdr * section_headers;
197 static Elf_Internal_Phdr * program_headers;
198 static Elf_Internal_Dyn * dynamic_section;
199 static elf_section_list * symtab_shndx_list;
200 static bfd_boolean show_name = FALSE;
201 static bfd_boolean do_dynamic = FALSE;
202 static bfd_boolean do_syms = FALSE;
203 static bfd_boolean do_dyn_syms = FALSE;
204 static bfd_boolean do_reloc = FALSE;
205 static bfd_boolean do_sections = FALSE;
206 static bfd_boolean do_section_groups = FALSE;
207 static bfd_boolean do_section_details = FALSE;
208 static bfd_boolean do_segments = FALSE;
209 static bfd_boolean do_unwind = FALSE;
210 static bfd_boolean do_using_dynamic = FALSE;
211 static bfd_boolean do_header = FALSE;
212 static bfd_boolean do_dump = FALSE;
213 static bfd_boolean do_version = FALSE;
214 static bfd_boolean do_histogram = FALSE;
215 static bfd_boolean do_debugging = FALSE;
216 static bfd_boolean do_arch = FALSE;
217 static bfd_boolean do_notes = FALSE;
218 static bfd_boolean do_archive_index = FALSE;
219 static bfd_boolean is_32bit_elf = FALSE;
220 static bfd_boolean decompress_dumps = FALSE;
221
222 struct group_list
223 {
224 struct group_list * next;
225 unsigned int section_index;
226 };
227
228 struct group
229 {
230 struct group_list * root;
231 unsigned int group_index;
232 };
233
234 static size_t group_count;
235 static struct group * section_groups;
236 static struct group ** section_headers_groups;
237
238
239 /* Flag bits indicating particular types of dump. */
240 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
241 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
242 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
243 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
244 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
245
246 typedef unsigned char dump_type;
247
248 /* A linked list of the section names for which dumps were requested. */
249 struct dump_list_entry
250 {
251 char * name;
252 dump_type type;
253 struct dump_list_entry * next;
254 };
255 static struct dump_list_entry * dump_sects_byname;
256
257 /* A dynamic array of flags indicating for which sections a dump
258 has been requested via command line switches. */
259 static dump_type * cmdline_dump_sects = NULL;
260 static unsigned int num_cmdline_dump_sects = 0;
261
262 /* A dynamic array of flags indicating for which sections a dump of
263 some kind has been requested. It is reset on a per-object file
264 basis and then initialised from the cmdline_dump_sects array,
265 the results of interpreting the -w switch, and the
266 dump_sects_byname list. */
267 static dump_type * dump_sects = NULL;
268 static unsigned int num_dump_sects = 0;
269
270
271 /* How to print a vma value. */
272 typedef enum print_mode
273 {
274 HEX,
275 DEC,
276 DEC_5,
277 UNSIGNED,
278 PREFIX_HEX,
279 FULL_HEX,
280 LONG_HEX
281 }
282 print_mode;
283
284 /* Versioned symbol info. */
285 enum versioned_symbol_info
286 {
287 symbol_undefined,
288 symbol_hidden,
289 symbol_public
290 };
291
292 static const char * get_symbol_version_string
293 (FILE *, bfd_boolean, const char *, unsigned long, unsigned,
294 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
295
296 #define UNKNOWN -1
297
298 #define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
302 : string_table + (X)->sh_name))
303
304 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
305
306 #define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
309
310 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
314
315 #define REMOVE_ARCH_BITS(ADDR) \
316 do \
317 { \
318 if (elf_header.e_machine == EM_ARM) \
319 (ADDR) &= ~1; \
320 } \
321 while (0)
322 \f
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
328 and REASON is not NULL then emit an error message using REASON as part of the
329 context. */
330
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
334 {
335 void * mvar;
336 bfd_size_type amt = size * nmemb;
337
338 if (size == 0 || nmemb == 0)
339 return NULL;
340
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
347 {
348 if (reason)
349 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 nmemb, size, reason);
352 return NULL;
353 }
354
355 /* Check for size overflow. */
356 if (amt < nmemb)
357 {
358 if (reason)
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 nmemb, size, reason);
362 return NULL;
363 }
364
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt > current_file_size
368 || offset + archive_file_offset + amt > current_file_size)
369 {
370 if (reason)
371 error (_("Reading 0x%" BFD_VMA_FMT "x"
372 " bytes extends past end of file for %s\n"),
373 amt, reason);
374 return NULL;
375 }
376
377 if (fseek (file, archive_file_offset + offset, SEEK_SET))
378 {
379 if (reason)
380 error (_("Unable to seek to 0x%lx for %s\n"),
381 archive_file_offset + offset, reason);
382 return NULL;
383 }
384
385 mvar = var;
386 if (mvar == NULL)
387 {
388 /* Check for overflow. */
389 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390 /* + 1 so that we can '\0' terminate invalid string table sections. */
391 mvar = malloc ((size_t) amt + 1);
392
393 if (mvar == NULL)
394 {
395 if (reason)
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397 " bytes for %s\n"),
398 amt, reason);
399 return NULL;
400 }
401
402 ((char *) mvar)[amt] = '\0';
403 }
404
405 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406 {
407 if (reason)
408 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409 amt, reason);
410 if (mvar != var)
411 free (mvar);
412 return NULL;
413 }
414
415 return mvar;
416 }
417
418 /* Print a VMA value in the MODE specified.
419 Returns the number of characters displayed. */
420
421 static unsigned int
422 print_vma (bfd_vma vma, print_mode mode)
423 {
424 unsigned int nc = 0;
425
426 switch (mode)
427 {
428 case FULL_HEX:
429 nc = printf ("0x");
430 /* Fall through. */
431 case LONG_HEX:
432 #ifdef BFD64
433 if (is_32bit_elf)
434 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436 printf_vma (vma);
437 return nc + 16;
438
439 case DEC_5:
440 if (vma <= 99999)
441 return printf ("%5" BFD_VMA_FMT "d", vma);
442 /* Fall through. */
443 case PREFIX_HEX:
444 nc = printf ("0x");
445 /* Fall through. */
446 case HEX:
447 return nc + printf ("%" BFD_VMA_FMT "x", vma);
448
449 case DEC:
450 return printf ("%" BFD_VMA_FMT "d", vma);
451
452 case UNSIGNED:
453 return printf ("%" BFD_VMA_FMT "u", vma);
454
455 default:
456 /* FIXME: Report unrecognised mode ? */
457 return 0;
458 }
459 }
460
461 /* Display a symbol on stdout. Handles the display of control characters and
462 multibye characters (assuming the host environment supports them).
463
464 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465
466 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467 padding as necessary.
468
469 Returns the number of emitted characters. */
470
471 static unsigned int
472 print_symbol (signed int width, const char *symbol)
473 {
474 bfd_boolean extra_padding = FALSE;
475 signed int num_printed = 0;
476 #ifdef HAVE_MBSTATE_T
477 mbstate_t state;
478 #endif
479 unsigned int width_remaining;
480
481 if (width < 0)
482 {
483 /* Keep the width positive. This also helps. */
484 width = - width;
485 extra_padding = TRUE;
486 }
487 assert (width != 0);
488
489 if (do_wide)
490 /* Set the remaining width to a very large value.
491 This simplifies the code below. */
492 width_remaining = INT_MAX;
493 else
494 width_remaining = width;
495
496 #ifdef HAVE_MBSTATE_T
497 /* Initialise the multibyte conversion state. */
498 memset (& state, 0, sizeof (state));
499 #endif
500
501 while (width_remaining)
502 {
503 size_t n;
504 const char c = *symbol++;
505
506 if (c == 0)
507 break;
508
509 /* Do not print control characters directly as they can affect terminal
510 settings. Such characters usually appear in the names generated
511 by the assembler for local labels. */
512 if (ISCNTRL (c))
513 {
514 if (width_remaining < 2)
515 break;
516
517 printf ("^%c", c + 0x40);
518 width_remaining -= 2;
519 num_printed += 2;
520 }
521 else if (ISPRINT (c))
522 {
523 putchar (c);
524 width_remaining --;
525 num_printed ++;
526 }
527 else
528 {
529 #ifdef HAVE_MBSTATE_T
530 wchar_t w;
531 #endif
532 /* Let printf do the hard work of displaying multibyte characters. */
533 printf ("%.1s", symbol - 1);
534 width_remaining --;
535 num_printed ++;
536
537 #ifdef HAVE_MBSTATE_T
538 /* Try to find out how many bytes made up the character that was
539 just printed. Advance the symbol pointer past the bytes that
540 were displayed. */
541 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
542 #else
543 n = 1;
544 #endif
545 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
546 symbol += (n - 1);
547 }
548 }
549
550 if (extra_padding && num_printed < width)
551 {
552 /* Fill in the remaining spaces. */
553 printf ("%-*s", width - num_printed, " ");
554 num_printed = width;
555 }
556
557 return num_printed;
558 }
559
560 /* Returns a pointer to a static buffer containing a printable version of
561 the given section's name. Like print_symbol, except that it does not try
562 to print multibyte characters, it just interprets them as hex values. */
563
564 static const char *
565 printable_section_name (const Elf_Internal_Shdr * sec)
566 {
567 #define MAX_PRINT_SEC_NAME_LEN 128
568 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
569 const char * name = SECTION_NAME (sec);
570 char * buf = sec_name_buf;
571 char c;
572 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573
574 while ((c = * name ++) != 0)
575 {
576 if (ISCNTRL (c))
577 {
578 if (remaining < 2)
579 break;
580
581 * buf ++ = '^';
582 * buf ++ = c + 0x40;
583 remaining -= 2;
584 }
585 else if (ISPRINT (c))
586 {
587 * buf ++ = c;
588 remaining -= 1;
589 }
590 else
591 {
592 static char hex[17] = "0123456789ABCDEF";
593
594 if (remaining < 4)
595 break;
596 * buf ++ = '<';
597 * buf ++ = hex[(c & 0xf0) >> 4];
598 * buf ++ = hex[c & 0x0f];
599 * buf ++ = '>';
600 remaining -= 4;
601 }
602
603 if (remaining == 0)
604 break;
605 }
606
607 * buf = 0;
608 return sec_name_buf;
609 }
610
611 static const char *
612 printable_section_name_from_index (unsigned long ndx)
613 {
614 if (ndx >= elf_header.e_shnum)
615 return _("<corrupt>");
616
617 return printable_section_name (section_headers + ndx);
618 }
619
620 /* Return a pointer to section NAME, or NULL if no such section exists. */
621
622 static Elf_Internal_Shdr *
623 find_section (const char * name)
624 {
625 unsigned int i;
626
627 for (i = 0; i < elf_header.e_shnum; i++)
628 if (streq (SECTION_NAME (section_headers + i), name))
629 return section_headers + i;
630
631 return NULL;
632 }
633
634 /* Return a pointer to a section containing ADDR, or NULL if no such
635 section exists. */
636
637 static Elf_Internal_Shdr *
638 find_section_by_address (bfd_vma addr)
639 {
640 unsigned int i;
641
642 for (i = 0; i < elf_header.e_shnum; i++)
643 {
644 Elf_Internal_Shdr *sec = section_headers + i;
645 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
646 return sec;
647 }
648
649 return NULL;
650 }
651
652 static Elf_Internal_Shdr *
653 find_section_by_type (unsigned int type)
654 {
655 unsigned int i;
656
657 for (i = 0; i < elf_header.e_shnum; i++)
658 {
659 Elf_Internal_Shdr *sec = section_headers + i;
660 if (sec->sh_type == type)
661 return sec;
662 }
663
664 return NULL;
665 }
666
667 /* Return a pointer to section NAME, or NULL if no such section exists,
668 restricted to the list of sections given in SET. */
669
670 static Elf_Internal_Shdr *
671 find_section_in_set (const char * name, unsigned int * set)
672 {
673 unsigned int i;
674
675 if (set != NULL)
676 {
677 while ((i = *set++) > 0)
678 {
679 /* See PR 21156 for a reproducer. */
680 if (i >= elf_header.e_shnum)
681 continue; /* FIXME: Should we issue an error message ? */
682
683 if (streq (SECTION_NAME (section_headers + i), name))
684 return section_headers + i;
685 }
686 }
687
688 return find_section (name);
689 }
690
691 /* Read an unsigned LEB128 encoded value from DATA.
692 Set *LENGTH_RETURN to the number of bytes read. */
693
694 static inline unsigned long
695 read_uleb128 (unsigned char * data,
696 unsigned int * length_return,
697 const unsigned char * const end)
698 {
699 return read_leb128 (data, length_return, FALSE, end);
700 }
701
702 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
703 This OS has so many departures from the ELF standard that we test it at
704 many places. */
705
706 static inline bfd_boolean
707 is_ia64_vms (void)
708 {
709 return elf_header.e_machine == EM_IA_64
710 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
711 }
712
713 /* Guess the relocation size commonly used by the specific machines. */
714
715 static bfd_boolean
716 guess_is_rela (unsigned int e_machine)
717 {
718 switch (e_machine)
719 {
720 /* Targets that use REL relocations. */
721 case EM_386:
722 case EM_IAMCU:
723 case EM_960:
724 case EM_ARM:
725 case EM_D10V:
726 case EM_CYGNUS_D10V:
727 case EM_DLX:
728 case EM_MIPS:
729 case EM_MIPS_RS3_LE:
730 case EM_CYGNUS_M32R:
731 case EM_SCORE:
732 case EM_XGATE:
733 return FALSE;
734
735 /* Targets that use RELA relocations. */
736 case EM_68K:
737 case EM_860:
738 case EM_AARCH64:
739 case EM_ADAPTEVA_EPIPHANY:
740 case EM_ALPHA:
741 case EM_ALTERA_NIOS2:
742 case EM_ARC:
743 case EM_ARC_COMPACT:
744 case EM_ARC_COMPACT2:
745 case EM_AVR:
746 case EM_AVR_OLD:
747 case EM_BLACKFIN:
748 case EM_CR16:
749 case EM_CRIS:
750 case EM_CRX:
751 case EM_D30V:
752 case EM_CYGNUS_D30V:
753 case EM_FR30:
754 case EM_FT32:
755 case EM_CYGNUS_FR30:
756 case EM_CYGNUS_FRV:
757 case EM_H8S:
758 case EM_H8_300:
759 case EM_H8_300H:
760 case EM_IA_64:
761 case EM_IP2K:
762 case EM_IP2K_OLD:
763 case EM_IQ2000:
764 case EM_LATTICEMICO32:
765 case EM_M32C_OLD:
766 case EM_M32C:
767 case EM_M32R:
768 case EM_MCORE:
769 case EM_CYGNUS_MEP:
770 case EM_METAG:
771 case EM_MMIX:
772 case EM_MN10200:
773 case EM_CYGNUS_MN10200:
774 case EM_MN10300:
775 case EM_CYGNUS_MN10300:
776 case EM_MOXIE:
777 case EM_MSP430:
778 case EM_MSP430_OLD:
779 case EM_MT:
780 case EM_NDS32:
781 case EM_NIOS32:
782 case EM_OR1K:
783 case EM_PPC64:
784 case EM_PPC:
785 case EM_TI_PRU:
786 case EM_RISCV:
787 case EM_RL78:
788 case EM_RX:
789 case EM_S390:
790 case EM_S390_OLD:
791 case EM_SH:
792 case EM_SPARC:
793 case EM_SPARC32PLUS:
794 case EM_SPARCV9:
795 case EM_SPU:
796 case EM_TI_C6000:
797 case EM_TILEGX:
798 case EM_TILEPRO:
799 case EM_V800:
800 case EM_V850:
801 case EM_CYGNUS_V850:
802 case EM_VAX:
803 case EM_VISIUM:
804 case EM_X86_64:
805 case EM_L1OM:
806 case EM_K1OM:
807 case EM_XSTORMY16:
808 case EM_XTENSA:
809 case EM_XTENSA_OLD:
810 case EM_MICROBLAZE:
811 case EM_MICROBLAZE_OLD:
812 return TRUE;
813
814 case EM_68HC05:
815 case EM_68HC08:
816 case EM_68HC11:
817 case EM_68HC16:
818 case EM_FX66:
819 case EM_ME16:
820 case EM_MMA:
821 case EM_NCPU:
822 case EM_NDR1:
823 case EM_PCP:
824 case EM_ST100:
825 case EM_ST19:
826 case EM_ST7:
827 case EM_ST9PLUS:
828 case EM_STARCORE:
829 case EM_SVX:
830 case EM_TINYJ:
831 default:
832 warn (_("Don't know about relocations on this machine architecture\n"));
833 return FALSE;
834 }
835 }
836
837 /* Load RELA type relocations from FILE at REL_OFFSET extending for REL_SIZE bytes.
838 Returns TRUE upon success, FALSE otherwise. If successful then a
839 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
840 and the number of relocs loaded is placed in *NRELASP. It is the caller's
841 responsibility to free the allocated buffer. */
842
843 static bfd_boolean
844 slurp_rela_relocs (FILE * file,
845 unsigned long rel_offset,
846 unsigned long rel_size,
847 Elf_Internal_Rela ** relasp,
848 unsigned long * nrelasp)
849 {
850 Elf_Internal_Rela * relas;
851 size_t nrelas;
852 unsigned int i;
853
854 if (is_32bit_elf)
855 {
856 Elf32_External_Rela * erelas;
857
858 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
859 rel_size, _("32-bit relocation data"));
860 if (!erelas)
861 return FALSE;
862
863 nrelas = rel_size / sizeof (Elf32_External_Rela);
864
865 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
866 sizeof (Elf_Internal_Rela));
867
868 if (relas == NULL)
869 {
870 free (erelas);
871 error (_("out of memory parsing relocs\n"));
872 return FALSE;
873 }
874
875 for (i = 0; i < nrelas; i++)
876 {
877 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
878 relas[i].r_info = BYTE_GET (erelas[i].r_info);
879 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
880 }
881
882 free (erelas);
883 }
884 else
885 {
886 Elf64_External_Rela * erelas;
887
888 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
889 rel_size, _("64-bit relocation data"));
890 if (!erelas)
891 return FALSE;
892
893 nrelas = rel_size / sizeof (Elf64_External_Rela);
894
895 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
896 sizeof (Elf_Internal_Rela));
897
898 if (relas == NULL)
899 {
900 free (erelas);
901 error (_("out of memory parsing relocs\n"));
902 return FALSE;
903 }
904
905 for (i = 0; i < nrelas; i++)
906 {
907 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
908 relas[i].r_info = BYTE_GET (erelas[i].r_info);
909 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
910
911 /* The #ifdef BFD64 below is to prevent a compile time
912 warning. We know that if we do not have a 64 bit data
913 type that we will never execute this code anyway. */
914 #ifdef BFD64
915 if (elf_header.e_machine == EM_MIPS
916 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
917 {
918 /* In little-endian objects, r_info isn't really a
919 64-bit little-endian value: it has a 32-bit
920 little-endian symbol index followed by four
921 individual byte fields. Reorder INFO
922 accordingly. */
923 bfd_vma inf = relas[i].r_info;
924 inf = (((inf & 0xffffffff) << 32)
925 | ((inf >> 56) & 0xff)
926 | ((inf >> 40) & 0xff00)
927 | ((inf >> 24) & 0xff0000)
928 | ((inf >> 8) & 0xff000000));
929 relas[i].r_info = inf;
930 }
931 #endif /* BFD64 */
932 }
933
934 free (erelas);
935 }
936
937 *relasp = relas;
938 *nrelasp = nrelas;
939 return TRUE;
940 }
941
942 /* Load REL type relocations from FILE at REL_OFFSET extending for REL_SIZE bytes.
943 Returns TRUE upon success, FALSE otherwise. If successful then a
944 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
945 and the number of relocs loaded is placed in *NRELSP. It is the caller's
946 responsibility to free the allocated buffer. */
947
948 static bfd_boolean
949 slurp_rel_relocs (FILE * file,
950 unsigned long rel_offset,
951 unsigned long rel_size,
952 Elf_Internal_Rela ** relsp,
953 unsigned long * nrelsp)
954 {
955 Elf_Internal_Rela * rels;
956 size_t nrels;
957 unsigned int i;
958
959 if (is_32bit_elf)
960 {
961 Elf32_External_Rel * erels;
962
963 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
964 rel_size, _("32-bit relocation data"));
965 if (!erels)
966 return FALSE;
967
968 nrels = rel_size / sizeof (Elf32_External_Rel);
969
970 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
971
972 if (rels == NULL)
973 {
974 free (erels);
975 error (_("out of memory parsing relocs\n"));
976 return FALSE;
977 }
978
979 for (i = 0; i < nrels; i++)
980 {
981 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
982 rels[i].r_info = BYTE_GET (erels[i].r_info);
983 rels[i].r_addend = 0;
984 }
985
986 free (erels);
987 }
988 else
989 {
990 Elf64_External_Rel * erels;
991
992 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
993 rel_size, _("64-bit relocation data"));
994 if (!erels)
995 return FALSE;
996
997 nrels = rel_size / sizeof (Elf64_External_Rel);
998
999 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1000
1001 if (rels == NULL)
1002 {
1003 free (erels);
1004 error (_("out of memory parsing relocs\n"));
1005 return FALSE;
1006 }
1007
1008 for (i = 0; i < nrels; i++)
1009 {
1010 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1011 rels[i].r_info = BYTE_GET (erels[i].r_info);
1012 rels[i].r_addend = 0;
1013
1014 /* The #ifdef BFD64 below is to prevent a compile time
1015 warning. We know that if we do not have a 64 bit data
1016 type that we will never execute this code anyway. */
1017 #ifdef BFD64
1018 if (elf_header.e_machine == EM_MIPS
1019 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1020 {
1021 /* In little-endian objects, r_info isn't really a
1022 64-bit little-endian value: it has a 32-bit
1023 little-endian symbol index followed by four
1024 individual byte fields. Reorder INFO
1025 accordingly. */
1026 bfd_vma inf = rels[i].r_info;
1027 inf = (((inf & 0xffffffff) << 32)
1028 | ((inf >> 56) & 0xff)
1029 | ((inf >> 40) & 0xff00)
1030 | ((inf >> 24) & 0xff0000)
1031 | ((inf >> 8) & 0xff000000));
1032 rels[i].r_info = inf;
1033 }
1034 #endif /* BFD64 */
1035 }
1036
1037 free (erels);
1038 }
1039
1040 *relsp = rels;
1041 *nrelsp = nrels;
1042 return TRUE;
1043 }
1044
1045 /* Returns the reloc type extracted from the reloc info field. */
1046
1047 static unsigned int
1048 get_reloc_type (bfd_vma reloc_info)
1049 {
1050 if (is_32bit_elf)
1051 return ELF32_R_TYPE (reloc_info);
1052
1053 switch (elf_header.e_machine)
1054 {
1055 case EM_MIPS:
1056 /* Note: We assume that reloc_info has already been adjusted for us. */
1057 return ELF64_MIPS_R_TYPE (reloc_info);
1058
1059 case EM_SPARCV9:
1060 return ELF64_R_TYPE_ID (reloc_info);
1061
1062 default:
1063 return ELF64_R_TYPE (reloc_info);
1064 }
1065 }
1066
1067 /* Return the symbol index extracted from the reloc info field. */
1068
1069 static bfd_vma
1070 get_reloc_symindex (bfd_vma reloc_info)
1071 {
1072 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1073 }
1074
1075 static inline bfd_boolean
1076 uses_msp430x_relocs (void)
1077 {
1078 return
1079 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1080 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1081 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1082 /* TI compiler uses ELFOSABI_NONE. */
1083 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1084 }
1085
1086 /* Display the contents of the relocation data found at the specified
1087 offset. */
1088
1089 static bfd_boolean
1090 dump_relocations (FILE * file,
1091 unsigned long rel_offset,
1092 unsigned long rel_size,
1093 Elf_Internal_Sym * symtab,
1094 unsigned long nsyms,
1095 char * strtab,
1096 unsigned long strtablen,
1097 int is_rela,
1098 bfd_boolean is_dynsym)
1099 {
1100 unsigned long i;
1101 Elf_Internal_Rela * rels;
1102 bfd_boolean res = TRUE;
1103
1104 if (is_rela == UNKNOWN)
1105 is_rela = guess_is_rela (elf_header.e_machine);
1106
1107 if (is_rela)
1108 {
1109 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1110 return FALSE;
1111 }
1112 else
1113 {
1114 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1115 return FALSE;
1116 }
1117
1118 if (is_32bit_elf)
1119 {
1120 if (is_rela)
1121 {
1122 if (do_wide)
1123 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1124 else
1125 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1126 }
1127 else
1128 {
1129 if (do_wide)
1130 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1131 else
1132 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1133 }
1134 }
1135 else
1136 {
1137 if (is_rela)
1138 {
1139 if (do_wide)
1140 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1141 else
1142 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1143 }
1144 else
1145 {
1146 if (do_wide)
1147 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1148 else
1149 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1150 }
1151 }
1152
1153 for (i = 0; i < rel_size; i++)
1154 {
1155 const char * rtype;
1156 bfd_vma offset;
1157 bfd_vma inf;
1158 bfd_vma symtab_index;
1159 bfd_vma type;
1160
1161 offset = rels[i].r_offset;
1162 inf = rels[i].r_info;
1163
1164 type = get_reloc_type (inf);
1165 symtab_index = get_reloc_symindex (inf);
1166
1167 if (is_32bit_elf)
1168 {
1169 printf ("%8.8lx %8.8lx ",
1170 (unsigned long) offset & 0xffffffff,
1171 (unsigned long) inf & 0xffffffff);
1172 }
1173 else
1174 {
1175 #if BFD_HOST_64BIT_LONG
1176 printf (do_wide
1177 ? "%16.16lx %16.16lx "
1178 : "%12.12lx %12.12lx ",
1179 offset, inf);
1180 #elif BFD_HOST_64BIT_LONG_LONG
1181 #ifndef __MSVCRT__
1182 printf (do_wide
1183 ? "%16.16llx %16.16llx "
1184 : "%12.12llx %12.12llx ",
1185 offset, inf);
1186 #else
1187 printf (do_wide
1188 ? "%16.16I64x %16.16I64x "
1189 : "%12.12I64x %12.12I64x ",
1190 offset, inf);
1191 #endif
1192 #else
1193 printf (do_wide
1194 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1195 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1196 _bfd_int64_high (offset),
1197 _bfd_int64_low (offset),
1198 _bfd_int64_high (inf),
1199 _bfd_int64_low (inf));
1200 #endif
1201 }
1202
1203 switch (elf_header.e_machine)
1204 {
1205 default:
1206 rtype = NULL;
1207 break;
1208
1209 case EM_AARCH64:
1210 rtype = elf_aarch64_reloc_type (type);
1211 break;
1212
1213 case EM_M32R:
1214 case EM_CYGNUS_M32R:
1215 rtype = elf_m32r_reloc_type (type);
1216 break;
1217
1218 case EM_386:
1219 case EM_IAMCU:
1220 rtype = elf_i386_reloc_type (type);
1221 break;
1222
1223 case EM_68HC11:
1224 case EM_68HC12:
1225 rtype = elf_m68hc11_reloc_type (type);
1226 break;
1227
1228 case EM_68K:
1229 rtype = elf_m68k_reloc_type (type);
1230 break;
1231
1232 case EM_960:
1233 rtype = elf_i960_reloc_type (type);
1234 break;
1235
1236 case EM_AVR:
1237 case EM_AVR_OLD:
1238 rtype = elf_avr_reloc_type (type);
1239 break;
1240
1241 case EM_OLD_SPARCV9:
1242 case EM_SPARC32PLUS:
1243 case EM_SPARCV9:
1244 case EM_SPARC:
1245 rtype = elf_sparc_reloc_type (type);
1246 break;
1247
1248 case EM_SPU:
1249 rtype = elf_spu_reloc_type (type);
1250 break;
1251
1252 case EM_V800:
1253 rtype = v800_reloc_type (type);
1254 break;
1255 case EM_V850:
1256 case EM_CYGNUS_V850:
1257 rtype = v850_reloc_type (type);
1258 break;
1259
1260 case EM_D10V:
1261 case EM_CYGNUS_D10V:
1262 rtype = elf_d10v_reloc_type (type);
1263 break;
1264
1265 case EM_D30V:
1266 case EM_CYGNUS_D30V:
1267 rtype = elf_d30v_reloc_type (type);
1268 break;
1269
1270 case EM_DLX:
1271 rtype = elf_dlx_reloc_type (type);
1272 break;
1273
1274 case EM_SH:
1275 rtype = elf_sh_reloc_type (type);
1276 break;
1277
1278 case EM_MN10300:
1279 case EM_CYGNUS_MN10300:
1280 rtype = elf_mn10300_reloc_type (type);
1281 break;
1282
1283 case EM_MN10200:
1284 case EM_CYGNUS_MN10200:
1285 rtype = elf_mn10200_reloc_type (type);
1286 break;
1287
1288 case EM_FR30:
1289 case EM_CYGNUS_FR30:
1290 rtype = elf_fr30_reloc_type (type);
1291 break;
1292
1293 case EM_CYGNUS_FRV:
1294 rtype = elf_frv_reloc_type (type);
1295 break;
1296
1297 case EM_FT32:
1298 rtype = elf_ft32_reloc_type (type);
1299 break;
1300
1301 case EM_MCORE:
1302 rtype = elf_mcore_reloc_type (type);
1303 break;
1304
1305 case EM_MMIX:
1306 rtype = elf_mmix_reloc_type (type);
1307 break;
1308
1309 case EM_MOXIE:
1310 rtype = elf_moxie_reloc_type (type);
1311 break;
1312
1313 case EM_MSP430:
1314 if (uses_msp430x_relocs ())
1315 {
1316 rtype = elf_msp430x_reloc_type (type);
1317 break;
1318 }
1319 /* Fall through. */
1320 case EM_MSP430_OLD:
1321 rtype = elf_msp430_reloc_type (type);
1322 break;
1323
1324 case EM_NDS32:
1325 rtype = elf_nds32_reloc_type (type);
1326 break;
1327
1328 case EM_PPC:
1329 rtype = elf_ppc_reloc_type (type);
1330 break;
1331
1332 case EM_PPC64:
1333 rtype = elf_ppc64_reloc_type (type);
1334 break;
1335
1336 case EM_MIPS:
1337 case EM_MIPS_RS3_LE:
1338 rtype = elf_mips_reloc_type (type);
1339 break;
1340
1341 case EM_RISCV:
1342 rtype = elf_riscv_reloc_type (type);
1343 break;
1344
1345 case EM_ALPHA:
1346 rtype = elf_alpha_reloc_type (type);
1347 break;
1348
1349 case EM_ARM:
1350 rtype = elf_arm_reloc_type (type);
1351 break;
1352
1353 case EM_ARC:
1354 case EM_ARC_COMPACT:
1355 case EM_ARC_COMPACT2:
1356 rtype = elf_arc_reloc_type (type);
1357 break;
1358
1359 case EM_PARISC:
1360 rtype = elf_hppa_reloc_type (type);
1361 break;
1362
1363 case EM_H8_300:
1364 case EM_H8_300H:
1365 case EM_H8S:
1366 rtype = elf_h8_reloc_type (type);
1367 break;
1368
1369 case EM_OR1K:
1370 rtype = elf_or1k_reloc_type (type);
1371 break;
1372
1373 case EM_PJ:
1374 case EM_PJ_OLD:
1375 rtype = elf_pj_reloc_type (type);
1376 break;
1377 case EM_IA_64:
1378 rtype = elf_ia64_reloc_type (type);
1379 break;
1380
1381 case EM_CRIS:
1382 rtype = elf_cris_reloc_type (type);
1383 break;
1384
1385 case EM_860:
1386 rtype = elf_i860_reloc_type (type);
1387 break;
1388
1389 case EM_X86_64:
1390 case EM_L1OM:
1391 case EM_K1OM:
1392 rtype = elf_x86_64_reloc_type (type);
1393 break;
1394
1395 case EM_S370:
1396 rtype = i370_reloc_type (type);
1397 break;
1398
1399 case EM_S390_OLD:
1400 case EM_S390:
1401 rtype = elf_s390_reloc_type (type);
1402 break;
1403
1404 case EM_SCORE:
1405 rtype = elf_score_reloc_type (type);
1406 break;
1407
1408 case EM_XSTORMY16:
1409 rtype = elf_xstormy16_reloc_type (type);
1410 break;
1411
1412 case EM_CRX:
1413 rtype = elf_crx_reloc_type (type);
1414 break;
1415
1416 case EM_VAX:
1417 rtype = elf_vax_reloc_type (type);
1418 break;
1419
1420 case EM_VISIUM:
1421 rtype = elf_visium_reloc_type (type);
1422 break;
1423
1424 case EM_ADAPTEVA_EPIPHANY:
1425 rtype = elf_epiphany_reloc_type (type);
1426 break;
1427
1428 case EM_IP2K:
1429 case EM_IP2K_OLD:
1430 rtype = elf_ip2k_reloc_type (type);
1431 break;
1432
1433 case EM_IQ2000:
1434 rtype = elf_iq2000_reloc_type (type);
1435 break;
1436
1437 case EM_XTENSA_OLD:
1438 case EM_XTENSA:
1439 rtype = elf_xtensa_reloc_type (type);
1440 break;
1441
1442 case EM_LATTICEMICO32:
1443 rtype = elf_lm32_reloc_type (type);
1444 break;
1445
1446 case EM_M32C_OLD:
1447 case EM_M32C:
1448 rtype = elf_m32c_reloc_type (type);
1449 break;
1450
1451 case EM_MT:
1452 rtype = elf_mt_reloc_type (type);
1453 break;
1454
1455 case EM_BLACKFIN:
1456 rtype = elf_bfin_reloc_type (type);
1457 break;
1458
1459 case EM_CYGNUS_MEP:
1460 rtype = elf_mep_reloc_type (type);
1461 break;
1462
1463 case EM_CR16:
1464 rtype = elf_cr16_reloc_type (type);
1465 break;
1466
1467 case EM_MICROBLAZE:
1468 case EM_MICROBLAZE_OLD:
1469 rtype = elf_microblaze_reloc_type (type);
1470 break;
1471
1472 case EM_RL78:
1473 rtype = elf_rl78_reloc_type (type);
1474 break;
1475
1476 case EM_RX:
1477 rtype = elf_rx_reloc_type (type);
1478 break;
1479
1480 case EM_METAG:
1481 rtype = elf_metag_reloc_type (type);
1482 break;
1483
1484 case EM_XC16X:
1485 case EM_C166:
1486 rtype = elf_xc16x_reloc_type (type);
1487 break;
1488
1489 case EM_TI_C6000:
1490 rtype = elf_tic6x_reloc_type (type);
1491 break;
1492
1493 case EM_TILEGX:
1494 rtype = elf_tilegx_reloc_type (type);
1495 break;
1496
1497 case EM_TILEPRO:
1498 rtype = elf_tilepro_reloc_type (type);
1499 break;
1500
1501 case EM_XGATE:
1502 rtype = elf_xgate_reloc_type (type);
1503 break;
1504
1505 case EM_ALTERA_NIOS2:
1506 rtype = elf_nios2_reloc_type (type);
1507 break;
1508
1509 case EM_TI_PRU:
1510 rtype = elf_pru_reloc_type (type);
1511 break;
1512 }
1513
1514 if (rtype == NULL)
1515 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1516 else
1517 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1518
1519 if (elf_header.e_machine == EM_ALPHA
1520 && rtype != NULL
1521 && streq (rtype, "R_ALPHA_LITUSE")
1522 && is_rela)
1523 {
1524 switch (rels[i].r_addend)
1525 {
1526 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1527 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1528 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1529 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1530 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1531 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1532 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1533 default: rtype = NULL;
1534 }
1535
1536 if (rtype)
1537 printf (" (%s)", rtype);
1538 else
1539 {
1540 putchar (' ');
1541 printf (_("<unknown addend: %lx>"),
1542 (unsigned long) rels[i].r_addend);
1543 res = FALSE;
1544 }
1545 }
1546 else if (symtab_index)
1547 {
1548 if (symtab == NULL || symtab_index >= nsyms)
1549 {
1550 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1551 res = FALSE;
1552 }
1553 else
1554 {
1555 Elf_Internal_Sym * psym;
1556 const char * version_string;
1557 enum versioned_symbol_info sym_info;
1558 unsigned short vna_other;
1559
1560 psym = symtab + symtab_index;
1561
1562 version_string
1563 = get_symbol_version_string (file, is_dynsym,
1564 strtab, strtablen,
1565 symtab_index,
1566 psym,
1567 &sym_info,
1568 &vna_other);
1569
1570 printf (" ");
1571
1572 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1573 {
1574 const char * name;
1575 unsigned int len;
1576 unsigned int width = is_32bit_elf ? 8 : 14;
1577
1578 /* Relocations against GNU_IFUNC symbols do not use the value
1579 of the symbol as the address to relocate against. Instead
1580 they invoke the function named by the symbol and use its
1581 result as the address for relocation.
1582
1583 To indicate this to the user, do not display the value of
1584 the symbol in the "Symbols's Value" field. Instead show
1585 its name followed by () as a hint that the symbol is
1586 invoked. */
1587
1588 if (strtab == NULL
1589 || psym->st_name == 0
1590 || psym->st_name >= strtablen)
1591 name = "??";
1592 else
1593 name = strtab + psym->st_name;
1594
1595 len = print_symbol (width, name);
1596 if (version_string)
1597 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1598 version_string);
1599 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1600 }
1601 else
1602 {
1603 print_vma (psym->st_value, LONG_HEX);
1604
1605 printf (is_32bit_elf ? " " : " ");
1606 }
1607
1608 if (psym->st_name == 0)
1609 {
1610 const char * sec_name = "<null>";
1611 char name_buf[40];
1612
1613 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1614 {
1615 if (psym->st_shndx < elf_header.e_shnum)
1616 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1617 else if (psym->st_shndx == SHN_ABS)
1618 sec_name = "ABS";
1619 else if (psym->st_shndx == SHN_COMMON)
1620 sec_name = "COMMON";
1621 else if ((elf_header.e_machine == EM_MIPS
1622 && psym->st_shndx == SHN_MIPS_SCOMMON)
1623 || (elf_header.e_machine == EM_TI_C6000
1624 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1625 sec_name = "SCOMMON";
1626 else if (elf_header.e_machine == EM_MIPS
1627 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1628 sec_name = "SUNDEF";
1629 else if ((elf_header.e_machine == EM_X86_64
1630 || elf_header.e_machine == EM_L1OM
1631 || elf_header.e_machine == EM_K1OM)
1632 && psym->st_shndx == SHN_X86_64_LCOMMON)
1633 sec_name = "LARGE_COMMON";
1634 else if (elf_header.e_machine == EM_IA_64
1635 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1636 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1637 sec_name = "ANSI_COM";
1638 else if (is_ia64_vms ()
1639 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1640 sec_name = "VMS_SYMVEC";
1641 else
1642 {
1643 sprintf (name_buf, "<section 0x%x>",
1644 (unsigned int) psym->st_shndx);
1645 sec_name = name_buf;
1646 }
1647 }
1648 print_symbol (22, sec_name);
1649 }
1650 else if (strtab == NULL)
1651 printf (_("<string table index: %3ld>"), psym->st_name);
1652 else if (psym->st_name >= strtablen)
1653 {
1654 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1655 res = FALSE;
1656 }
1657 else
1658 {
1659 print_symbol (22, strtab + psym->st_name);
1660 if (version_string)
1661 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1662 version_string);
1663 }
1664
1665 if (is_rela)
1666 {
1667 bfd_vma off = rels[i].r_addend;
1668
1669 if ((bfd_signed_vma) off < 0)
1670 printf (" - %" BFD_VMA_FMT "x", - off);
1671 else
1672 printf (" + %" BFD_VMA_FMT "x", off);
1673 }
1674 }
1675 }
1676 else if (is_rela)
1677 {
1678 bfd_vma off = rels[i].r_addend;
1679
1680 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1681 if ((bfd_signed_vma) off < 0)
1682 printf ("-%" BFD_VMA_FMT "x", - off);
1683 else
1684 printf ("%" BFD_VMA_FMT "x", off);
1685 }
1686
1687 if (elf_header.e_machine == EM_SPARCV9
1688 && rtype != NULL
1689 && streq (rtype, "R_SPARC_OLO10"))
1690 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1691
1692 putchar ('\n');
1693
1694 #ifdef BFD64
1695 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1696 {
1697 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1698 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1699 const char * rtype2 = elf_mips_reloc_type (type2);
1700 const char * rtype3 = elf_mips_reloc_type (type3);
1701
1702 printf (" Type2: ");
1703
1704 if (rtype2 == NULL)
1705 printf (_("unrecognized: %-7lx"),
1706 (unsigned long) type2 & 0xffffffff);
1707 else
1708 printf ("%-17.17s", rtype2);
1709
1710 printf ("\n Type3: ");
1711
1712 if (rtype3 == NULL)
1713 printf (_("unrecognized: %-7lx"),
1714 (unsigned long) type3 & 0xffffffff);
1715 else
1716 printf ("%-17.17s", rtype3);
1717
1718 putchar ('\n');
1719 }
1720 #endif /* BFD64 */
1721 }
1722
1723 free (rels);
1724
1725 return res;
1726 }
1727
1728 static const char *
1729 get_mips_dynamic_type (unsigned long type)
1730 {
1731 switch (type)
1732 {
1733 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1734 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1735 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1736 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1737 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1738 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1739 case DT_MIPS_MSYM: return "MIPS_MSYM";
1740 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1741 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1742 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1743 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1744 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1745 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1746 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1747 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1748 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1749 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1750 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1751 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1752 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1753 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1754 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1755 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1756 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1757 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1758 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1759 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1760 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1761 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1762 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1763 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1764 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1765 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1766 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1767 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1768 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1769 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1770 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1771 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1772 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1773 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1774 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1775 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1776 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1777 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1778 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1779 default:
1780 return NULL;
1781 }
1782 }
1783
1784 static const char *
1785 get_sparc64_dynamic_type (unsigned long type)
1786 {
1787 switch (type)
1788 {
1789 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1790 default:
1791 return NULL;
1792 }
1793 }
1794
1795 static const char *
1796 get_ppc_dynamic_type (unsigned long type)
1797 {
1798 switch (type)
1799 {
1800 case DT_PPC_GOT: return "PPC_GOT";
1801 case DT_PPC_OPT: return "PPC_OPT";
1802 default:
1803 return NULL;
1804 }
1805 }
1806
1807 static const char *
1808 get_ppc64_dynamic_type (unsigned long type)
1809 {
1810 switch (type)
1811 {
1812 case DT_PPC64_GLINK: return "PPC64_GLINK";
1813 case DT_PPC64_OPD: return "PPC64_OPD";
1814 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1815 case DT_PPC64_OPT: return "PPC64_OPT";
1816 default:
1817 return NULL;
1818 }
1819 }
1820
1821 static const char *
1822 get_parisc_dynamic_type (unsigned long type)
1823 {
1824 switch (type)
1825 {
1826 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1827 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1828 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1829 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1830 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1831 case DT_HP_PREINIT: return "HP_PREINIT";
1832 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1833 case DT_HP_NEEDED: return "HP_NEEDED";
1834 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1835 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1836 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1837 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1838 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1839 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1840 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1841 case DT_HP_FILTERED: return "HP_FILTERED";
1842 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1843 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1844 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1845 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1846 case DT_PLT: return "PLT";
1847 case DT_PLT_SIZE: return "PLT_SIZE";
1848 case DT_DLT: return "DLT";
1849 case DT_DLT_SIZE: return "DLT_SIZE";
1850 default:
1851 return NULL;
1852 }
1853 }
1854
1855 static const char *
1856 get_ia64_dynamic_type (unsigned long type)
1857 {
1858 switch (type)
1859 {
1860 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1861 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1862 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1863 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1864 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1865 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1866 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1867 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1868 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1869 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1870 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1871 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1872 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1873 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1874 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1875 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1876 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1877 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1878 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1879 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1880 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1881 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1882 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1883 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1884 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1885 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1886 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1887 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1888 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1889 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1890 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1891 default:
1892 return NULL;
1893 }
1894 }
1895
1896 static const char *
1897 get_solaris_section_type (unsigned long type)
1898 {
1899 switch (type)
1900 {
1901 case 0x6fffffee: return "SUNW_ancillary";
1902 case 0x6fffffef: return "SUNW_capchain";
1903 case 0x6ffffff0: return "SUNW_capinfo";
1904 case 0x6ffffff1: return "SUNW_symsort";
1905 case 0x6ffffff2: return "SUNW_tlssort";
1906 case 0x6ffffff3: return "SUNW_LDYNSYM";
1907 case 0x6ffffff4: return "SUNW_dof";
1908 case 0x6ffffff5: return "SUNW_cap";
1909 case 0x6ffffff6: return "SUNW_SIGNATURE";
1910 case 0x6ffffff7: return "SUNW_ANNOTATE";
1911 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1912 case 0x6ffffff9: return "SUNW_DEBUG";
1913 case 0x6ffffffa: return "SUNW_move";
1914 case 0x6ffffffb: return "SUNW_COMDAT";
1915 case 0x6ffffffc: return "SUNW_syminfo";
1916 case 0x6ffffffd: return "SUNW_verdef";
1917 case 0x6ffffffe: return "SUNW_verneed";
1918 case 0x6fffffff: return "SUNW_versym";
1919 case 0x70000000: return "SPARC_GOTDATA";
1920 default: return NULL;
1921 }
1922 }
1923
1924 static const char *
1925 get_alpha_dynamic_type (unsigned long type)
1926 {
1927 switch (type)
1928 {
1929 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1930 default: return NULL;
1931 }
1932 }
1933
1934 static const char *
1935 get_score_dynamic_type (unsigned long type)
1936 {
1937 switch (type)
1938 {
1939 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1940 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1941 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1942 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1943 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1944 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1945 default: return NULL;
1946 }
1947 }
1948
1949 static const char *
1950 get_tic6x_dynamic_type (unsigned long type)
1951 {
1952 switch (type)
1953 {
1954 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1955 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1956 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1957 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1958 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1959 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1960 default: return NULL;
1961 }
1962 }
1963
1964 static const char *
1965 get_nios2_dynamic_type (unsigned long type)
1966 {
1967 switch (type)
1968 {
1969 case DT_NIOS2_GP: return "NIOS2_GP";
1970 default: return NULL;
1971 }
1972 }
1973
1974 static const char *
1975 get_solaris_dynamic_type (unsigned long type)
1976 {
1977 switch (type)
1978 {
1979 case 0x6000000d: return "SUNW_AUXILIARY";
1980 case 0x6000000e: return "SUNW_RTLDINF";
1981 case 0x6000000f: return "SUNW_FILTER";
1982 case 0x60000010: return "SUNW_CAP";
1983 case 0x60000011: return "SUNW_SYMTAB";
1984 case 0x60000012: return "SUNW_SYMSZ";
1985 case 0x60000013: return "SUNW_SORTENT";
1986 case 0x60000014: return "SUNW_SYMSORT";
1987 case 0x60000015: return "SUNW_SYMSORTSZ";
1988 case 0x60000016: return "SUNW_TLSSORT";
1989 case 0x60000017: return "SUNW_TLSSORTSZ";
1990 case 0x60000018: return "SUNW_CAPINFO";
1991 case 0x60000019: return "SUNW_STRPAD";
1992 case 0x6000001a: return "SUNW_CAPCHAIN";
1993 case 0x6000001b: return "SUNW_LDMACH";
1994 case 0x6000001d: return "SUNW_CAPCHAINENT";
1995 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1996 case 0x60000021: return "SUNW_PARENT";
1997 case 0x60000023: return "SUNW_ASLR";
1998 case 0x60000025: return "SUNW_RELAX";
1999 case 0x60000029: return "SUNW_NXHEAP";
2000 case 0x6000002b: return "SUNW_NXSTACK";
2001
2002 case 0x70000001: return "SPARC_REGISTER";
2003 case 0x7ffffffd: return "AUXILIARY";
2004 case 0x7ffffffe: return "USED";
2005 case 0x7fffffff: return "FILTER";
2006
2007 default: return NULL;
2008 }
2009 }
2010
2011 static const char *
2012 get_dynamic_type (unsigned long type)
2013 {
2014 static char buff[64];
2015
2016 switch (type)
2017 {
2018 case DT_NULL: return "NULL";
2019 case DT_NEEDED: return "NEEDED";
2020 case DT_PLTRELSZ: return "PLTRELSZ";
2021 case DT_PLTGOT: return "PLTGOT";
2022 case DT_HASH: return "HASH";
2023 case DT_STRTAB: return "STRTAB";
2024 case DT_SYMTAB: return "SYMTAB";
2025 case DT_RELA: return "RELA";
2026 case DT_RELASZ: return "RELASZ";
2027 case DT_RELAENT: return "RELAENT";
2028 case DT_STRSZ: return "STRSZ";
2029 case DT_SYMENT: return "SYMENT";
2030 case DT_INIT: return "INIT";
2031 case DT_FINI: return "FINI";
2032 case DT_SONAME: return "SONAME";
2033 case DT_RPATH: return "RPATH";
2034 case DT_SYMBOLIC: return "SYMBOLIC";
2035 case DT_REL: return "REL";
2036 case DT_RELSZ: return "RELSZ";
2037 case DT_RELENT: return "RELENT";
2038 case DT_PLTREL: return "PLTREL";
2039 case DT_DEBUG: return "DEBUG";
2040 case DT_TEXTREL: return "TEXTREL";
2041 case DT_JMPREL: return "JMPREL";
2042 case DT_BIND_NOW: return "BIND_NOW";
2043 case DT_INIT_ARRAY: return "INIT_ARRAY";
2044 case DT_FINI_ARRAY: return "FINI_ARRAY";
2045 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2046 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2047 case DT_RUNPATH: return "RUNPATH";
2048 case DT_FLAGS: return "FLAGS";
2049
2050 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2051 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2052 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2053
2054 case DT_CHECKSUM: return "CHECKSUM";
2055 case DT_PLTPADSZ: return "PLTPADSZ";
2056 case DT_MOVEENT: return "MOVEENT";
2057 case DT_MOVESZ: return "MOVESZ";
2058 case DT_FEATURE: return "FEATURE";
2059 case DT_POSFLAG_1: return "POSFLAG_1";
2060 case DT_SYMINSZ: return "SYMINSZ";
2061 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2062
2063 case DT_ADDRRNGLO: return "ADDRRNGLO";
2064 case DT_CONFIG: return "CONFIG";
2065 case DT_DEPAUDIT: return "DEPAUDIT";
2066 case DT_AUDIT: return "AUDIT";
2067 case DT_PLTPAD: return "PLTPAD";
2068 case DT_MOVETAB: return "MOVETAB";
2069 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2070
2071 case DT_VERSYM: return "VERSYM";
2072
2073 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2074 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2075 case DT_RELACOUNT: return "RELACOUNT";
2076 case DT_RELCOUNT: return "RELCOUNT";
2077 case DT_FLAGS_1: return "FLAGS_1";
2078 case DT_VERDEF: return "VERDEF";
2079 case DT_VERDEFNUM: return "VERDEFNUM";
2080 case DT_VERNEED: return "VERNEED";
2081 case DT_VERNEEDNUM: return "VERNEEDNUM";
2082
2083 case DT_AUXILIARY: return "AUXILIARY";
2084 case DT_USED: return "USED";
2085 case DT_FILTER: return "FILTER";
2086
2087 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2088 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2089 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2090 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2091 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2092 case DT_GNU_HASH: return "GNU_HASH";
2093
2094 default:
2095 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2096 {
2097 const char * result;
2098
2099 switch (elf_header.e_machine)
2100 {
2101 case EM_MIPS:
2102 case EM_MIPS_RS3_LE:
2103 result = get_mips_dynamic_type (type);
2104 break;
2105 case EM_SPARCV9:
2106 result = get_sparc64_dynamic_type (type);
2107 break;
2108 case EM_PPC:
2109 result = get_ppc_dynamic_type (type);
2110 break;
2111 case EM_PPC64:
2112 result = get_ppc64_dynamic_type (type);
2113 break;
2114 case EM_IA_64:
2115 result = get_ia64_dynamic_type (type);
2116 break;
2117 case EM_ALPHA:
2118 result = get_alpha_dynamic_type (type);
2119 break;
2120 case EM_SCORE:
2121 result = get_score_dynamic_type (type);
2122 break;
2123 case EM_TI_C6000:
2124 result = get_tic6x_dynamic_type (type);
2125 break;
2126 case EM_ALTERA_NIOS2:
2127 result = get_nios2_dynamic_type (type);
2128 break;
2129 default:
2130 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2131 result = get_solaris_dynamic_type (type);
2132 else
2133 result = NULL;
2134 break;
2135 }
2136
2137 if (result != NULL)
2138 return result;
2139
2140 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2141 }
2142 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2143 || (elf_header.e_machine == EM_PARISC
2144 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2145 {
2146 const char * result;
2147
2148 switch (elf_header.e_machine)
2149 {
2150 case EM_PARISC:
2151 result = get_parisc_dynamic_type (type);
2152 break;
2153 case EM_IA_64:
2154 result = get_ia64_dynamic_type (type);
2155 break;
2156 default:
2157 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2158 result = get_solaris_dynamic_type (type);
2159 else
2160 result = NULL;
2161 break;
2162 }
2163
2164 if (result != NULL)
2165 return result;
2166
2167 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2168 type);
2169 }
2170 else
2171 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2172
2173 return buff;
2174 }
2175 }
2176
2177 static char *
2178 get_file_type (unsigned e_type)
2179 {
2180 static char buff[32];
2181
2182 switch (e_type)
2183 {
2184 case ET_NONE: return _("NONE (None)");
2185 case ET_REL: return _("REL (Relocatable file)");
2186 case ET_EXEC: return _("EXEC (Executable file)");
2187 case ET_DYN: return _("DYN (Shared object file)");
2188 case ET_CORE: return _("CORE (Core file)");
2189
2190 default:
2191 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2192 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2193 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2194 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2195 else
2196 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2197 return buff;
2198 }
2199 }
2200
2201 static char *
2202 get_machine_name (unsigned e_machine)
2203 {
2204 static char buff[64]; /* XXX */
2205
2206 switch (e_machine)
2207 {
2208 /* Please keep this switch table sorted by increasing EM_ value. */
2209 /* 0 */
2210 case EM_NONE: return _("None");
2211 case EM_M32: return "WE32100";
2212 case EM_SPARC: return "Sparc";
2213 case EM_386: return "Intel 80386";
2214 case EM_68K: return "MC68000";
2215 case EM_88K: return "MC88000";
2216 case EM_IAMCU: return "Intel MCU";
2217 case EM_860: return "Intel 80860";
2218 case EM_MIPS: return "MIPS R3000";
2219 case EM_S370: return "IBM System/370";
2220 /* 10 */
2221 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2222 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2223 case EM_PARISC: return "HPPA";
2224 case EM_VPP550: return "Fujitsu VPP500";
2225 case EM_SPARC32PLUS: return "Sparc v8+" ;
2226 case EM_960: return "Intel 90860";
2227 case EM_PPC: return "PowerPC";
2228 /* 20 */
2229 case EM_PPC64: return "PowerPC64";
2230 case EM_S390_OLD:
2231 case EM_S390: return "IBM S/390";
2232 case EM_SPU: return "SPU";
2233 /* 30 */
2234 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2235 case EM_FR20: return "Fujitsu FR20";
2236 case EM_RH32: return "TRW RH32";
2237 case EM_MCORE: return "MCORE";
2238 /* 40 */
2239 case EM_ARM: return "ARM";
2240 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2241 case EM_SH: return "Renesas / SuperH SH";
2242 case EM_SPARCV9: return "Sparc v9";
2243 case EM_TRICORE: return "Siemens Tricore";
2244 case EM_ARC: return "ARC";
2245 case EM_H8_300: return "Renesas H8/300";
2246 case EM_H8_300H: return "Renesas H8/300H";
2247 case EM_H8S: return "Renesas H8S";
2248 case EM_H8_500: return "Renesas H8/500";
2249 /* 50 */
2250 case EM_IA_64: return "Intel IA-64";
2251 case EM_MIPS_X: return "Stanford MIPS-X";
2252 case EM_COLDFIRE: return "Motorola Coldfire";
2253 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2254 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2255 case EM_PCP: return "Siemens PCP";
2256 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2257 case EM_NDR1: return "Denso NDR1 microprocesspr";
2258 case EM_STARCORE: return "Motorola Star*Core processor";
2259 case EM_ME16: return "Toyota ME16 processor";
2260 /* 60 */
2261 case EM_ST100: return "STMicroelectronics ST100 processor";
2262 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2263 case EM_X86_64: return "Advanced Micro Devices X86-64";
2264 case EM_PDSP: return "Sony DSP processor";
2265 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2266 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2267 case EM_FX66: return "Siemens FX66 microcontroller";
2268 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2269 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2270 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2271 /* 70 */
2272 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2273 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2274 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2275 case EM_SVX: return "Silicon Graphics SVx";
2276 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2277 case EM_VAX: return "Digital VAX";
2278 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2279 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2280 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2281 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2282 /* 80 */
2283 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2284 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2285 case EM_PRISM: return "Vitesse Prism";
2286 case EM_AVR_OLD:
2287 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2288 case EM_CYGNUS_FR30:
2289 case EM_FR30: return "Fujitsu FR30";
2290 case EM_CYGNUS_D10V:
2291 case EM_D10V: return "d10v";
2292 case EM_CYGNUS_D30V:
2293 case EM_D30V: return "d30v";
2294 case EM_CYGNUS_V850:
2295 case EM_V850: return "Renesas V850";
2296 case EM_CYGNUS_M32R:
2297 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2298 case EM_CYGNUS_MN10300:
2299 case EM_MN10300: return "mn10300";
2300 /* 90 */
2301 case EM_CYGNUS_MN10200:
2302 case EM_MN10200: return "mn10200";
2303 case EM_PJ: return "picoJava";
2304 case EM_OR1K: return "OpenRISC 1000";
2305 case EM_ARC_COMPACT: return "ARCompact";
2306 case EM_XTENSA_OLD:
2307 case EM_XTENSA: return "Tensilica Xtensa Processor";
2308 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2309 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2310 case EM_NS32K: return "National Semiconductor 32000 series";
2311 case EM_TPC: return "Tenor Network TPC processor";
2312 case EM_SNP1K: return "Trebia SNP 1000 processor";
2313 /* 100 */
2314 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2315 case EM_IP2K_OLD:
2316 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2317 case EM_MAX: return "MAX Processor";
2318 case EM_CR: return "National Semiconductor CompactRISC";
2319 case EM_F2MC16: return "Fujitsu F2MC16";
2320 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2321 case EM_BLACKFIN: return "Analog Devices Blackfin";
2322 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2323 case EM_SEP: return "Sharp embedded microprocessor";
2324 case EM_ARCA: return "Arca RISC microprocessor";
2325 /* 110 */
2326 case EM_UNICORE: return "Unicore";
2327 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2328 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2329 case EM_ALTERA_NIOS2: return "Altera Nios II";
2330 case EM_CRX: return "National Semiconductor CRX microprocessor";
2331 case EM_XGATE: return "Motorola XGATE embedded processor";
2332 case EM_C166:
2333 case EM_XC16X: return "Infineon Technologies xc16x";
2334 case EM_M16C: return "Renesas M16C series microprocessors";
2335 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2336 case EM_CE: return "Freescale Communication Engine RISC core";
2337 /* 120 */
2338 case EM_M32C: return "Renesas M32c";
2339 /* 130 */
2340 case EM_TSK3000: return "Altium TSK3000 core";
2341 case EM_RS08: return "Freescale RS08 embedded processor";
2342 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2343 case EM_SCORE: return "SUNPLUS S+Core";
2344 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2345 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2346 case EM_LATTICEMICO32: return "Lattice Mico32";
2347 case EM_SE_C17: return "Seiko Epson C17 family";
2348 /* 140 */
2349 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2350 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2351 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2352 case EM_TI_PRU: return "TI PRU I/O processor";
2353 /* 160 */
2354 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2355 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2356 case EM_R32C: return "Renesas R32C series microprocessors";
2357 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2358 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2359 case EM_8051: return "Intel 8051 and variants";
2360 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2361 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2362 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2363 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2364 /* 170 */
2365 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2366 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2367 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2368 case EM_RX: return "Renesas RX";
2369 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2370 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2371 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2372 case EM_CR16:
2373 case EM_MICROBLAZE:
2374 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2375 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2376 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2377 /* 180 */
2378 case EM_L1OM: return "Intel L1OM";
2379 case EM_K1OM: return "Intel K1OM";
2380 case EM_INTEL182: return "Intel (reserved)";
2381 case EM_AARCH64: return "AArch64";
2382 case EM_ARM184: return "ARM (reserved)";
2383 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2384 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2385 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2386 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2387 /* 190 */
2388 case EM_CUDA: return "NVIDIA CUDA architecture";
2389 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2390 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2391 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2392 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2393 case EM_ARC_COMPACT2: return "ARCv2";
2394 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2395 case EM_RL78: return "Renesas RL78";
2396 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2397 case EM_78K0R: return "Renesas 78K0R";
2398 /* 200 */
2399 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2400 case EM_BA1: return "Beyond BA1 CPU architecture";
2401 case EM_BA2: return "Beyond BA2 CPU architecture";
2402 case EM_XCORE: return "XMOS xCORE processor family";
2403 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2404 /* 210 */
2405 case EM_KM32: return "KM211 KM32 32-bit processor";
2406 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2407 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2408 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2409 case EM_KVARC: return "KM211 KVARC processor";
2410 case EM_CDP: return "Paneve CDP architecture family";
2411 case EM_COGE: return "Cognitive Smart Memory Processor";
2412 case EM_COOL: return "Bluechip Systems CoolEngine";
2413 case EM_NORC: return "Nanoradio Optimized RISC";
2414 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2415 /* 220 */
2416 case EM_Z80: return "Zilog Z80";
2417 case EM_VISIUM: return "CDS VISIUMcore processor";
2418 case EM_FT32: return "FTDI Chip FT32";
2419 case EM_MOXIE: return "Moxie";
2420 case EM_AMDGPU: return "AMD GPU";
2421 case EM_RISCV: return "RISC-V";
2422 case EM_LANAI: return "Lanai 32-bit processor";
2423 case EM_BPF: return "Linux BPF";
2424
2425 /* Large numbers... */
2426 case EM_MT: return "Morpho Techologies MT processor";
2427 case EM_ALPHA: return "Alpha";
2428 case EM_WEBASSEMBLY: return "Web Assembly";
2429 case EM_DLX: return "OpenDLX";
2430 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2431 case EM_IQ2000: return "Vitesse IQ2000";
2432 case EM_M32C_OLD:
2433 case EM_NIOS32: return "Altera Nios";
2434 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2435 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2436 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2437
2438 default:
2439 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2440 return buff;
2441 }
2442 }
2443
2444 static void
2445 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2446 {
2447 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2448 other compilers don't a specific architecture type in the e_flags, and
2449 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2450 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2451 architectures.
2452
2453 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2454 but also sets a specific architecture type in the e_flags field.
2455
2456 However, when decoding the flags we don't worry if we see an
2457 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2458 ARCEM architecture type. */
2459
2460 switch (e_flags & EF_ARC_MACH_MSK)
2461 {
2462 /* We only expect these to occur for EM_ARC_COMPACT2. */
2463 case EF_ARC_CPU_ARCV2EM:
2464 strcat (buf, ", ARC EM");
2465 break;
2466 case EF_ARC_CPU_ARCV2HS:
2467 strcat (buf, ", ARC HS");
2468 break;
2469
2470 /* We only expect these to occur for EM_ARC_COMPACT. */
2471 case E_ARC_MACH_ARC600:
2472 strcat (buf, ", ARC600");
2473 break;
2474 case E_ARC_MACH_ARC601:
2475 strcat (buf, ", ARC601");
2476 break;
2477 case E_ARC_MACH_ARC700:
2478 strcat (buf, ", ARC700");
2479 break;
2480
2481 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2482 new ELF with new architecture being read by an old version of
2483 readelf, or (c) An ELF built with non-GNU compiler that does not
2484 set the architecture in the e_flags. */
2485 default:
2486 if (e_machine == EM_ARC_COMPACT)
2487 strcat (buf, ", Unknown ARCompact");
2488 else
2489 strcat (buf, ", Unknown ARC");
2490 break;
2491 }
2492
2493 switch (e_flags & EF_ARC_OSABI_MSK)
2494 {
2495 case E_ARC_OSABI_ORIG:
2496 strcat (buf, ", (ABI:legacy)");
2497 break;
2498 case E_ARC_OSABI_V2:
2499 strcat (buf, ", (ABI:v2)");
2500 break;
2501 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2502 case E_ARC_OSABI_V3:
2503 strcat (buf, ", v3 no-legacy-syscalls ABI");
2504 break;
2505 default:
2506 strcat (buf, ", unrecognised ARC OSABI flag");
2507 break;
2508 }
2509 }
2510
2511 static void
2512 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2513 {
2514 unsigned eabi;
2515 bfd_boolean unknown = FALSE;
2516
2517 eabi = EF_ARM_EABI_VERSION (e_flags);
2518 e_flags &= ~ EF_ARM_EABIMASK;
2519
2520 /* Handle "generic" ARM flags. */
2521 if (e_flags & EF_ARM_RELEXEC)
2522 {
2523 strcat (buf, ", relocatable executable");
2524 e_flags &= ~ EF_ARM_RELEXEC;
2525 }
2526
2527 /* Now handle EABI specific flags. */
2528 switch (eabi)
2529 {
2530 default:
2531 strcat (buf, ", <unrecognized EABI>");
2532 if (e_flags)
2533 unknown = TRUE;
2534 break;
2535
2536 case EF_ARM_EABI_VER1:
2537 strcat (buf, ", Version1 EABI");
2538 while (e_flags)
2539 {
2540 unsigned flag;
2541
2542 /* Process flags one bit at a time. */
2543 flag = e_flags & - e_flags;
2544 e_flags &= ~ flag;
2545
2546 switch (flag)
2547 {
2548 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2549 strcat (buf, ", sorted symbol tables");
2550 break;
2551
2552 default:
2553 unknown = TRUE;
2554 break;
2555 }
2556 }
2557 break;
2558
2559 case EF_ARM_EABI_VER2:
2560 strcat (buf, ", Version2 EABI");
2561 while (e_flags)
2562 {
2563 unsigned flag;
2564
2565 /* Process flags one bit at a time. */
2566 flag = e_flags & - e_flags;
2567 e_flags &= ~ flag;
2568
2569 switch (flag)
2570 {
2571 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2572 strcat (buf, ", sorted symbol tables");
2573 break;
2574
2575 case EF_ARM_DYNSYMSUSESEGIDX:
2576 strcat (buf, ", dynamic symbols use segment index");
2577 break;
2578
2579 case EF_ARM_MAPSYMSFIRST:
2580 strcat (buf, ", mapping symbols precede others");
2581 break;
2582
2583 default:
2584 unknown = TRUE;
2585 break;
2586 }
2587 }
2588 break;
2589
2590 case EF_ARM_EABI_VER3:
2591 strcat (buf, ", Version3 EABI");
2592 break;
2593
2594 case EF_ARM_EABI_VER4:
2595 strcat (buf, ", Version4 EABI");
2596 while (e_flags)
2597 {
2598 unsigned flag;
2599
2600 /* Process flags one bit at a time. */
2601 flag = e_flags & - e_flags;
2602 e_flags &= ~ flag;
2603
2604 switch (flag)
2605 {
2606 case EF_ARM_BE8:
2607 strcat (buf, ", BE8");
2608 break;
2609
2610 case EF_ARM_LE8:
2611 strcat (buf, ", LE8");
2612 break;
2613
2614 default:
2615 unknown = TRUE;
2616 break;
2617 }
2618 }
2619 break;
2620
2621 case EF_ARM_EABI_VER5:
2622 strcat (buf, ", Version5 EABI");
2623 while (e_flags)
2624 {
2625 unsigned flag;
2626
2627 /* Process flags one bit at a time. */
2628 flag = e_flags & - e_flags;
2629 e_flags &= ~ flag;
2630
2631 switch (flag)
2632 {
2633 case EF_ARM_BE8:
2634 strcat (buf, ", BE8");
2635 break;
2636
2637 case EF_ARM_LE8:
2638 strcat (buf, ", LE8");
2639 break;
2640
2641 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2642 strcat (buf, ", soft-float ABI");
2643 break;
2644
2645 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2646 strcat (buf, ", hard-float ABI");
2647 break;
2648
2649 default:
2650 unknown = TRUE;
2651 break;
2652 }
2653 }
2654 break;
2655
2656 case EF_ARM_EABI_UNKNOWN:
2657 strcat (buf, ", GNU EABI");
2658 while (e_flags)
2659 {
2660 unsigned flag;
2661
2662 /* Process flags one bit at a time. */
2663 flag = e_flags & - e_flags;
2664 e_flags &= ~ flag;
2665
2666 switch (flag)
2667 {
2668 case EF_ARM_INTERWORK:
2669 strcat (buf, ", interworking enabled");
2670 break;
2671
2672 case EF_ARM_APCS_26:
2673 strcat (buf, ", uses APCS/26");
2674 break;
2675
2676 case EF_ARM_APCS_FLOAT:
2677 strcat (buf, ", uses APCS/float");
2678 break;
2679
2680 case EF_ARM_PIC:
2681 strcat (buf, ", position independent");
2682 break;
2683
2684 case EF_ARM_ALIGN8:
2685 strcat (buf, ", 8 bit structure alignment");
2686 break;
2687
2688 case EF_ARM_NEW_ABI:
2689 strcat (buf, ", uses new ABI");
2690 break;
2691
2692 case EF_ARM_OLD_ABI:
2693 strcat (buf, ", uses old ABI");
2694 break;
2695
2696 case EF_ARM_SOFT_FLOAT:
2697 strcat (buf, ", software FP");
2698 break;
2699
2700 case EF_ARM_VFP_FLOAT:
2701 strcat (buf, ", VFP");
2702 break;
2703
2704 case EF_ARM_MAVERICK_FLOAT:
2705 strcat (buf, ", Maverick FP");
2706 break;
2707
2708 default:
2709 unknown = TRUE;
2710 break;
2711 }
2712 }
2713 }
2714
2715 if (unknown)
2716 strcat (buf,_(", <unknown>"));
2717 }
2718
2719 static void
2720 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2721 {
2722 --size; /* Leave space for null terminator. */
2723
2724 switch (e_flags & EF_AVR_MACH)
2725 {
2726 case E_AVR_MACH_AVR1:
2727 strncat (buf, ", avr:1", size);
2728 break;
2729 case E_AVR_MACH_AVR2:
2730 strncat (buf, ", avr:2", size);
2731 break;
2732 case E_AVR_MACH_AVR25:
2733 strncat (buf, ", avr:25", size);
2734 break;
2735 case E_AVR_MACH_AVR3:
2736 strncat (buf, ", avr:3", size);
2737 break;
2738 case E_AVR_MACH_AVR31:
2739 strncat (buf, ", avr:31", size);
2740 break;
2741 case E_AVR_MACH_AVR35:
2742 strncat (buf, ", avr:35", size);
2743 break;
2744 case E_AVR_MACH_AVR4:
2745 strncat (buf, ", avr:4", size);
2746 break;
2747 case E_AVR_MACH_AVR5:
2748 strncat (buf, ", avr:5", size);
2749 break;
2750 case E_AVR_MACH_AVR51:
2751 strncat (buf, ", avr:51", size);
2752 break;
2753 case E_AVR_MACH_AVR6:
2754 strncat (buf, ", avr:6", size);
2755 break;
2756 case E_AVR_MACH_AVRTINY:
2757 strncat (buf, ", avr:100", size);
2758 break;
2759 case E_AVR_MACH_XMEGA1:
2760 strncat (buf, ", avr:101", size);
2761 break;
2762 case E_AVR_MACH_XMEGA2:
2763 strncat (buf, ", avr:102", size);
2764 break;
2765 case E_AVR_MACH_XMEGA3:
2766 strncat (buf, ", avr:103", size);
2767 break;
2768 case E_AVR_MACH_XMEGA4:
2769 strncat (buf, ", avr:104", size);
2770 break;
2771 case E_AVR_MACH_XMEGA5:
2772 strncat (buf, ", avr:105", size);
2773 break;
2774 case E_AVR_MACH_XMEGA6:
2775 strncat (buf, ", avr:106", size);
2776 break;
2777 case E_AVR_MACH_XMEGA7:
2778 strncat (buf, ", avr:107", size);
2779 break;
2780 default:
2781 strncat (buf, ", avr:<unknown>", size);
2782 break;
2783 }
2784
2785 size -= strlen (buf);
2786 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2787 strncat (buf, ", link-relax", size);
2788 }
2789
2790 static void
2791 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2792 {
2793 unsigned abi;
2794 unsigned arch;
2795 unsigned config;
2796 unsigned version;
2797 bfd_boolean has_fpu = FALSE;
2798 unsigned int r = 0;
2799
2800 static const char *ABI_STRINGS[] =
2801 {
2802 "ABI v0", /* use r5 as return register; only used in N1213HC */
2803 "ABI v1", /* use r0 as return register */
2804 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2805 "ABI v2fp", /* for FPU */
2806 "AABI",
2807 "ABI2 FP+"
2808 };
2809 static const char *VER_STRINGS[] =
2810 {
2811 "Andes ELF V1.3 or older",
2812 "Andes ELF V1.3.1",
2813 "Andes ELF V1.4"
2814 };
2815 static const char *ARCH_STRINGS[] =
2816 {
2817 "",
2818 "Andes Star v1.0",
2819 "Andes Star v2.0",
2820 "Andes Star v3.0",
2821 "Andes Star v3.0m"
2822 };
2823
2824 abi = EF_NDS_ABI & e_flags;
2825 arch = EF_NDS_ARCH & e_flags;
2826 config = EF_NDS_INST & e_flags;
2827 version = EF_NDS32_ELF_VERSION & e_flags;
2828
2829 memset (buf, 0, size);
2830
2831 switch (abi)
2832 {
2833 case E_NDS_ABI_V0:
2834 case E_NDS_ABI_V1:
2835 case E_NDS_ABI_V2:
2836 case E_NDS_ABI_V2FP:
2837 case E_NDS_ABI_AABI:
2838 case E_NDS_ABI_V2FP_PLUS:
2839 /* In case there are holes in the array. */
2840 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2841 break;
2842
2843 default:
2844 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2845 break;
2846 }
2847
2848 switch (version)
2849 {
2850 case E_NDS32_ELF_VER_1_2:
2851 case E_NDS32_ELF_VER_1_3:
2852 case E_NDS32_ELF_VER_1_4:
2853 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2854 break;
2855
2856 default:
2857 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2858 break;
2859 }
2860
2861 if (E_NDS_ABI_V0 == abi)
2862 {
2863 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2864 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2865 if (arch == E_NDS_ARCH_STAR_V1_0)
2866 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2867 return;
2868 }
2869
2870 switch (arch)
2871 {
2872 case E_NDS_ARCH_STAR_V1_0:
2873 case E_NDS_ARCH_STAR_V2_0:
2874 case E_NDS_ARCH_STAR_V3_0:
2875 case E_NDS_ARCH_STAR_V3_M:
2876 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2877 break;
2878
2879 default:
2880 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2881 /* ARCH version determines how the e_flags are interpreted.
2882 If it is unknown, we cannot proceed. */
2883 return;
2884 }
2885
2886 /* Newer ABI; Now handle architecture specific flags. */
2887 if (arch == E_NDS_ARCH_STAR_V1_0)
2888 {
2889 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2890 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2891
2892 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2893 r += snprintf (buf + r, size -r, ", MAC");
2894
2895 if (config & E_NDS32_HAS_DIV_INST)
2896 r += snprintf (buf + r, size -r, ", DIV");
2897
2898 if (config & E_NDS32_HAS_16BIT_INST)
2899 r += snprintf (buf + r, size -r, ", 16b");
2900 }
2901 else
2902 {
2903 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2904 {
2905 if (version <= E_NDS32_ELF_VER_1_3)
2906 r += snprintf (buf + r, size -r, ", [B8]");
2907 else
2908 r += snprintf (buf + r, size -r, ", EX9");
2909 }
2910
2911 if (config & E_NDS32_HAS_MAC_DX_INST)
2912 r += snprintf (buf + r, size -r, ", MAC_DX");
2913
2914 if (config & E_NDS32_HAS_DIV_DX_INST)
2915 r += snprintf (buf + r, size -r, ", DIV_DX");
2916
2917 if (config & E_NDS32_HAS_16BIT_INST)
2918 {
2919 if (version <= E_NDS32_ELF_VER_1_3)
2920 r += snprintf (buf + r, size -r, ", 16b");
2921 else
2922 r += snprintf (buf + r, size -r, ", IFC");
2923 }
2924 }
2925
2926 if (config & E_NDS32_HAS_EXT_INST)
2927 r += snprintf (buf + r, size -r, ", PERF1");
2928
2929 if (config & E_NDS32_HAS_EXT2_INST)
2930 r += snprintf (buf + r, size -r, ", PERF2");
2931
2932 if (config & E_NDS32_HAS_FPU_INST)
2933 {
2934 has_fpu = TRUE;
2935 r += snprintf (buf + r, size -r, ", FPU_SP");
2936 }
2937
2938 if (config & E_NDS32_HAS_FPU_DP_INST)
2939 {
2940 has_fpu = TRUE;
2941 r += snprintf (buf + r, size -r, ", FPU_DP");
2942 }
2943
2944 if (config & E_NDS32_HAS_FPU_MAC_INST)
2945 {
2946 has_fpu = TRUE;
2947 r += snprintf (buf + r, size -r, ", FPU_MAC");
2948 }
2949
2950 if (has_fpu)
2951 {
2952 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2953 {
2954 case E_NDS32_FPU_REG_8SP_4DP:
2955 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2956 break;
2957 case E_NDS32_FPU_REG_16SP_8DP:
2958 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2959 break;
2960 case E_NDS32_FPU_REG_32SP_16DP:
2961 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2962 break;
2963 case E_NDS32_FPU_REG_32SP_32DP:
2964 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2965 break;
2966 }
2967 }
2968
2969 if (config & E_NDS32_HAS_AUDIO_INST)
2970 r += snprintf (buf + r, size -r, ", AUDIO");
2971
2972 if (config & E_NDS32_HAS_STRING_INST)
2973 r += snprintf (buf + r, size -r, ", STR");
2974
2975 if (config & E_NDS32_HAS_REDUCED_REGS)
2976 r += snprintf (buf + r, size -r, ", 16REG");
2977
2978 if (config & E_NDS32_HAS_VIDEO_INST)
2979 {
2980 if (version <= E_NDS32_ELF_VER_1_3)
2981 r += snprintf (buf + r, size -r, ", VIDEO");
2982 else
2983 r += snprintf (buf + r, size -r, ", SATURATION");
2984 }
2985
2986 if (config & E_NDS32_HAS_ENCRIPT_INST)
2987 r += snprintf (buf + r, size -r, ", ENCRP");
2988
2989 if (config & E_NDS32_HAS_L2C_INST)
2990 r += snprintf (buf + r, size -r, ", L2C");
2991 }
2992
2993 static char *
2994 get_machine_flags (unsigned e_flags, unsigned e_machine)
2995 {
2996 static char buf[1024];
2997
2998 buf[0] = '\0';
2999
3000 if (e_flags)
3001 {
3002 switch (e_machine)
3003 {
3004 default:
3005 break;
3006
3007 case EM_ARC_COMPACT2:
3008 case EM_ARC_COMPACT:
3009 decode_ARC_machine_flags (e_flags, e_machine, buf);
3010 break;
3011
3012 case EM_ARM:
3013 decode_ARM_machine_flags (e_flags, buf);
3014 break;
3015
3016 case EM_AVR:
3017 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3018 break;
3019
3020 case EM_BLACKFIN:
3021 if (e_flags & EF_BFIN_PIC)
3022 strcat (buf, ", PIC");
3023
3024 if (e_flags & EF_BFIN_FDPIC)
3025 strcat (buf, ", FDPIC");
3026
3027 if (e_flags & EF_BFIN_CODE_IN_L1)
3028 strcat (buf, ", code in L1");
3029
3030 if (e_flags & EF_BFIN_DATA_IN_L1)
3031 strcat (buf, ", data in L1");
3032
3033 break;
3034
3035 case EM_CYGNUS_FRV:
3036 switch (e_flags & EF_FRV_CPU_MASK)
3037 {
3038 case EF_FRV_CPU_GENERIC:
3039 break;
3040
3041 default:
3042 strcat (buf, ", fr???");
3043 break;
3044
3045 case EF_FRV_CPU_FR300:
3046 strcat (buf, ", fr300");
3047 break;
3048
3049 case EF_FRV_CPU_FR400:
3050 strcat (buf, ", fr400");
3051 break;
3052 case EF_FRV_CPU_FR405:
3053 strcat (buf, ", fr405");
3054 break;
3055
3056 case EF_FRV_CPU_FR450:
3057 strcat (buf, ", fr450");
3058 break;
3059
3060 case EF_FRV_CPU_FR500:
3061 strcat (buf, ", fr500");
3062 break;
3063 case EF_FRV_CPU_FR550:
3064 strcat (buf, ", fr550");
3065 break;
3066
3067 case EF_FRV_CPU_SIMPLE:
3068 strcat (buf, ", simple");
3069 break;
3070 case EF_FRV_CPU_TOMCAT:
3071 strcat (buf, ", tomcat");
3072 break;
3073 }
3074 break;
3075
3076 case EM_68K:
3077 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3078 strcat (buf, ", m68000");
3079 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3080 strcat (buf, ", cpu32");
3081 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3082 strcat (buf, ", fido_a");
3083 else
3084 {
3085 char const * isa = _("unknown");
3086 char const * mac = _("unknown mac");
3087 char const * additional = NULL;
3088
3089 switch (e_flags & EF_M68K_CF_ISA_MASK)
3090 {
3091 case EF_M68K_CF_ISA_A_NODIV:
3092 isa = "A";
3093 additional = ", nodiv";
3094 break;
3095 case EF_M68K_CF_ISA_A:
3096 isa = "A";
3097 break;
3098 case EF_M68K_CF_ISA_A_PLUS:
3099 isa = "A+";
3100 break;
3101 case EF_M68K_CF_ISA_B_NOUSP:
3102 isa = "B";
3103 additional = ", nousp";
3104 break;
3105 case EF_M68K_CF_ISA_B:
3106 isa = "B";
3107 break;
3108 case EF_M68K_CF_ISA_C:
3109 isa = "C";
3110 break;
3111 case EF_M68K_CF_ISA_C_NODIV:
3112 isa = "C";
3113 additional = ", nodiv";
3114 break;
3115 }
3116 strcat (buf, ", cf, isa ");
3117 strcat (buf, isa);
3118 if (additional)
3119 strcat (buf, additional);
3120 if (e_flags & EF_M68K_CF_FLOAT)
3121 strcat (buf, ", float");
3122 switch (e_flags & EF_M68K_CF_MAC_MASK)
3123 {
3124 case 0:
3125 mac = NULL;
3126 break;
3127 case EF_M68K_CF_MAC:
3128 mac = "mac";
3129 break;
3130 case EF_M68K_CF_EMAC:
3131 mac = "emac";
3132 break;
3133 case EF_M68K_CF_EMAC_B:
3134 mac = "emac_b";
3135 break;
3136 }
3137 if (mac)
3138 {
3139 strcat (buf, ", ");
3140 strcat (buf, mac);
3141 }
3142 }
3143 break;
3144
3145 case EM_CYGNUS_MEP:
3146 switch (e_flags & EF_MEP_CPU_MASK)
3147 {
3148 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3149 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3150 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3151 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3152 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3153 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3154 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3155 }
3156
3157 switch (e_flags & EF_MEP_COP_MASK)
3158 {
3159 case EF_MEP_COP_NONE: break;
3160 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3161 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3162 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3163 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3164 default: strcat (buf, _("<unknown MeP copro type>")); break;
3165 }
3166
3167 if (e_flags & EF_MEP_LIBRARY)
3168 strcat (buf, ", Built for Library");
3169
3170 if (e_flags & EF_MEP_INDEX_MASK)
3171 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3172 e_flags & EF_MEP_INDEX_MASK);
3173
3174 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3175 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3176 e_flags & ~ EF_MEP_ALL_FLAGS);
3177 break;
3178
3179 case EM_PPC:
3180 if (e_flags & EF_PPC_EMB)
3181 strcat (buf, ", emb");
3182
3183 if (e_flags & EF_PPC_RELOCATABLE)
3184 strcat (buf, _(", relocatable"));
3185
3186 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3187 strcat (buf, _(", relocatable-lib"));
3188 break;
3189
3190 case EM_PPC64:
3191 if (e_flags & EF_PPC64_ABI)
3192 {
3193 char abi[] = ", abiv0";
3194
3195 abi[6] += e_flags & EF_PPC64_ABI;
3196 strcat (buf, abi);
3197 }
3198 break;
3199
3200 case EM_V800:
3201 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3202 strcat (buf, ", RH850 ABI");
3203
3204 if (e_flags & EF_V800_850E3)
3205 strcat (buf, ", V3 architecture");
3206
3207 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3208 strcat (buf, ", FPU not used");
3209
3210 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3211 strcat (buf, ", regmode: COMMON");
3212
3213 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3214 strcat (buf, ", r4 not used");
3215
3216 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3217 strcat (buf, ", r30 not used");
3218
3219 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3220 strcat (buf, ", r5 not used");
3221
3222 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3223 strcat (buf, ", r2 not used");
3224
3225 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3226 {
3227 switch (e_flags & - e_flags)
3228 {
3229 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3230 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3231 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3232 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3233 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3234 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3235 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3236 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3237 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3238 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3239 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3240 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3241 default: break;
3242 }
3243 }
3244 break;
3245
3246 case EM_V850:
3247 case EM_CYGNUS_V850:
3248 switch (e_flags & EF_V850_ARCH)
3249 {
3250 case E_V850E3V5_ARCH:
3251 strcat (buf, ", v850e3v5");
3252 break;
3253 case E_V850E2V3_ARCH:
3254 strcat (buf, ", v850e2v3");
3255 break;
3256 case E_V850E2_ARCH:
3257 strcat (buf, ", v850e2");
3258 break;
3259 case E_V850E1_ARCH:
3260 strcat (buf, ", v850e1");
3261 break;
3262 case E_V850E_ARCH:
3263 strcat (buf, ", v850e");
3264 break;
3265 case E_V850_ARCH:
3266 strcat (buf, ", v850");
3267 break;
3268 default:
3269 strcat (buf, _(", unknown v850 architecture variant"));
3270 break;
3271 }
3272 break;
3273
3274 case EM_M32R:
3275 case EM_CYGNUS_M32R:
3276 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3277 strcat (buf, ", m32r");
3278 break;
3279
3280 case EM_MIPS:
3281 case EM_MIPS_RS3_LE:
3282 if (e_flags & EF_MIPS_NOREORDER)
3283 strcat (buf, ", noreorder");
3284
3285 if (e_flags & EF_MIPS_PIC)
3286 strcat (buf, ", pic");
3287
3288 if (e_flags & EF_MIPS_CPIC)
3289 strcat (buf, ", cpic");
3290
3291 if (e_flags & EF_MIPS_UCODE)
3292 strcat (buf, ", ugen_reserved");
3293
3294 if (e_flags & EF_MIPS_ABI2)
3295 strcat (buf, ", abi2");
3296
3297 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3298 strcat (buf, ", odk first");
3299
3300 if (e_flags & EF_MIPS_32BITMODE)
3301 strcat (buf, ", 32bitmode");
3302
3303 if (e_flags & EF_MIPS_NAN2008)
3304 strcat (buf, ", nan2008");
3305
3306 if (e_flags & EF_MIPS_FP64)
3307 strcat (buf, ", fp64");
3308
3309 switch ((e_flags & EF_MIPS_MACH))
3310 {
3311 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3312 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3313 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3314 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3315 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3316 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3317 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3318 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3319 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3320 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3321 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3322 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3323 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3324 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3325 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3326 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3327 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3328 case 0:
3329 /* We simply ignore the field in this case to avoid confusion:
3330 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3331 extension. */
3332 break;
3333 default: strcat (buf, _(", unknown CPU")); break;
3334 }
3335
3336 switch ((e_flags & EF_MIPS_ABI))
3337 {
3338 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3339 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3340 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3341 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3342 case 0:
3343 /* We simply ignore the field in this case to avoid confusion:
3344 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3345 This means it is likely to be an o32 file, but not for
3346 sure. */
3347 break;
3348 default: strcat (buf, _(", unknown ABI")); break;
3349 }
3350
3351 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3352 strcat (buf, ", mdmx");
3353
3354 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3355 strcat (buf, ", mips16");
3356
3357 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3358 strcat (buf, ", micromips");
3359
3360 switch ((e_flags & EF_MIPS_ARCH))
3361 {
3362 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3363 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3364 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3365 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3366 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3367 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3368 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3369 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3370 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3371 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3372 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3373 default: strcat (buf, _(", unknown ISA")); break;
3374 }
3375 break;
3376
3377 case EM_NDS32:
3378 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3379 break;
3380
3381 case EM_RISCV:
3382 if (e_flags & EF_RISCV_RVC)
3383 strcat (buf, ", RVC");
3384
3385 switch (e_flags & EF_RISCV_FLOAT_ABI)
3386 {
3387 case EF_RISCV_FLOAT_ABI_SOFT:
3388 strcat (buf, ", soft-float ABI");
3389 break;
3390
3391 case EF_RISCV_FLOAT_ABI_SINGLE:
3392 strcat (buf, ", single-float ABI");
3393 break;
3394
3395 case EF_RISCV_FLOAT_ABI_DOUBLE:
3396 strcat (buf, ", double-float ABI");
3397 break;
3398
3399 case EF_RISCV_FLOAT_ABI_QUAD:
3400 strcat (buf, ", quad-float ABI");
3401 break;
3402 }
3403 break;
3404
3405 case EM_SH:
3406 switch ((e_flags & EF_SH_MACH_MASK))
3407 {
3408 case EF_SH1: strcat (buf, ", sh1"); break;
3409 case EF_SH2: strcat (buf, ", sh2"); break;
3410 case EF_SH3: strcat (buf, ", sh3"); break;
3411 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3412 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3413 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3414 case EF_SH3E: strcat (buf, ", sh3e"); break;
3415 case EF_SH4: strcat (buf, ", sh4"); break;
3416 case EF_SH5: strcat (buf, ", sh5"); break;
3417 case EF_SH2E: strcat (buf, ", sh2e"); break;
3418 case EF_SH4A: strcat (buf, ", sh4a"); break;
3419 case EF_SH2A: strcat (buf, ", sh2a"); break;
3420 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3421 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3422 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3423 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3424 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3425 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3426 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3427 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3428 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3429 default: strcat (buf, _(", unknown ISA")); break;
3430 }
3431
3432 if (e_flags & EF_SH_PIC)
3433 strcat (buf, ", pic");
3434
3435 if (e_flags & EF_SH_FDPIC)
3436 strcat (buf, ", fdpic");
3437 break;
3438
3439 case EM_OR1K:
3440 if (e_flags & EF_OR1K_NODELAY)
3441 strcat (buf, ", no delay");
3442 break;
3443
3444 case EM_SPARCV9:
3445 if (e_flags & EF_SPARC_32PLUS)
3446 strcat (buf, ", v8+");
3447
3448 if (e_flags & EF_SPARC_SUN_US1)
3449 strcat (buf, ", ultrasparcI");
3450
3451 if (e_flags & EF_SPARC_SUN_US3)
3452 strcat (buf, ", ultrasparcIII");
3453
3454 if (e_flags & EF_SPARC_HAL_R1)
3455 strcat (buf, ", halr1");
3456
3457 if (e_flags & EF_SPARC_LEDATA)
3458 strcat (buf, ", ledata");
3459
3460 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3461 strcat (buf, ", tso");
3462
3463 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3464 strcat (buf, ", pso");
3465
3466 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3467 strcat (buf, ", rmo");
3468 break;
3469
3470 case EM_PARISC:
3471 switch (e_flags & EF_PARISC_ARCH)
3472 {
3473 case EFA_PARISC_1_0:
3474 strcpy (buf, ", PA-RISC 1.0");
3475 break;
3476 case EFA_PARISC_1_1:
3477 strcpy (buf, ", PA-RISC 1.1");
3478 break;
3479 case EFA_PARISC_2_0:
3480 strcpy (buf, ", PA-RISC 2.0");
3481 break;
3482 default:
3483 break;
3484 }
3485 if (e_flags & EF_PARISC_TRAPNIL)
3486 strcat (buf, ", trapnil");
3487 if (e_flags & EF_PARISC_EXT)
3488 strcat (buf, ", ext");
3489 if (e_flags & EF_PARISC_LSB)
3490 strcat (buf, ", lsb");
3491 if (e_flags & EF_PARISC_WIDE)
3492 strcat (buf, ", wide");
3493 if (e_flags & EF_PARISC_NO_KABP)
3494 strcat (buf, ", no kabp");
3495 if (e_flags & EF_PARISC_LAZYSWAP)
3496 strcat (buf, ", lazyswap");
3497 break;
3498
3499 case EM_PJ:
3500 case EM_PJ_OLD:
3501 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3502 strcat (buf, ", new calling convention");
3503
3504 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3505 strcat (buf, ", gnu calling convention");
3506 break;
3507
3508 case EM_IA_64:
3509 if ((e_flags & EF_IA_64_ABI64))
3510 strcat (buf, ", 64-bit");
3511 else
3512 strcat (buf, ", 32-bit");
3513 if ((e_flags & EF_IA_64_REDUCEDFP))
3514 strcat (buf, ", reduced fp model");
3515 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3516 strcat (buf, ", no function descriptors, constant gp");
3517 else if ((e_flags & EF_IA_64_CONS_GP))
3518 strcat (buf, ", constant gp");
3519 if ((e_flags & EF_IA_64_ABSOLUTE))
3520 strcat (buf, ", absolute");
3521 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3522 {
3523 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3524 strcat (buf, ", vms_linkages");
3525 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3526 {
3527 case EF_IA_64_VMS_COMCOD_SUCCESS:
3528 break;
3529 case EF_IA_64_VMS_COMCOD_WARNING:
3530 strcat (buf, ", warning");
3531 break;
3532 case EF_IA_64_VMS_COMCOD_ERROR:
3533 strcat (buf, ", error");
3534 break;
3535 case EF_IA_64_VMS_COMCOD_ABORT:
3536 strcat (buf, ", abort");
3537 break;
3538 default:
3539 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3540 e_flags & EF_IA_64_VMS_COMCOD);
3541 strcat (buf, ", <unknown>");
3542 }
3543 }
3544 break;
3545
3546 case EM_VAX:
3547 if ((e_flags & EF_VAX_NONPIC))
3548 strcat (buf, ", non-PIC");
3549 if ((e_flags & EF_VAX_DFLOAT))
3550 strcat (buf, ", D-Float");
3551 if ((e_flags & EF_VAX_GFLOAT))
3552 strcat (buf, ", G-Float");
3553 break;
3554
3555 case EM_VISIUM:
3556 if (e_flags & EF_VISIUM_ARCH_MCM)
3557 strcat (buf, ", mcm");
3558 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3559 strcat (buf, ", mcm24");
3560 if (e_flags & EF_VISIUM_ARCH_GR6)
3561 strcat (buf, ", gr6");
3562 break;
3563
3564 case EM_RL78:
3565 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3566 {
3567 case E_FLAG_RL78_ANY_CPU: break;
3568 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3569 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3570 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3571 }
3572 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3573 strcat (buf, ", 64-bit doubles");
3574 break;
3575
3576 case EM_RX:
3577 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3578 strcat (buf, ", 64-bit doubles");
3579 if (e_flags & E_FLAG_RX_DSP)
3580 strcat (buf, ", dsp");
3581 if (e_flags & E_FLAG_RX_PID)
3582 strcat (buf, ", pid");
3583 if (e_flags & E_FLAG_RX_ABI)
3584 strcat (buf, ", RX ABI");
3585 if (e_flags & E_FLAG_RX_SINSNS_SET)
3586 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3587 ? ", uses String instructions" : ", bans String instructions");
3588 if (e_flags & E_FLAG_RX_V2)
3589 strcat (buf, ", V2");
3590 break;
3591
3592 case EM_S390:
3593 if (e_flags & EF_S390_HIGH_GPRS)
3594 strcat (buf, ", highgprs");
3595 break;
3596
3597 case EM_TI_C6000:
3598 if ((e_flags & EF_C6000_REL))
3599 strcat (buf, ", relocatable module");
3600 break;
3601
3602 case EM_MSP430:
3603 strcat (buf, _(": architecture variant: "));
3604 switch (e_flags & EF_MSP430_MACH)
3605 {
3606 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3607 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3608 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3609 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3610 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3611 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3612 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3613 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3614 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3615 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3616 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3617 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3618 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3619 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3620 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3621 default:
3622 strcat (buf, _(": unknown")); break;
3623 }
3624
3625 if (e_flags & ~ EF_MSP430_MACH)
3626 strcat (buf, _(": unknown extra flag bits also present"));
3627 }
3628 }
3629
3630 return buf;
3631 }
3632
3633 static const char *
3634 get_osabi_name (unsigned int osabi)
3635 {
3636 static char buff[32];
3637
3638 switch (osabi)
3639 {
3640 case ELFOSABI_NONE: return "UNIX - System V";
3641 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3642 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3643 case ELFOSABI_GNU: return "UNIX - GNU";
3644 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3645 case ELFOSABI_AIX: return "UNIX - AIX";
3646 case ELFOSABI_IRIX: return "UNIX - IRIX";
3647 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3648 case ELFOSABI_TRU64: return "UNIX - TRU64";
3649 case ELFOSABI_MODESTO: return "Novell - Modesto";
3650 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3651 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3652 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3653 case ELFOSABI_AROS: return "AROS";
3654 case ELFOSABI_FENIXOS: return "FenixOS";
3655 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3656 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3657 default:
3658 if (osabi >= 64)
3659 switch (elf_header.e_machine)
3660 {
3661 case EM_ARM:
3662 switch (osabi)
3663 {
3664 case ELFOSABI_ARM: return "ARM";
3665 default:
3666 break;
3667 }
3668 break;
3669
3670 case EM_MSP430:
3671 case EM_MSP430_OLD:
3672 case EM_VISIUM:
3673 switch (osabi)
3674 {
3675 case ELFOSABI_STANDALONE: return _("Standalone App");
3676 default:
3677 break;
3678 }
3679 break;
3680
3681 case EM_TI_C6000:
3682 switch (osabi)
3683 {
3684 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3685 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3686 default:
3687 break;
3688 }
3689 break;
3690
3691 default:
3692 break;
3693 }
3694 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3695 return buff;
3696 }
3697 }
3698
3699 static const char *
3700 get_aarch64_segment_type (unsigned long type)
3701 {
3702 switch (type)
3703 {
3704 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3705 default: return NULL;
3706 }
3707 }
3708
3709 static const char *
3710 get_arm_segment_type (unsigned long type)
3711 {
3712 switch (type)
3713 {
3714 case PT_ARM_EXIDX: return "EXIDX";
3715 default: return NULL;
3716 }
3717 }
3718
3719 static const char *
3720 get_mips_segment_type (unsigned long type)
3721 {
3722 switch (type)
3723 {
3724 case PT_MIPS_REGINFO: return "REGINFO";
3725 case PT_MIPS_RTPROC: return "RTPROC";
3726 case PT_MIPS_OPTIONS: return "OPTIONS";
3727 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3728 default: return NULL;
3729 }
3730 }
3731
3732 static const char *
3733 get_parisc_segment_type (unsigned long type)
3734 {
3735 switch (type)
3736 {
3737 case PT_HP_TLS: return "HP_TLS";
3738 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3739 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3740 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3741 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3742 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3743 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3744 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3745 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3746 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3747 case PT_HP_PARALLEL: return "HP_PARALLEL";
3748 case PT_HP_FASTBIND: return "HP_FASTBIND";
3749 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3750 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3751 case PT_HP_STACK: return "HP_STACK";
3752 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3753 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3754 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3755 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3756 default: return NULL;
3757 }
3758 }
3759
3760 static const char *
3761 get_ia64_segment_type (unsigned long type)
3762 {
3763 switch (type)
3764 {
3765 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3766 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3767 case PT_HP_TLS: return "HP_TLS";
3768 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3769 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3770 case PT_IA_64_HP_STACK: return "HP_STACK";
3771 default: return NULL;
3772 }
3773 }
3774
3775 static const char *
3776 get_tic6x_segment_type (unsigned long type)
3777 {
3778 switch (type)
3779 {
3780 case PT_C6000_PHATTR: return "C6000_PHATTR";
3781 default: return NULL;
3782 }
3783 }
3784
3785 static const char *
3786 get_solaris_segment_type (unsigned long type)
3787 {
3788 switch (type)
3789 {
3790 case 0x6464e550: return "PT_SUNW_UNWIND";
3791 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3792 case 0x6ffffff7: return "PT_LOSUNW";
3793 case 0x6ffffffa: return "PT_SUNWBSS";
3794 case 0x6ffffffb: return "PT_SUNWSTACK";
3795 case 0x6ffffffc: return "PT_SUNWDTRACE";
3796 case 0x6ffffffd: return "PT_SUNWCAP";
3797 case 0x6fffffff: return "PT_HISUNW";
3798 default: return NULL;
3799 }
3800 }
3801
3802 static const char *
3803 get_segment_type (unsigned long p_type)
3804 {
3805 static char buff[32];
3806
3807 switch (p_type)
3808 {
3809 case PT_NULL: return "NULL";
3810 case PT_LOAD: return "LOAD";
3811 case PT_DYNAMIC: return "DYNAMIC";
3812 case PT_INTERP: return "INTERP";
3813 case PT_NOTE: return "NOTE";
3814 case PT_SHLIB: return "SHLIB";
3815 case PT_PHDR: return "PHDR";
3816 case PT_TLS: return "TLS";
3817 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3818 case PT_GNU_STACK: return "GNU_STACK";
3819 case PT_GNU_RELRO: return "GNU_RELRO";
3820
3821 default:
3822 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3823 {
3824 const char * result;
3825
3826 switch (elf_header.e_machine)
3827 {
3828 case EM_AARCH64:
3829 result = get_aarch64_segment_type (p_type);
3830 break;
3831 case EM_ARM:
3832 result = get_arm_segment_type (p_type);
3833 break;
3834 case EM_MIPS:
3835 case EM_MIPS_RS3_LE:
3836 result = get_mips_segment_type (p_type);
3837 break;
3838 case EM_PARISC:
3839 result = get_parisc_segment_type (p_type);
3840 break;
3841 case EM_IA_64:
3842 result = get_ia64_segment_type (p_type);
3843 break;
3844 case EM_TI_C6000:
3845 result = get_tic6x_segment_type (p_type);
3846 break;
3847 default:
3848 result = NULL;
3849 break;
3850 }
3851
3852 if (result != NULL)
3853 return result;
3854
3855 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3856 }
3857 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3858 {
3859 const char * result;
3860
3861 switch (elf_header.e_machine)
3862 {
3863 case EM_PARISC:
3864 result = get_parisc_segment_type (p_type);
3865 break;
3866 case EM_IA_64:
3867 result = get_ia64_segment_type (p_type);
3868 break;
3869 default:
3870 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3871 result = get_solaris_segment_type (p_type);
3872 else
3873 result = NULL;
3874 break;
3875 }
3876
3877 if (result != NULL)
3878 return result;
3879
3880 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3881 }
3882 else
3883 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3884
3885 return buff;
3886 }
3887 }
3888
3889 static const char *
3890 get_mips_section_type_name (unsigned int sh_type)
3891 {
3892 switch (sh_type)
3893 {
3894 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3895 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3896 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3897 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3898 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3899 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3900 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3901 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3902 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3903 case SHT_MIPS_RELD: return "MIPS_RELD";
3904 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3905 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3906 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3907 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3908 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3909 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3910 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3911 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3912 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3913 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3914 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3915 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3916 case SHT_MIPS_LINE: return "MIPS_LINE";
3917 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3918 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3919 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3920 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3921 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3922 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3923 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3924 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3925 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3926 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3927 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3928 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3929 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3930 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3931 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3932 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3933 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3934 default:
3935 break;
3936 }
3937 return NULL;
3938 }
3939
3940 static const char *
3941 get_parisc_section_type_name (unsigned int sh_type)
3942 {
3943 switch (sh_type)
3944 {
3945 case SHT_PARISC_EXT: return "PARISC_EXT";
3946 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3947 case SHT_PARISC_DOC: return "PARISC_DOC";
3948 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3949 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3950 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3951 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3952 default: return NULL;
3953 }
3954 }
3955
3956 static const char *
3957 get_ia64_section_type_name (unsigned int sh_type)
3958 {
3959 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3960 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3961 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3962
3963 switch (sh_type)
3964 {
3965 case SHT_IA_64_EXT: return "IA_64_EXT";
3966 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3967 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3968 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3969 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3970 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3971 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3972 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3973 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3974 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3975 default:
3976 break;
3977 }
3978 return NULL;
3979 }
3980
3981 static const char *
3982 get_x86_64_section_type_name (unsigned int sh_type)
3983 {
3984 switch (sh_type)
3985 {
3986 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3987 default: return NULL;
3988 }
3989 }
3990
3991 static const char *
3992 get_aarch64_section_type_name (unsigned int sh_type)
3993 {
3994 switch (sh_type)
3995 {
3996 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
3997 default: return NULL;
3998 }
3999 }
4000
4001 static const char *
4002 get_arm_section_type_name (unsigned int sh_type)
4003 {
4004 switch (sh_type)
4005 {
4006 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4007 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4008 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4009 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4010 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4011 default: return NULL;
4012 }
4013 }
4014
4015 static const char *
4016 get_tic6x_section_type_name (unsigned int sh_type)
4017 {
4018 switch (sh_type)
4019 {
4020 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4021 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4022 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4023 case SHT_TI_ICODE: return "TI_ICODE";
4024 case SHT_TI_XREF: return "TI_XREF";
4025 case SHT_TI_HANDLER: return "TI_HANDLER";
4026 case SHT_TI_INITINFO: return "TI_INITINFO";
4027 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4028 default: return NULL;
4029 }
4030 }
4031
4032 static const char *
4033 get_msp430x_section_type_name (unsigned int sh_type)
4034 {
4035 switch (sh_type)
4036 {
4037 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4038 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4039 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4040 default: return NULL;
4041 }
4042 }
4043
4044 static const char *
4045 get_v850_section_type_name (unsigned int sh_type)
4046 {
4047 switch (sh_type)
4048 {
4049 case SHT_V850_SCOMMON: return "V850 Small Common";
4050 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4051 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4052 case SHT_RENESAS_IOP: return "RENESAS IOP";
4053 case SHT_RENESAS_INFO: return "RENESAS INFO";
4054 default: return NULL;
4055 }
4056 }
4057
4058 static const char *
4059 get_section_type_name (unsigned int sh_type)
4060 {
4061 static char buff[32];
4062 const char * result;
4063
4064 switch (sh_type)
4065 {
4066 case SHT_NULL: return "NULL";
4067 case SHT_PROGBITS: return "PROGBITS";
4068 case SHT_SYMTAB: return "SYMTAB";
4069 case SHT_STRTAB: return "STRTAB";
4070 case SHT_RELA: return "RELA";
4071 case SHT_HASH: return "HASH";
4072 case SHT_DYNAMIC: return "DYNAMIC";
4073 case SHT_NOTE: return "NOTE";
4074 case SHT_NOBITS: return "NOBITS";
4075 case SHT_REL: return "REL";
4076 case SHT_SHLIB: return "SHLIB";
4077 case SHT_DYNSYM: return "DYNSYM";
4078 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4079 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4080 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4081 case SHT_GNU_HASH: return "GNU_HASH";
4082 case SHT_GROUP: return "GROUP";
4083 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4084 case SHT_GNU_verdef: return "VERDEF";
4085 case SHT_GNU_verneed: return "VERNEED";
4086 case SHT_GNU_versym: return "VERSYM";
4087 case 0x6ffffff0: return "VERSYM";
4088 case 0x6ffffffc: return "VERDEF";
4089 case 0x7ffffffd: return "AUXILIARY";
4090 case 0x7fffffff: return "FILTER";
4091 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4092
4093 default:
4094 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4095 {
4096 switch (elf_header.e_machine)
4097 {
4098 case EM_MIPS:
4099 case EM_MIPS_RS3_LE:
4100 result = get_mips_section_type_name (sh_type);
4101 break;
4102 case EM_PARISC:
4103 result = get_parisc_section_type_name (sh_type);
4104 break;
4105 case EM_IA_64:
4106 result = get_ia64_section_type_name (sh_type);
4107 break;
4108 case EM_X86_64:
4109 case EM_L1OM:
4110 case EM_K1OM:
4111 result = get_x86_64_section_type_name (sh_type);
4112 break;
4113 case EM_AARCH64:
4114 result = get_aarch64_section_type_name (sh_type);
4115 break;
4116 case EM_ARM:
4117 result = get_arm_section_type_name (sh_type);
4118 break;
4119 case EM_TI_C6000:
4120 result = get_tic6x_section_type_name (sh_type);
4121 break;
4122 case EM_MSP430:
4123 result = get_msp430x_section_type_name (sh_type);
4124 break;
4125 case EM_V800:
4126 case EM_V850:
4127 case EM_CYGNUS_V850:
4128 result = get_v850_section_type_name (sh_type);
4129 break;
4130 default:
4131 result = NULL;
4132 break;
4133 }
4134
4135 if (result != NULL)
4136 return result;
4137
4138 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4139 }
4140 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4141 {
4142 switch (elf_header.e_machine)
4143 {
4144 case EM_IA_64:
4145 result = get_ia64_section_type_name (sh_type);
4146 break;
4147 default:
4148 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4149 result = get_solaris_section_type (sh_type);
4150 else
4151 {
4152 switch (sh_type)
4153 {
4154 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4155 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4156 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4157 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4158 default:
4159 result = NULL;
4160 break;
4161 }
4162 }
4163 break;
4164 }
4165
4166 if (result != NULL)
4167 return result;
4168
4169 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4170 }
4171 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4172 {
4173 switch (elf_header.e_machine)
4174 {
4175 case EM_V800:
4176 case EM_V850:
4177 case EM_CYGNUS_V850:
4178 result = get_v850_section_type_name (sh_type);
4179 break;
4180 default:
4181 result = NULL;
4182 break;
4183 }
4184
4185 if (result != NULL)
4186 return result;
4187
4188 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4189 }
4190 else
4191 /* This message is probably going to be displayed in a 15
4192 character wide field, so put the hex value first. */
4193 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4194
4195 return buff;
4196 }
4197 }
4198
4199 #define OPTION_DEBUG_DUMP 512
4200 #define OPTION_DYN_SYMS 513
4201 #define OPTION_DWARF_DEPTH 514
4202 #define OPTION_DWARF_START 515
4203 #define OPTION_DWARF_CHECK 516
4204
4205 static struct option options[] =
4206 {
4207 {"all", no_argument, 0, 'a'},
4208 {"file-header", no_argument, 0, 'h'},
4209 {"program-headers", no_argument, 0, 'l'},
4210 {"headers", no_argument, 0, 'e'},
4211 {"histogram", no_argument, 0, 'I'},
4212 {"segments", no_argument, 0, 'l'},
4213 {"sections", no_argument, 0, 'S'},
4214 {"section-headers", no_argument, 0, 'S'},
4215 {"section-groups", no_argument, 0, 'g'},
4216 {"section-details", no_argument, 0, 't'},
4217 {"full-section-name",no_argument, 0, 'N'},
4218 {"symbols", no_argument, 0, 's'},
4219 {"syms", no_argument, 0, 's'},
4220 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4221 {"relocs", no_argument, 0, 'r'},
4222 {"notes", no_argument, 0, 'n'},
4223 {"dynamic", no_argument, 0, 'd'},
4224 {"arch-specific", no_argument, 0, 'A'},
4225 {"version-info", no_argument, 0, 'V'},
4226 {"use-dynamic", no_argument, 0, 'D'},
4227 {"unwind", no_argument, 0, 'u'},
4228 {"archive-index", no_argument, 0, 'c'},
4229 {"hex-dump", required_argument, 0, 'x'},
4230 {"relocated-dump", required_argument, 0, 'R'},
4231 {"string-dump", required_argument, 0, 'p'},
4232 {"decompress", no_argument, 0, 'z'},
4233 #ifdef SUPPORT_DISASSEMBLY
4234 {"instruction-dump", required_argument, 0, 'i'},
4235 #endif
4236 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4237
4238 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4239 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4240 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4241
4242 {"version", no_argument, 0, 'v'},
4243 {"wide", no_argument, 0, 'W'},
4244 {"help", no_argument, 0, 'H'},
4245 {0, no_argument, 0, 0}
4246 };
4247
4248 static void
4249 usage (FILE * stream)
4250 {
4251 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4252 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4253 fprintf (stream, _(" Options are:\n\
4254 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4255 -h --file-header Display the ELF file header\n\
4256 -l --program-headers Display the program headers\n\
4257 --segments An alias for --program-headers\n\
4258 -S --section-headers Display the sections' header\n\
4259 --sections An alias for --section-headers\n\
4260 -g --section-groups Display the section groups\n\
4261 -t --section-details Display the section details\n\
4262 -e --headers Equivalent to: -h -l -S\n\
4263 -s --syms Display the symbol table\n\
4264 --symbols An alias for --syms\n\
4265 --dyn-syms Display the dynamic symbol table\n\
4266 -n --notes Display the core notes (if present)\n\
4267 -r --relocs Display the relocations (if present)\n\
4268 -u --unwind Display the unwind info (if present)\n\
4269 -d --dynamic Display the dynamic section (if present)\n\
4270 -V --version-info Display the version sections (if present)\n\
4271 -A --arch-specific Display architecture specific information (if any)\n\
4272 -c --archive-index Display the symbol/file index in an archive\n\
4273 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4274 -x --hex-dump=<number|name>\n\
4275 Dump the contents of section <number|name> as bytes\n\
4276 -p --string-dump=<number|name>\n\
4277 Dump the contents of section <number|name> as strings\n\
4278 -R --relocated-dump=<number|name>\n\
4279 Dump the contents of section <number|name> as relocated bytes\n\
4280 -z --decompress Decompress section before dumping it\n\
4281 -w[lLiaprmfFsoRt] or\n\
4282 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4283 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4284 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4285 =addr,=cu_index]\n\
4286 Display the contents of DWARF2 debug sections\n"));
4287 fprintf (stream, _("\
4288 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4289 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4290 or deeper\n"));
4291 #ifdef SUPPORT_DISASSEMBLY
4292 fprintf (stream, _("\
4293 -i --instruction-dump=<number|name>\n\
4294 Disassemble the contents of section <number|name>\n"));
4295 #endif
4296 fprintf (stream, _("\
4297 -I --histogram Display histogram of bucket list lengths\n\
4298 -W --wide Allow output width to exceed 80 characters\n\
4299 @<file> Read options from <file>\n\
4300 -H --help Display this information\n\
4301 -v --version Display the version number of readelf\n"));
4302
4303 if (REPORT_BUGS_TO[0] && stream == stdout)
4304 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4305
4306 exit (stream == stdout ? 0 : 1);
4307 }
4308
4309 /* Record the fact that the user wants the contents of section number
4310 SECTION to be displayed using the method(s) encoded as flags bits
4311 in TYPE. Note, TYPE can be zero if we are creating the array for
4312 the first time. */
4313
4314 static void
4315 request_dump_bynumber (unsigned int section, dump_type type)
4316 {
4317 if (section >= num_dump_sects)
4318 {
4319 dump_type * new_dump_sects;
4320
4321 new_dump_sects = (dump_type *) calloc (section + 1,
4322 sizeof (* dump_sects));
4323
4324 if (new_dump_sects == NULL)
4325 error (_("Out of memory allocating dump request table.\n"));
4326 else
4327 {
4328 if (dump_sects)
4329 {
4330 /* Copy current flag settings. */
4331 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4332
4333 free (dump_sects);
4334 }
4335
4336 dump_sects = new_dump_sects;
4337 num_dump_sects = section + 1;
4338 }
4339 }
4340
4341 if (dump_sects)
4342 dump_sects[section] |= type;
4343
4344 return;
4345 }
4346
4347 /* Request a dump by section name. */
4348
4349 static void
4350 request_dump_byname (const char * section, dump_type type)
4351 {
4352 struct dump_list_entry * new_request;
4353
4354 new_request = (struct dump_list_entry *)
4355 malloc (sizeof (struct dump_list_entry));
4356 if (!new_request)
4357 error (_("Out of memory allocating dump request table.\n"));
4358
4359 new_request->name = strdup (section);
4360 if (!new_request->name)
4361 error (_("Out of memory allocating dump request table.\n"));
4362
4363 new_request->type = type;
4364
4365 new_request->next = dump_sects_byname;
4366 dump_sects_byname = new_request;
4367 }
4368
4369 static inline void
4370 request_dump (dump_type type)
4371 {
4372 int section;
4373 char * cp;
4374
4375 do_dump++;
4376 section = strtoul (optarg, & cp, 0);
4377
4378 if (! *cp && section >= 0)
4379 request_dump_bynumber (section, type);
4380 else
4381 request_dump_byname (optarg, type);
4382 }
4383
4384
4385 static void
4386 parse_args (int argc, char ** argv)
4387 {
4388 int c;
4389
4390 if (argc < 2)
4391 usage (stderr);
4392
4393 while ((c = getopt_long
4394 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4395 {
4396 switch (c)
4397 {
4398 case 0:
4399 /* Long options. */
4400 break;
4401 case 'H':
4402 usage (stdout);
4403 break;
4404
4405 case 'a':
4406 do_syms = TRUE;
4407 do_reloc = TRUE;
4408 do_unwind = TRUE;
4409 do_dynamic = TRUE;
4410 do_header = TRUE;
4411 do_sections = TRUE;
4412 do_section_groups = TRUE;
4413 do_segments = TRUE;
4414 do_version = TRUE;
4415 do_histogram = TRUE;
4416 do_arch = TRUE;
4417 do_notes = TRUE;
4418 break;
4419 case 'g':
4420 do_section_groups = TRUE;
4421 break;
4422 case 't':
4423 case 'N':
4424 do_sections = TRUE;
4425 do_section_details = TRUE;
4426 break;
4427 case 'e':
4428 do_header = TRUE;
4429 do_sections = TRUE;
4430 do_segments = TRUE;
4431 break;
4432 case 'A':
4433 do_arch = TRUE;
4434 break;
4435 case 'D':
4436 do_using_dynamic = TRUE;
4437 break;
4438 case 'r':
4439 do_reloc = TRUE;
4440 break;
4441 case 'u':
4442 do_unwind = TRUE;
4443 break;
4444 case 'h':
4445 do_header = TRUE;
4446 break;
4447 case 'l':
4448 do_segments = TRUE;
4449 break;
4450 case 's':
4451 do_syms = TRUE;
4452 break;
4453 case 'S':
4454 do_sections = TRUE;
4455 break;
4456 case 'd':
4457 do_dynamic = TRUE;
4458 break;
4459 case 'I':
4460 do_histogram = TRUE;
4461 break;
4462 case 'n':
4463 do_notes = TRUE;
4464 break;
4465 case 'c':
4466 do_archive_index = TRUE;
4467 break;
4468 case 'x':
4469 request_dump (HEX_DUMP);
4470 break;
4471 case 'p':
4472 request_dump (STRING_DUMP);
4473 break;
4474 case 'R':
4475 request_dump (RELOC_DUMP);
4476 break;
4477 case 'z':
4478 decompress_dumps = TRUE;
4479 break;
4480 case 'w':
4481 do_dump = TRUE;
4482 if (optarg == 0)
4483 {
4484 do_debugging = TRUE;
4485 dwarf_select_sections_all ();
4486 }
4487 else
4488 {
4489 do_debugging = FALSE;
4490 dwarf_select_sections_by_letters (optarg);
4491 }
4492 break;
4493 case OPTION_DEBUG_DUMP:
4494 do_dump = TRUE;
4495 if (optarg == 0)
4496 do_debugging = TRUE;
4497 else
4498 {
4499 do_debugging = FALSE;
4500 dwarf_select_sections_by_names (optarg);
4501 }
4502 break;
4503 case OPTION_DWARF_DEPTH:
4504 {
4505 char *cp;
4506
4507 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4508 }
4509 break;
4510 case OPTION_DWARF_START:
4511 {
4512 char *cp;
4513
4514 dwarf_start_die = strtoul (optarg, & cp, 0);
4515 }
4516 break;
4517 case OPTION_DWARF_CHECK:
4518 dwarf_check = TRUE;
4519 break;
4520 case OPTION_DYN_SYMS:
4521 do_dyn_syms = TRUE;
4522 break;
4523 #ifdef SUPPORT_DISASSEMBLY
4524 case 'i':
4525 request_dump (DISASS_DUMP);
4526 break;
4527 #endif
4528 case 'v':
4529 print_version (program_name);
4530 break;
4531 case 'V':
4532 do_version = TRUE;
4533 break;
4534 case 'W':
4535 do_wide = TRUE;
4536 break;
4537 default:
4538 /* xgettext:c-format */
4539 error (_("Invalid option '-%c'\n"), c);
4540 /* Fall through. */
4541 case '?':
4542 usage (stderr);
4543 }
4544 }
4545
4546 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4547 && !do_segments && !do_header && !do_dump && !do_version
4548 && !do_histogram && !do_debugging && !do_arch && !do_notes
4549 && !do_section_groups && !do_archive_index
4550 && !do_dyn_syms)
4551 usage (stderr);
4552 }
4553
4554 static const char *
4555 get_elf_class (unsigned int elf_class)
4556 {
4557 static char buff[32];
4558
4559 switch (elf_class)
4560 {
4561 case ELFCLASSNONE: return _("none");
4562 case ELFCLASS32: return "ELF32";
4563 case ELFCLASS64: return "ELF64";
4564 default:
4565 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4566 return buff;
4567 }
4568 }
4569
4570 static const char *
4571 get_data_encoding (unsigned int encoding)
4572 {
4573 static char buff[32];
4574
4575 switch (encoding)
4576 {
4577 case ELFDATANONE: return _("none");
4578 case ELFDATA2LSB: return _("2's complement, little endian");
4579 case ELFDATA2MSB: return _("2's complement, big endian");
4580 default:
4581 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4582 return buff;
4583 }
4584 }
4585
4586 /* Decode the data held in 'elf_header'. */
4587
4588 static bfd_boolean
4589 process_file_header (void)
4590 {
4591 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4592 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4593 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4594 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4595 {
4596 error
4597 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4598 return FALSE;
4599 }
4600
4601 init_dwarf_regnames (elf_header.e_machine);
4602
4603 if (do_header)
4604 {
4605 unsigned i;
4606
4607 printf (_("ELF Header:\n"));
4608 printf (_(" Magic: "));
4609 for (i = 0; i < EI_NIDENT; i++)
4610 printf ("%2.2x ", elf_header.e_ident[i]);
4611 printf ("\n");
4612 printf (_(" Class: %s\n"),
4613 get_elf_class (elf_header.e_ident[EI_CLASS]));
4614 printf (_(" Data: %s\n"),
4615 get_data_encoding (elf_header.e_ident[EI_DATA]));
4616 printf (_(" Version: %d %s\n"),
4617 elf_header.e_ident[EI_VERSION],
4618 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4619 ? "(current)"
4620 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4621 ? _("<unknown: %lx>")
4622 : "")));
4623 printf (_(" OS/ABI: %s\n"),
4624 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4625 printf (_(" ABI Version: %d\n"),
4626 elf_header.e_ident[EI_ABIVERSION]);
4627 printf (_(" Type: %s\n"),
4628 get_file_type (elf_header.e_type));
4629 printf (_(" Machine: %s\n"),
4630 get_machine_name (elf_header.e_machine));
4631 printf (_(" Version: 0x%lx\n"),
4632 (unsigned long) elf_header.e_version);
4633
4634 printf (_(" Entry point address: "));
4635 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4636 printf (_("\n Start of program headers: "));
4637 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4638 printf (_(" (bytes into file)\n Start of section headers: "));
4639 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4640 printf (_(" (bytes into file)\n"));
4641
4642 printf (_(" Flags: 0x%lx%s\n"),
4643 (unsigned long) elf_header.e_flags,
4644 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4645 printf (_(" Size of this header: %ld (bytes)\n"),
4646 (long) elf_header.e_ehsize);
4647 printf (_(" Size of program headers: %ld (bytes)\n"),
4648 (long) elf_header.e_phentsize);
4649 printf (_(" Number of program headers: %ld"),
4650 (long) elf_header.e_phnum);
4651 if (section_headers != NULL
4652 && elf_header.e_phnum == PN_XNUM
4653 && section_headers[0].sh_info != 0)
4654 printf (" (%ld)", (long) section_headers[0].sh_info);
4655 putc ('\n', stdout);
4656 printf (_(" Size of section headers: %ld (bytes)\n"),
4657 (long) elf_header.e_shentsize);
4658 printf (_(" Number of section headers: %ld"),
4659 (long) elf_header.e_shnum);
4660 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4661 printf (" (%ld)", (long) section_headers[0].sh_size);
4662 putc ('\n', stdout);
4663 printf (_(" Section header string table index: %ld"),
4664 (long) elf_header.e_shstrndx);
4665 if (section_headers != NULL
4666 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4667 printf (" (%u)", section_headers[0].sh_link);
4668 else if (elf_header.e_shstrndx != SHN_UNDEF
4669 && elf_header.e_shstrndx >= elf_header.e_shnum)
4670 printf (_(" <corrupt: out of range>"));
4671 putc ('\n', stdout);
4672 }
4673
4674 if (section_headers != NULL)
4675 {
4676 if (elf_header.e_phnum == PN_XNUM
4677 && section_headers[0].sh_info != 0)
4678 elf_header.e_phnum = section_headers[0].sh_info;
4679 if (elf_header.e_shnum == SHN_UNDEF)
4680 elf_header.e_shnum = section_headers[0].sh_size;
4681 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4682 elf_header.e_shstrndx = section_headers[0].sh_link;
4683 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4684 elf_header.e_shstrndx = SHN_UNDEF;
4685 free (section_headers);
4686 section_headers = NULL;
4687 }
4688
4689 return TRUE;
4690 }
4691
4692 static bfd_boolean
4693 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4694 {
4695 Elf32_External_Phdr * phdrs;
4696 Elf32_External_Phdr * external;
4697 Elf_Internal_Phdr * internal;
4698 unsigned int i;
4699 unsigned int size = elf_header.e_phentsize;
4700 unsigned int num = elf_header.e_phnum;
4701
4702 /* PR binutils/17531: Cope with unexpected section header sizes. */
4703 if (size == 0 || num == 0)
4704 return FALSE;
4705 if (size < sizeof * phdrs)
4706 {
4707 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4708 return FALSE;
4709 }
4710 if (size > sizeof * phdrs)
4711 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4712
4713 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4714 size, num, _("program headers"));
4715 if (phdrs == NULL)
4716 return FALSE;
4717
4718 for (i = 0, internal = pheaders, external = phdrs;
4719 i < elf_header.e_phnum;
4720 i++, internal++, external++)
4721 {
4722 internal->p_type = BYTE_GET (external->p_type);
4723 internal->p_offset = BYTE_GET (external->p_offset);
4724 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4725 internal->p_paddr = BYTE_GET (external->p_paddr);
4726 internal->p_filesz = BYTE_GET (external->p_filesz);
4727 internal->p_memsz = BYTE_GET (external->p_memsz);
4728 internal->p_flags = BYTE_GET (external->p_flags);
4729 internal->p_align = BYTE_GET (external->p_align);
4730 }
4731
4732 free (phdrs);
4733 return TRUE;
4734 }
4735
4736 static bfd_boolean
4737 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4738 {
4739 Elf64_External_Phdr * phdrs;
4740 Elf64_External_Phdr * external;
4741 Elf_Internal_Phdr * internal;
4742 unsigned int i;
4743 unsigned int size = elf_header.e_phentsize;
4744 unsigned int num = elf_header.e_phnum;
4745
4746 /* PR binutils/17531: Cope with unexpected section header sizes. */
4747 if (size == 0 || num == 0)
4748 return FALSE;
4749 if (size < sizeof * phdrs)
4750 {
4751 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4752 return FALSE;
4753 }
4754 if (size > sizeof * phdrs)
4755 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4756
4757 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4758 size, num, _("program headers"));
4759 if (!phdrs)
4760 return FALSE;
4761
4762 for (i = 0, internal = pheaders, external = phdrs;
4763 i < elf_header.e_phnum;
4764 i++, internal++, external++)
4765 {
4766 internal->p_type = BYTE_GET (external->p_type);
4767 internal->p_flags = BYTE_GET (external->p_flags);
4768 internal->p_offset = BYTE_GET (external->p_offset);
4769 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4770 internal->p_paddr = BYTE_GET (external->p_paddr);
4771 internal->p_filesz = BYTE_GET (external->p_filesz);
4772 internal->p_memsz = BYTE_GET (external->p_memsz);
4773 internal->p_align = BYTE_GET (external->p_align);
4774 }
4775
4776 free (phdrs);
4777 return TRUE;
4778 }
4779
4780 /* Returns TRUE if the program headers were read into `program_headers'. */
4781
4782 static bfd_boolean
4783 get_program_headers (FILE * file)
4784 {
4785 Elf_Internal_Phdr * phdrs;
4786
4787 /* Check cache of prior read. */
4788 if (program_headers != NULL)
4789 return TRUE;
4790
4791 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4792 sizeof (Elf_Internal_Phdr));
4793
4794 if (phdrs == NULL)
4795 {
4796 error (_("Out of memory reading %u program headers\n"),
4797 elf_header.e_phnum);
4798 return FALSE;
4799 }
4800
4801 if (is_32bit_elf
4802 ? get_32bit_program_headers (file, phdrs)
4803 : get_64bit_program_headers (file, phdrs))
4804 {
4805 program_headers = phdrs;
4806 return TRUE;
4807 }
4808
4809 free (phdrs);
4810 return FALSE;
4811 }
4812
4813 /* Returns TRUE if the program headers were loaded. */
4814
4815 static bfd_boolean
4816 process_program_headers (FILE * file)
4817 {
4818 Elf_Internal_Phdr * segment;
4819 unsigned int i;
4820 Elf_Internal_Phdr * previous_load = NULL;
4821
4822 if (elf_header.e_phnum == 0)
4823 {
4824 /* PR binutils/12467. */
4825 if (elf_header.e_phoff != 0)
4826 {
4827 warn (_("possibly corrupt ELF header - it has a non-zero program"
4828 " header offset, but no program headers\n"));
4829 return FALSE;
4830 }
4831 else if (do_segments)
4832 printf (_("\nThere are no program headers in this file.\n"));
4833 return TRUE;
4834 }
4835
4836 if (do_segments && !do_header)
4837 {
4838 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4839 printf (_("Entry point "));
4840 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4841 printf (_("\nThere are %d program headers, starting at offset "),
4842 elf_header.e_phnum);
4843 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4844 printf ("\n");
4845 }
4846
4847 if (! get_program_headers (file))
4848 return TRUE;
4849
4850 if (do_segments)
4851 {
4852 if (elf_header.e_phnum > 1)
4853 printf (_("\nProgram Headers:\n"));
4854 else
4855 printf (_("\nProgram Headers:\n"));
4856
4857 if (is_32bit_elf)
4858 printf
4859 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4860 else if (do_wide)
4861 printf
4862 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4863 else
4864 {
4865 printf
4866 (_(" Type Offset VirtAddr PhysAddr\n"));
4867 printf
4868 (_(" FileSiz MemSiz Flags Align\n"));
4869 }
4870 }
4871
4872 dynamic_addr = 0;
4873 dynamic_size = 0;
4874
4875 for (i = 0, segment = program_headers;
4876 i < elf_header.e_phnum;
4877 i++, segment++)
4878 {
4879 if (do_segments)
4880 {
4881 printf (" %-14.14s ", get_segment_type (segment->p_type));
4882
4883 if (is_32bit_elf)
4884 {
4885 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4886 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4887 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4888 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4889 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4890 printf ("%c%c%c ",
4891 (segment->p_flags & PF_R ? 'R' : ' '),
4892 (segment->p_flags & PF_W ? 'W' : ' '),
4893 (segment->p_flags & PF_X ? 'E' : ' '));
4894 printf ("%#lx", (unsigned long) segment->p_align);
4895 }
4896 else if (do_wide)
4897 {
4898 if ((unsigned long) segment->p_offset == segment->p_offset)
4899 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4900 else
4901 {
4902 print_vma (segment->p_offset, FULL_HEX);
4903 putchar (' ');
4904 }
4905
4906 print_vma (segment->p_vaddr, FULL_HEX);
4907 putchar (' ');
4908 print_vma (segment->p_paddr, FULL_HEX);
4909 putchar (' ');
4910
4911 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4912 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4913 else
4914 {
4915 print_vma (segment->p_filesz, FULL_HEX);
4916 putchar (' ');
4917 }
4918
4919 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4920 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4921 else
4922 {
4923 print_vma (segment->p_memsz, FULL_HEX);
4924 }
4925
4926 printf (" %c%c%c ",
4927 (segment->p_flags & PF_R ? 'R' : ' '),
4928 (segment->p_flags & PF_W ? 'W' : ' '),
4929 (segment->p_flags & PF_X ? 'E' : ' '));
4930
4931 if ((unsigned long) segment->p_align == segment->p_align)
4932 printf ("%#lx", (unsigned long) segment->p_align);
4933 else
4934 {
4935 print_vma (segment->p_align, PREFIX_HEX);
4936 }
4937 }
4938 else
4939 {
4940 print_vma (segment->p_offset, FULL_HEX);
4941 putchar (' ');
4942 print_vma (segment->p_vaddr, FULL_HEX);
4943 putchar (' ');
4944 print_vma (segment->p_paddr, FULL_HEX);
4945 printf ("\n ");
4946 print_vma (segment->p_filesz, FULL_HEX);
4947 putchar (' ');
4948 print_vma (segment->p_memsz, FULL_HEX);
4949 printf (" %c%c%c ",
4950 (segment->p_flags & PF_R ? 'R' : ' '),
4951 (segment->p_flags & PF_W ? 'W' : ' '),
4952 (segment->p_flags & PF_X ? 'E' : ' '));
4953 print_vma (segment->p_align, PREFIX_HEX);
4954 }
4955
4956 putc ('\n', stdout);
4957 }
4958
4959 switch (segment->p_type)
4960 {
4961 case PT_LOAD:
4962 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
4963 required by the ELF standard, several programs, including the Linux
4964 kernel, make use of non-ordered segments. */
4965 if (previous_load
4966 && previous_load->p_vaddr > segment->p_vaddr)
4967 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4968 #endif
4969 if (segment->p_memsz < segment->p_filesz)
4970 error (_("the segment's file size is larger than its memory size\n"));
4971 previous_load = segment;
4972 break;
4973
4974 case PT_PHDR:
4975 /* PR 20815 - Verify that the program header is loaded into memory. */
4976 if (i > 0 && previous_load != NULL)
4977 error (_("the PHDR segment must occur before any LOAD segment\n"));
4978 if (elf_header.e_machine != EM_PARISC)
4979 {
4980 unsigned int j;
4981
4982 for (j = 1; j < elf_header.e_phnum; j++)
4983 if (program_headers[j].p_vaddr <= segment->p_vaddr
4984 && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4985 >= (segment->p_vaddr + segment->p_filesz))
4986 break;
4987 if (j == elf_header.e_phnum)
4988 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4989 }
4990 break;
4991
4992 case PT_DYNAMIC:
4993 if (dynamic_addr)
4994 error (_("more than one dynamic segment\n"));
4995
4996 /* By default, assume that the .dynamic section is the first
4997 section in the DYNAMIC segment. */
4998 dynamic_addr = segment->p_offset;
4999 dynamic_size = segment->p_filesz;
5000 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
5001 if (dynamic_addr + dynamic_size >= current_file_size)
5002 {
5003 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5004 dynamic_addr = dynamic_size = 0;
5005 }
5006
5007 /* Try to locate the .dynamic section. If there is
5008 a section header table, we can easily locate it. */
5009 if (section_headers != NULL)
5010 {
5011 Elf_Internal_Shdr * sec;
5012
5013 sec = find_section (".dynamic");
5014 if (sec == NULL || sec->sh_size == 0)
5015 {
5016 /* A corresponding .dynamic section is expected, but on
5017 IA-64/OpenVMS it is OK for it to be missing. */
5018 if (!is_ia64_vms ())
5019 error (_("no .dynamic section in the dynamic segment\n"));
5020 break;
5021 }
5022
5023 if (sec->sh_type == SHT_NOBITS)
5024 {
5025 dynamic_size = 0;
5026 break;
5027 }
5028
5029 dynamic_addr = sec->sh_offset;
5030 dynamic_size = sec->sh_size;
5031
5032 if (dynamic_addr < segment->p_offset
5033 || dynamic_addr > segment->p_offset + segment->p_filesz)
5034 warn (_("the .dynamic section is not contained"
5035 " within the dynamic segment\n"));
5036 else if (dynamic_addr > segment->p_offset)
5037 warn (_("the .dynamic section is not the first section"
5038 " in the dynamic segment.\n"));
5039 }
5040 break;
5041
5042 case PT_INTERP:
5043 if (fseek (file, archive_file_offset + (long) segment->p_offset,
5044 SEEK_SET))
5045 error (_("Unable to find program interpreter name\n"));
5046 else
5047 {
5048 char fmt [32];
5049 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5050
5051 if (ret >= (int) sizeof (fmt) || ret < 0)
5052 error (_("Internal error: failed to create format string to display program interpreter\n"));
5053
5054 program_interpreter[0] = 0;
5055 if (fscanf (file, fmt, program_interpreter) <= 0)
5056 error (_("Unable to read program interpreter name\n"));
5057
5058 if (do_segments)
5059 printf (_(" [Requesting program interpreter: %s]\n"),
5060 program_interpreter);
5061 }
5062 break;
5063 }
5064 }
5065
5066 if (do_segments && section_headers != NULL && string_table != NULL)
5067 {
5068 printf (_("\n Section to Segment mapping:\n"));
5069 printf (_(" Segment Sections...\n"));
5070
5071 for (i = 0; i < elf_header.e_phnum; i++)
5072 {
5073 unsigned int j;
5074 Elf_Internal_Shdr * section;
5075
5076 segment = program_headers + i;
5077 section = section_headers + 1;
5078
5079 printf (" %2.2d ", i);
5080
5081 for (j = 1; j < elf_header.e_shnum; j++, section++)
5082 {
5083 if (!ELF_TBSS_SPECIAL (section, segment)
5084 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5085 printf ("%s ", printable_section_name (section));
5086 }
5087
5088 putc ('\n',stdout);
5089 }
5090 }
5091
5092 return TRUE;
5093 }
5094
5095
5096 /* Find the file offset corresponding to VMA by using the program headers. */
5097
5098 static long
5099 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
5100 {
5101 Elf_Internal_Phdr * seg;
5102
5103 if (! get_program_headers (file))
5104 {
5105 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5106 return (long) vma;
5107 }
5108
5109 for (seg = program_headers;
5110 seg < program_headers + elf_header.e_phnum;
5111 ++seg)
5112 {
5113 if (seg->p_type != PT_LOAD)
5114 continue;
5115
5116 if (vma >= (seg->p_vaddr & -seg->p_align)
5117 && vma + size <= seg->p_vaddr + seg->p_filesz)
5118 return vma - seg->p_vaddr + seg->p_offset;
5119 }
5120
5121 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5122 (unsigned long) vma);
5123 return (long) vma;
5124 }
5125
5126
5127 /* Allocate memory and load the sections headers into the global pointer
5128 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5129 generate any error messages if the load fails. */
5130
5131 static bfd_boolean
5132 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5133 {
5134 Elf32_External_Shdr * shdrs;
5135 Elf_Internal_Shdr * internal;
5136 unsigned int i;
5137 unsigned int size = elf_header.e_shentsize;
5138 unsigned int num = probe ? 1 : elf_header.e_shnum;
5139
5140 /* PR binutils/17531: Cope with unexpected section header sizes. */
5141 if (size == 0 || num == 0)
5142 return FALSE;
5143 if (size < sizeof * shdrs)
5144 {
5145 if (! probe)
5146 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5147 return FALSE;
5148 }
5149 if (!probe && size > sizeof * shdrs)
5150 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5151
5152 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5153 size, num,
5154 probe ? NULL : _("section headers"));
5155 if (shdrs == NULL)
5156 return FALSE;
5157
5158 if (section_headers != NULL)
5159 free (section_headers);
5160 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5161 sizeof (Elf_Internal_Shdr));
5162 if (section_headers == NULL)
5163 {
5164 if (!probe)
5165 error (_("Out of memory reading %u section headers\n"), num);
5166 return FALSE;
5167 }
5168
5169 for (i = 0, internal = section_headers;
5170 i < num;
5171 i++, internal++)
5172 {
5173 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5174 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5175 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5176 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5177 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5178 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5179 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5180 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5181 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5182 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5183 if (!probe && internal->sh_link > num)
5184 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5185 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5186 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5187 }
5188
5189 free (shdrs);
5190 return TRUE;
5191 }
5192
5193 static bfd_boolean
5194 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5195 {
5196 Elf64_External_Shdr * shdrs;
5197 Elf_Internal_Shdr * internal;
5198 unsigned int i;
5199 unsigned int size = elf_header.e_shentsize;
5200 unsigned int num = probe ? 1 : elf_header.e_shnum;
5201
5202 /* PR binutils/17531: Cope with unexpected section header sizes. */
5203 if (size == 0 || num == 0)
5204 return FALSE;
5205 if (size < sizeof * shdrs)
5206 {
5207 if (! probe)
5208 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5209 return FALSE;
5210 }
5211 if (! probe && size > sizeof * shdrs)
5212 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5213
5214 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5215 size, num,
5216 probe ? NULL : _("section headers"));
5217 if (shdrs == NULL)
5218 return FALSE;
5219
5220 if (section_headers != NULL)
5221 free (section_headers);
5222 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5223 sizeof (Elf_Internal_Shdr));
5224 if (section_headers == NULL)
5225 {
5226 if (! probe)
5227 error (_("Out of memory reading %u section headers\n"), num);
5228 return FALSE;
5229 }
5230
5231 for (i = 0, internal = section_headers;
5232 i < num;
5233 i++, internal++)
5234 {
5235 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5236 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5237 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5238 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5239 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5240 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5241 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5242 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5243 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5244 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5245 if (!probe && internal->sh_link > num)
5246 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5247 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5248 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5249 }
5250
5251 free (shdrs);
5252 return TRUE;
5253 }
5254
5255 static Elf_Internal_Sym *
5256 get_32bit_elf_symbols (FILE * file,
5257 Elf_Internal_Shdr * section,
5258 unsigned long * num_syms_return)
5259 {
5260 unsigned long number = 0;
5261 Elf32_External_Sym * esyms = NULL;
5262 Elf_External_Sym_Shndx * shndx = NULL;
5263 Elf_Internal_Sym * isyms = NULL;
5264 Elf_Internal_Sym * psym;
5265 unsigned int j;
5266
5267 if (section->sh_size == 0)
5268 {
5269 if (num_syms_return != NULL)
5270 * num_syms_return = 0;
5271 return NULL;
5272 }
5273
5274 /* Run some sanity checks first. */
5275 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5276 {
5277 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5278 printable_section_name (section), (unsigned long) section->sh_entsize);
5279 goto exit_point;
5280 }
5281
5282 if (section->sh_size > current_file_size)
5283 {
5284 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5285 printable_section_name (section), (unsigned long) section->sh_size);
5286 goto exit_point;
5287 }
5288
5289 number = section->sh_size / section->sh_entsize;
5290
5291 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5292 {
5293 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5294 (unsigned long) section->sh_size,
5295 printable_section_name (section),
5296 (unsigned long) section->sh_entsize);
5297 goto exit_point;
5298 }
5299
5300 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5301 section->sh_size, _("symbols"));
5302 if (esyms == NULL)
5303 goto exit_point;
5304
5305 {
5306 elf_section_list * entry;
5307
5308 shndx = NULL;
5309 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5310 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5311 {
5312 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5313 entry->hdr->sh_offset,
5314 1, entry->hdr->sh_size,
5315 _("symbol table section indicies"));
5316 if (shndx == NULL)
5317 goto exit_point;
5318 /* PR17531: file: heap-buffer-overflow */
5319 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5320 {
5321 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5322 printable_section_name (entry->hdr),
5323 (unsigned long) entry->hdr->sh_size,
5324 (unsigned long) section->sh_size);
5325 goto exit_point;
5326 }
5327 }
5328 }
5329
5330 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5331
5332 if (isyms == NULL)
5333 {
5334 error (_("Out of memory reading %lu symbols\n"),
5335 (unsigned long) number);
5336 goto exit_point;
5337 }
5338
5339 for (j = 0, psym = isyms; j < number; j++, psym++)
5340 {
5341 psym->st_name = BYTE_GET (esyms[j].st_name);
5342 psym->st_value = BYTE_GET (esyms[j].st_value);
5343 psym->st_size = BYTE_GET (esyms[j].st_size);
5344 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5345 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5346 psym->st_shndx
5347 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5348 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5349 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5350 psym->st_info = BYTE_GET (esyms[j].st_info);
5351 psym->st_other = BYTE_GET (esyms[j].st_other);
5352 }
5353
5354 exit_point:
5355 if (shndx != NULL)
5356 free (shndx);
5357 if (esyms != NULL)
5358 free (esyms);
5359
5360 if (num_syms_return != NULL)
5361 * num_syms_return = isyms == NULL ? 0 : number;
5362
5363 return isyms;
5364 }
5365
5366 static Elf_Internal_Sym *
5367 get_64bit_elf_symbols (FILE * file,
5368 Elf_Internal_Shdr * section,
5369 unsigned long * num_syms_return)
5370 {
5371 unsigned long number = 0;
5372 Elf64_External_Sym * esyms = NULL;
5373 Elf_External_Sym_Shndx * shndx = NULL;
5374 Elf_Internal_Sym * isyms = NULL;
5375 Elf_Internal_Sym * psym;
5376 unsigned int j;
5377
5378 if (section->sh_size == 0)
5379 {
5380 if (num_syms_return != NULL)
5381 * num_syms_return = 0;
5382 return NULL;
5383 }
5384
5385 /* Run some sanity checks first. */
5386 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5387 {
5388 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5389 printable_section_name (section),
5390 (unsigned long) section->sh_entsize);
5391 goto exit_point;
5392 }
5393
5394 if (section->sh_size > current_file_size)
5395 {
5396 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5397 printable_section_name (section),
5398 (unsigned long) section->sh_size);
5399 goto exit_point;
5400 }
5401
5402 number = section->sh_size / section->sh_entsize;
5403
5404 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5405 {
5406 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5407 (unsigned long) section->sh_size,
5408 printable_section_name (section),
5409 (unsigned long) section->sh_entsize);
5410 goto exit_point;
5411 }
5412
5413 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5414 section->sh_size, _("symbols"));
5415 if (!esyms)
5416 goto exit_point;
5417
5418 {
5419 elf_section_list * entry;
5420
5421 shndx = NULL;
5422 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5423 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5424 {
5425 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5426 entry->hdr->sh_offset,
5427 1, entry->hdr->sh_size,
5428 _("symbol table section indicies"));
5429 if (shndx == NULL)
5430 goto exit_point;
5431 /* PR17531: file: heap-buffer-overflow */
5432 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5433 {
5434 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5435 printable_section_name (entry->hdr),
5436 (unsigned long) entry->hdr->sh_size,
5437 (unsigned long) section->sh_size);
5438 goto exit_point;
5439 }
5440 }
5441 }
5442
5443 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5444
5445 if (isyms == NULL)
5446 {
5447 error (_("Out of memory reading %lu symbols\n"),
5448 (unsigned long) number);
5449 goto exit_point;
5450 }
5451
5452 for (j = 0, psym = isyms; j < number; j++, psym++)
5453 {
5454 psym->st_name = BYTE_GET (esyms[j].st_name);
5455 psym->st_info = BYTE_GET (esyms[j].st_info);
5456 psym->st_other = BYTE_GET (esyms[j].st_other);
5457 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5458
5459 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5460 psym->st_shndx
5461 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5462 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5463 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5464
5465 psym->st_value = BYTE_GET (esyms[j].st_value);
5466 psym->st_size = BYTE_GET (esyms[j].st_size);
5467 }
5468
5469 exit_point:
5470 if (shndx != NULL)
5471 free (shndx);
5472 if (esyms != NULL)
5473 free (esyms);
5474
5475 if (num_syms_return != NULL)
5476 * num_syms_return = isyms == NULL ? 0 : number;
5477
5478 return isyms;
5479 }
5480
5481 static const char *
5482 get_elf_section_flags (bfd_vma sh_flags)
5483 {
5484 static char buff[1024];
5485 char * p = buff;
5486 unsigned int field_size = is_32bit_elf ? 8 : 16;
5487 signed int sindex;
5488 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5489 bfd_vma os_flags = 0;
5490 bfd_vma proc_flags = 0;
5491 bfd_vma unknown_flags = 0;
5492 static const struct
5493 {
5494 const char * str;
5495 unsigned int len;
5496 }
5497 flags [] =
5498 {
5499 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5500 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5501 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5502 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5503 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5504 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5505 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5506 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5507 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5508 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5509 /* IA-64 specific. */
5510 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5511 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5512 /* IA-64 OpenVMS specific. */
5513 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5514 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5515 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5516 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5517 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5518 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5519 /* Generic. */
5520 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5521 /* SPARC specific. */
5522 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5523 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5524 /* ARM specific. */
5525 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5526 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5527 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5528 };
5529
5530 if (do_section_details)
5531 {
5532 sprintf (buff, "[%*.*lx]: ",
5533 field_size, field_size, (unsigned long) sh_flags);
5534 p += field_size + 4;
5535 }
5536
5537 while (sh_flags)
5538 {
5539 bfd_vma flag;
5540
5541 flag = sh_flags & - sh_flags;
5542 sh_flags &= ~ flag;
5543
5544 if (do_section_details)
5545 {
5546 switch (flag)
5547 {
5548 case SHF_WRITE: sindex = 0; break;
5549 case SHF_ALLOC: sindex = 1; break;
5550 case SHF_EXECINSTR: sindex = 2; break;
5551 case SHF_MERGE: sindex = 3; break;
5552 case SHF_STRINGS: sindex = 4; break;
5553 case SHF_INFO_LINK: sindex = 5; break;
5554 case SHF_LINK_ORDER: sindex = 6; break;
5555 case SHF_OS_NONCONFORMING: sindex = 7; break;
5556 case SHF_GROUP: sindex = 8; break;
5557 case SHF_TLS: sindex = 9; break;
5558 case SHF_EXCLUDE: sindex = 18; break;
5559 case SHF_COMPRESSED: sindex = 20; break;
5560
5561 default:
5562 sindex = -1;
5563 switch (elf_header.e_machine)
5564 {
5565 case EM_IA_64:
5566 if (flag == SHF_IA_64_SHORT)
5567 sindex = 10;
5568 else if (flag == SHF_IA_64_NORECOV)
5569 sindex = 11;
5570 #ifdef BFD64
5571 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5572 switch (flag)
5573 {
5574 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5575 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5576 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5577 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5578 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5579 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5580 default: break;
5581 }
5582 #endif
5583 break;
5584
5585 case EM_386:
5586 case EM_IAMCU:
5587 case EM_X86_64:
5588 case EM_L1OM:
5589 case EM_K1OM:
5590 case EM_OLD_SPARCV9:
5591 case EM_SPARC32PLUS:
5592 case EM_SPARCV9:
5593 case EM_SPARC:
5594 if (flag == SHF_ORDERED)
5595 sindex = 19;
5596 break;
5597
5598 case EM_ARM:
5599 switch (flag)
5600 {
5601 case SHF_ENTRYSECT: sindex = 21; break;
5602 case SHF_ARM_PURECODE: sindex = 22; break;
5603 case SHF_COMDEF: sindex = 23; break;
5604 default: break;
5605 }
5606 break;
5607
5608 default:
5609 break;
5610 }
5611 }
5612
5613 if (sindex != -1)
5614 {
5615 if (p != buff + field_size + 4)
5616 {
5617 if (size < (10 + 2))
5618 {
5619 warn (_("Internal error: not enough buffer room for section flag info"));
5620 return _("<unknown>");
5621 }
5622 size -= 2;
5623 *p++ = ',';
5624 *p++ = ' ';
5625 }
5626
5627 size -= flags [sindex].len;
5628 p = stpcpy (p, flags [sindex].str);
5629 }
5630 else if (flag & SHF_MASKOS)
5631 os_flags |= flag;
5632 else if (flag & SHF_MASKPROC)
5633 proc_flags |= flag;
5634 else
5635 unknown_flags |= flag;
5636 }
5637 else
5638 {
5639 switch (flag)
5640 {
5641 case SHF_WRITE: *p = 'W'; break;
5642 case SHF_ALLOC: *p = 'A'; break;
5643 case SHF_EXECINSTR: *p = 'X'; break;
5644 case SHF_MERGE: *p = 'M'; break;
5645 case SHF_STRINGS: *p = 'S'; break;
5646 case SHF_INFO_LINK: *p = 'I'; break;
5647 case SHF_LINK_ORDER: *p = 'L'; break;
5648 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5649 case SHF_GROUP: *p = 'G'; break;
5650 case SHF_TLS: *p = 'T'; break;
5651 case SHF_EXCLUDE: *p = 'E'; break;
5652 case SHF_COMPRESSED: *p = 'C'; break;
5653
5654 default:
5655 if ((elf_header.e_machine == EM_X86_64
5656 || elf_header.e_machine == EM_L1OM
5657 || elf_header.e_machine == EM_K1OM)
5658 && flag == SHF_X86_64_LARGE)
5659 *p = 'l';
5660 else if (elf_header.e_machine == EM_ARM
5661 && flag == SHF_ARM_PURECODE)
5662 *p = 'y';
5663 else if (flag & SHF_MASKOS)
5664 {
5665 *p = 'o';
5666 sh_flags &= ~ SHF_MASKOS;
5667 }
5668 else if (flag & SHF_MASKPROC)
5669 {
5670 *p = 'p';
5671 sh_flags &= ~ SHF_MASKPROC;
5672 }
5673 else
5674 *p = 'x';
5675 break;
5676 }
5677 p++;
5678 }
5679 }
5680
5681 if (do_section_details)
5682 {
5683 if (os_flags)
5684 {
5685 size -= 5 + field_size;
5686 if (p != buff + field_size + 4)
5687 {
5688 if (size < (2 + 1))
5689 {
5690 warn (_("Internal error: not enough buffer room for section flag info"));
5691 return _("<unknown>");
5692 }
5693 size -= 2;
5694 *p++ = ',';
5695 *p++ = ' ';
5696 }
5697 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5698 (unsigned long) os_flags);
5699 p += 5 + field_size;
5700 }
5701 if (proc_flags)
5702 {
5703 size -= 7 + field_size;
5704 if (p != buff + field_size + 4)
5705 {
5706 if (size < (2 + 1))
5707 {
5708 warn (_("Internal error: not enough buffer room for section flag info"));
5709 return _("<unknown>");
5710 }
5711 size -= 2;
5712 *p++ = ',';
5713 *p++ = ' ';
5714 }
5715 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5716 (unsigned long) proc_flags);
5717 p += 7 + field_size;
5718 }
5719 if (unknown_flags)
5720 {
5721 size -= 10 + field_size;
5722 if (p != buff + field_size + 4)
5723 {
5724 if (size < (2 + 1))
5725 {
5726 warn (_("Internal error: not enough buffer room for section flag info"));
5727 return _("<unknown>");
5728 }
5729 size -= 2;
5730 *p++ = ',';
5731 *p++ = ' ';
5732 }
5733 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5734 (unsigned long) unknown_flags);
5735 p += 10 + field_size;
5736 }
5737 }
5738
5739 *p = '\0';
5740 return buff;
5741 }
5742
5743 static unsigned int
5744 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5745 {
5746 if (is_32bit_elf)
5747 {
5748 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5749
5750 if (size < sizeof (* echdr))
5751 {
5752 error (_("Compressed section is too small even for a compression header\n"));
5753 return 0;
5754 }
5755
5756 chdr->ch_type = BYTE_GET (echdr->ch_type);
5757 chdr->ch_size = BYTE_GET (echdr->ch_size);
5758 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5759 return sizeof (*echdr);
5760 }
5761 else
5762 {
5763 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5764
5765 if (size < sizeof (* echdr))
5766 {
5767 error (_("Compressed section is too small even for a compression header\n"));
5768 return 0;
5769 }
5770
5771 chdr->ch_type = BYTE_GET (echdr->ch_type);
5772 chdr->ch_size = BYTE_GET (echdr->ch_size);
5773 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5774 return sizeof (*echdr);
5775 }
5776 }
5777
5778 static bfd_boolean
5779 process_section_headers (FILE * file)
5780 {
5781 Elf_Internal_Shdr * section;
5782 unsigned int i;
5783
5784 section_headers = NULL;
5785
5786 if (elf_header.e_shnum == 0)
5787 {
5788 /* PR binutils/12467. */
5789 if (elf_header.e_shoff != 0)
5790 {
5791 warn (_("possibly corrupt ELF file header - it has a non-zero"
5792 " section header offset, but no section headers\n"));
5793 return FALSE;
5794 }
5795 else if (do_sections)
5796 printf (_("\nThere are no sections in this file.\n"));
5797
5798 return TRUE;
5799 }
5800
5801 if (do_sections && !do_header)
5802 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5803 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5804
5805 if (is_32bit_elf)
5806 {
5807 if (! get_32bit_section_headers (file, FALSE))
5808 return FALSE;
5809 }
5810 else
5811 {
5812 if (! get_64bit_section_headers (file, FALSE))
5813 return FALSE;
5814 }
5815
5816 /* Read in the string table, so that we have names to display. */
5817 if (elf_header.e_shstrndx != SHN_UNDEF
5818 && elf_header.e_shstrndx < elf_header.e_shnum)
5819 {
5820 section = section_headers + elf_header.e_shstrndx;
5821
5822 if (section->sh_size != 0)
5823 {
5824 string_table = (char *) get_data (NULL, file, section->sh_offset,
5825 1, section->sh_size,
5826 _("string table"));
5827
5828 string_table_length = string_table != NULL ? section->sh_size : 0;
5829 }
5830 }
5831
5832 /* Scan the sections for the dynamic symbol table
5833 and dynamic string table and debug sections. */
5834 dynamic_symbols = NULL;
5835 dynamic_strings = NULL;
5836 dynamic_syminfo = NULL;
5837 symtab_shndx_list = NULL;
5838
5839 eh_addr_size = is_32bit_elf ? 4 : 8;
5840 switch (elf_header.e_machine)
5841 {
5842 case EM_MIPS:
5843 case EM_MIPS_RS3_LE:
5844 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5845 FDE addresses. However, the ABI also has a semi-official ILP32
5846 variant for which the normal FDE address size rules apply.
5847
5848 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5849 section, where XX is the size of longs in bits. Unfortunately,
5850 earlier compilers provided no way of distinguishing ILP32 objects
5851 from LP64 objects, so if there's any doubt, we should assume that
5852 the official LP64 form is being used. */
5853 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5854 && find_section (".gcc_compiled_long32") == NULL)
5855 eh_addr_size = 8;
5856 break;
5857
5858 case EM_H8_300:
5859 case EM_H8_300H:
5860 switch (elf_header.e_flags & EF_H8_MACH)
5861 {
5862 case E_H8_MACH_H8300:
5863 case E_H8_MACH_H8300HN:
5864 case E_H8_MACH_H8300SN:
5865 case E_H8_MACH_H8300SXN:
5866 eh_addr_size = 2;
5867 break;
5868 case E_H8_MACH_H8300H:
5869 case E_H8_MACH_H8300S:
5870 case E_H8_MACH_H8300SX:
5871 eh_addr_size = 4;
5872 break;
5873 }
5874 break;
5875
5876 case EM_M32C_OLD:
5877 case EM_M32C:
5878 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5879 {
5880 case EF_M32C_CPU_M16C:
5881 eh_addr_size = 2;
5882 break;
5883 }
5884 break;
5885 }
5886
5887 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5888 do \
5889 { \
5890 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5891 if (section->sh_entsize != expected_entsize) \
5892 { \
5893 char buf[40]; \
5894 sprintf_vma (buf, section->sh_entsize); \
5895 /* Note: coded this way so that there is a single string for \
5896 translation. */ \
5897 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5898 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5899 (unsigned) expected_entsize); \
5900 section->sh_entsize = expected_entsize; \
5901 } \
5902 } \
5903 while (0)
5904
5905 #define CHECK_ENTSIZE(section, i, type) \
5906 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5907 sizeof (Elf64_External_##type))
5908
5909 for (i = 0, section = section_headers;
5910 i < elf_header.e_shnum;
5911 i++, section++)
5912 {
5913 char * name = SECTION_NAME (section);
5914
5915 if (section->sh_type == SHT_DYNSYM)
5916 {
5917 if (dynamic_symbols != NULL)
5918 {
5919 error (_("File contains multiple dynamic symbol tables\n"));
5920 continue;
5921 }
5922
5923 CHECK_ENTSIZE (section, i, Sym);
5924 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5925 }
5926 else if (section->sh_type == SHT_STRTAB
5927 && streq (name, ".dynstr"))
5928 {
5929 if (dynamic_strings != NULL)
5930 {
5931 error (_("File contains multiple dynamic string tables\n"));
5932 continue;
5933 }
5934
5935 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5936 1, section->sh_size,
5937 _("dynamic strings"));
5938 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5939 }
5940 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5941 {
5942 elf_section_list * entry = xmalloc (sizeof * entry);
5943 entry->hdr = section;
5944 entry->next = symtab_shndx_list;
5945 symtab_shndx_list = entry;
5946 }
5947 else if (section->sh_type == SHT_SYMTAB)
5948 CHECK_ENTSIZE (section, i, Sym);
5949 else if (section->sh_type == SHT_GROUP)
5950 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5951 else if (section->sh_type == SHT_REL)
5952 CHECK_ENTSIZE (section, i, Rel);
5953 else if (section->sh_type == SHT_RELA)
5954 CHECK_ENTSIZE (section, i, Rela);
5955 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5956 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5957 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5958 || do_debug_str || do_debug_loc || do_debug_ranges
5959 || do_debug_addr || do_debug_cu_index)
5960 && (const_strneq (name, ".debug_")
5961 || const_strneq (name, ".zdebug_")))
5962 {
5963 if (name[1] == 'z')
5964 name += sizeof (".zdebug_") - 1;
5965 else
5966 name += sizeof (".debug_") - 1;
5967
5968 if (do_debugging
5969 || (do_debug_info && const_strneq (name, "info"))
5970 || (do_debug_info && const_strneq (name, "types"))
5971 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5972 || (do_debug_lines && strcmp (name, "line") == 0)
5973 || (do_debug_lines && const_strneq (name, "line."))
5974 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5975 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5976 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5977 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5978 || (do_debug_aranges && const_strneq (name, "aranges"))
5979 || (do_debug_ranges && const_strneq (name, "ranges"))
5980 || (do_debug_ranges && const_strneq (name, "rnglists"))
5981 || (do_debug_frames && const_strneq (name, "frame"))
5982 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5983 || (do_debug_macinfo && const_strneq (name, "macro"))
5984 || (do_debug_str && const_strneq (name, "str"))
5985 || (do_debug_loc && const_strneq (name, "loc"))
5986 || (do_debug_loc && const_strneq (name, "loclists"))
5987 || (do_debug_addr && const_strneq (name, "addr"))
5988 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5989 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5990 )
5991 request_dump_bynumber (i, DEBUG_DUMP);
5992 }
5993 /* Linkonce section to be combined with .debug_info at link time. */
5994 else if ((do_debugging || do_debug_info)
5995 && const_strneq (name, ".gnu.linkonce.wi."))
5996 request_dump_bynumber (i, DEBUG_DUMP);
5997 else if (do_debug_frames && streq (name, ".eh_frame"))
5998 request_dump_bynumber (i, DEBUG_DUMP);
5999 else if (do_gdb_index && streq (name, ".gdb_index"))
6000 request_dump_bynumber (i, DEBUG_DUMP);
6001 /* Trace sections for Itanium VMS. */
6002 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6003 || do_trace_aranges)
6004 && const_strneq (name, ".trace_"))
6005 {
6006 name += sizeof (".trace_") - 1;
6007
6008 if (do_debugging
6009 || (do_trace_info && streq (name, "info"))
6010 || (do_trace_abbrevs && streq (name, "abbrev"))
6011 || (do_trace_aranges && streq (name, "aranges"))
6012 )
6013 request_dump_bynumber (i, DEBUG_DUMP);
6014 }
6015 }
6016
6017 if (! do_sections)
6018 return TRUE;
6019
6020 if (elf_header.e_shnum > 1)
6021 printf (_("\nSection Headers:\n"));
6022 else
6023 printf (_("\nSection Header:\n"));
6024
6025 if (is_32bit_elf)
6026 {
6027 if (do_section_details)
6028 {
6029 printf (_(" [Nr] Name\n"));
6030 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6031 }
6032 else
6033 printf
6034 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6035 }
6036 else if (do_wide)
6037 {
6038 if (do_section_details)
6039 {
6040 printf (_(" [Nr] Name\n"));
6041 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6042 }
6043 else
6044 printf
6045 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6046 }
6047 else
6048 {
6049 if (do_section_details)
6050 {
6051 printf (_(" [Nr] Name\n"));
6052 printf (_(" Type Address Offset Link\n"));
6053 printf (_(" Size EntSize Info Align\n"));
6054 }
6055 else
6056 {
6057 printf (_(" [Nr] Name Type Address Offset\n"));
6058 printf (_(" Size EntSize Flags Link Info Align\n"));
6059 }
6060 }
6061
6062 if (do_section_details)
6063 printf (_(" Flags\n"));
6064
6065 for (i = 0, section = section_headers;
6066 i < elf_header.e_shnum;
6067 i++, section++)
6068 {
6069 /* Run some sanity checks on the section header. */
6070
6071 /* Check the sh_link field. */
6072 switch (section->sh_type)
6073 {
6074 case SHT_SYMTAB_SHNDX:
6075 case SHT_GROUP:
6076 case SHT_HASH:
6077 case SHT_GNU_HASH:
6078 case SHT_GNU_versym:
6079 case SHT_REL:
6080 case SHT_RELA:
6081 if (section->sh_link < 1
6082 || section->sh_link >= elf_header.e_shnum
6083 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6084 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6085 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6086 i, section->sh_link);
6087 break;
6088
6089 case SHT_DYNAMIC:
6090 case SHT_SYMTAB:
6091 case SHT_DYNSYM:
6092 case SHT_GNU_verneed:
6093 case SHT_GNU_verdef:
6094 case SHT_GNU_LIBLIST:
6095 if (section->sh_link < 1
6096 || section->sh_link >= elf_header.e_shnum
6097 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6098 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6099 i, section->sh_link);
6100 break;
6101
6102 case SHT_INIT_ARRAY:
6103 case SHT_FINI_ARRAY:
6104 case SHT_PREINIT_ARRAY:
6105 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6106 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6107 i, section->sh_link);
6108 break;
6109
6110 default:
6111 /* FIXME: Add support for target specific section types. */
6112 #if 0 /* Currently we do not check other section types as there are too
6113 many special cases. Stab sections for example have a type
6114 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6115 section. */
6116 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6117 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6118 i, section->sh_link);
6119 #endif
6120 break;
6121 }
6122
6123 /* Check the sh_info field. */
6124 switch (section->sh_type)
6125 {
6126 case SHT_REL:
6127 case SHT_RELA:
6128 if (section->sh_info < 1
6129 || section->sh_info >= elf_header.e_shnum
6130 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6131 && section_headers[section->sh_info].sh_type != SHT_NOBITS
6132 && section_headers[section->sh_info].sh_type != SHT_NOTE
6133 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6134 /* FIXME: Are other section types valid ? */
6135 && section_headers[section->sh_info].sh_type < SHT_LOOS))
6136 {
6137 if (section->sh_info == 0
6138 && (streq (SECTION_NAME (section), ".rel.dyn")
6139 || streq (SECTION_NAME (section), ".rela.dyn")))
6140 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6141 of zero. The relocations in these sections may apply
6142 to many different sections. */
6143 ;
6144 else
6145 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6146 i, section->sh_info);
6147 }
6148 break;
6149
6150 case SHT_DYNAMIC:
6151 case SHT_HASH:
6152 case SHT_SYMTAB_SHNDX:
6153 case SHT_INIT_ARRAY:
6154 case SHT_FINI_ARRAY:
6155 case SHT_PREINIT_ARRAY:
6156 if (section->sh_info != 0)
6157 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6158 i, section->sh_info);
6159 break;
6160
6161 case SHT_GROUP:
6162 case SHT_SYMTAB:
6163 case SHT_DYNSYM:
6164 /* A symbol index - we assume that it is valid. */
6165 break;
6166
6167 default:
6168 /* FIXME: Add support for target specific section types. */
6169 if (section->sh_type == SHT_NOBITS)
6170 /* NOBITS section headers with non-zero sh_info fields can be
6171 created when a binary is stripped of everything but its debug
6172 information. The stripped sections have their headers
6173 preserved but their types set to SHT_NOBITS. So do not check
6174 this type of section. */
6175 ;
6176 else if (section->sh_flags & SHF_INFO_LINK)
6177 {
6178 if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
6179 warn (_("[%2u]: Expected link to another section in info field"), i);
6180 }
6181 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6182 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6183 i, section->sh_info);
6184 break;
6185 }
6186
6187 printf (" [%2u] ", i);
6188 if (do_section_details)
6189 printf ("%s\n ", printable_section_name (section));
6190 else
6191 print_symbol (-17, SECTION_NAME (section));
6192
6193 printf (do_wide ? " %-15s " : " %-15.15s ",
6194 get_section_type_name (section->sh_type));
6195
6196 if (is_32bit_elf)
6197 {
6198 const char * link_too_big = NULL;
6199
6200 print_vma (section->sh_addr, LONG_HEX);
6201
6202 printf ( " %6.6lx %6.6lx %2.2lx",
6203 (unsigned long) section->sh_offset,
6204 (unsigned long) section->sh_size,
6205 (unsigned long) section->sh_entsize);
6206
6207 if (do_section_details)
6208 fputs (" ", stdout);
6209 else
6210 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6211
6212 if (section->sh_link >= elf_header.e_shnum)
6213 {
6214 link_too_big = "";
6215 /* The sh_link value is out of range. Normally this indicates
6216 an error but it can have special values in Solaris binaries. */
6217 switch (elf_header.e_machine)
6218 {
6219 case EM_386:
6220 case EM_IAMCU:
6221 case EM_X86_64:
6222 case EM_L1OM:
6223 case EM_K1OM:
6224 case EM_OLD_SPARCV9:
6225 case EM_SPARC32PLUS:
6226 case EM_SPARCV9:
6227 case EM_SPARC:
6228 if (section->sh_link == (SHN_BEFORE & 0xffff))
6229 link_too_big = "BEFORE";
6230 else if (section->sh_link == (SHN_AFTER & 0xffff))
6231 link_too_big = "AFTER";
6232 break;
6233 default:
6234 break;
6235 }
6236 }
6237
6238 if (do_section_details)
6239 {
6240 if (link_too_big != NULL && * link_too_big)
6241 printf ("<%s> ", link_too_big);
6242 else
6243 printf ("%2u ", section->sh_link);
6244 printf ("%3u %2lu\n", section->sh_info,
6245 (unsigned long) section->sh_addralign);
6246 }
6247 else
6248 printf ("%2u %3u %2lu\n",
6249 section->sh_link,
6250 section->sh_info,
6251 (unsigned long) section->sh_addralign);
6252
6253 if (link_too_big && ! * link_too_big)
6254 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6255 i, section->sh_link);
6256 }
6257 else if (do_wide)
6258 {
6259 print_vma (section->sh_addr, LONG_HEX);
6260
6261 if ((long) section->sh_offset == section->sh_offset)
6262 printf (" %6.6lx", (unsigned long) section->sh_offset);
6263 else
6264 {
6265 putchar (' ');
6266 print_vma (section->sh_offset, LONG_HEX);
6267 }
6268
6269 if ((unsigned long) section->sh_size == section->sh_size)
6270 printf (" %6.6lx", (unsigned long) section->sh_size);
6271 else
6272 {
6273 putchar (' ');
6274 print_vma (section->sh_size, LONG_HEX);
6275 }
6276
6277 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6278 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6279 else
6280 {
6281 putchar (' ');
6282 print_vma (section->sh_entsize, LONG_HEX);
6283 }
6284
6285 if (do_section_details)
6286 fputs (" ", stdout);
6287 else
6288 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6289
6290 printf ("%2u %3u ", section->sh_link, section->sh_info);
6291
6292 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6293 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6294 else
6295 {
6296 print_vma (section->sh_addralign, DEC);
6297 putchar ('\n');
6298 }
6299 }
6300 else if (do_section_details)
6301 {
6302 printf (" %-15.15s ",
6303 get_section_type_name (section->sh_type));
6304 print_vma (section->sh_addr, LONG_HEX);
6305 if ((long) section->sh_offset == section->sh_offset)
6306 printf (" %16.16lx", (unsigned long) section->sh_offset);
6307 else
6308 {
6309 printf (" ");
6310 print_vma (section->sh_offset, LONG_HEX);
6311 }
6312 printf (" %u\n ", section->sh_link);
6313 print_vma (section->sh_size, LONG_HEX);
6314 putchar (' ');
6315 print_vma (section->sh_entsize, LONG_HEX);
6316
6317 printf (" %-16u %lu\n",
6318 section->sh_info,
6319 (unsigned long) section->sh_addralign);
6320 }
6321 else
6322 {
6323 putchar (' ');
6324 print_vma (section->sh_addr, LONG_HEX);
6325 if ((long) section->sh_offset == section->sh_offset)
6326 printf (" %8.8lx", (unsigned long) section->sh_offset);
6327 else
6328 {
6329 printf (" ");
6330 print_vma (section->sh_offset, LONG_HEX);
6331 }
6332 printf ("\n ");
6333 print_vma (section->sh_size, LONG_HEX);
6334 printf (" ");
6335 print_vma (section->sh_entsize, LONG_HEX);
6336
6337 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6338
6339 printf (" %2u %3u %lu\n",
6340 section->sh_link,
6341 section->sh_info,
6342 (unsigned long) section->sh_addralign);
6343 }
6344
6345 if (do_section_details)
6346 {
6347 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6348 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6349 {
6350 /* Minimum section size is 12 bytes for 32-bit compression
6351 header + 12 bytes for compressed data header. */
6352 unsigned char buf[24];
6353
6354 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6355 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6356 sizeof (buf), _("compression header")))
6357 {
6358 Elf_Internal_Chdr chdr;
6359
6360 (void) get_compression_header (&chdr, buf, sizeof (buf));
6361
6362 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6363 printf (" ZLIB, ");
6364 else
6365 printf (_(" [<unknown>: 0x%x], "),
6366 chdr.ch_type);
6367 print_vma (chdr.ch_size, LONG_HEX);
6368 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6369 }
6370 }
6371 }
6372 }
6373
6374 if (!do_section_details)
6375 {
6376 /* The ordering of the letters shown here matches the ordering of the
6377 corresponding SHF_xxx values, and hence the order in which these
6378 letters will be displayed to the user. */
6379 printf (_("Key to Flags:\n\
6380 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6381 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6382 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6383 if (elf_header.e_machine == EM_X86_64
6384 || elf_header.e_machine == EM_L1OM
6385 || elf_header.e_machine == EM_K1OM)
6386 printf (_("l (large), "));
6387 else if (elf_header.e_machine == EM_ARM)
6388 printf (_("y (purecode), "));
6389 printf ("p (processor specific)\n");
6390 }
6391
6392 return TRUE;
6393 }
6394
6395 static const char *
6396 get_group_flags (unsigned int flags)
6397 {
6398 static char buff[128];
6399
6400 if (flags == 0)
6401 return "";
6402 else if (flags == GRP_COMDAT)
6403 return "COMDAT ";
6404
6405 snprintf (buff, 14, _("[0x%x: "), flags);
6406
6407 flags &= ~ GRP_COMDAT;
6408 if (flags & GRP_MASKOS)
6409 {
6410 strcat (buff, "<OS specific>");
6411 flags &= ~ GRP_MASKOS;
6412 }
6413
6414 if (flags & GRP_MASKPROC)
6415 {
6416 strcat (buff, "<PROC specific>");
6417 flags &= ~ GRP_MASKPROC;
6418 }
6419
6420 if (flags)
6421 strcat (buff, "<unknown>");
6422
6423 strcat (buff, "]");
6424 return buff;
6425 }
6426
6427 static bfd_boolean
6428 process_section_groups (FILE * file)
6429 {
6430 Elf_Internal_Shdr * section;
6431 unsigned int i;
6432 struct group * group;
6433 Elf_Internal_Shdr * symtab_sec;
6434 Elf_Internal_Shdr * strtab_sec;
6435 Elf_Internal_Sym * symtab;
6436 unsigned long num_syms;
6437 char * strtab;
6438 size_t strtab_size;
6439
6440 /* Don't process section groups unless needed. */
6441 if (!do_unwind && !do_section_groups)
6442 return TRUE;
6443
6444 if (elf_header.e_shnum == 0)
6445 {
6446 if (do_section_groups)
6447 printf (_("\nThere are no sections to group in this file.\n"));
6448
6449 return TRUE;
6450 }
6451
6452 if (section_headers == NULL)
6453 {
6454 error (_("Section headers are not available!\n"));
6455 /* PR 13622: This can happen with a corrupt ELF header. */
6456 return FALSE;
6457 }
6458
6459 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6460 sizeof (struct group *));
6461
6462 if (section_headers_groups == NULL)
6463 {
6464 error (_("Out of memory reading %u section group headers\n"),
6465 elf_header.e_shnum);
6466 return FALSE;
6467 }
6468
6469 /* Scan the sections for the group section. */
6470 group_count = 0;
6471 for (i = 0, section = section_headers;
6472 i < elf_header.e_shnum;
6473 i++, section++)
6474 if (section->sh_type == SHT_GROUP)
6475 group_count++;
6476
6477 if (group_count == 0)
6478 {
6479 if (do_section_groups)
6480 printf (_("\nThere are no section groups in this file.\n"));
6481
6482 return TRUE;
6483 }
6484
6485 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6486
6487 if (section_groups == NULL)
6488 {
6489 error (_("Out of memory reading %lu groups\n"),
6490 (unsigned long) group_count);
6491 return FALSE;
6492 }
6493
6494 symtab_sec = NULL;
6495 strtab_sec = NULL;
6496 symtab = NULL;
6497 num_syms = 0;
6498 strtab = NULL;
6499 strtab_size = 0;
6500 for (i = 0, section = section_headers, group = section_groups;
6501 i < elf_header.e_shnum;
6502 i++, section++)
6503 {
6504 if (section->sh_type == SHT_GROUP)
6505 {
6506 const char * name = printable_section_name (section);
6507 const char * group_name;
6508 unsigned char * start;
6509 unsigned char * indices;
6510 unsigned int entry, j, size;
6511 Elf_Internal_Shdr * sec;
6512 Elf_Internal_Sym * sym;
6513
6514 /* Get the symbol table. */
6515 if (section->sh_link >= elf_header.e_shnum
6516 || ((sec = section_headers + section->sh_link)->sh_type
6517 != SHT_SYMTAB))
6518 {
6519 error (_("Bad sh_link in group section `%s'\n"), name);
6520 continue;
6521 }
6522
6523 if (symtab_sec != sec)
6524 {
6525 symtab_sec = sec;
6526 if (symtab)
6527 free (symtab);
6528 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6529 }
6530
6531 if (symtab == NULL)
6532 {
6533 error (_("Corrupt header in group section `%s'\n"), name);
6534 continue;
6535 }
6536
6537 if (section->sh_info >= num_syms)
6538 {
6539 error (_("Bad sh_info in group section `%s'\n"), name);
6540 continue;
6541 }
6542
6543 sym = symtab + section->sh_info;
6544
6545 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6546 {
6547 if (sym->st_shndx == 0
6548 || sym->st_shndx >= elf_header.e_shnum)
6549 {
6550 error (_("Bad sh_info in group section `%s'\n"), name);
6551 continue;
6552 }
6553
6554 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6555 strtab_sec = NULL;
6556 if (strtab)
6557 free (strtab);
6558 strtab = NULL;
6559 strtab_size = 0;
6560 }
6561 else
6562 {
6563 /* Get the string table. */
6564 if (symtab_sec->sh_link >= elf_header.e_shnum)
6565 {
6566 strtab_sec = NULL;
6567 if (strtab)
6568 free (strtab);
6569 strtab = NULL;
6570 strtab_size = 0;
6571 }
6572 else if (strtab_sec
6573 != (sec = section_headers + symtab_sec->sh_link))
6574 {
6575 strtab_sec = sec;
6576 if (strtab)
6577 free (strtab);
6578
6579 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6580 1, strtab_sec->sh_size,
6581 _("string table"));
6582 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6583 }
6584 group_name = sym->st_name < strtab_size
6585 ? strtab + sym->st_name : _("<corrupt>");
6586 }
6587
6588 /* PR 17531: file: loop. */
6589 if (section->sh_entsize > section->sh_size)
6590 {
6591 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6592 printable_section_name (section),
6593 (unsigned long) section->sh_entsize,
6594 (unsigned long) section->sh_size);
6595 break;
6596 }
6597
6598 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6599 1, section->sh_size,
6600 _("section data"));
6601 if (start == NULL)
6602 continue;
6603
6604 indices = start;
6605 size = (section->sh_size / section->sh_entsize) - 1;
6606 entry = byte_get (indices, 4);
6607 indices += 4;
6608
6609 if (do_section_groups)
6610 {
6611 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6612 get_group_flags (entry), i, name, group_name, size);
6613
6614 printf (_(" [Index] Name\n"));
6615 }
6616
6617 group->group_index = i;
6618
6619 for (j = 0; j < size; j++)
6620 {
6621 struct group_list * g;
6622
6623 entry = byte_get (indices, 4);
6624 indices += 4;
6625
6626 if (entry >= elf_header.e_shnum)
6627 {
6628 static unsigned num_group_errors = 0;
6629
6630 if (num_group_errors ++ < 10)
6631 {
6632 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6633 entry, i, elf_header.e_shnum - 1);
6634 if (num_group_errors == 10)
6635 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6636 }
6637 continue;
6638 }
6639
6640 if (section_headers_groups [entry] != NULL)
6641 {
6642 if (entry)
6643 {
6644 static unsigned num_errs = 0;
6645
6646 if (num_errs ++ < 10)
6647 {
6648 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6649 entry, i,
6650 section_headers_groups [entry]->group_index);
6651 if (num_errs == 10)
6652 warn (_("Further error messages about already contained group sections suppressed\n"));
6653 }
6654 continue;
6655 }
6656 else
6657 {
6658 /* Intel C/C++ compiler may put section 0 in a
6659 section group. We just warn it the first time
6660 and ignore it afterwards. */
6661 static bfd_boolean warned = FALSE;
6662 if (!warned)
6663 {
6664 error (_("section 0 in group section [%5u]\n"),
6665 section_headers_groups [entry]->group_index);
6666 warned = TRUE;
6667 }
6668 }
6669 }
6670
6671 section_headers_groups [entry] = group;
6672
6673 if (do_section_groups)
6674 {
6675 sec = section_headers + entry;
6676 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6677 }
6678
6679 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6680 g->section_index = entry;
6681 g->next = group->root;
6682 group->root = g;
6683 }
6684
6685 if (start)
6686 free (start);
6687
6688 group++;
6689 }
6690 }
6691
6692 if (symtab)
6693 free (symtab);
6694 if (strtab)
6695 free (strtab);
6696 return TRUE;
6697 }
6698
6699 /* Data used to display dynamic fixups. */
6700
6701 struct ia64_vms_dynfixup
6702 {
6703 bfd_vma needed_ident; /* Library ident number. */
6704 bfd_vma needed; /* Index in the dstrtab of the library name. */
6705 bfd_vma fixup_needed; /* Index of the library. */
6706 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6707 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6708 };
6709
6710 /* Data used to display dynamic relocations. */
6711
6712 struct ia64_vms_dynimgrela
6713 {
6714 bfd_vma img_rela_cnt; /* Number of relocations. */
6715 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6716 };
6717
6718 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6719 library). */
6720
6721 static bfd_boolean
6722 dump_ia64_vms_dynamic_fixups (FILE * file,
6723 struct ia64_vms_dynfixup * fixup,
6724 const char * strtab,
6725 unsigned int strtab_sz)
6726 {
6727 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6728 long i;
6729 const char * lib_name;
6730
6731 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6732 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6733 _("dynamic section image fixups"));
6734 if (!imfs)
6735 return FALSE;
6736
6737 if (fixup->needed < strtab_sz)
6738 lib_name = strtab + fixup->needed;
6739 else
6740 {
6741 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6742 (unsigned long) fixup->needed);
6743 lib_name = "???";
6744 }
6745 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6746 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6747 printf
6748 (_("Seg Offset Type SymVec DataType\n"));
6749
6750 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6751 {
6752 unsigned int type;
6753 const char *rtype;
6754
6755 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6756 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6757 type = BYTE_GET (imfs [i].type);
6758 rtype = elf_ia64_reloc_type (type);
6759 if (rtype == NULL)
6760 printf (" 0x%08x ", type);
6761 else
6762 printf (" %-32s ", rtype);
6763 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6764 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6765 }
6766
6767 free (imfs);
6768 return TRUE;
6769 }
6770
6771 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6772
6773 static bfd_boolean
6774 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6775 {
6776 Elf64_External_VMS_IMAGE_RELA *imrs;
6777 long i;
6778
6779 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6780 1, imgrela->img_rela_cnt * sizeof (*imrs),
6781 _("dynamic section image relocations"));
6782 if (!imrs)
6783 return FALSE;
6784
6785 printf (_("\nImage relocs\n"));
6786 printf
6787 (_("Seg Offset Type Addend Seg Sym Off\n"));
6788
6789 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6790 {
6791 unsigned int type;
6792 const char *rtype;
6793
6794 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6795 printf ("%08" BFD_VMA_FMT "x ",
6796 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6797 type = BYTE_GET (imrs [i].type);
6798 rtype = elf_ia64_reloc_type (type);
6799 if (rtype == NULL)
6800 printf ("0x%08x ", type);
6801 else
6802 printf ("%-31s ", rtype);
6803 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6804 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6805 printf ("%08" BFD_VMA_FMT "x\n",
6806 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6807 }
6808
6809 free (imrs);
6810 return TRUE;
6811 }
6812
6813 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6814
6815 static bfd_boolean
6816 process_ia64_vms_dynamic_relocs (FILE *file)
6817 {
6818 struct ia64_vms_dynfixup fixup;
6819 struct ia64_vms_dynimgrela imgrela;
6820 Elf_Internal_Dyn *entry;
6821 bfd_vma strtab_off = 0;
6822 bfd_vma strtab_sz = 0;
6823 char *strtab = NULL;
6824 bfd_boolean res = TRUE;
6825
6826 memset (&fixup, 0, sizeof (fixup));
6827 memset (&imgrela, 0, sizeof (imgrela));
6828
6829 /* Note: the order of the entries is specified by the OpenVMS specs. */
6830 for (entry = dynamic_section;
6831 entry < dynamic_section + dynamic_nent;
6832 entry++)
6833 {
6834 switch (entry->d_tag)
6835 {
6836 case DT_IA_64_VMS_STRTAB_OFFSET:
6837 strtab_off = entry->d_un.d_val;
6838 break;
6839 case DT_STRSZ:
6840 strtab_sz = entry->d_un.d_val;
6841 if (strtab == NULL)
6842 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6843 1, strtab_sz, _("dynamic string section"));
6844 break;
6845
6846 case DT_IA_64_VMS_NEEDED_IDENT:
6847 fixup.needed_ident = entry->d_un.d_val;
6848 break;
6849 case DT_NEEDED:
6850 fixup.needed = entry->d_un.d_val;
6851 break;
6852 case DT_IA_64_VMS_FIXUP_NEEDED:
6853 fixup.fixup_needed = entry->d_un.d_val;
6854 break;
6855 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6856 fixup.fixup_rela_cnt = entry->d_un.d_val;
6857 break;
6858 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6859 fixup.fixup_rela_off = entry->d_un.d_val;
6860 if (! dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz))
6861 res = FALSE;
6862 break;
6863 case DT_IA_64_VMS_IMG_RELA_CNT:
6864 imgrela.img_rela_cnt = entry->d_un.d_val;
6865 break;
6866 case DT_IA_64_VMS_IMG_RELA_OFF:
6867 imgrela.img_rela_off = entry->d_un.d_val;
6868 if (! dump_ia64_vms_dynamic_relocs (file, &imgrela))
6869 res = FALSE;
6870 break;
6871
6872 default:
6873 break;
6874 }
6875 }
6876
6877 if (strtab != NULL)
6878 free (strtab);
6879
6880 return res;
6881 }
6882
6883 static struct
6884 {
6885 const char * name;
6886 int reloc;
6887 int size;
6888 int rela;
6889 }
6890 dynamic_relocations [] =
6891 {
6892 { "REL", DT_REL, DT_RELSZ, FALSE },
6893 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6894 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6895 };
6896
6897 /* Process the reloc section. */
6898
6899 static bfd_boolean
6900 process_relocs (FILE * file)
6901 {
6902 unsigned long rel_size;
6903 unsigned long rel_offset;
6904
6905 if (!do_reloc)
6906 return TRUE;
6907
6908 if (do_using_dynamic)
6909 {
6910 int is_rela;
6911 const char * name;
6912 bfd_boolean has_dynamic_reloc;
6913 unsigned int i;
6914
6915 has_dynamic_reloc = FALSE;
6916
6917 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6918 {
6919 is_rela = dynamic_relocations [i].rela;
6920 name = dynamic_relocations [i].name;
6921 rel_size = dynamic_info [dynamic_relocations [i].size];
6922 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6923
6924 if (rel_size)
6925 has_dynamic_reloc = TRUE;
6926
6927 if (is_rela == UNKNOWN)
6928 {
6929 if (dynamic_relocations [i].reloc == DT_JMPREL)
6930 switch (dynamic_info[DT_PLTREL])
6931 {
6932 case DT_REL:
6933 is_rela = FALSE;
6934 break;
6935 case DT_RELA:
6936 is_rela = TRUE;
6937 break;
6938 }
6939 }
6940
6941 if (rel_size)
6942 {
6943 printf
6944 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6945 name, rel_offset, rel_size);
6946
6947 dump_relocations (file,
6948 offset_from_vma (file, rel_offset, rel_size),
6949 rel_size,
6950 dynamic_symbols, num_dynamic_syms,
6951 dynamic_strings, dynamic_strings_length,
6952 is_rela, TRUE /* is_dynamic */);
6953 }
6954 }
6955
6956 if (is_ia64_vms ())
6957 if (process_ia64_vms_dynamic_relocs (file))
6958 has_dynamic_reloc = TRUE;
6959
6960 if (! has_dynamic_reloc)
6961 printf (_("\nThere are no dynamic relocations in this file.\n"));
6962 }
6963 else
6964 {
6965 Elf_Internal_Shdr * section;
6966 unsigned long i;
6967 bfd_boolean found = FALSE;
6968
6969 for (i = 0, section = section_headers;
6970 i < elf_header.e_shnum;
6971 i++, section++)
6972 {
6973 if ( section->sh_type != SHT_RELA
6974 && section->sh_type != SHT_REL)
6975 continue;
6976
6977 rel_offset = section->sh_offset;
6978 rel_size = section->sh_size;
6979
6980 if (rel_size)
6981 {
6982 Elf_Internal_Shdr * strsec;
6983 int is_rela;
6984
6985 printf (_("\nRelocation section "));
6986
6987 if (string_table == NULL)
6988 printf ("%d", section->sh_name);
6989 else
6990 printf ("'%s'", printable_section_name (section));
6991
6992 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6993 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6994
6995 is_rela = section->sh_type == SHT_RELA;
6996
6997 if (section->sh_link != 0
6998 && section->sh_link < elf_header.e_shnum)
6999 {
7000 Elf_Internal_Shdr * symsec;
7001 Elf_Internal_Sym * symtab;
7002 unsigned long nsyms;
7003 unsigned long strtablen = 0;
7004 char * strtab = NULL;
7005
7006 symsec = section_headers + section->sh_link;
7007 if (symsec->sh_type != SHT_SYMTAB
7008 && symsec->sh_type != SHT_DYNSYM)
7009 continue;
7010
7011 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
7012
7013 if (symtab == NULL)
7014 continue;
7015
7016 if (symsec->sh_link != 0
7017 && symsec->sh_link < elf_header.e_shnum)
7018 {
7019 strsec = section_headers + symsec->sh_link;
7020
7021 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7022 1, strsec->sh_size,
7023 _("string table"));
7024 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7025 }
7026
7027 dump_relocations (file, rel_offset, rel_size,
7028 symtab, nsyms, strtab, strtablen,
7029 is_rela,
7030 symsec->sh_type == SHT_DYNSYM);
7031 if (strtab)
7032 free (strtab);
7033 free (symtab);
7034 }
7035 else
7036 dump_relocations (file, rel_offset, rel_size,
7037 NULL, 0, NULL, 0, is_rela,
7038 FALSE /* is_dynamic */);
7039
7040 found = TRUE;
7041 }
7042 }
7043
7044 if (! found)
7045 printf (_("\nThere are no relocations in this file.\n"));
7046 }
7047
7048 return TRUE;
7049 }
7050
7051 /* An absolute address consists of a section and an offset. If the
7052 section is NULL, the offset itself is the address, otherwise, the
7053 address equals to LOAD_ADDRESS(section) + offset. */
7054
7055 struct absaddr
7056 {
7057 unsigned short section;
7058 bfd_vma offset;
7059 };
7060
7061 #define ABSADDR(a) \
7062 ((a).section \
7063 ? section_headers [(a).section].sh_addr + (a).offset \
7064 : (a).offset)
7065
7066 /* Find the nearest symbol at or below ADDR. Returns the symbol
7067 name, if found, and the offset from the symbol to ADDR. */
7068
7069 static void
7070 find_symbol_for_address (Elf_Internal_Sym * symtab,
7071 unsigned long nsyms,
7072 const char * strtab,
7073 unsigned long strtab_size,
7074 struct absaddr addr,
7075 const char ** symname,
7076 bfd_vma * offset)
7077 {
7078 bfd_vma dist = 0x100000;
7079 Elf_Internal_Sym * sym;
7080 Elf_Internal_Sym * beg;
7081 Elf_Internal_Sym * end;
7082 Elf_Internal_Sym * best = NULL;
7083
7084 REMOVE_ARCH_BITS (addr.offset);
7085 beg = symtab;
7086 end = symtab + nsyms;
7087
7088 while (beg < end)
7089 {
7090 bfd_vma value;
7091
7092 sym = beg + (end - beg) / 2;
7093
7094 value = sym->st_value;
7095 REMOVE_ARCH_BITS (value);
7096
7097 if (sym->st_name != 0
7098 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7099 && addr.offset >= value
7100 && addr.offset - value < dist)
7101 {
7102 best = sym;
7103 dist = addr.offset - value;
7104 if (!dist)
7105 break;
7106 }
7107
7108 if (addr.offset < value)
7109 end = sym;
7110 else
7111 beg = sym + 1;
7112 }
7113
7114 if (best)
7115 {
7116 *symname = (best->st_name >= strtab_size
7117 ? _("<corrupt>") : strtab + best->st_name);
7118 *offset = dist;
7119 return;
7120 }
7121
7122 *symname = NULL;
7123 *offset = addr.offset;
7124 }
7125
7126 static /* signed */ int
7127 symcmp (const void *p, const void *q)
7128 {
7129 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7130 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7131
7132 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7133 }
7134
7135 /* Process the unwind section. */
7136
7137 #include "unwind-ia64.h"
7138
7139 struct ia64_unw_table_entry
7140 {
7141 struct absaddr start;
7142 struct absaddr end;
7143 struct absaddr info;
7144 };
7145
7146 struct ia64_unw_aux_info
7147 {
7148 struct ia64_unw_table_entry * table; /* Unwind table. */
7149 unsigned long table_len; /* Length of unwind table. */
7150 unsigned char * info; /* Unwind info. */
7151 unsigned long info_size; /* Size of unwind info. */
7152 bfd_vma info_addr; /* Starting address of unwind info. */
7153 bfd_vma seg_base; /* Starting address of segment. */
7154 Elf_Internal_Sym * symtab; /* The symbol table. */
7155 unsigned long nsyms; /* Number of symbols. */
7156 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7157 unsigned long nfuns; /* Number of entries in funtab. */
7158 char * strtab; /* The string table. */
7159 unsigned long strtab_size; /* Size of string table. */
7160 };
7161
7162 static bfd_boolean
7163 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7164 {
7165 struct ia64_unw_table_entry * tp;
7166 unsigned long j, nfuns;
7167 int in_body;
7168 bfd_boolean res = TRUE;
7169
7170 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7171 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7172 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7173 aux->funtab[nfuns++] = aux->symtab[j];
7174 aux->nfuns = nfuns;
7175 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7176
7177 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7178 {
7179 bfd_vma stamp;
7180 bfd_vma offset;
7181 const unsigned char * dp;
7182 const unsigned char * head;
7183 const unsigned char * end;
7184 const char * procname;
7185
7186 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7187 aux->strtab_size, tp->start, &procname, &offset);
7188
7189 fputs ("\n<", stdout);
7190
7191 if (procname)
7192 {
7193 fputs (procname, stdout);
7194
7195 if (offset)
7196 printf ("+%lx", (unsigned long) offset);
7197 }
7198
7199 fputs (">: [", stdout);
7200 print_vma (tp->start.offset, PREFIX_HEX);
7201 fputc ('-', stdout);
7202 print_vma (tp->end.offset, PREFIX_HEX);
7203 printf ("], info at +0x%lx\n",
7204 (unsigned long) (tp->info.offset - aux->seg_base));
7205
7206 /* PR 17531: file: 86232b32. */
7207 if (aux->info == NULL)
7208 continue;
7209
7210 /* PR 17531: file: 0997b4d1. */
7211 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7212 {
7213 warn (_("Invalid offset %lx in table entry %ld\n"),
7214 (long) tp->info.offset, (long) (tp - aux->table));
7215 res = FALSE;
7216 continue;
7217 }
7218
7219 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7220 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7221
7222 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7223 (unsigned) UNW_VER (stamp),
7224 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7225 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7226 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7227 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7228
7229 if (UNW_VER (stamp) != 1)
7230 {
7231 printf (_("\tUnknown version.\n"));
7232 continue;
7233 }
7234
7235 in_body = 0;
7236 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7237 /* PR 17531: file: 16ceda89. */
7238 if (end > aux->info + aux->info_size)
7239 end = aux->info + aux->info_size;
7240 for (dp = head + 8; dp < end;)
7241 dp = unw_decode (dp, in_body, & in_body, end);
7242 }
7243
7244 free (aux->funtab);
7245
7246 return res;
7247 }
7248
7249 static bfd_boolean
7250 slurp_ia64_unwind_table (FILE * file,
7251 struct ia64_unw_aux_info * aux,
7252 Elf_Internal_Shdr * sec)
7253 {
7254 unsigned long size, nrelas, i;
7255 Elf_Internal_Phdr * seg;
7256 struct ia64_unw_table_entry * tep;
7257 Elf_Internal_Shdr * relsec;
7258 Elf_Internal_Rela * rela;
7259 Elf_Internal_Rela * rp;
7260 unsigned char * table;
7261 unsigned char * tp;
7262 Elf_Internal_Sym * sym;
7263 const char * relname;
7264
7265 aux->table_len = 0;
7266
7267 /* First, find the starting address of the segment that includes
7268 this section: */
7269
7270 if (elf_header.e_phnum)
7271 {
7272 if (! get_program_headers (file))
7273 return FALSE;
7274
7275 for (seg = program_headers;
7276 seg < program_headers + elf_header.e_phnum;
7277 ++seg)
7278 {
7279 if (seg->p_type != PT_LOAD)
7280 continue;
7281
7282 if (sec->sh_addr >= seg->p_vaddr
7283 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7284 {
7285 aux->seg_base = seg->p_vaddr;
7286 break;
7287 }
7288 }
7289 }
7290
7291 /* Second, build the unwind table from the contents of the unwind section: */
7292 size = sec->sh_size;
7293 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7294 _("unwind table"));
7295 if (!table)
7296 return FALSE;
7297
7298 aux->table_len = size / (3 * eh_addr_size);
7299 aux->table = (struct ia64_unw_table_entry *)
7300 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7301 tep = aux->table;
7302
7303 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7304 {
7305 tep->start.section = SHN_UNDEF;
7306 tep->end.section = SHN_UNDEF;
7307 tep->info.section = SHN_UNDEF;
7308 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7309 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7310 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7311 tep->start.offset += aux->seg_base;
7312 tep->end.offset += aux->seg_base;
7313 tep->info.offset += aux->seg_base;
7314 }
7315 free (table);
7316
7317 /* Third, apply any relocations to the unwind table: */
7318 for (relsec = section_headers;
7319 relsec < section_headers + elf_header.e_shnum;
7320 ++relsec)
7321 {
7322 if (relsec->sh_type != SHT_RELA
7323 || relsec->sh_info >= elf_header.e_shnum
7324 || section_headers + relsec->sh_info != sec)
7325 continue;
7326
7327 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7328 & rela, & nrelas))
7329 {
7330 free (aux->table);
7331 aux->table = NULL;
7332 aux->table_len = 0;
7333 return FALSE;
7334 }
7335
7336 for (rp = rela; rp < rela + nrelas; ++rp)
7337 {
7338 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7339 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7340
7341 /* PR 17531: file: 9fa67536. */
7342 if (relname == NULL)
7343 {
7344 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7345 continue;
7346 }
7347
7348 if (! const_strneq (relname, "R_IA64_SEGREL"))
7349 {
7350 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7351 continue;
7352 }
7353
7354 i = rp->r_offset / (3 * eh_addr_size);
7355
7356 /* PR 17531: file: 5bc8d9bf. */
7357 if (i >= aux->table_len)
7358 {
7359 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7360 continue;
7361 }
7362
7363 switch (rp->r_offset / eh_addr_size % 3)
7364 {
7365 case 0:
7366 aux->table[i].start.section = sym->st_shndx;
7367 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7368 break;
7369 case 1:
7370 aux->table[i].end.section = sym->st_shndx;
7371 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7372 break;
7373 case 2:
7374 aux->table[i].info.section = sym->st_shndx;
7375 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7376 break;
7377 default:
7378 break;
7379 }
7380 }
7381
7382 free (rela);
7383 }
7384
7385 return TRUE;
7386 }
7387
7388 static bfd_boolean
7389 ia64_process_unwind (FILE * file)
7390 {
7391 Elf_Internal_Shdr * sec;
7392 Elf_Internal_Shdr * unwsec = NULL;
7393 Elf_Internal_Shdr * strsec;
7394 unsigned long i, unwcount = 0, unwstart = 0;
7395 struct ia64_unw_aux_info aux;
7396 bfd_boolean res = TRUE;
7397
7398 memset (& aux, 0, sizeof (aux));
7399
7400 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7401 {
7402 if (sec->sh_type == SHT_SYMTAB
7403 && sec->sh_link < elf_header.e_shnum)
7404 {
7405 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7406
7407 strsec = section_headers + sec->sh_link;
7408 if (aux.strtab != NULL)
7409 {
7410 error (_("Multiple auxillary string tables encountered\n"));
7411 free (aux.strtab);
7412 res = FALSE;
7413 }
7414 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7415 1, strsec->sh_size,
7416 _("string table"));
7417 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7418 }
7419 else if (sec->sh_type == SHT_IA_64_UNWIND)
7420 unwcount++;
7421 }
7422
7423 if (!unwcount)
7424 printf (_("\nThere are no unwind sections in this file.\n"));
7425
7426 while (unwcount-- > 0)
7427 {
7428 char * suffix;
7429 size_t len, len2;
7430
7431 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7432 i < elf_header.e_shnum; ++i, ++sec)
7433 if (sec->sh_type == SHT_IA_64_UNWIND)
7434 {
7435 unwsec = sec;
7436 break;
7437 }
7438 /* We have already counted the number of SHT_IA64_UNWIND
7439 sections so the loop above should never fail. */
7440 assert (unwsec != NULL);
7441
7442 unwstart = i + 1;
7443 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7444
7445 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7446 {
7447 /* We need to find which section group it is in. */
7448 struct group_list * g;
7449
7450 if (section_headers_groups == NULL
7451 || section_headers_groups [i] == NULL)
7452 i = elf_header.e_shnum;
7453 else
7454 {
7455 g = section_headers_groups [i]->root;
7456
7457 for (; g != NULL; g = g->next)
7458 {
7459 sec = section_headers + g->section_index;
7460
7461 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7462 break;
7463 }
7464
7465 if (g == NULL)
7466 i = elf_header.e_shnum;
7467 }
7468 }
7469 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7470 {
7471 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7472 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7473 suffix = SECTION_NAME (unwsec) + len;
7474 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7475 ++i, ++sec)
7476 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7477 && streq (SECTION_NAME (sec) + len2, suffix))
7478 break;
7479 }
7480 else
7481 {
7482 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7483 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7484 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7485 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7486 suffix = "";
7487 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7488 suffix = SECTION_NAME (unwsec) + len;
7489 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7490 ++i, ++sec)
7491 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7492 && streq (SECTION_NAME (sec) + len2, suffix))
7493 break;
7494 }
7495
7496 if (i == elf_header.e_shnum)
7497 {
7498 printf (_("\nCould not find unwind info section for "));
7499
7500 if (string_table == NULL)
7501 printf ("%d", unwsec->sh_name);
7502 else
7503 printf ("'%s'", printable_section_name (unwsec));
7504 }
7505 else
7506 {
7507 aux.info_addr = sec->sh_addr;
7508 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7509 sec->sh_size,
7510 _("unwind info"));
7511 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7512
7513 printf (_("\nUnwind section "));
7514
7515 if (string_table == NULL)
7516 printf ("%d", unwsec->sh_name);
7517 else
7518 printf ("'%s'", printable_section_name (unwsec));
7519
7520 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7521 (unsigned long) unwsec->sh_offset,
7522 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7523
7524 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7525 && aux.table_len > 0)
7526 dump_ia64_unwind (& aux);
7527
7528 if (aux.table)
7529 free ((char *) aux.table);
7530 if (aux.info)
7531 free ((char *) aux.info);
7532 aux.table = NULL;
7533 aux.info = NULL;
7534 }
7535 }
7536
7537 if (aux.symtab)
7538 free (aux.symtab);
7539 if (aux.strtab)
7540 free ((char *) aux.strtab);
7541
7542 return res;
7543 }
7544
7545 struct hppa_unw_table_entry
7546 {
7547 struct absaddr start;
7548 struct absaddr end;
7549 unsigned int Cannot_unwind:1; /* 0 */
7550 unsigned int Millicode:1; /* 1 */
7551 unsigned int Millicode_save_sr0:1; /* 2 */
7552 unsigned int Region_description:2; /* 3..4 */
7553 unsigned int reserved1:1; /* 5 */
7554 unsigned int Entry_SR:1; /* 6 */
7555 unsigned int Entry_FR:4; /* Number saved 7..10 */
7556 unsigned int Entry_GR:5; /* Number saved 11..15 */
7557 unsigned int Args_stored:1; /* 16 */
7558 unsigned int Variable_Frame:1; /* 17 */
7559 unsigned int Separate_Package_Body:1; /* 18 */
7560 unsigned int Frame_Extension_Millicode:1; /* 19 */
7561 unsigned int Stack_Overflow_Check:1; /* 20 */
7562 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7563 unsigned int Ada_Region:1; /* 22 */
7564 unsigned int cxx_info:1; /* 23 */
7565 unsigned int cxx_try_catch:1; /* 24 */
7566 unsigned int sched_entry_seq:1; /* 25 */
7567 unsigned int reserved2:1; /* 26 */
7568 unsigned int Save_SP:1; /* 27 */
7569 unsigned int Save_RP:1; /* 28 */
7570 unsigned int Save_MRP_in_frame:1; /* 29 */
7571 unsigned int extn_ptr_defined:1; /* 30 */
7572 unsigned int Cleanup_defined:1; /* 31 */
7573
7574 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7575 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7576 unsigned int Large_frame:1; /* 2 */
7577 unsigned int Pseudo_SP_Set:1; /* 3 */
7578 unsigned int reserved4:1; /* 4 */
7579 unsigned int Total_frame_size:27; /* 5..31 */
7580 };
7581
7582 struct hppa_unw_aux_info
7583 {
7584 struct hppa_unw_table_entry * table; /* Unwind table. */
7585 unsigned long table_len; /* Length of unwind table. */
7586 bfd_vma seg_base; /* Starting address of segment. */
7587 Elf_Internal_Sym * symtab; /* The symbol table. */
7588 unsigned long nsyms; /* Number of symbols. */
7589 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7590 unsigned long nfuns; /* Number of entries in funtab. */
7591 char * strtab; /* The string table. */
7592 unsigned long strtab_size; /* Size of string table. */
7593 };
7594
7595 static bfd_boolean
7596 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7597 {
7598 struct hppa_unw_table_entry * tp;
7599 unsigned long j, nfuns;
7600 bfd_boolean res = TRUE;
7601
7602 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7603 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7604 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7605 aux->funtab[nfuns++] = aux->symtab[j];
7606 aux->nfuns = nfuns;
7607 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7608
7609 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7610 {
7611 bfd_vma offset;
7612 const char * procname;
7613
7614 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7615 aux->strtab_size, tp->start, &procname,
7616 &offset);
7617
7618 fputs ("\n<", stdout);
7619
7620 if (procname)
7621 {
7622 fputs (procname, stdout);
7623
7624 if (offset)
7625 printf ("+%lx", (unsigned long) offset);
7626 }
7627
7628 fputs (">: [", stdout);
7629 print_vma (tp->start.offset, PREFIX_HEX);
7630 fputc ('-', stdout);
7631 print_vma (tp->end.offset, PREFIX_HEX);
7632 printf ("]\n\t");
7633
7634 #define PF(_m) if (tp->_m) printf (#_m " ");
7635 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7636 PF(Cannot_unwind);
7637 PF(Millicode);
7638 PF(Millicode_save_sr0);
7639 /* PV(Region_description); */
7640 PF(Entry_SR);
7641 PV(Entry_FR);
7642 PV(Entry_GR);
7643 PF(Args_stored);
7644 PF(Variable_Frame);
7645 PF(Separate_Package_Body);
7646 PF(Frame_Extension_Millicode);
7647 PF(Stack_Overflow_Check);
7648 PF(Two_Instruction_SP_Increment);
7649 PF(Ada_Region);
7650 PF(cxx_info);
7651 PF(cxx_try_catch);
7652 PF(sched_entry_seq);
7653 PF(Save_SP);
7654 PF(Save_RP);
7655 PF(Save_MRP_in_frame);
7656 PF(extn_ptr_defined);
7657 PF(Cleanup_defined);
7658 PF(MPE_XL_interrupt_marker);
7659 PF(HP_UX_interrupt_marker);
7660 PF(Large_frame);
7661 PF(Pseudo_SP_Set);
7662 PV(Total_frame_size);
7663 #undef PF
7664 #undef PV
7665 }
7666
7667 printf ("\n");
7668
7669 free (aux->funtab);
7670
7671 return res;
7672 }
7673
7674 static bfd_boolean
7675 slurp_hppa_unwind_table (FILE * file,
7676 struct hppa_unw_aux_info * aux,
7677 Elf_Internal_Shdr * sec)
7678 {
7679 unsigned long size, unw_ent_size, nentries, nrelas, i;
7680 Elf_Internal_Phdr * seg;
7681 struct hppa_unw_table_entry * tep;
7682 Elf_Internal_Shdr * relsec;
7683 Elf_Internal_Rela * rela;
7684 Elf_Internal_Rela * rp;
7685 unsigned char * table;
7686 unsigned char * tp;
7687 Elf_Internal_Sym * sym;
7688 const char * relname;
7689
7690 /* First, find the starting address of the segment that includes
7691 this section. */
7692 if (elf_header.e_phnum)
7693 {
7694 if (! get_program_headers (file))
7695 return FALSE;
7696
7697 for (seg = program_headers;
7698 seg < program_headers + elf_header.e_phnum;
7699 ++seg)
7700 {
7701 if (seg->p_type != PT_LOAD)
7702 continue;
7703
7704 if (sec->sh_addr >= seg->p_vaddr
7705 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7706 {
7707 aux->seg_base = seg->p_vaddr;
7708 break;
7709 }
7710 }
7711 }
7712
7713 /* Second, build the unwind table from the contents of the unwind
7714 section. */
7715 size = sec->sh_size;
7716 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7717 _("unwind table"));
7718 if (!table)
7719 return FALSE;
7720
7721 unw_ent_size = 16;
7722 nentries = size / unw_ent_size;
7723 size = unw_ent_size * nentries;
7724
7725 tep = aux->table = (struct hppa_unw_table_entry *)
7726 xcmalloc (nentries, sizeof (aux->table[0]));
7727
7728 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7729 {
7730 unsigned int tmp1, tmp2;
7731
7732 tep->start.section = SHN_UNDEF;
7733 tep->end.section = SHN_UNDEF;
7734
7735 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7736 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7737 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7738 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7739
7740 tep->start.offset += aux->seg_base;
7741 tep->end.offset += aux->seg_base;
7742
7743 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7744 tep->Millicode = (tmp1 >> 30) & 0x1;
7745 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7746 tep->Region_description = (tmp1 >> 27) & 0x3;
7747 tep->reserved1 = (tmp1 >> 26) & 0x1;
7748 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7749 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7750 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7751 tep->Args_stored = (tmp1 >> 15) & 0x1;
7752 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7753 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7754 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7755 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7756 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7757 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7758 tep->cxx_info = (tmp1 >> 8) & 0x1;
7759 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7760 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7761 tep->reserved2 = (tmp1 >> 5) & 0x1;
7762 tep->Save_SP = (tmp1 >> 4) & 0x1;
7763 tep->Save_RP = (tmp1 >> 3) & 0x1;
7764 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7765 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7766 tep->Cleanup_defined = tmp1 & 0x1;
7767
7768 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7769 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7770 tep->Large_frame = (tmp2 >> 29) & 0x1;
7771 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7772 tep->reserved4 = (tmp2 >> 27) & 0x1;
7773 tep->Total_frame_size = tmp2 & 0x7ffffff;
7774 }
7775 free (table);
7776
7777 /* Third, apply any relocations to the unwind table. */
7778 for (relsec = section_headers;
7779 relsec < section_headers + elf_header.e_shnum;
7780 ++relsec)
7781 {
7782 if (relsec->sh_type != SHT_RELA
7783 || relsec->sh_info >= elf_header.e_shnum
7784 || section_headers + relsec->sh_info != sec)
7785 continue;
7786
7787 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7788 & rela, & nrelas))
7789 return FALSE;
7790
7791 for (rp = rela; rp < rela + nrelas; ++rp)
7792 {
7793 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7794 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7795
7796 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7797 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7798 {
7799 warn (_("Skipping unexpected relocation type %s\n"), relname);
7800 continue;
7801 }
7802
7803 i = rp->r_offset / unw_ent_size;
7804
7805 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7806 {
7807 case 0:
7808 aux->table[i].start.section = sym->st_shndx;
7809 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7810 break;
7811 case 1:
7812 aux->table[i].end.section = sym->st_shndx;
7813 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7814 break;
7815 default:
7816 break;
7817 }
7818 }
7819
7820 free (rela);
7821 }
7822
7823 aux->table_len = nentries;
7824
7825 return TRUE;
7826 }
7827
7828 static bfd_boolean
7829 hppa_process_unwind (FILE * file)
7830 {
7831 struct hppa_unw_aux_info aux;
7832 Elf_Internal_Shdr * unwsec = NULL;
7833 Elf_Internal_Shdr * strsec;
7834 Elf_Internal_Shdr * sec;
7835 unsigned long i;
7836 bfd_boolean res = TRUE;
7837
7838 if (string_table == NULL)
7839 return FALSE;
7840
7841 memset (& aux, 0, sizeof (aux));
7842
7843 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7844 {
7845 if (sec->sh_type == SHT_SYMTAB
7846 && sec->sh_link < elf_header.e_shnum)
7847 {
7848 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7849
7850 strsec = section_headers + sec->sh_link;
7851 if (aux.strtab != NULL)
7852 {
7853 error (_("Multiple auxillary string tables encountered\n"));
7854 free (aux.strtab);
7855 res = FALSE;
7856 }
7857 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7858 1, strsec->sh_size,
7859 _("string table"));
7860 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7861 }
7862 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7863 unwsec = sec;
7864 }
7865
7866 if (!unwsec)
7867 printf (_("\nThere are no unwind sections in this file.\n"));
7868
7869 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7870 {
7871 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7872 {
7873 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7874 printable_section_name (sec),
7875 (unsigned long) sec->sh_offset,
7876 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7877
7878 if (! slurp_hppa_unwind_table (file, &aux, sec))
7879 res = FALSE;
7880
7881 if (aux.table_len > 0)
7882 {
7883 if (! dump_hppa_unwind (&aux))
7884 res = FALSE;
7885 }
7886
7887 if (aux.table)
7888 free ((char *) aux.table);
7889 aux.table = NULL;
7890 }
7891 }
7892
7893 if (aux.symtab)
7894 free (aux.symtab);
7895 if (aux.strtab)
7896 free ((char *) aux.strtab);
7897
7898 return res;
7899 }
7900
7901 struct arm_section
7902 {
7903 unsigned char * data; /* The unwind data. */
7904 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7905 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7906 unsigned long nrelas; /* The number of relocations. */
7907 unsigned int rel_type; /* REL or RELA ? */
7908 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7909 };
7910
7911 struct arm_unw_aux_info
7912 {
7913 FILE * file; /* The file containing the unwind sections. */
7914 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7915 unsigned long nsyms; /* Number of symbols. */
7916 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7917 unsigned long nfuns; /* Number of these symbols. */
7918 char * strtab; /* The file's string table. */
7919 unsigned long strtab_size; /* Size of string table. */
7920 };
7921
7922 static const char *
7923 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7924 bfd_vma fn, struct absaddr addr)
7925 {
7926 const char *procname;
7927 bfd_vma sym_offset;
7928
7929 if (addr.section == SHN_UNDEF)
7930 addr.offset = fn;
7931
7932 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7933 aux->strtab_size, addr, &procname,
7934 &sym_offset);
7935
7936 print_vma (fn, PREFIX_HEX);
7937
7938 if (procname)
7939 {
7940 fputs (" <", stdout);
7941 fputs (procname, stdout);
7942
7943 if (sym_offset)
7944 printf ("+0x%lx", (unsigned long) sym_offset);
7945 fputc ('>', stdout);
7946 }
7947
7948 return procname;
7949 }
7950
7951 static void
7952 arm_free_section (struct arm_section *arm_sec)
7953 {
7954 if (arm_sec->data != NULL)
7955 free (arm_sec->data);
7956
7957 if (arm_sec->rela != NULL)
7958 free (arm_sec->rela);
7959 }
7960
7961 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7962 cached section and install SEC instead.
7963 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7964 and return its valued in * WORDP, relocating if necessary.
7965 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7966 relocation's offset in ADDR.
7967 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7968 into the string table of the symbol associated with the reloc. If no
7969 reloc was applied store -1 there.
7970 5) Return TRUE upon success, FALSE otherwise. */
7971
7972 static bfd_boolean
7973 get_unwind_section_word (struct arm_unw_aux_info * aux,
7974 struct arm_section * arm_sec,
7975 Elf_Internal_Shdr * sec,
7976 bfd_vma word_offset,
7977 unsigned int * wordp,
7978 struct absaddr * addr,
7979 bfd_vma * sym_name)
7980 {
7981 Elf_Internal_Rela *rp;
7982 Elf_Internal_Sym *sym;
7983 const char * relname;
7984 unsigned int word;
7985 bfd_boolean wrapped;
7986
7987 if (sec == NULL || arm_sec == NULL)
7988 return FALSE;
7989
7990 addr->section = SHN_UNDEF;
7991 addr->offset = 0;
7992
7993 if (sym_name != NULL)
7994 *sym_name = (bfd_vma) -1;
7995
7996 /* If necessary, update the section cache. */
7997 if (sec != arm_sec->sec)
7998 {
7999 Elf_Internal_Shdr *relsec;
8000
8001 arm_free_section (arm_sec);
8002
8003 arm_sec->sec = sec;
8004 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
8005 sec->sh_size, _("unwind data"));
8006 arm_sec->rela = NULL;
8007 arm_sec->nrelas = 0;
8008
8009 for (relsec = section_headers;
8010 relsec < section_headers + elf_header.e_shnum;
8011 ++relsec)
8012 {
8013 if (relsec->sh_info >= elf_header.e_shnum
8014 || section_headers + relsec->sh_info != sec
8015 /* PR 15745: Check the section type as well. */
8016 || (relsec->sh_type != SHT_REL
8017 && relsec->sh_type != SHT_RELA))
8018 continue;
8019
8020 arm_sec->rel_type = relsec->sh_type;
8021 if (relsec->sh_type == SHT_REL)
8022 {
8023 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
8024 relsec->sh_size,
8025 & arm_sec->rela, & arm_sec->nrelas))
8026 return FALSE;
8027 }
8028 else /* relsec->sh_type == SHT_RELA */
8029 {
8030 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
8031 relsec->sh_size,
8032 & arm_sec->rela, & arm_sec->nrelas))
8033 return FALSE;
8034 }
8035 break;
8036 }
8037
8038 arm_sec->next_rela = arm_sec->rela;
8039 }
8040
8041 /* If there is no unwind data we can do nothing. */
8042 if (arm_sec->data == NULL)
8043 return FALSE;
8044
8045 /* If the offset is invalid then fail. */
8046 if (word_offset > (sec->sh_size - 4)
8047 /* PR 18879 */
8048 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
8049 || ((bfd_signed_vma) word_offset) < 0)
8050 return FALSE;
8051
8052 /* Get the word at the required offset. */
8053 word = byte_get (arm_sec->data + word_offset, 4);
8054
8055 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8056 if (arm_sec->rela == NULL)
8057 {
8058 * wordp = word;
8059 return TRUE;
8060 }
8061
8062 /* Look through the relocs to find the one that applies to the provided offset. */
8063 wrapped = FALSE;
8064 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8065 {
8066 bfd_vma prelval, offset;
8067
8068 if (rp->r_offset > word_offset && !wrapped)
8069 {
8070 rp = arm_sec->rela;
8071 wrapped = TRUE;
8072 }
8073 if (rp->r_offset > word_offset)
8074 break;
8075
8076 if (rp->r_offset & 3)
8077 {
8078 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8079 (unsigned long) rp->r_offset);
8080 continue;
8081 }
8082
8083 if (rp->r_offset < word_offset)
8084 continue;
8085
8086 /* PR 17531: file: 027-161405-0.004 */
8087 if (aux->symtab == NULL)
8088 continue;
8089
8090 if (arm_sec->rel_type == SHT_REL)
8091 {
8092 offset = word & 0x7fffffff;
8093 if (offset & 0x40000000)
8094 offset |= ~ (bfd_vma) 0x7fffffff;
8095 }
8096 else if (arm_sec->rel_type == SHT_RELA)
8097 offset = rp->r_addend;
8098 else
8099 {
8100 error (_("Unknown section relocation type %d encountered\n"),
8101 arm_sec->rel_type);
8102 break;
8103 }
8104
8105 /* PR 17531 file: 027-1241568-0.004. */
8106 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8107 {
8108 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8109 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8110 break;
8111 }
8112
8113 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8114 offset += sym->st_value;
8115 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8116
8117 /* Check that we are processing the expected reloc type. */
8118 if (elf_header.e_machine == EM_ARM)
8119 {
8120 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8121 if (relname == NULL)
8122 {
8123 warn (_("Skipping unknown ARM relocation type: %d\n"),
8124 (int) ELF32_R_TYPE (rp->r_info));
8125 continue;
8126 }
8127
8128 if (streq (relname, "R_ARM_NONE"))
8129 continue;
8130
8131 if (! streq (relname, "R_ARM_PREL31"))
8132 {
8133 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8134 continue;
8135 }
8136 }
8137 else if (elf_header.e_machine == EM_TI_C6000)
8138 {
8139 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8140 if (relname == NULL)
8141 {
8142 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8143 (int) ELF32_R_TYPE (rp->r_info));
8144 continue;
8145 }
8146
8147 if (streq (relname, "R_C6000_NONE"))
8148 continue;
8149
8150 if (! streq (relname, "R_C6000_PREL31"))
8151 {
8152 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8153 continue;
8154 }
8155
8156 prelval >>= 1;
8157 }
8158 else
8159 {
8160 /* This function currently only supports ARM and TI unwinders. */
8161 warn (_("Only TI and ARM unwinders are currently supported\n"));
8162 break;
8163 }
8164
8165 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8166 addr->section = sym->st_shndx;
8167 addr->offset = offset;
8168
8169 if (sym_name)
8170 * sym_name = sym->st_name;
8171 break;
8172 }
8173
8174 *wordp = word;
8175 arm_sec->next_rela = rp;
8176
8177 return TRUE;
8178 }
8179
8180 static const char *tic6x_unwind_regnames[16] =
8181 {
8182 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8183 "A14", "A13", "A12", "A11", "A10",
8184 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8185 };
8186
8187 static void
8188 decode_tic6x_unwind_regmask (unsigned int mask)
8189 {
8190 int i;
8191
8192 for (i = 12; mask; mask >>= 1, i--)
8193 {
8194 if (mask & 1)
8195 {
8196 fputs (tic6x_unwind_regnames[i], stdout);
8197 if (mask > 1)
8198 fputs (", ", stdout);
8199 }
8200 }
8201 }
8202
8203 #define ADVANCE \
8204 if (remaining == 0 && more_words) \
8205 { \
8206 data_offset += 4; \
8207 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8208 data_offset, & word, & addr, NULL)) \
8209 return FALSE; \
8210 remaining = 4; \
8211 more_words--; \
8212 } \
8213
8214 #define GET_OP(OP) \
8215 ADVANCE; \
8216 if (remaining) \
8217 { \
8218 remaining--; \
8219 (OP) = word >> 24; \
8220 word <<= 8; \
8221 } \
8222 else \
8223 { \
8224 printf (_("[Truncated opcode]\n")); \
8225 return FALSE; \
8226 } \
8227 printf ("0x%02x ", OP)
8228
8229 static bfd_boolean
8230 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8231 unsigned int word,
8232 unsigned int remaining,
8233 unsigned int more_words,
8234 bfd_vma data_offset,
8235 Elf_Internal_Shdr * data_sec,
8236 struct arm_section * data_arm_sec)
8237 {
8238 struct absaddr addr;
8239 bfd_boolean res = TRUE;
8240
8241 /* Decode the unwinding instructions. */
8242 while (1)
8243 {
8244 unsigned int op, op2;
8245
8246 ADVANCE;
8247 if (remaining == 0)
8248 break;
8249 remaining--;
8250 op = word >> 24;
8251 word <<= 8;
8252
8253 printf (" 0x%02x ", op);
8254
8255 if ((op & 0xc0) == 0x00)
8256 {
8257 int offset = ((op & 0x3f) << 2) + 4;
8258
8259 printf (" vsp = vsp + %d", offset);
8260 }
8261 else if ((op & 0xc0) == 0x40)
8262 {
8263 int offset = ((op & 0x3f) << 2) + 4;
8264
8265 printf (" vsp = vsp - %d", offset);
8266 }
8267 else if ((op & 0xf0) == 0x80)
8268 {
8269 GET_OP (op2);
8270 if (op == 0x80 && op2 == 0)
8271 printf (_("Refuse to unwind"));
8272 else
8273 {
8274 unsigned int mask = ((op & 0x0f) << 8) | op2;
8275 bfd_boolean first = TRUE;
8276 int i;
8277
8278 printf ("pop {");
8279 for (i = 0; i < 12; i++)
8280 if (mask & (1 << i))
8281 {
8282 if (first)
8283 first = FALSE;
8284 else
8285 printf (", ");
8286 printf ("r%d", 4 + i);
8287 }
8288 printf ("}");
8289 }
8290 }
8291 else if ((op & 0xf0) == 0x90)
8292 {
8293 if (op == 0x9d || op == 0x9f)
8294 printf (_(" [Reserved]"));
8295 else
8296 printf (" vsp = r%d", op & 0x0f);
8297 }
8298 else if ((op & 0xf0) == 0xa0)
8299 {
8300 int end = 4 + (op & 0x07);
8301 bfd_boolean first = TRUE;
8302 int i;
8303
8304 printf (" pop {");
8305 for (i = 4; i <= end; i++)
8306 {
8307 if (first)
8308 first = FALSE;
8309 else
8310 printf (", ");
8311 printf ("r%d", i);
8312 }
8313 if (op & 0x08)
8314 {
8315 if (!first)
8316 printf (", ");
8317 printf ("r14");
8318 }
8319 printf ("}");
8320 }
8321 else if (op == 0xb0)
8322 printf (_(" finish"));
8323 else if (op == 0xb1)
8324 {
8325 GET_OP (op2);
8326 if (op2 == 0 || (op2 & 0xf0) != 0)
8327 printf (_("[Spare]"));
8328 else
8329 {
8330 unsigned int mask = op2 & 0x0f;
8331 bfd_boolean first = TRUE;
8332 int i;
8333
8334 printf ("pop {");
8335 for (i = 0; i < 12; i++)
8336 if (mask & (1 << i))
8337 {
8338 if (first)
8339 first = FALSE;
8340 else
8341 printf (", ");
8342 printf ("r%d", i);
8343 }
8344 printf ("}");
8345 }
8346 }
8347 else if (op == 0xb2)
8348 {
8349 unsigned char buf[9];
8350 unsigned int i, len;
8351 unsigned long offset;
8352
8353 for (i = 0; i < sizeof (buf); i++)
8354 {
8355 GET_OP (buf[i]);
8356 if ((buf[i] & 0x80) == 0)
8357 break;
8358 }
8359 if (i == sizeof (buf))
8360 {
8361 error (_("corrupt change to vsp"));
8362 res = FALSE;
8363 }
8364 else
8365 {
8366 offset = read_uleb128 (buf, &len, buf + i + 1);
8367 assert (len == i + 1);
8368 offset = offset * 4 + 0x204;
8369 printf ("vsp = vsp + %ld", offset);
8370 }
8371 }
8372 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8373 {
8374 unsigned int first, last;
8375
8376 GET_OP (op2);
8377 first = op2 >> 4;
8378 last = op2 & 0x0f;
8379 if (op == 0xc8)
8380 first = first + 16;
8381 printf ("pop {D%d", first);
8382 if (last)
8383 printf ("-D%d", first + last);
8384 printf ("}");
8385 }
8386 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8387 {
8388 unsigned int count = op & 0x07;
8389
8390 printf ("pop {D8");
8391 if (count)
8392 printf ("-D%d", 8 + count);
8393 printf ("}");
8394 }
8395 else if (op >= 0xc0 && op <= 0xc5)
8396 {
8397 unsigned int count = op & 0x07;
8398
8399 printf (" pop {wR10");
8400 if (count)
8401 printf ("-wR%d", 10 + count);
8402 printf ("}");
8403 }
8404 else if (op == 0xc6)
8405 {
8406 unsigned int first, last;
8407
8408 GET_OP (op2);
8409 first = op2 >> 4;
8410 last = op2 & 0x0f;
8411 printf ("pop {wR%d", first);
8412 if (last)
8413 printf ("-wR%d", first + last);
8414 printf ("}");
8415 }
8416 else if (op == 0xc7)
8417 {
8418 GET_OP (op2);
8419 if (op2 == 0 || (op2 & 0xf0) != 0)
8420 printf (_("[Spare]"));
8421 else
8422 {
8423 unsigned int mask = op2 & 0x0f;
8424 bfd_boolean first = TRUE;
8425 int i;
8426
8427 printf ("pop {");
8428 for (i = 0; i < 4; i++)
8429 if (mask & (1 << i))
8430 {
8431 if (first)
8432 first = FALSE;
8433 else
8434 printf (", ");
8435 printf ("wCGR%d", i);
8436 }
8437 printf ("}");
8438 }
8439 }
8440 else
8441 {
8442 printf (_(" [unsupported opcode]"));
8443 res = FALSE;
8444 }
8445
8446 printf ("\n");
8447 }
8448
8449 return res;
8450 }
8451
8452 static bfd_boolean
8453 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8454 unsigned int word,
8455 unsigned int remaining,
8456 unsigned int more_words,
8457 bfd_vma data_offset,
8458 Elf_Internal_Shdr * data_sec,
8459 struct arm_section * data_arm_sec)
8460 {
8461 struct absaddr addr;
8462
8463 /* Decode the unwinding instructions. */
8464 while (1)
8465 {
8466 unsigned int op, op2;
8467
8468 ADVANCE;
8469 if (remaining == 0)
8470 break;
8471 remaining--;
8472 op = word >> 24;
8473 word <<= 8;
8474
8475 printf (" 0x%02x ", op);
8476
8477 if ((op & 0xc0) == 0x00)
8478 {
8479 int offset = ((op & 0x3f) << 3) + 8;
8480 printf (" sp = sp + %d", offset);
8481 }
8482 else if ((op & 0xc0) == 0x80)
8483 {
8484 GET_OP (op2);
8485 if (op == 0x80 && op2 == 0)
8486 printf (_("Refuse to unwind"));
8487 else
8488 {
8489 unsigned int mask = ((op & 0x1f) << 8) | op2;
8490 if (op & 0x20)
8491 printf ("pop compact {");
8492 else
8493 printf ("pop {");
8494
8495 decode_tic6x_unwind_regmask (mask);
8496 printf("}");
8497 }
8498 }
8499 else if ((op & 0xf0) == 0xc0)
8500 {
8501 unsigned int reg;
8502 unsigned int nregs;
8503 unsigned int i;
8504 const char *name;
8505 struct
8506 {
8507 unsigned int offset;
8508 unsigned int reg;
8509 } regpos[16];
8510
8511 /* Scan entire instruction first so that GET_OP output is not
8512 interleaved with disassembly. */
8513 nregs = 0;
8514 for (i = 0; nregs < (op & 0xf); i++)
8515 {
8516 GET_OP (op2);
8517 reg = op2 >> 4;
8518 if (reg != 0xf)
8519 {
8520 regpos[nregs].offset = i * 2;
8521 regpos[nregs].reg = reg;
8522 nregs++;
8523 }
8524
8525 reg = op2 & 0xf;
8526 if (reg != 0xf)
8527 {
8528 regpos[nregs].offset = i * 2 + 1;
8529 regpos[nregs].reg = reg;
8530 nregs++;
8531 }
8532 }
8533
8534 printf (_("pop frame {"));
8535 reg = nregs - 1;
8536 for (i = i * 2; i > 0; i--)
8537 {
8538 if (regpos[reg].offset == i - 1)
8539 {
8540 name = tic6x_unwind_regnames[regpos[reg].reg];
8541 if (reg > 0)
8542 reg--;
8543 }
8544 else
8545 name = _("[pad]");
8546
8547 fputs (name, stdout);
8548 if (i > 1)
8549 printf (", ");
8550 }
8551
8552 printf ("}");
8553 }
8554 else if (op == 0xd0)
8555 printf (" MOV FP, SP");
8556 else if (op == 0xd1)
8557 printf (" __c6xabi_pop_rts");
8558 else if (op == 0xd2)
8559 {
8560 unsigned char buf[9];
8561 unsigned int i, len;
8562 unsigned long offset;
8563
8564 for (i = 0; i < sizeof (buf); i++)
8565 {
8566 GET_OP (buf[i]);
8567 if ((buf[i] & 0x80) == 0)
8568 break;
8569 }
8570 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8571 if (i == sizeof (buf))
8572 {
8573 warn (_("Corrupt stack pointer adjustment detected\n"));
8574 return FALSE;
8575 }
8576
8577 offset = read_uleb128 (buf, &len, buf + i + 1);
8578 assert (len == i + 1);
8579 offset = offset * 8 + 0x408;
8580 printf (_("sp = sp + %ld"), offset);
8581 }
8582 else if ((op & 0xf0) == 0xe0)
8583 {
8584 if ((op & 0x0f) == 7)
8585 printf (" RETURN");
8586 else
8587 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8588 }
8589 else
8590 {
8591 printf (_(" [unsupported opcode]"));
8592 }
8593 putchar ('\n');
8594 }
8595
8596 return TRUE;
8597 }
8598
8599 static bfd_vma
8600 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8601 {
8602 bfd_vma offset;
8603
8604 offset = word & 0x7fffffff;
8605 if (offset & 0x40000000)
8606 offset |= ~ (bfd_vma) 0x7fffffff;
8607
8608 if (elf_header.e_machine == EM_TI_C6000)
8609 offset <<= 1;
8610
8611 return offset + where;
8612 }
8613
8614 static bfd_boolean
8615 decode_arm_unwind (struct arm_unw_aux_info * aux,
8616 unsigned int word,
8617 unsigned int remaining,
8618 bfd_vma data_offset,
8619 Elf_Internal_Shdr * data_sec,
8620 struct arm_section * data_arm_sec)
8621 {
8622 int per_index;
8623 unsigned int more_words = 0;
8624 struct absaddr addr;
8625 bfd_vma sym_name = (bfd_vma) -1;
8626 bfd_boolean res = FALSE;
8627
8628 if (remaining == 0)
8629 {
8630 /* Fetch the first word.
8631 Note - when decoding an object file the address extracted
8632 here will always be 0. So we also pass in the sym_name
8633 parameter so that we can find the symbol associated with
8634 the personality routine. */
8635 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8636 & word, & addr, & sym_name))
8637 return FALSE;
8638
8639 remaining = 4;
8640 }
8641
8642 if ((word & 0x80000000) == 0)
8643 {
8644 /* Expand prel31 for personality routine. */
8645 bfd_vma fn;
8646 const char *procname;
8647
8648 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8649 printf (_(" Personality routine: "));
8650 if (fn == 0
8651 && addr.section == SHN_UNDEF && addr.offset == 0
8652 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8653 {
8654 procname = aux->strtab + sym_name;
8655 print_vma (fn, PREFIX_HEX);
8656 if (procname)
8657 {
8658 fputs (" <", stdout);
8659 fputs (procname, stdout);
8660 fputc ('>', stdout);
8661 }
8662 }
8663 else
8664 procname = arm_print_vma_and_name (aux, fn, addr);
8665 fputc ('\n', stdout);
8666
8667 /* The GCC personality routines use the standard compact
8668 encoding, starting with one byte giving the number of
8669 words. */
8670 if (procname != NULL
8671 && (const_strneq (procname, "__gcc_personality_v0")
8672 || const_strneq (procname, "__gxx_personality_v0")
8673 || const_strneq (procname, "__gcj_personality_v0")
8674 || const_strneq (procname, "__gnu_objc_personality_v0")))
8675 {
8676 remaining = 0;
8677 more_words = 1;
8678 ADVANCE;
8679 if (!remaining)
8680 {
8681 printf (_(" [Truncated data]\n"));
8682 return FALSE;
8683 }
8684 more_words = word >> 24;
8685 word <<= 8;
8686 remaining--;
8687 per_index = -1;
8688 }
8689 else
8690 return TRUE;
8691 }
8692 else
8693 {
8694 /* ARM EHABI Section 6.3:
8695
8696 An exception-handling table entry for the compact model looks like:
8697
8698 31 30-28 27-24 23-0
8699 -- ----- ----- ----
8700 1 0 index Data for personalityRoutine[index] */
8701
8702 if (elf_header.e_machine == EM_ARM
8703 && (word & 0x70000000))
8704 {
8705 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8706 res = FALSE;
8707 }
8708
8709 per_index = (word >> 24) & 0x7f;
8710 printf (_(" Compact model index: %d\n"), per_index);
8711 if (per_index == 0)
8712 {
8713 more_words = 0;
8714 word <<= 8;
8715 remaining--;
8716 }
8717 else if (per_index < 3)
8718 {
8719 more_words = (word >> 16) & 0xff;
8720 word <<= 16;
8721 remaining -= 2;
8722 }
8723 }
8724
8725 switch (elf_header.e_machine)
8726 {
8727 case EM_ARM:
8728 if (per_index < 3)
8729 {
8730 if (! decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8731 data_offset, data_sec, data_arm_sec))
8732 res = FALSE;
8733 }
8734 else
8735 {
8736 warn (_("Unknown ARM compact model index encountered\n"));
8737 printf (_(" [reserved]\n"));
8738 res = FALSE;
8739 }
8740 break;
8741
8742 case EM_TI_C6000:
8743 if (per_index < 3)
8744 {
8745 if (! decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8746 data_offset, data_sec, data_arm_sec))
8747 res = FALSE;
8748 }
8749 else if (per_index < 5)
8750 {
8751 if (((word >> 17) & 0x7f) == 0x7f)
8752 printf (_(" Restore stack from frame pointer\n"));
8753 else
8754 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8755 printf (_(" Registers restored: "));
8756 if (per_index == 4)
8757 printf (" (compact) ");
8758 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8759 putchar ('\n');
8760 printf (_(" Return register: %s\n"),
8761 tic6x_unwind_regnames[word & 0xf]);
8762 }
8763 else
8764 printf (_(" [reserved (%d)]\n"), per_index);
8765 break;
8766
8767 default:
8768 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8769 elf_header.e_machine);
8770 res = FALSE;
8771 }
8772
8773 /* Decode the descriptors. Not implemented. */
8774
8775 return res;
8776 }
8777
8778 static bfd_boolean
8779 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8780 {
8781 struct arm_section exidx_arm_sec, extab_arm_sec;
8782 unsigned int i, exidx_len;
8783 unsigned long j, nfuns;
8784 bfd_boolean res = TRUE;
8785
8786 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8787 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8788 exidx_len = exidx_sec->sh_size / 8;
8789
8790 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8791 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8792 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8793 aux->funtab[nfuns++] = aux->symtab[j];
8794 aux->nfuns = nfuns;
8795 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8796
8797 for (i = 0; i < exidx_len; i++)
8798 {
8799 unsigned int exidx_fn, exidx_entry;
8800 struct absaddr fn_addr, entry_addr;
8801 bfd_vma fn;
8802
8803 fputc ('\n', stdout);
8804
8805 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8806 8 * i, & exidx_fn, & fn_addr, NULL)
8807 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8808 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8809 {
8810 free (aux->funtab);
8811 arm_free_section (& exidx_arm_sec);
8812 arm_free_section (& extab_arm_sec);
8813 return FALSE;
8814 }
8815
8816 /* ARM EHABI, Section 5:
8817 An index table entry consists of 2 words.
8818 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8819 if (exidx_fn & 0x80000000)
8820 {
8821 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8822 res = FALSE;
8823 }
8824
8825 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8826
8827 arm_print_vma_and_name (aux, fn, fn_addr);
8828 fputs (": ", stdout);
8829
8830 if (exidx_entry == 1)
8831 {
8832 print_vma (exidx_entry, PREFIX_HEX);
8833 fputs (" [cantunwind]\n", stdout);
8834 }
8835 else if (exidx_entry & 0x80000000)
8836 {
8837 print_vma (exidx_entry, PREFIX_HEX);
8838 fputc ('\n', stdout);
8839 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8840 }
8841 else
8842 {
8843 bfd_vma table, table_offset = 0;
8844 Elf_Internal_Shdr *table_sec;
8845
8846 fputs ("@", stdout);
8847 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8848 print_vma (table, PREFIX_HEX);
8849 printf ("\n");
8850
8851 /* Locate the matching .ARM.extab. */
8852 if (entry_addr.section != SHN_UNDEF
8853 && entry_addr.section < elf_header.e_shnum)
8854 {
8855 table_sec = section_headers + entry_addr.section;
8856 table_offset = entry_addr.offset;
8857 /* PR 18879 */
8858 if (table_offset > table_sec->sh_size
8859 || ((bfd_signed_vma) table_offset) < 0)
8860 {
8861 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8862 (unsigned long) table_offset,
8863 printable_section_name (table_sec));
8864 res = FALSE;
8865 continue;
8866 }
8867 }
8868 else
8869 {
8870 table_sec = find_section_by_address (table);
8871 if (table_sec != NULL)
8872 table_offset = table - table_sec->sh_addr;
8873 }
8874
8875 if (table_sec == NULL)
8876 {
8877 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8878 (unsigned long) table);
8879 res = FALSE;
8880 continue;
8881 }
8882
8883 if (! decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8884 &extab_arm_sec))
8885 res = FALSE;
8886 }
8887 }
8888
8889 printf ("\n");
8890
8891 free (aux->funtab);
8892 arm_free_section (&exidx_arm_sec);
8893 arm_free_section (&extab_arm_sec);
8894
8895 return res;
8896 }
8897
8898 /* Used for both ARM and C6X unwinding tables. */
8899
8900 static bfd_boolean
8901 arm_process_unwind (FILE *file)
8902 {
8903 struct arm_unw_aux_info aux;
8904 Elf_Internal_Shdr *unwsec = NULL;
8905 Elf_Internal_Shdr *strsec;
8906 Elf_Internal_Shdr *sec;
8907 unsigned long i;
8908 unsigned int sec_type;
8909 bfd_boolean res = TRUE;
8910
8911 switch (elf_header.e_machine)
8912 {
8913 case EM_ARM:
8914 sec_type = SHT_ARM_EXIDX;
8915 break;
8916
8917 case EM_TI_C6000:
8918 sec_type = SHT_C6000_UNWIND;
8919 break;
8920
8921 default:
8922 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8923 elf_header.e_machine);
8924 return FALSE;
8925 }
8926
8927 if (string_table == NULL)
8928 return FALSE;
8929
8930 memset (& aux, 0, sizeof (aux));
8931 aux.file = file;
8932
8933 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8934 {
8935 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8936 {
8937 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8938
8939 strsec = section_headers + sec->sh_link;
8940
8941 /* PR binutils/17531 file: 011-12666-0.004. */
8942 if (aux.strtab != NULL)
8943 {
8944 error (_("Multiple string tables found in file.\n"));
8945 free (aux.strtab);
8946 res = FALSE;
8947 }
8948 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8949 1, strsec->sh_size, _("string table"));
8950 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8951 }
8952 else if (sec->sh_type == sec_type)
8953 unwsec = sec;
8954 }
8955
8956 if (unwsec == NULL)
8957 printf (_("\nThere are no unwind sections in this file.\n"));
8958 else
8959 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8960 {
8961 if (sec->sh_type == sec_type)
8962 {
8963 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8964 printable_section_name (sec),
8965 (unsigned long) sec->sh_offset,
8966 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8967
8968 if (! dump_arm_unwind (&aux, sec))
8969 res = FALSE;
8970 }
8971 }
8972
8973 if (aux.symtab)
8974 free (aux.symtab);
8975 if (aux.strtab)
8976 free ((char *) aux.strtab);
8977
8978 return res;
8979 }
8980
8981 static bfd_boolean
8982 process_unwind (FILE * file)
8983 {
8984 struct unwind_handler
8985 {
8986 unsigned int machtype;
8987 bfd_boolean (* handler)(FILE *);
8988 } handlers[] =
8989 {
8990 { EM_ARM, arm_process_unwind },
8991 { EM_IA_64, ia64_process_unwind },
8992 { EM_PARISC, hppa_process_unwind },
8993 { EM_TI_C6000, arm_process_unwind },
8994 { 0, NULL }
8995 };
8996 int i;
8997
8998 if (!do_unwind)
8999 return TRUE;
9000
9001 for (i = 0; handlers[i].handler != NULL; i++)
9002 if (elf_header.e_machine == handlers[i].machtype)
9003 return handlers[i].handler (file);
9004
9005 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9006 get_machine_name (elf_header.e_machine));
9007 return TRUE;
9008 }
9009
9010 static void
9011 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9012 {
9013 switch (entry->d_tag)
9014 {
9015 case DT_MIPS_FLAGS:
9016 if (entry->d_un.d_val == 0)
9017 printf (_("NONE"));
9018 else
9019 {
9020 static const char * opts[] =
9021 {
9022 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9023 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9024 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9025 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9026 "RLD_ORDER_SAFE"
9027 };
9028 unsigned int cnt;
9029 bfd_boolean first = TRUE;
9030
9031 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9032 if (entry->d_un.d_val & (1 << cnt))
9033 {
9034 printf ("%s%s", first ? "" : " ", opts[cnt]);
9035 first = FALSE;
9036 }
9037 }
9038 break;
9039
9040 case DT_MIPS_IVERSION:
9041 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9042 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9043 else
9044 {
9045 char buf[40];
9046 sprintf_vma (buf, entry->d_un.d_ptr);
9047 /* Note: coded this way so that there is a single string for translation. */
9048 printf (_("<corrupt: %s>"), buf);
9049 }
9050 break;
9051
9052 case DT_MIPS_TIME_STAMP:
9053 {
9054 char timebuf[128];
9055 struct tm * tmp;
9056 time_t atime = entry->d_un.d_val;
9057
9058 tmp = gmtime (&atime);
9059 /* PR 17531: file: 6accc532. */
9060 if (tmp == NULL)
9061 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9062 else
9063 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9064 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9065 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9066 printf (_("Time Stamp: %s"), timebuf);
9067 }
9068 break;
9069
9070 case DT_MIPS_RLD_VERSION:
9071 case DT_MIPS_LOCAL_GOTNO:
9072 case DT_MIPS_CONFLICTNO:
9073 case DT_MIPS_LIBLISTNO:
9074 case DT_MIPS_SYMTABNO:
9075 case DT_MIPS_UNREFEXTNO:
9076 case DT_MIPS_HIPAGENO:
9077 case DT_MIPS_DELTA_CLASS_NO:
9078 case DT_MIPS_DELTA_INSTANCE_NO:
9079 case DT_MIPS_DELTA_RELOC_NO:
9080 case DT_MIPS_DELTA_SYM_NO:
9081 case DT_MIPS_DELTA_CLASSSYM_NO:
9082 case DT_MIPS_COMPACT_SIZE:
9083 print_vma (entry->d_un.d_val, DEC);
9084 break;
9085
9086 default:
9087 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9088 }
9089 putchar ('\n');
9090 }
9091
9092 static void
9093 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9094 {
9095 switch (entry->d_tag)
9096 {
9097 case DT_HP_DLD_FLAGS:
9098 {
9099 static struct
9100 {
9101 long int bit;
9102 const char * str;
9103 }
9104 flags[] =
9105 {
9106 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9107 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9108 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9109 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9110 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9111 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9112 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9113 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9114 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9115 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9116 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9117 { DT_HP_GST, "HP_GST" },
9118 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9119 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9120 { DT_HP_NODELETE, "HP_NODELETE" },
9121 { DT_HP_GROUP, "HP_GROUP" },
9122 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9123 };
9124 bfd_boolean first = TRUE;
9125 size_t cnt;
9126 bfd_vma val = entry->d_un.d_val;
9127
9128 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9129 if (val & flags[cnt].bit)
9130 {
9131 if (! first)
9132 putchar (' ');
9133 fputs (flags[cnt].str, stdout);
9134 first = FALSE;
9135 val ^= flags[cnt].bit;
9136 }
9137
9138 if (val != 0 || first)
9139 {
9140 if (! first)
9141 putchar (' ');
9142 print_vma (val, HEX);
9143 }
9144 }
9145 break;
9146
9147 default:
9148 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9149 break;
9150 }
9151 putchar ('\n');
9152 }
9153
9154 #ifdef BFD64
9155
9156 /* VMS vs Unix time offset and factor. */
9157
9158 #define VMS_EPOCH_OFFSET 35067168000000000LL
9159 #define VMS_GRANULARITY_FACTOR 10000000
9160
9161 /* Display a VMS time in a human readable format. */
9162
9163 static void
9164 print_vms_time (bfd_int64_t vmstime)
9165 {
9166 struct tm *tm;
9167 time_t unxtime;
9168
9169 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9170 tm = gmtime (&unxtime);
9171 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9172 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9173 tm->tm_hour, tm->tm_min, tm->tm_sec);
9174 }
9175 #endif /* BFD64 */
9176
9177 static void
9178 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9179 {
9180 switch (entry->d_tag)
9181 {
9182 case DT_IA_64_PLT_RESERVE:
9183 /* First 3 slots reserved. */
9184 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9185 printf (" -- ");
9186 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9187 break;
9188
9189 case DT_IA_64_VMS_LINKTIME:
9190 #ifdef BFD64
9191 print_vms_time (entry->d_un.d_val);
9192 #endif
9193 break;
9194
9195 case DT_IA_64_VMS_LNKFLAGS:
9196 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9197 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9198 printf (" CALL_DEBUG");
9199 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9200 printf (" NOP0BUFS");
9201 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9202 printf (" P0IMAGE");
9203 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9204 printf (" MKTHREADS");
9205 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9206 printf (" UPCALLS");
9207 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9208 printf (" IMGSTA");
9209 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9210 printf (" INITIALIZE");
9211 if (entry->d_un.d_val & VMS_LF_MAIN)
9212 printf (" MAIN");
9213 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9214 printf (" EXE_INIT");
9215 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9216 printf (" TBK_IN_IMG");
9217 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9218 printf (" DBG_IN_IMG");
9219 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9220 printf (" TBK_IN_DSF");
9221 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9222 printf (" DBG_IN_DSF");
9223 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9224 printf (" SIGNATURES");
9225 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9226 printf (" REL_SEG_OFF");
9227 break;
9228
9229 default:
9230 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9231 break;
9232 }
9233 putchar ('\n');
9234 }
9235
9236 static bfd_boolean
9237 get_32bit_dynamic_section (FILE * file)
9238 {
9239 Elf32_External_Dyn * edyn;
9240 Elf32_External_Dyn * ext;
9241 Elf_Internal_Dyn * entry;
9242
9243 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9244 dynamic_size, _("dynamic section"));
9245 if (!edyn)
9246 return FALSE;
9247
9248 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9249 might not have the luxury of section headers. Look for the DT_NULL
9250 terminator to determine the number of entries. */
9251 for (ext = edyn, dynamic_nent = 0;
9252 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9253 ext++)
9254 {
9255 dynamic_nent++;
9256 if (BYTE_GET (ext->d_tag) == DT_NULL)
9257 break;
9258 }
9259
9260 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9261 sizeof (* entry));
9262 if (dynamic_section == NULL)
9263 {
9264 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9265 (unsigned long) dynamic_nent);
9266 free (edyn);
9267 return FALSE;
9268 }
9269
9270 for (ext = edyn, entry = dynamic_section;
9271 entry < dynamic_section + dynamic_nent;
9272 ext++, entry++)
9273 {
9274 entry->d_tag = BYTE_GET (ext->d_tag);
9275 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9276 }
9277
9278 free (edyn);
9279
9280 return TRUE;
9281 }
9282
9283 static bfd_boolean
9284 get_64bit_dynamic_section (FILE * file)
9285 {
9286 Elf64_External_Dyn * edyn;
9287 Elf64_External_Dyn * ext;
9288 Elf_Internal_Dyn * entry;
9289
9290 /* Read in the data. */
9291 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9292 dynamic_size, _("dynamic section"));
9293 if (!edyn)
9294 return FALSE;
9295
9296 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9297 might not have the luxury of section headers. Look for the DT_NULL
9298 terminator to determine the number of entries. */
9299 for (ext = edyn, dynamic_nent = 0;
9300 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9301 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9302 ext++)
9303 {
9304 dynamic_nent++;
9305 if (BYTE_GET (ext->d_tag) == DT_NULL)
9306 break;
9307 }
9308
9309 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9310 sizeof (* entry));
9311 if (dynamic_section == NULL)
9312 {
9313 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9314 (unsigned long) dynamic_nent);
9315 free (edyn);
9316 return FALSE;
9317 }
9318
9319 /* Convert from external to internal formats. */
9320 for (ext = edyn, entry = dynamic_section;
9321 entry < dynamic_section + dynamic_nent;
9322 ext++, entry++)
9323 {
9324 entry->d_tag = BYTE_GET (ext->d_tag);
9325 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9326 }
9327
9328 free (edyn);
9329
9330 return TRUE;
9331 }
9332
9333 static void
9334 print_dynamic_flags (bfd_vma flags)
9335 {
9336 bfd_boolean first = TRUE;
9337
9338 while (flags)
9339 {
9340 bfd_vma flag;
9341
9342 flag = flags & - flags;
9343 flags &= ~ flag;
9344
9345 if (first)
9346 first = FALSE;
9347 else
9348 putc (' ', stdout);
9349
9350 switch (flag)
9351 {
9352 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9353 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9354 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9355 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9356 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9357 default: fputs (_("unknown"), stdout); break;
9358 }
9359 }
9360 puts ("");
9361 }
9362
9363 /* Parse and display the contents of the dynamic section. */
9364
9365 static bfd_boolean
9366 process_dynamic_section (FILE * file)
9367 {
9368 Elf_Internal_Dyn * entry;
9369
9370 if (dynamic_size == 0)
9371 {
9372 if (do_dynamic)
9373 printf (_("\nThere is no dynamic section in this file.\n"));
9374
9375 return TRUE;
9376 }
9377
9378 if (is_32bit_elf)
9379 {
9380 if (! get_32bit_dynamic_section (file))
9381 return FALSE;
9382 }
9383 else
9384 {
9385 if (! get_64bit_dynamic_section (file))
9386 return FALSE;
9387 }
9388
9389 /* Find the appropriate symbol table. */
9390 if (dynamic_symbols == NULL)
9391 {
9392 for (entry = dynamic_section;
9393 entry < dynamic_section + dynamic_nent;
9394 ++entry)
9395 {
9396 Elf_Internal_Shdr section;
9397
9398 if (entry->d_tag != DT_SYMTAB)
9399 continue;
9400
9401 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9402
9403 /* Since we do not know how big the symbol table is,
9404 we default to reading in the entire file (!) and
9405 processing that. This is overkill, I know, but it
9406 should work. */
9407 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9408
9409 if (archive_file_offset != 0)
9410 section.sh_size = archive_file_size - section.sh_offset;
9411 else
9412 {
9413 if (fseek (file, 0, SEEK_END))
9414 error (_("Unable to seek to end of file!\n"));
9415
9416 section.sh_size = ftell (file) - section.sh_offset;
9417 }
9418
9419 if (is_32bit_elf)
9420 section.sh_entsize = sizeof (Elf32_External_Sym);
9421 else
9422 section.sh_entsize = sizeof (Elf64_External_Sym);
9423 section.sh_name = string_table_length;
9424
9425 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9426 if (num_dynamic_syms < 1)
9427 {
9428 error (_("Unable to determine the number of symbols to load\n"));
9429 continue;
9430 }
9431 }
9432 }
9433
9434 /* Similarly find a string table. */
9435 if (dynamic_strings == NULL)
9436 {
9437 for (entry = dynamic_section;
9438 entry < dynamic_section + dynamic_nent;
9439 ++entry)
9440 {
9441 unsigned long offset;
9442 long str_tab_len;
9443
9444 if (entry->d_tag != DT_STRTAB)
9445 continue;
9446
9447 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9448
9449 /* Since we do not know how big the string table is,
9450 we default to reading in the entire file (!) and
9451 processing that. This is overkill, I know, but it
9452 should work. */
9453
9454 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9455
9456 if (archive_file_offset != 0)
9457 str_tab_len = archive_file_size - offset;
9458 else
9459 {
9460 if (fseek (file, 0, SEEK_END))
9461 error (_("Unable to seek to end of file\n"));
9462 str_tab_len = ftell (file) - offset;
9463 }
9464
9465 if (str_tab_len < 1)
9466 {
9467 error
9468 (_("Unable to determine the length of the dynamic string table\n"));
9469 continue;
9470 }
9471
9472 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9473 str_tab_len,
9474 _("dynamic string table"));
9475 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9476 break;
9477 }
9478 }
9479
9480 /* And find the syminfo section if available. */
9481 if (dynamic_syminfo == NULL)
9482 {
9483 unsigned long syminsz = 0;
9484
9485 for (entry = dynamic_section;
9486 entry < dynamic_section + dynamic_nent;
9487 ++entry)
9488 {
9489 if (entry->d_tag == DT_SYMINENT)
9490 {
9491 /* Note: these braces are necessary to avoid a syntax
9492 error from the SunOS4 C compiler. */
9493 /* PR binutils/17531: A corrupt file can trigger this test.
9494 So do not use an assert, instead generate an error message. */
9495 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9496 error (_("Bad value (%d) for SYMINENT entry\n"),
9497 (int) entry->d_un.d_val);
9498 }
9499 else if (entry->d_tag == DT_SYMINSZ)
9500 syminsz = entry->d_un.d_val;
9501 else if (entry->d_tag == DT_SYMINFO)
9502 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9503 syminsz);
9504 }
9505
9506 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9507 {
9508 Elf_External_Syminfo * extsyminfo;
9509 Elf_External_Syminfo * extsym;
9510 Elf_Internal_Syminfo * syminfo;
9511
9512 /* There is a syminfo section. Read the data. */
9513 extsyminfo = (Elf_External_Syminfo *)
9514 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9515 _("symbol information"));
9516 if (!extsyminfo)
9517 return FALSE;
9518
9519 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9520 if (dynamic_syminfo == NULL)
9521 {
9522 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9523 (unsigned long) syminsz);
9524 return FALSE;
9525 }
9526
9527 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9528 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9529 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9530 ++syminfo, ++extsym)
9531 {
9532 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9533 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9534 }
9535
9536 free (extsyminfo);
9537 }
9538 }
9539
9540 if (do_dynamic && dynamic_addr)
9541 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9542 dynamic_addr, (unsigned long) dynamic_nent);
9543 if (do_dynamic)
9544 printf (_(" Tag Type Name/Value\n"));
9545
9546 for (entry = dynamic_section;
9547 entry < dynamic_section + dynamic_nent;
9548 entry++)
9549 {
9550 if (do_dynamic)
9551 {
9552 const char * dtype;
9553
9554 putchar (' ');
9555 print_vma (entry->d_tag, FULL_HEX);
9556 dtype = get_dynamic_type (entry->d_tag);
9557 printf (" (%s)%*s", dtype,
9558 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9559 }
9560
9561 switch (entry->d_tag)
9562 {
9563 case DT_FLAGS:
9564 if (do_dynamic)
9565 print_dynamic_flags (entry->d_un.d_val);
9566 break;
9567
9568 case DT_AUXILIARY:
9569 case DT_FILTER:
9570 case DT_CONFIG:
9571 case DT_DEPAUDIT:
9572 case DT_AUDIT:
9573 if (do_dynamic)
9574 {
9575 switch (entry->d_tag)
9576 {
9577 case DT_AUXILIARY:
9578 printf (_("Auxiliary library"));
9579 break;
9580
9581 case DT_FILTER:
9582 printf (_("Filter library"));
9583 break;
9584
9585 case DT_CONFIG:
9586 printf (_("Configuration file"));
9587 break;
9588
9589 case DT_DEPAUDIT:
9590 printf (_("Dependency audit library"));
9591 break;
9592
9593 case DT_AUDIT:
9594 printf (_("Audit library"));
9595 break;
9596 }
9597
9598 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9599 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9600 else
9601 {
9602 printf (": ");
9603 print_vma (entry->d_un.d_val, PREFIX_HEX);
9604 putchar ('\n');
9605 }
9606 }
9607 break;
9608
9609 case DT_FEATURE:
9610 if (do_dynamic)
9611 {
9612 printf (_("Flags:"));
9613
9614 if (entry->d_un.d_val == 0)
9615 printf (_(" None\n"));
9616 else
9617 {
9618 unsigned long int val = entry->d_un.d_val;
9619
9620 if (val & DTF_1_PARINIT)
9621 {
9622 printf (" PARINIT");
9623 val ^= DTF_1_PARINIT;
9624 }
9625 if (val & DTF_1_CONFEXP)
9626 {
9627 printf (" CONFEXP");
9628 val ^= DTF_1_CONFEXP;
9629 }
9630 if (val != 0)
9631 printf (" %lx", val);
9632 puts ("");
9633 }
9634 }
9635 break;
9636
9637 case DT_POSFLAG_1:
9638 if (do_dynamic)
9639 {
9640 printf (_("Flags:"));
9641
9642 if (entry->d_un.d_val == 0)
9643 printf (_(" None\n"));
9644 else
9645 {
9646 unsigned long int val = entry->d_un.d_val;
9647
9648 if (val & DF_P1_LAZYLOAD)
9649 {
9650 printf (" LAZYLOAD");
9651 val ^= DF_P1_LAZYLOAD;
9652 }
9653 if (val & DF_P1_GROUPPERM)
9654 {
9655 printf (" GROUPPERM");
9656 val ^= DF_P1_GROUPPERM;
9657 }
9658 if (val != 0)
9659 printf (" %lx", val);
9660 puts ("");
9661 }
9662 }
9663 break;
9664
9665 case DT_FLAGS_1:
9666 if (do_dynamic)
9667 {
9668 printf (_("Flags:"));
9669 if (entry->d_un.d_val == 0)
9670 printf (_(" None\n"));
9671 else
9672 {
9673 unsigned long int val = entry->d_un.d_val;
9674
9675 if (val & DF_1_NOW)
9676 {
9677 printf (" NOW");
9678 val ^= DF_1_NOW;
9679 }
9680 if (val & DF_1_GLOBAL)
9681 {
9682 printf (" GLOBAL");
9683 val ^= DF_1_GLOBAL;
9684 }
9685 if (val & DF_1_GROUP)
9686 {
9687 printf (" GROUP");
9688 val ^= DF_1_GROUP;
9689 }
9690 if (val & DF_1_NODELETE)
9691 {
9692 printf (" NODELETE");
9693 val ^= DF_1_NODELETE;
9694 }
9695 if (val & DF_1_LOADFLTR)
9696 {
9697 printf (" LOADFLTR");
9698 val ^= DF_1_LOADFLTR;
9699 }
9700 if (val & DF_1_INITFIRST)
9701 {
9702 printf (" INITFIRST");
9703 val ^= DF_1_INITFIRST;
9704 }
9705 if (val & DF_1_NOOPEN)
9706 {
9707 printf (" NOOPEN");
9708 val ^= DF_1_NOOPEN;
9709 }
9710 if (val & DF_1_ORIGIN)
9711 {
9712 printf (" ORIGIN");
9713 val ^= DF_1_ORIGIN;
9714 }
9715 if (val & DF_1_DIRECT)
9716 {
9717 printf (" DIRECT");
9718 val ^= DF_1_DIRECT;
9719 }
9720 if (val & DF_1_TRANS)
9721 {
9722 printf (" TRANS");
9723 val ^= DF_1_TRANS;
9724 }
9725 if (val & DF_1_INTERPOSE)
9726 {
9727 printf (" INTERPOSE");
9728 val ^= DF_1_INTERPOSE;
9729 }
9730 if (val & DF_1_NODEFLIB)
9731 {
9732 printf (" NODEFLIB");
9733 val ^= DF_1_NODEFLIB;
9734 }
9735 if (val & DF_1_NODUMP)
9736 {
9737 printf (" NODUMP");
9738 val ^= DF_1_NODUMP;
9739 }
9740 if (val & DF_1_CONFALT)
9741 {
9742 printf (" CONFALT");
9743 val ^= DF_1_CONFALT;
9744 }
9745 if (val & DF_1_ENDFILTEE)
9746 {
9747 printf (" ENDFILTEE");
9748 val ^= DF_1_ENDFILTEE;
9749 }
9750 if (val & DF_1_DISPRELDNE)
9751 {
9752 printf (" DISPRELDNE");
9753 val ^= DF_1_DISPRELDNE;
9754 }
9755 if (val & DF_1_DISPRELPND)
9756 {
9757 printf (" DISPRELPND");
9758 val ^= DF_1_DISPRELPND;
9759 }
9760 if (val & DF_1_NODIRECT)
9761 {
9762 printf (" NODIRECT");
9763 val ^= DF_1_NODIRECT;
9764 }
9765 if (val & DF_1_IGNMULDEF)
9766 {
9767 printf (" IGNMULDEF");
9768 val ^= DF_1_IGNMULDEF;
9769 }
9770 if (val & DF_1_NOKSYMS)
9771 {
9772 printf (" NOKSYMS");
9773 val ^= DF_1_NOKSYMS;
9774 }
9775 if (val & DF_1_NOHDR)
9776 {
9777 printf (" NOHDR");
9778 val ^= DF_1_NOHDR;
9779 }
9780 if (val & DF_1_EDITED)
9781 {
9782 printf (" EDITED");
9783 val ^= DF_1_EDITED;
9784 }
9785 if (val & DF_1_NORELOC)
9786 {
9787 printf (" NORELOC");
9788 val ^= DF_1_NORELOC;
9789 }
9790 if (val & DF_1_SYMINTPOSE)
9791 {
9792 printf (" SYMINTPOSE");
9793 val ^= DF_1_SYMINTPOSE;
9794 }
9795 if (val & DF_1_GLOBAUDIT)
9796 {
9797 printf (" GLOBAUDIT");
9798 val ^= DF_1_GLOBAUDIT;
9799 }
9800 if (val & DF_1_SINGLETON)
9801 {
9802 printf (" SINGLETON");
9803 val ^= DF_1_SINGLETON;
9804 }
9805 if (val & DF_1_STUB)
9806 {
9807 printf (" STUB");
9808 val ^= DF_1_STUB;
9809 }
9810 if (val & DF_1_PIE)
9811 {
9812 printf (" PIE");
9813 val ^= DF_1_PIE;
9814 }
9815 if (val != 0)
9816 printf (" %lx", val);
9817 puts ("");
9818 }
9819 }
9820 break;
9821
9822 case DT_PLTREL:
9823 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9824 if (do_dynamic)
9825 puts (get_dynamic_type (entry->d_un.d_val));
9826 break;
9827
9828 case DT_NULL :
9829 case DT_NEEDED :
9830 case DT_PLTGOT :
9831 case DT_HASH :
9832 case DT_STRTAB :
9833 case DT_SYMTAB :
9834 case DT_RELA :
9835 case DT_INIT :
9836 case DT_FINI :
9837 case DT_SONAME :
9838 case DT_RPATH :
9839 case DT_SYMBOLIC:
9840 case DT_REL :
9841 case DT_DEBUG :
9842 case DT_TEXTREL :
9843 case DT_JMPREL :
9844 case DT_RUNPATH :
9845 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9846
9847 if (do_dynamic)
9848 {
9849 char * name;
9850
9851 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9852 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9853 else
9854 name = NULL;
9855
9856 if (name)
9857 {
9858 switch (entry->d_tag)
9859 {
9860 case DT_NEEDED:
9861 printf (_("Shared library: [%s]"), name);
9862
9863 if (streq (name, program_interpreter))
9864 printf (_(" program interpreter"));
9865 break;
9866
9867 case DT_SONAME:
9868 printf (_("Library soname: [%s]"), name);
9869 break;
9870
9871 case DT_RPATH:
9872 printf (_("Library rpath: [%s]"), name);
9873 break;
9874
9875 case DT_RUNPATH:
9876 printf (_("Library runpath: [%s]"), name);
9877 break;
9878
9879 default:
9880 print_vma (entry->d_un.d_val, PREFIX_HEX);
9881 break;
9882 }
9883 }
9884 else
9885 print_vma (entry->d_un.d_val, PREFIX_HEX);
9886
9887 putchar ('\n');
9888 }
9889 break;
9890
9891 case DT_PLTRELSZ:
9892 case DT_RELASZ :
9893 case DT_STRSZ :
9894 case DT_RELSZ :
9895 case DT_RELAENT :
9896 case DT_SYMENT :
9897 case DT_RELENT :
9898 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9899 /* Fall through. */
9900 case DT_PLTPADSZ:
9901 case DT_MOVEENT :
9902 case DT_MOVESZ :
9903 case DT_INIT_ARRAYSZ:
9904 case DT_FINI_ARRAYSZ:
9905 case DT_GNU_CONFLICTSZ:
9906 case DT_GNU_LIBLISTSZ:
9907 if (do_dynamic)
9908 {
9909 print_vma (entry->d_un.d_val, UNSIGNED);
9910 printf (_(" (bytes)\n"));
9911 }
9912 break;
9913
9914 case DT_VERDEFNUM:
9915 case DT_VERNEEDNUM:
9916 case DT_RELACOUNT:
9917 case DT_RELCOUNT:
9918 if (do_dynamic)
9919 {
9920 print_vma (entry->d_un.d_val, UNSIGNED);
9921 putchar ('\n');
9922 }
9923 break;
9924
9925 case DT_SYMINSZ:
9926 case DT_SYMINENT:
9927 case DT_SYMINFO:
9928 case DT_USED:
9929 case DT_INIT_ARRAY:
9930 case DT_FINI_ARRAY:
9931 if (do_dynamic)
9932 {
9933 if (entry->d_tag == DT_USED
9934 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9935 {
9936 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9937
9938 if (*name)
9939 {
9940 printf (_("Not needed object: [%s]\n"), name);
9941 break;
9942 }
9943 }
9944
9945 print_vma (entry->d_un.d_val, PREFIX_HEX);
9946 putchar ('\n');
9947 }
9948 break;
9949
9950 case DT_BIND_NOW:
9951 /* The value of this entry is ignored. */
9952 if (do_dynamic)
9953 putchar ('\n');
9954 break;
9955
9956 case DT_GNU_PRELINKED:
9957 if (do_dynamic)
9958 {
9959 struct tm * tmp;
9960 time_t atime = entry->d_un.d_val;
9961
9962 tmp = gmtime (&atime);
9963 /* PR 17533 file: 041-1244816-0.004. */
9964 if (tmp == NULL)
9965 printf (_("<corrupt time val: %lx"),
9966 (unsigned long) atime);
9967 else
9968 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9969 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9970 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9971
9972 }
9973 break;
9974
9975 case DT_GNU_HASH:
9976 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9977 if (do_dynamic)
9978 {
9979 print_vma (entry->d_un.d_val, PREFIX_HEX);
9980 putchar ('\n');
9981 }
9982 break;
9983
9984 default:
9985 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9986 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9987 entry->d_un.d_val;
9988
9989 if (do_dynamic)
9990 {
9991 switch (elf_header.e_machine)
9992 {
9993 case EM_MIPS:
9994 case EM_MIPS_RS3_LE:
9995 dynamic_section_mips_val (entry);
9996 break;
9997 case EM_PARISC:
9998 dynamic_section_parisc_val (entry);
9999 break;
10000 case EM_IA_64:
10001 dynamic_section_ia64_val (entry);
10002 break;
10003 default:
10004 print_vma (entry->d_un.d_val, PREFIX_HEX);
10005 putchar ('\n');
10006 }
10007 }
10008 break;
10009 }
10010 }
10011
10012 return TRUE;
10013 }
10014
10015 static char *
10016 get_ver_flags (unsigned int flags)
10017 {
10018 static char buff[32];
10019
10020 buff[0] = 0;
10021
10022 if (flags == 0)
10023 return _("none");
10024
10025 if (flags & VER_FLG_BASE)
10026 strcat (buff, "BASE");
10027
10028 if (flags & VER_FLG_WEAK)
10029 {
10030 if (flags & VER_FLG_BASE)
10031 strcat (buff, " | ");
10032
10033 strcat (buff, "WEAK");
10034 }
10035
10036 if (flags & VER_FLG_INFO)
10037 {
10038 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10039 strcat (buff, " | ");
10040
10041 strcat (buff, "INFO");
10042 }
10043
10044 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10045 {
10046 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10047 strcat (buff, " | ");
10048
10049 strcat (buff, _("<unknown>"));
10050 }
10051
10052 return buff;
10053 }
10054
10055 /* Display the contents of the version sections. */
10056
10057 static bfd_boolean
10058 process_version_sections (FILE * file)
10059 {
10060 Elf_Internal_Shdr * section;
10061 unsigned i;
10062 bfd_boolean found = FALSE;
10063
10064 if (! do_version)
10065 return TRUE;
10066
10067 for (i = 0, section = section_headers;
10068 i < elf_header.e_shnum;
10069 i++, section++)
10070 {
10071 switch (section->sh_type)
10072 {
10073 case SHT_GNU_verdef:
10074 {
10075 Elf_External_Verdef * edefs;
10076 unsigned int idx;
10077 unsigned int cnt;
10078 unsigned int end;
10079 char * endbuf;
10080
10081 found = TRUE;
10082
10083 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
10084 printable_section_name (section),
10085 section->sh_info);
10086
10087 printf (_(" Addr: 0x"));
10088 printf_vma (section->sh_addr);
10089 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10090 (unsigned long) section->sh_offset, section->sh_link,
10091 printable_section_name_from_index (section->sh_link));
10092
10093 edefs = (Elf_External_Verdef *)
10094 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
10095 _("version definition section"));
10096 if (!edefs)
10097 break;
10098 endbuf = (char *) edefs + section->sh_size;
10099
10100 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10101 end = (section->sh_info < section->sh_size
10102 ? section->sh_info : section->sh_size);
10103 for (idx = cnt = 0; cnt < end; ++cnt)
10104 {
10105 char * vstart;
10106 Elf_External_Verdef * edef;
10107 Elf_Internal_Verdef ent;
10108 Elf_External_Verdaux * eaux;
10109 Elf_Internal_Verdaux aux;
10110 unsigned int isum;
10111 int j;
10112
10113 /* Check for very large indices. */
10114 if (idx > (size_t) (endbuf - (char *) edefs))
10115 break;
10116
10117 vstart = ((char *) edefs) + idx;
10118 if (vstart + sizeof (*edef) > endbuf)
10119 break;
10120
10121 edef = (Elf_External_Verdef *) vstart;
10122
10123 ent.vd_version = BYTE_GET (edef->vd_version);
10124 ent.vd_flags = BYTE_GET (edef->vd_flags);
10125 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10126 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10127 ent.vd_hash = BYTE_GET (edef->vd_hash);
10128 ent.vd_aux = BYTE_GET (edef->vd_aux);
10129 ent.vd_next = BYTE_GET (edef->vd_next);
10130
10131 printf (_(" %#06x: Rev: %d Flags: %s"),
10132 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10133
10134 printf (_(" Index: %d Cnt: %d "),
10135 ent.vd_ndx, ent.vd_cnt);
10136
10137 /* Check for overflow. */
10138 if (ent.vd_aux + sizeof (* eaux) > (size_t) (endbuf - vstart))
10139 break;
10140
10141 vstart += ent.vd_aux;
10142
10143 eaux = (Elf_External_Verdaux *) vstart;
10144
10145 aux.vda_name = BYTE_GET (eaux->vda_name);
10146 aux.vda_next = BYTE_GET (eaux->vda_next);
10147
10148 if (VALID_DYNAMIC_NAME (aux.vda_name))
10149 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10150 else
10151 printf (_("Name index: %ld\n"), aux.vda_name);
10152
10153 isum = idx + ent.vd_aux;
10154
10155 for (j = 1; j < ent.vd_cnt; j++)
10156 {
10157 /* Check for overflow. */
10158 if (aux.vda_next > (size_t) (endbuf - vstart))
10159 break;
10160
10161 isum += aux.vda_next;
10162 vstart += aux.vda_next;
10163
10164 eaux = (Elf_External_Verdaux *) vstart;
10165 if (vstart + sizeof (*eaux) > endbuf)
10166 break;
10167
10168 aux.vda_name = BYTE_GET (eaux->vda_name);
10169 aux.vda_next = BYTE_GET (eaux->vda_next);
10170
10171 if (VALID_DYNAMIC_NAME (aux.vda_name))
10172 printf (_(" %#06x: Parent %d: %s\n"),
10173 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10174 else
10175 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10176 isum, j, aux.vda_name);
10177 }
10178
10179 if (j < ent.vd_cnt)
10180 printf (_(" Version def aux past end of section\n"));
10181
10182 /* PR 17531:
10183 file: id:000001,src:000172+005151,op:splice,rep:2. */
10184 if (idx + ent.vd_next < idx)
10185 break;
10186
10187 idx += ent.vd_next;
10188 }
10189
10190 if (cnt < section->sh_info)
10191 printf (_(" Version definition past end of section\n"));
10192
10193 free (edefs);
10194 }
10195 break;
10196
10197 case SHT_GNU_verneed:
10198 {
10199 Elf_External_Verneed * eneed;
10200 unsigned int idx;
10201 unsigned int cnt;
10202 char * endbuf;
10203
10204 found = TRUE;
10205
10206 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
10207 printable_section_name (section), section->sh_info);
10208
10209 printf (_(" Addr: 0x"));
10210 printf_vma (section->sh_addr);
10211 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10212 (unsigned long) section->sh_offset, section->sh_link,
10213 printable_section_name_from_index (section->sh_link));
10214
10215 eneed = (Elf_External_Verneed *) get_data (NULL, file,
10216 section->sh_offset, 1,
10217 section->sh_size,
10218 _("Version Needs section"));
10219 if (!eneed)
10220 break;
10221 endbuf = (char *) eneed + section->sh_size;
10222
10223 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10224 {
10225 Elf_External_Verneed * entry;
10226 Elf_Internal_Verneed ent;
10227 unsigned int isum;
10228 int j;
10229 char * vstart;
10230
10231 if (idx > (size_t) (endbuf - (char *) eneed))
10232 break;
10233
10234 vstart = ((char *) eneed) + idx;
10235 if (vstart + sizeof (*entry) > endbuf)
10236 break;
10237
10238 entry = (Elf_External_Verneed *) vstart;
10239
10240 ent.vn_version = BYTE_GET (entry->vn_version);
10241 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10242 ent.vn_file = BYTE_GET (entry->vn_file);
10243 ent.vn_aux = BYTE_GET (entry->vn_aux);
10244 ent.vn_next = BYTE_GET (entry->vn_next);
10245
10246 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10247
10248 if (VALID_DYNAMIC_NAME (ent.vn_file))
10249 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10250 else
10251 printf (_(" File: %lx"), ent.vn_file);
10252
10253 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10254
10255 /* Check for overflow. */
10256 if (ent.vn_aux > (size_t) (endbuf - vstart))
10257 break;
10258 vstart += ent.vn_aux;
10259
10260 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10261 {
10262 Elf_External_Vernaux * eaux;
10263 Elf_Internal_Vernaux aux;
10264
10265 if (vstart + sizeof (*eaux) > endbuf)
10266 break;
10267 eaux = (Elf_External_Vernaux *) vstart;
10268
10269 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10270 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10271 aux.vna_other = BYTE_GET (eaux->vna_other);
10272 aux.vna_name = BYTE_GET (eaux->vna_name);
10273 aux.vna_next = BYTE_GET (eaux->vna_next);
10274
10275 if (VALID_DYNAMIC_NAME (aux.vna_name))
10276 printf (_(" %#06x: Name: %s"),
10277 isum, GET_DYNAMIC_NAME (aux.vna_name));
10278 else
10279 printf (_(" %#06x: Name index: %lx"),
10280 isum, aux.vna_name);
10281
10282 printf (_(" Flags: %s Version: %d\n"),
10283 get_ver_flags (aux.vna_flags), aux.vna_other);
10284
10285 /* Check for overflow. */
10286 if (aux.vna_next > (size_t) (endbuf - vstart)
10287 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10288 {
10289 warn (_("Invalid vna_next field of %lx\n"),
10290 aux.vna_next);
10291 j = ent.vn_cnt;
10292 break;
10293 }
10294 isum += aux.vna_next;
10295 vstart += aux.vna_next;
10296 }
10297
10298 if (j < ent.vn_cnt)
10299 warn (_("Missing Version Needs auxillary information\n"));
10300
10301 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10302 {
10303 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10304 cnt = section->sh_info;
10305 break;
10306 }
10307 idx += ent.vn_next;
10308 }
10309
10310 if (cnt < section->sh_info)
10311 warn (_("Missing Version Needs information\n"));
10312
10313 free (eneed);
10314 }
10315 break;
10316
10317 case SHT_GNU_versym:
10318 {
10319 Elf_Internal_Shdr * link_section;
10320 size_t total;
10321 unsigned int cnt;
10322 unsigned char * edata;
10323 unsigned short * data;
10324 char * strtab;
10325 Elf_Internal_Sym * symbols;
10326 Elf_Internal_Shdr * string_sec;
10327 unsigned long num_syms;
10328 long off;
10329
10330 if (section->sh_link >= elf_header.e_shnum)
10331 break;
10332
10333 link_section = section_headers + section->sh_link;
10334 total = section->sh_size / sizeof (Elf_External_Versym);
10335
10336 if (link_section->sh_link >= elf_header.e_shnum)
10337 break;
10338
10339 found = TRUE;
10340
10341 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10342 if (symbols == NULL)
10343 break;
10344
10345 string_sec = section_headers + link_section->sh_link;
10346
10347 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10348 string_sec->sh_size,
10349 _("version string table"));
10350 if (!strtab)
10351 {
10352 free (symbols);
10353 break;
10354 }
10355
10356 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10357 printable_section_name (section), (unsigned long) total);
10358
10359 printf (_(" Addr: "));
10360 printf_vma (section->sh_addr);
10361 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10362 (unsigned long) section->sh_offset, section->sh_link,
10363 printable_section_name (link_section));
10364
10365 off = offset_from_vma (file,
10366 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10367 total * sizeof (short));
10368 edata = (unsigned char *) get_data (NULL, file, off, total,
10369 sizeof (short),
10370 _("version symbol data"));
10371 if (!edata)
10372 {
10373 free (strtab);
10374 free (symbols);
10375 break;
10376 }
10377
10378 data = (short unsigned int *) cmalloc (total, sizeof (short));
10379
10380 for (cnt = total; cnt --;)
10381 data[cnt] = byte_get (edata + cnt * sizeof (short),
10382 sizeof (short));
10383
10384 free (edata);
10385
10386 for (cnt = 0; cnt < total; cnt += 4)
10387 {
10388 int j, nn;
10389 char *name;
10390 char *invalid = _("*invalid*");
10391
10392 printf (" %03x:", cnt);
10393
10394 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10395 switch (data[cnt + j])
10396 {
10397 case 0:
10398 fputs (_(" 0 (*local*) "), stdout);
10399 break;
10400
10401 case 1:
10402 fputs (_(" 1 (*global*) "), stdout);
10403 break;
10404
10405 default:
10406 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10407 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10408
10409 /* If this index value is greater than the size of the symbols
10410 array, break to avoid an out-of-bounds read. */
10411 if ((unsigned long)(cnt + j) >= num_syms)
10412 {
10413 warn (_("invalid index into symbol array\n"));
10414 break;
10415 }
10416
10417 name = NULL;
10418 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10419 {
10420 Elf_Internal_Verneed ivn;
10421 unsigned long offset;
10422
10423 offset = offset_from_vma
10424 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10425 sizeof (Elf_External_Verneed));
10426
10427 do
10428 {
10429 Elf_Internal_Vernaux ivna;
10430 Elf_External_Verneed evn;
10431 Elf_External_Vernaux evna;
10432 unsigned long a_off;
10433
10434 if (get_data (&evn, file, offset, sizeof (evn), 1,
10435 _("version need")) == NULL)
10436 break;
10437
10438 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10439 ivn.vn_next = BYTE_GET (evn.vn_next);
10440
10441 a_off = offset + ivn.vn_aux;
10442
10443 do
10444 {
10445 if (get_data (&evna, file, a_off, sizeof (evna),
10446 1, _("version need aux (2)")) == NULL)
10447 {
10448 ivna.vna_next = 0;
10449 ivna.vna_other = 0;
10450 }
10451 else
10452 {
10453 ivna.vna_next = BYTE_GET (evna.vna_next);
10454 ivna.vna_other = BYTE_GET (evna.vna_other);
10455 }
10456
10457 a_off += ivna.vna_next;
10458 }
10459 while (ivna.vna_other != data[cnt + j]
10460 && ivna.vna_next != 0);
10461
10462 if (ivna.vna_other == data[cnt + j])
10463 {
10464 ivna.vna_name = BYTE_GET (evna.vna_name);
10465
10466 if (ivna.vna_name >= string_sec->sh_size)
10467 name = invalid;
10468 else
10469 name = strtab + ivna.vna_name;
10470 break;
10471 }
10472
10473 offset += ivn.vn_next;
10474 }
10475 while (ivn.vn_next);
10476 }
10477
10478 if (data[cnt + j] != 0x8001
10479 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10480 {
10481 Elf_Internal_Verdef ivd;
10482 Elf_External_Verdef evd;
10483 unsigned long offset;
10484
10485 offset = offset_from_vma
10486 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10487 sizeof evd);
10488
10489 do
10490 {
10491 if (get_data (&evd, file, offset, sizeof (evd), 1,
10492 _("version def")) == NULL)
10493 {
10494 ivd.vd_next = 0;
10495 /* PR 17531: file: 046-1082287-0.004. */
10496 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10497 break;
10498 }
10499 else
10500 {
10501 ivd.vd_next = BYTE_GET (evd.vd_next);
10502 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10503 }
10504
10505 offset += ivd.vd_next;
10506 }
10507 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10508 && ivd.vd_next != 0);
10509
10510 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10511 {
10512 Elf_External_Verdaux evda;
10513 Elf_Internal_Verdaux ivda;
10514
10515 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10516
10517 if (get_data (&evda, file,
10518 offset - ivd.vd_next + ivd.vd_aux,
10519 sizeof (evda), 1,
10520 _("version def aux")) == NULL)
10521 break;
10522
10523 ivda.vda_name = BYTE_GET (evda.vda_name);
10524
10525 if (ivda.vda_name >= string_sec->sh_size)
10526 name = invalid;
10527 else if (name != NULL && name != invalid)
10528 name = _("*both*");
10529 else
10530 name = strtab + ivda.vda_name;
10531 }
10532 }
10533 if (name != NULL)
10534 nn += printf ("(%s%-*s",
10535 name,
10536 12 - (int) strlen (name),
10537 ")");
10538
10539 if (nn < 18)
10540 printf ("%*c", 18 - nn, ' ');
10541 }
10542
10543 putchar ('\n');
10544 }
10545
10546 free (data);
10547 free (strtab);
10548 free (symbols);
10549 }
10550 break;
10551
10552 default:
10553 break;
10554 }
10555 }
10556
10557 if (! found)
10558 printf (_("\nNo version information found in this file.\n"));
10559
10560 return TRUE;
10561 }
10562
10563 static const char *
10564 get_symbol_binding (unsigned int binding)
10565 {
10566 static char buff[32];
10567
10568 switch (binding)
10569 {
10570 case STB_LOCAL: return "LOCAL";
10571 case STB_GLOBAL: return "GLOBAL";
10572 case STB_WEAK: return "WEAK";
10573 default:
10574 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10575 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10576 binding);
10577 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10578 {
10579 if (binding == STB_GNU_UNIQUE
10580 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10581 /* GNU is still using the default value 0. */
10582 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10583 return "UNIQUE";
10584 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10585 }
10586 else
10587 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10588 return buff;
10589 }
10590 }
10591
10592 static const char *
10593 get_symbol_type (unsigned int type)
10594 {
10595 static char buff[32];
10596
10597 switch (type)
10598 {
10599 case STT_NOTYPE: return "NOTYPE";
10600 case STT_OBJECT: return "OBJECT";
10601 case STT_FUNC: return "FUNC";
10602 case STT_SECTION: return "SECTION";
10603 case STT_FILE: return "FILE";
10604 case STT_COMMON: return "COMMON";
10605 case STT_TLS: return "TLS";
10606 case STT_RELC: return "RELC";
10607 case STT_SRELC: return "SRELC";
10608 default:
10609 if (type >= STT_LOPROC && type <= STT_HIPROC)
10610 {
10611 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10612 return "THUMB_FUNC";
10613
10614 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10615 return "REGISTER";
10616
10617 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10618 return "PARISC_MILLI";
10619
10620 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10621 }
10622 else if (type >= STT_LOOS && type <= STT_HIOS)
10623 {
10624 if (elf_header.e_machine == EM_PARISC)
10625 {
10626 if (type == STT_HP_OPAQUE)
10627 return "HP_OPAQUE";
10628 if (type == STT_HP_STUB)
10629 return "HP_STUB";
10630 }
10631
10632 if (type == STT_GNU_IFUNC
10633 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10634 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10635 /* GNU is still using the default value 0. */
10636 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10637 return "IFUNC";
10638
10639 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10640 }
10641 else
10642 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10643 return buff;
10644 }
10645 }
10646
10647 static const char *
10648 get_symbol_visibility (unsigned int visibility)
10649 {
10650 switch (visibility)
10651 {
10652 case STV_DEFAULT: return "DEFAULT";
10653 case STV_INTERNAL: return "INTERNAL";
10654 case STV_HIDDEN: return "HIDDEN";
10655 case STV_PROTECTED: return "PROTECTED";
10656 default:
10657 error (_("Unrecognized visibility value: %u"), visibility);
10658 return _("<unknown>");
10659 }
10660 }
10661
10662 static const char *
10663 get_solaris_symbol_visibility (unsigned int visibility)
10664 {
10665 switch (visibility)
10666 {
10667 case 4: return "EXPORTED";
10668 case 5: return "SINGLETON";
10669 case 6: return "ELIMINATE";
10670 default: return get_symbol_visibility (visibility);
10671 }
10672 }
10673
10674 static const char *
10675 get_mips_symbol_other (unsigned int other)
10676 {
10677 switch (other)
10678 {
10679 case STO_OPTIONAL: return "OPTIONAL";
10680 case STO_MIPS_PLT: return "MIPS PLT";
10681 case STO_MIPS_PIC: return "MIPS PIC";
10682 case STO_MICROMIPS: return "MICROMIPS";
10683 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10684 case STO_MIPS16: return "MIPS16";
10685 default: return NULL;
10686 }
10687 }
10688
10689 static const char *
10690 get_ia64_symbol_other (unsigned int other)
10691 {
10692 if (is_ia64_vms ())
10693 {
10694 static char res[32];
10695
10696 res[0] = 0;
10697
10698 /* Function types is for images and .STB files only. */
10699 switch (elf_header.e_type)
10700 {
10701 case ET_DYN:
10702 case ET_EXEC:
10703 switch (VMS_ST_FUNC_TYPE (other))
10704 {
10705 case VMS_SFT_CODE_ADDR:
10706 strcat (res, " CA");
10707 break;
10708 case VMS_SFT_SYMV_IDX:
10709 strcat (res, " VEC");
10710 break;
10711 case VMS_SFT_FD:
10712 strcat (res, " FD");
10713 break;
10714 case VMS_SFT_RESERVE:
10715 strcat (res, " RSV");
10716 break;
10717 default:
10718 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10719 VMS_ST_FUNC_TYPE (other));
10720 strcat (res, " <unknown>");
10721 break;
10722 }
10723 break;
10724 default:
10725 break;
10726 }
10727 switch (VMS_ST_LINKAGE (other))
10728 {
10729 case VMS_STL_IGNORE:
10730 strcat (res, " IGN");
10731 break;
10732 case VMS_STL_RESERVE:
10733 strcat (res, " RSV");
10734 break;
10735 case VMS_STL_STD:
10736 strcat (res, " STD");
10737 break;
10738 case VMS_STL_LNK:
10739 strcat (res, " LNK");
10740 break;
10741 default:
10742 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10743 VMS_ST_LINKAGE (other));
10744 strcat (res, " <unknown>");
10745 break;
10746 }
10747
10748 if (res[0] != 0)
10749 return res + 1;
10750 else
10751 return res;
10752 }
10753 return NULL;
10754 }
10755
10756 static const char *
10757 get_ppc64_symbol_other (unsigned int other)
10758 {
10759 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10760 {
10761 static char buf[32];
10762 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10763 PPC64_LOCAL_ENTRY_OFFSET (other));
10764 return buf;
10765 }
10766 return NULL;
10767 }
10768
10769 static const char *
10770 get_symbol_other (unsigned int other)
10771 {
10772 const char * result = NULL;
10773 static char buff [32];
10774
10775 if (other == 0)
10776 return "";
10777
10778 switch (elf_header.e_machine)
10779 {
10780 case EM_MIPS:
10781 result = get_mips_symbol_other (other);
10782 break;
10783 case EM_IA_64:
10784 result = get_ia64_symbol_other (other);
10785 break;
10786 case EM_PPC64:
10787 result = get_ppc64_symbol_other (other);
10788 break;
10789 default:
10790 result = NULL;
10791 break;
10792 }
10793
10794 if (result)
10795 return result;
10796
10797 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10798 return buff;
10799 }
10800
10801 static const char *
10802 get_symbol_index_type (unsigned int type)
10803 {
10804 static char buff[32];
10805
10806 switch (type)
10807 {
10808 case SHN_UNDEF: return "UND";
10809 case SHN_ABS: return "ABS";
10810 case SHN_COMMON: return "COM";
10811 default:
10812 if (type == SHN_IA_64_ANSI_COMMON
10813 && elf_header.e_machine == EM_IA_64
10814 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10815 return "ANSI_COM";
10816 else if ((elf_header.e_machine == EM_X86_64
10817 || elf_header.e_machine == EM_L1OM
10818 || elf_header.e_machine == EM_K1OM)
10819 && type == SHN_X86_64_LCOMMON)
10820 return "LARGE_COM";
10821 else if ((type == SHN_MIPS_SCOMMON
10822 && elf_header.e_machine == EM_MIPS)
10823 || (type == SHN_TIC6X_SCOMMON
10824 && elf_header.e_machine == EM_TI_C6000))
10825 return "SCOM";
10826 else if (type == SHN_MIPS_SUNDEFINED
10827 && elf_header.e_machine == EM_MIPS)
10828 return "SUND";
10829 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10830 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10831 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10832 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10833 else if (type >= SHN_LORESERVE)
10834 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10835 else if (type >= elf_header.e_shnum)
10836 sprintf (buff, _("bad section index[%3d]"), type);
10837 else
10838 sprintf (buff, "%3d", type);
10839 break;
10840 }
10841
10842 return buff;
10843 }
10844
10845 static bfd_vma *
10846 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10847 {
10848 unsigned char * e_data;
10849 bfd_vma * i_data;
10850
10851 /* If the size_t type is smaller than the bfd_size_type, eg because
10852 you are building a 32-bit tool on a 64-bit host, then make sure
10853 that when (number) is cast to (size_t) no information is lost. */
10854 if (sizeof (size_t) < sizeof (bfd_size_type)
10855 && (bfd_size_type) ((size_t) number) != number)
10856 {
10857 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10858 " elements of size %u\n"),
10859 number, ent_size);
10860 return NULL;
10861 }
10862
10863 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10864 attempting to allocate memory when the read is bound to fail. */
10865 if (ent_size * number > current_file_size)
10866 {
10867 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10868 number);
10869 return NULL;
10870 }
10871
10872 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10873 if (e_data == NULL)
10874 {
10875 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10876 number);
10877 return NULL;
10878 }
10879
10880 if (fread (e_data, ent_size, (size_t) number, file) != number)
10881 {
10882 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10883 number * ent_size);
10884 free (e_data);
10885 return NULL;
10886 }
10887
10888 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10889 if (i_data == NULL)
10890 {
10891 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10892 " dynamic entries\n"),
10893 number);
10894 free (e_data);
10895 return NULL;
10896 }
10897
10898 while (number--)
10899 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10900
10901 free (e_data);
10902
10903 return i_data;
10904 }
10905
10906 static void
10907 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10908 {
10909 Elf_Internal_Sym * psym;
10910 int n;
10911
10912 n = print_vma (si, DEC_5);
10913 if (n < 5)
10914 fputs (&" "[n], stdout);
10915 printf (" %3lu: ", hn);
10916
10917 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10918 {
10919 printf (_("<No info available for dynamic symbol number %lu>\n"),
10920 (unsigned long) si);
10921 return;
10922 }
10923
10924 psym = dynamic_symbols + si;
10925 print_vma (psym->st_value, LONG_HEX);
10926 putchar (' ');
10927 print_vma (psym->st_size, DEC_5);
10928
10929 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10930 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10931
10932 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10933 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10934 else
10935 {
10936 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10937
10938 printf (" %-7s", get_symbol_visibility (vis));
10939 /* Check to see if any other bits in the st_other field are set.
10940 Note - displaying this information disrupts the layout of the
10941 table being generated, but for the moment this case is very
10942 rare. */
10943 if (psym->st_other ^ vis)
10944 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10945 }
10946
10947 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10948 if (VALID_DYNAMIC_NAME (psym->st_name))
10949 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10950 else
10951 printf (_(" <corrupt: %14ld>"), psym->st_name);
10952 putchar ('\n');
10953 }
10954
10955 static const char *
10956 get_symbol_version_string (FILE * file,
10957 bfd_boolean is_dynsym,
10958 const char * strtab,
10959 unsigned long int strtab_size,
10960 unsigned int si,
10961 Elf_Internal_Sym * psym,
10962 enum versioned_symbol_info * sym_info,
10963 unsigned short * vna_other)
10964 {
10965 unsigned char data[2];
10966 unsigned short vers_data;
10967 unsigned long offset;
10968
10969 if (!is_dynsym
10970 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10971 return NULL;
10972
10973 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10974 sizeof data + si * sizeof (vers_data));
10975
10976 if (get_data (&data, file, offset + si * sizeof (vers_data),
10977 sizeof (data), 1, _("version data")) == NULL)
10978 return NULL;
10979
10980 vers_data = byte_get (data, 2);
10981
10982 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10983 return NULL;
10984
10985 /* Usually we'd only see verdef for defined symbols, and verneed for
10986 undefined symbols. However, symbols defined by the linker in
10987 .dynbss for variables copied from a shared library in order to
10988 avoid text relocations are defined yet have verneed. We could
10989 use a heuristic to detect the special case, for example, check
10990 for verneed first on symbols defined in SHT_NOBITS sections, but
10991 it is simpler and more reliable to just look for both verdef and
10992 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10993
10994 if (psym->st_shndx != SHN_UNDEF
10995 && vers_data != 0x8001
10996 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10997 {
10998 Elf_Internal_Verdef ivd;
10999 Elf_Internal_Verdaux ivda;
11000 Elf_External_Verdaux evda;
11001 unsigned long off;
11002
11003 off = offset_from_vma (file,
11004 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11005 sizeof (Elf_External_Verdef));
11006
11007 do
11008 {
11009 Elf_External_Verdef evd;
11010
11011 if (get_data (&evd, file, off, sizeof (evd), 1,
11012 _("version def")) == NULL)
11013 {
11014 ivd.vd_ndx = 0;
11015 ivd.vd_aux = 0;
11016 ivd.vd_next = 0;
11017 }
11018 else
11019 {
11020 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11021 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11022 ivd.vd_next = BYTE_GET (evd.vd_next);
11023 }
11024
11025 off += ivd.vd_next;
11026 }
11027 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11028
11029 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11030 {
11031 off -= ivd.vd_next;
11032 off += ivd.vd_aux;
11033
11034 if (get_data (&evda, file, off, sizeof (evda), 1,
11035 _("version def aux")) != NULL)
11036 {
11037 ivda.vda_name = BYTE_GET (evda.vda_name);
11038
11039 if (psym->st_name != ivda.vda_name)
11040 {
11041 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11042 ? symbol_hidden : symbol_public);
11043 return (ivda.vda_name < strtab_size
11044 ? strtab + ivda.vda_name : _("<corrupt>"));
11045 }
11046 }
11047 }
11048 }
11049
11050 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11051 {
11052 Elf_External_Verneed evn;
11053 Elf_Internal_Verneed ivn;
11054 Elf_Internal_Vernaux ivna;
11055
11056 offset = offset_from_vma (file,
11057 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11058 sizeof evn);
11059 do
11060 {
11061 unsigned long vna_off;
11062
11063 if (get_data (&evn, file, offset, sizeof (evn), 1,
11064 _("version need")) == NULL)
11065 {
11066 ivna.vna_next = 0;
11067 ivna.vna_other = 0;
11068 ivna.vna_name = 0;
11069 break;
11070 }
11071
11072 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11073 ivn.vn_next = BYTE_GET (evn.vn_next);
11074
11075 vna_off = offset + ivn.vn_aux;
11076
11077 do
11078 {
11079 Elf_External_Vernaux evna;
11080
11081 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
11082 _("version need aux (3)")) == NULL)
11083 {
11084 ivna.vna_next = 0;
11085 ivna.vna_other = 0;
11086 ivna.vna_name = 0;
11087 }
11088 else
11089 {
11090 ivna.vna_other = BYTE_GET (evna.vna_other);
11091 ivna.vna_next = BYTE_GET (evna.vna_next);
11092 ivna.vna_name = BYTE_GET (evna.vna_name);
11093 }
11094
11095 vna_off += ivna.vna_next;
11096 }
11097 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11098
11099 if (ivna.vna_other == vers_data)
11100 break;
11101
11102 offset += ivn.vn_next;
11103 }
11104 while (ivn.vn_next != 0);
11105
11106 if (ivna.vna_other == vers_data)
11107 {
11108 *sym_info = symbol_undefined;
11109 *vna_other = ivna.vna_other;
11110 return (ivna.vna_name < strtab_size
11111 ? strtab + ivna.vna_name : _("<corrupt>"));
11112 }
11113 }
11114 return NULL;
11115 }
11116
11117 /* Dump the symbol table. */
11118 static bfd_boolean
11119 process_symbol_table (FILE * file)
11120 {
11121 Elf_Internal_Shdr * section;
11122 bfd_size_type nbuckets = 0;
11123 bfd_size_type nchains = 0;
11124 bfd_vma * buckets = NULL;
11125 bfd_vma * chains = NULL;
11126 bfd_vma ngnubuckets = 0;
11127 bfd_vma * gnubuckets = NULL;
11128 bfd_vma * gnuchains = NULL;
11129 bfd_vma gnusymidx = 0;
11130 bfd_size_type ngnuchains = 0;
11131
11132 if (!do_syms && !do_dyn_syms && !do_histogram)
11133 return TRUE;
11134
11135 if (dynamic_info[DT_HASH]
11136 && (do_histogram
11137 || (do_using_dynamic
11138 && !do_dyn_syms
11139 && dynamic_strings != NULL)))
11140 {
11141 unsigned char nb[8];
11142 unsigned char nc[8];
11143 unsigned int hash_ent_size = 4;
11144
11145 if ((elf_header.e_machine == EM_ALPHA
11146 || elf_header.e_machine == EM_S390
11147 || elf_header.e_machine == EM_S390_OLD)
11148 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11149 hash_ent_size = 8;
11150
11151 if (fseek (file,
11152 (archive_file_offset
11153 + offset_from_vma (file, dynamic_info[DT_HASH],
11154 sizeof nb + sizeof nc)),
11155 SEEK_SET))
11156 {
11157 error (_("Unable to seek to start of dynamic information\n"));
11158 goto no_hash;
11159 }
11160
11161 if (fread (nb, hash_ent_size, 1, file) != 1)
11162 {
11163 error (_("Failed to read in number of buckets\n"));
11164 goto no_hash;
11165 }
11166
11167 if (fread (nc, hash_ent_size, 1, file) != 1)
11168 {
11169 error (_("Failed to read in number of chains\n"));
11170 goto no_hash;
11171 }
11172
11173 nbuckets = byte_get (nb, hash_ent_size);
11174 nchains = byte_get (nc, hash_ent_size);
11175
11176 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11177 chains = get_dynamic_data (file, nchains, hash_ent_size);
11178
11179 no_hash:
11180 if (buckets == NULL || chains == NULL)
11181 {
11182 if (do_using_dynamic)
11183 return FALSE;
11184 free (buckets);
11185 free (chains);
11186 buckets = NULL;
11187 chains = NULL;
11188 nbuckets = 0;
11189 nchains = 0;
11190 }
11191 }
11192
11193 if (dynamic_info_DT_GNU_HASH
11194 && (do_histogram
11195 || (do_using_dynamic
11196 && !do_dyn_syms
11197 && dynamic_strings != NULL)))
11198 {
11199 unsigned char nb[16];
11200 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11201 bfd_vma buckets_vma;
11202
11203 if (fseek (file,
11204 (archive_file_offset
11205 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11206 sizeof nb)),
11207 SEEK_SET))
11208 {
11209 error (_("Unable to seek to start of dynamic information\n"));
11210 goto no_gnu_hash;
11211 }
11212
11213 if (fread (nb, 16, 1, file) != 1)
11214 {
11215 error (_("Failed to read in number of buckets\n"));
11216 goto no_gnu_hash;
11217 }
11218
11219 ngnubuckets = byte_get (nb, 4);
11220 gnusymidx = byte_get (nb + 4, 4);
11221 bitmaskwords = byte_get (nb + 8, 4);
11222 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11223 if (is_32bit_elf)
11224 buckets_vma += bitmaskwords * 4;
11225 else
11226 buckets_vma += bitmaskwords * 8;
11227
11228 if (fseek (file,
11229 (archive_file_offset
11230 + offset_from_vma (file, buckets_vma, 4)),
11231 SEEK_SET))
11232 {
11233 error (_("Unable to seek to start of dynamic information\n"));
11234 goto no_gnu_hash;
11235 }
11236
11237 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11238
11239 if (gnubuckets == NULL)
11240 goto no_gnu_hash;
11241
11242 for (i = 0; i < ngnubuckets; i++)
11243 if (gnubuckets[i] != 0)
11244 {
11245 if (gnubuckets[i] < gnusymidx)
11246 return FALSE;
11247
11248 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11249 maxchain = gnubuckets[i];
11250 }
11251
11252 if (maxchain == 0xffffffff)
11253 goto no_gnu_hash;
11254
11255 maxchain -= gnusymidx;
11256
11257 if (fseek (file,
11258 (archive_file_offset
11259 + offset_from_vma (file, buckets_vma
11260 + 4 * (ngnubuckets + maxchain), 4)),
11261 SEEK_SET))
11262 {
11263 error (_("Unable to seek to start of dynamic information\n"));
11264 goto no_gnu_hash;
11265 }
11266
11267 do
11268 {
11269 if (fread (nb, 4, 1, file) != 1)
11270 {
11271 error (_("Failed to determine last chain length\n"));
11272 goto no_gnu_hash;
11273 }
11274
11275 if (maxchain + 1 == 0)
11276 goto no_gnu_hash;
11277
11278 ++maxchain;
11279 }
11280 while ((byte_get (nb, 4) & 1) == 0);
11281
11282 if (fseek (file,
11283 (archive_file_offset
11284 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11285 SEEK_SET))
11286 {
11287 error (_("Unable to seek to start of dynamic information\n"));
11288 goto no_gnu_hash;
11289 }
11290
11291 gnuchains = get_dynamic_data (file, maxchain, 4);
11292 ngnuchains = maxchain;
11293
11294 no_gnu_hash:
11295 if (gnuchains == NULL)
11296 {
11297 free (gnubuckets);
11298 gnubuckets = NULL;
11299 ngnubuckets = 0;
11300 if (do_using_dynamic)
11301 return FALSE;
11302 }
11303 }
11304
11305 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11306 && do_syms
11307 && do_using_dynamic
11308 && dynamic_strings != NULL
11309 && dynamic_symbols != NULL)
11310 {
11311 unsigned long hn;
11312
11313 if (dynamic_info[DT_HASH])
11314 {
11315 bfd_vma si;
11316
11317 printf (_("\nSymbol table for image:\n"));
11318 if (is_32bit_elf)
11319 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11320 else
11321 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11322
11323 for (hn = 0; hn < nbuckets; hn++)
11324 {
11325 if (! buckets[hn])
11326 continue;
11327
11328 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11329 print_dynamic_symbol (si, hn);
11330 }
11331 }
11332
11333 if (dynamic_info_DT_GNU_HASH)
11334 {
11335 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11336 if (is_32bit_elf)
11337 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11338 else
11339 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11340
11341 for (hn = 0; hn < ngnubuckets; ++hn)
11342 if (gnubuckets[hn] != 0)
11343 {
11344 bfd_vma si = gnubuckets[hn];
11345 bfd_vma off = si - gnusymidx;
11346
11347 do
11348 {
11349 print_dynamic_symbol (si, hn);
11350 si++;
11351 }
11352 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11353 }
11354 }
11355 }
11356 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11357 && section_headers != NULL)
11358 {
11359 unsigned int i;
11360
11361 for (i = 0, section = section_headers;
11362 i < elf_header.e_shnum;
11363 i++, section++)
11364 {
11365 unsigned int si;
11366 char * strtab = NULL;
11367 unsigned long int strtab_size = 0;
11368 Elf_Internal_Sym * symtab;
11369 Elf_Internal_Sym * psym;
11370 unsigned long num_syms;
11371
11372 if ((section->sh_type != SHT_SYMTAB
11373 && section->sh_type != SHT_DYNSYM)
11374 || (!do_syms
11375 && section->sh_type == SHT_SYMTAB))
11376 continue;
11377
11378 if (section->sh_entsize == 0)
11379 {
11380 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11381 printable_section_name (section));
11382 continue;
11383 }
11384
11385 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11386 printable_section_name (section),
11387 (unsigned long) (section->sh_size / section->sh_entsize));
11388
11389 if (is_32bit_elf)
11390 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11391 else
11392 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11393
11394 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11395 if (symtab == NULL)
11396 continue;
11397
11398 if (section->sh_link == elf_header.e_shstrndx)
11399 {
11400 strtab = string_table;
11401 strtab_size = string_table_length;
11402 }
11403 else if (section->sh_link < elf_header.e_shnum)
11404 {
11405 Elf_Internal_Shdr * string_sec;
11406
11407 string_sec = section_headers + section->sh_link;
11408
11409 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11410 1, string_sec->sh_size,
11411 _("string table"));
11412 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11413 }
11414
11415 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11416 {
11417 const char *version_string;
11418 enum versioned_symbol_info sym_info;
11419 unsigned short vna_other;
11420
11421 printf ("%6d: ", si);
11422 print_vma (psym->st_value, LONG_HEX);
11423 putchar (' ');
11424 print_vma (psym->st_size, DEC_5);
11425 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11426 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11427 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11428 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11429 else
11430 {
11431 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11432
11433 printf (" %-7s", get_symbol_visibility (vis));
11434 /* Check to see if any other bits in the st_other field are set.
11435 Note - displaying this information disrupts the layout of the
11436 table being generated, but for the moment this case is very rare. */
11437 if (psym->st_other ^ vis)
11438 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11439 }
11440 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11441 print_symbol (25, psym->st_name < strtab_size
11442 ? strtab + psym->st_name : _("<corrupt>"));
11443
11444 version_string
11445 = get_symbol_version_string (file,
11446 section->sh_type == SHT_DYNSYM,
11447 strtab, strtab_size, si,
11448 psym, &sym_info, &vna_other);
11449 if (version_string)
11450 {
11451 if (sym_info == symbol_undefined)
11452 printf ("@%s (%d)", version_string, vna_other);
11453 else
11454 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11455 version_string);
11456 }
11457
11458 putchar ('\n');
11459
11460 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11461 && si >= section->sh_info
11462 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11463 && elf_header.e_machine != EM_MIPS
11464 /* Solaris binaries have been found to violate this requirement as
11465 well. Not sure if this is a bug or an ABI requirement. */
11466 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11467 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11468 si, printable_section_name (section), section->sh_info);
11469 }
11470
11471 free (symtab);
11472 if (strtab != string_table)
11473 free (strtab);
11474 }
11475 }
11476 else if (do_syms)
11477 printf
11478 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11479
11480 if (do_histogram && buckets != NULL)
11481 {
11482 unsigned long * lengths;
11483 unsigned long * counts;
11484 unsigned long hn;
11485 bfd_vma si;
11486 unsigned long maxlength = 0;
11487 unsigned long nzero_counts = 0;
11488 unsigned long nsyms = 0;
11489 unsigned long chained;
11490
11491 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11492 (unsigned long) nbuckets);
11493
11494 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11495 if (lengths == NULL)
11496 {
11497 error (_("Out of memory allocating space for histogram buckets\n"));
11498 return FALSE;
11499 }
11500
11501 printf (_(" Length Number %% of total Coverage\n"));
11502 for (hn = 0; hn < nbuckets; ++hn)
11503 {
11504 for (si = buckets[hn], chained = 0;
11505 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11506 si = chains[si], ++chained)
11507 {
11508 ++nsyms;
11509 if (maxlength < ++lengths[hn])
11510 ++maxlength;
11511 }
11512
11513 /* PR binutils/17531: A corrupt binary could contain broken
11514 histogram data. Do not go into an infinite loop trying
11515 to process it. */
11516 if (chained > nchains)
11517 {
11518 error (_("histogram chain is corrupt\n"));
11519 break;
11520 }
11521 }
11522
11523 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11524 if (counts == NULL)
11525 {
11526 free (lengths);
11527 error (_("Out of memory allocating space for histogram counts\n"));
11528 return FALSE;
11529 }
11530
11531 for (hn = 0; hn < nbuckets; ++hn)
11532 ++counts[lengths[hn]];
11533
11534 if (nbuckets > 0)
11535 {
11536 unsigned long i;
11537 printf (" 0 %-10lu (%5.1f%%)\n",
11538 counts[0], (counts[0] * 100.0) / nbuckets);
11539 for (i = 1; i <= maxlength; ++i)
11540 {
11541 nzero_counts += counts[i] * i;
11542 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11543 i, counts[i], (counts[i] * 100.0) / nbuckets,
11544 (nzero_counts * 100.0) / nsyms);
11545 }
11546 }
11547
11548 free (counts);
11549 free (lengths);
11550 }
11551
11552 if (buckets != NULL)
11553 {
11554 free (buckets);
11555 free (chains);
11556 }
11557
11558 if (do_histogram && gnubuckets != NULL)
11559 {
11560 unsigned long * lengths;
11561 unsigned long * counts;
11562 unsigned long hn;
11563 unsigned long maxlength = 0;
11564 unsigned long nzero_counts = 0;
11565 unsigned long nsyms = 0;
11566
11567 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11568 (unsigned long) ngnubuckets);
11569
11570 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11571 if (lengths == NULL)
11572 {
11573 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11574 return FALSE;
11575 }
11576
11577 printf (_(" Length Number %% of total Coverage\n"));
11578
11579 for (hn = 0; hn < ngnubuckets; ++hn)
11580 if (gnubuckets[hn] != 0)
11581 {
11582 bfd_vma off, length = 1;
11583
11584 for (off = gnubuckets[hn] - gnusymidx;
11585 /* PR 17531 file: 010-77222-0.004. */
11586 off < ngnuchains && (gnuchains[off] & 1) == 0;
11587 ++off)
11588 ++length;
11589 lengths[hn] = length;
11590 if (length > maxlength)
11591 maxlength = length;
11592 nsyms += length;
11593 }
11594
11595 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11596 if (counts == NULL)
11597 {
11598 free (lengths);
11599 error (_("Out of memory allocating space for gnu histogram counts\n"));
11600 return FALSE;
11601 }
11602
11603 for (hn = 0; hn < ngnubuckets; ++hn)
11604 ++counts[lengths[hn]];
11605
11606 if (ngnubuckets > 0)
11607 {
11608 unsigned long j;
11609 printf (" 0 %-10lu (%5.1f%%)\n",
11610 counts[0], (counts[0] * 100.0) / ngnubuckets);
11611 for (j = 1; j <= maxlength; ++j)
11612 {
11613 nzero_counts += counts[j] * j;
11614 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11615 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11616 (nzero_counts * 100.0) / nsyms);
11617 }
11618 }
11619
11620 free (counts);
11621 free (lengths);
11622 free (gnubuckets);
11623 free (gnuchains);
11624 }
11625
11626 return TRUE;
11627 }
11628
11629 static bfd_boolean
11630 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11631 {
11632 unsigned int i;
11633
11634 if (dynamic_syminfo == NULL
11635 || !do_dynamic)
11636 /* No syminfo, this is ok. */
11637 return TRUE;
11638
11639 /* There better should be a dynamic symbol section. */
11640 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11641 return FALSE;
11642
11643 if (dynamic_addr)
11644 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11645 dynamic_syminfo_offset, dynamic_syminfo_nent);
11646
11647 printf (_(" Num: Name BoundTo Flags\n"));
11648 for (i = 0; i < dynamic_syminfo_nent; ++i)
11649 {
11650 unsigned short int flags = dynamic_syminfo[i].si_flags;
11651
11652 printf ("%4d: ", i);
11653 if (i >= num_dynamic_syms)
11654 printf (_("<corrupt index>"));
11655 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11656 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11657 else
11658 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11659 putchar (' ');
11660
11661 switch (dynamic_syminfo[i].si_boundto)
11662 {
11663 case SYMINFO_BT_SELF:
11664 fputs ("SELF ", stdout);
11665 break;
11666 case SYMINFO_BT_PARENT:
11667 fputs ("PARENT ", stdout);
11668 break;
11669 default:
11670 if (dynamic_syminfo[i].si_boundto > 0
11671 && dynamic_syminfo[i].si_boundto < dynamic_nent
11672 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11673 {
11674 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11675 putchar (' ' );
11676 }
11677 else
11678 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11679 break;
11680 }
11681
11682 if (flags & SYMINFO_FLG_DIRECT)
11683 printf (" DIRECT");
11684 if (flags & SYMINFO_FLG_PASSTHRU)
11685 printf (" PASSTHRU");
11686 if (flags & SYMINFO_FLG_COPY)
11687 printf (" COPY");
11688 if (flags & SYMINFO_FLG_LAZYLOAD)
11689 printf (" LAZYLOAD");
11690
11691 puts ("");
11692 }
11693
11694 return TRUE;
11695 }
11696
11697 #define IN_RANGE(START,END,ADDR,OFF) \
11698 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11699
11700 /* Check to see if the given reloc needs to be handled in a target specific
11701 manner. If so then process the reloc and return TRUE otherwise return
11702 FALSE.
11703
11704 If called with reloc == NULL, then this is a signal that reloc processing
11705 for the current section has finished, and any saved state should be
11706 discarded. */
11707
11708 static bfd_boolean
11709 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11710 unsigned char * start,
11711 unsigned char * end,
11712 Elf_Internal_Sym * symtab,
11713 unsigned long num_syms)
11714 {
11715 unsigned int reloc_type = 0;
11716 unsigned long sym_index = 0;
11717
11718 if (reloc)
11719 {
11720 reloc_type = get_reloc_type (reloc->r_info);
11721 sym_index = get_reloc_symindex (reloc->r_info);
11722 }
11723
11724 switch (elf_header.e_machine)
11725 {
11726 case EM_MSP430:
11727 case EM_MSP430_OLD:
11728 {
11729 static Elf_Internal_Sym * saved_sym = NULL;
11730
11731 if (reloc == NULL)
11732 {
11733 saved_sym = NULL;
11734 return TRUE;
11735 }
11736
11737 switch (reloc_type)
11738 {
11739 case 10: /* R_MSP430_SYM_DIFF */
11740 if (uses_msp430x_relocs ())
11741 break;
11742 /* Fall through. */
11743 case 21: /* R_MSP430X_SYM_DIFF */
11744 /* PR 21139. */
11745 if (sym_index >= num_syms)
11746 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11747 sym_index);
11748 else
11749 saved_sym = symtab + sym_index;
11750 return TRUE;
11751
11752 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11753 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11754 goto handle_sym_diff;
11755
11756 case 5: /* R_MSP430_16_BYTE */
11757 case 9: /* R_MSP430_8 */
11758 if (uses_msp430x_relocs ())
11759 break;
11760 goto handle_sym_diff;
11761
11762 case 2: /* R_MSP430_ABS16 */
11763 case 15: /* R_MSP430X_ABS16 */
11764 if (! uses_msp430x_relocs ())
11765 break;
11766 goto handle_sym_diff;
11767
11768 handle_sym_diff:
11769 if (saved_sym != NULL)
11770 {
11771 int reloc_size = reloc_type == 1 ? 4 : 2;
11772 bfd_vma value;
11773
11774 if (sym_index >= num_syms)
11775 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
11776 sym_index);
11777 else
11778 {
11779 value = reloc->r_addend + (symtab[sym_index].st_value
11780 - saved_sym->st_value);
11781
11782 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
11783 byte_put (start + reloc->r_offset, value, reloc_size);
11784 else
11785 /* PR 21137 */
11786 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
11787 (long) reloc->r_offset);
11788 }
11789
11790 saved_sym = NULL;
11791 return TRUE;
11792 }
11793 break;
11794
11795 default:
11796 if (saved_sym != NULL)
11797 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11798 break;
11799 }
11800 break;
11801 }
11802
11803 case EM_MN10300:
11804 case EM_CYGNUS_MN10300:
11805 {
11806 static Elf_Internal_Sym * saved_sym = NULL;
11807
11808 if (reloc == NULL)
11809 {
11810 saved_sym = NULL;
11811 return TRUE;
11812 }
11813
11814 switch (reloc_type)
11815 {
11816 case 34: /* R_MN10300_ALIGN */
11817 return TRUE;
11818 case 33: /* R_MN10300_SYM_DIFF */
11819 if (sym_index >= num_syms)
11820 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
11821 sym_index);
11822 else
11823 saved_sym = symtab + sym_index;
11824 return TRUE;
11825
11826 case 1: /* R_MN10300_32 */
11827 case 2: /* R_MN10300_16 */
11828 if (saved_sym != NULL)
11829 {
11830 int reloc_size = reloc_type == 1 ? 4 : 2;
11831 bfd_vma value;
11832
11833 if (sym_index >= num_syms)
11834 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
11835 sym_index);
11836 else
11837 {
11838 value = reloc->r_addend + (symtab[sym_index].st_value
11839 - saved_sym->st_value);
11840
11841 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
11842 byte_put (start + reloc->r_offset, value, reloc_size);
11843 else
11844 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
11845 (long) reloc->r_offset);
11846 }
11847
11848 saved_sym = NULL;
11849 return TRUE;
11850 }
11851 break;
11852 default:
11853 if (saved_sym != NULL)
11854 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11855 break;
11856 }
11857 break;
11858 }
11859
11860 case EM_RL78:
11861 {
11862 static bfd_vma saved_sym1 = 0;
11863 static bfd_vma saved_sym2 = 0;
11864 static bfd_vma value;
11865
11866 if (reloc == NULL)
11867 {
11868 saved_sym1 = saved_sym2 = 0;
11869 return TRUE;
11870 }
11871
11872 switch (reloc_type)
11873 {
11874 case 0x80: /* R_RL78_SYM. */
11875 saved_sym1 = saved_sym2;
11876 if (sym_index >= num_syms)
11877 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
11878 sym_index);
11879 else
11880 {
11881 saved_sym2 = symtab[sym_index].st_value;
11882 saved_sym2 += reloc->r_addend;
11883 }
11884 return TRUE;
11885
11886 case 0x83: /* R_RL78_OPsub. */
11887 value = saved_sym1 - saved_sym2;
11888 saved_sym2 = saved_sym1 = 0;
11889 return TRUE;
11890 break;
11891
11892 case 0x41: /* R_RL78_ABS32. */
11893 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
11894 byte_put (start + reloc->r_offset, value, 4);
11895 else
11896 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11897 (long) reloc->r_offset);
11898 value = 0;
11899 return TRUE;
11900
11901 case 0x43: /* R_RL78_ABS16. */
11902 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
11903 byte_put (start + reloc->r_offset, value, 2);
11904 else
11905 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11906 (long) reloc->r_offset);
11907 value = 0;
11908 return TRUE;
11909
11910 default:
11911 break;
11912 }
11913 break;
11914 }
11915 }
11916
11917 return FALSE;
11918 }
11919
11920 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11921 DWARF debug sections. This is a target specific test. Note - we do not
11922 go through the whole including-target-headers-multiple-times route, (as
11923 we have already done with <elf/h8.h>) because this would become very
11924 messy and even then this function would have to contain target specific
11925 information (the names of the relocs instead of their numeric values).
11926 FIXME: This is not the correct way to solve this problem. The proper way
11927 is to have target specific reloc sizing and typing functions created by
11928 the reloc-macros.h header, in the same way that it already creates the
11929 reloc naming functions. */
11930
11931 static bfd_boolean
11932 is_32bit_abs_reloc (unsigned int reloc_type)
11933 {
11934 /* Please keep this table alpha-sorted for ease of visual lookup. */
11935 switch (elf_header.e_machine)
11936 {
11937 case EM_386:
11938 case EM_IAMCU:
11939 return reloc_type == 1; /* R_386_32. */
11940 case EM_68K:
11941 return reloc_type == 1; /* R_68K_32. */
11942 case EM_860:
11943 return reloc_type == 1; /* R_860_32. */
11944 case EM_960:
11945 return reloc_type == 2; /* R_960_32. */
11946 case EM_AARCH64:
11947 return (reloc_type == 258
11948 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
11949 case EM_ADAPTEVA_EPIPHANY:
11950 return reloc_type == 3;
11951 case EM_ALPHA:
11952 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11953 case EM_ARC:
11954 return reloc_type == 1; /* R_ARC_32. */
11955 case EM_ARC_COMPACT:
11956 case EM_ARC_COMPACT2:
11957 return reloc_type == 4; /* R_ARC_32. */
11958 case EM_ARM:
11959 return reloc_type == 2; /* R_ARM_ABS32 */
11960 case EM_AVR_OLD:
11961 case EM_AVR:
11962 return reloc_type == 1;
11963 case EM_BLACKFIN:
11964 return reloc_type == 0x12; /* R_byte4_data. */
11965 case EM_CRIS:
11966 return reloc_type == 3; /* R_CRIS_32. */
11967 case EM_CR16:
11968 return reloc_type == 3; /* R_CR16_NUM32. */
11969 case EM_CRX:
11970 return reloc_type == 15; /* R_CRX_NUM32. */
11971 case EM_CYGNUS_FRV:
11972 return reloc_type == 1;
11973 case EM_CYGNUS_D10V:
11974 case EM_D10V:
11975 return reloc_type == 6; /* R_D10V_32. */
11976 case EM_CYGNUS_D30V:
11977 case EM_D30V:
11978 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11979 case EM_DLX:
11980 return reloc_type == 3; /* R_DLX_RELOC_32. */
11981 case EM_CYGNUS_FR30:
11982 case EM_FR30:
11983 return reloc_type == 3; /* R_FR30_32. */
11984 case EM_FT32:
11985 return reloc_type == 1; /* R_FT32_32. */
11986 case EM_H8S:
11987 case EM_H8_300:
11988 case EM_H8_300H:
11989 return reloc_type == 1; /* R_H8_DIR32. */
11990 case EM_IA_64:
11991 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11992 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11993 case EM_IP2K_OLD:
11994 case EM_IP2K:
11995 return reloc_type == 2; /* R_IP2K_32. */
11996 case EM_IQ2000:
11997 return reloc_type == 2; /* R_IQ2000_32. */
11998 case EM_LATTICEMICO32:
11999 return reloc_type == 3; /* R_LM32_32. */
12000 case EM_M32C_OLD:
12001 case EM_M32C:
12002 return reloc_type == 3; /* R_M32C_32. */
12003 case EM_M32R:
12004 return reloc_type == 34; /* R_M32R_32_RELA. */
12005 case EM_68HC11:
12006 case EM_68HC12:
12007 return reloc_type == 6; /* R_M68HC11_32. */
12008 case EM_MCORE:
12009 return reloc_type == 1; /* R_MCORE_ADDR32. */
12010 case EM_CYGNUS_MEP:
12011 return reloc_type == 4; /* R_MEP_32. */
12012 case EM_METAG:
12013 return reloc_type == 2; /* R_METAG_ADDR32. */
12014 case EM_MICROBLAZE:
12015 return reloc_type == 1; /* R_MICROBLAZE_32. */
12016 case EM_MIPS:
12017 return reloc_type == 2; /* R_MIPS_32. */
12018 case EM_MMIX:
12019 return reloc_type == 4; /* R_MMIX_32. */
12020 case EM_CYGNUS_MN10200:
12021 case EM_MN10200:
12022 return reloc_type == 1; /* R_MN10200_32. */
12023 case EM_CYGNUS_MN10300:
12024 case EM_MN10300:
12025 return reloc_type == 1; /* R_MN10300_32. */
12026 case EM_MOXIE:
12027 return reloc_type == 1; /* R_MOXIE_32. */
12028 case EM_MSP430_OLD:
12029 case EM_MSP430:
12030 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12031 case EM_MT:
12032 return reloc_type == 2; /* R_MT_32. */
12033 case EM_NDS32:
12034 return reloc_type == 20; /* R_NDS32_RELA. */
12035 case EM_ALTERA_NIOS2:
12036 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12037 case EM_NIOS32:
12038 return reloc_type == 1; /* R_NIOS_32. */
12039 case EM_OR1K:
12040 return reloc_type == 1; /* R_OR1K_32. */
12041 case EM_PARISC:
12042 return (reloc_type == 1 /* R_PARISC_DIR32. */
12043 || reloc_type == 41); /* R_PARISC_SECREL32. */
12044 case EM_PJ:
12045 case EM_PJ_OLD:
12046 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12047 case EM_PPC64:
12048 return reloc_type == 1; /* R_PPC64_ADDR32. */
12049 case EM_PPC:
12050 return reloc_type == 1; /* R_PPC_ADDR32. */
12051 case EM_TI_PRU:
12052 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12053 case EM_RISCV:
12054 return reloc_type == 1; /* R_RISCV_32. */
12055 case EM_RL78:
12056 return reloc_type == 1; /* R_RL78_DIR32. */
12057 case EM_RX:
12058 return reloc_type == 1; /* R_RX_DIR32. */
12059 case EM_S370:
12060 return reloc_type == 1; /* R_I370_ADDR31. */
12061 case EM_S390_OLD:
12062 case EM_S390:
12063 return reloc_type == 4; /* R_S390_32. */
12064 case EM_SCORE:
12065 return reloc_type == 8; /* R_SCORE_ABS32. */
12066 case EM_SH:
12067 return reloc_type == 1; /* R_SH_DIR32. */
12068 case EM_SPARC32PLUS:
12069 case EM_SPARCV9:
12070 case EM_SPARC:
12071 return reloc_type == 3 /* R_SPARC_32. */
12072 || reloc_type == 23; /* R_SPARC_UA32. */
12073 case EM_SPU:
12074 return reloc_type == 6; /* R_SPU_ADDR32 */
12075 case EM_TI_C6000:
12076 return reloc_type == 1; /* R_C6000_ABS32. */
12077 case EM_TILEGX:
12078 return reloc_type == 2; /* R_TILEGX_32. */
12079 case EM_TILEPRO:
12080 return reloc_type == 1; /* R_TILEPRO_32. */
12081 case EM_CYGNUS_V850:
12082 case EM_V850:
12083 return reloc_type == 6; /* R_V850_ABS32. */
12084 case EM_V800:
12085 return reloc_type == 0x33; /* R_V810_WORD. */
12086 case EM_VAX:
12087 return reloc_type == 1; /* R_VAX_32. */
12088 case EM_VISIUM:
12089 return reloc_type == 3; /* R_VISIUM_32. */
12090 case EM_X86_64:
12091 case EM_L1OM:
12092 case EM_K1OM:
12093 return reloc_type == 10; /* R_X86_64_32. */
12094 case EM_XC16X:
12095 case EM_C166:
12096 return reloc_type == 3; /* R_XC16C_ABS_32. */
12097 case EM_XGATE:
12098 return reloc_type == 4; /* R_XGATE_32. */
12099 case EM_XSTORMY16:
12100 return reloc_type == 1; /* R_XSTROMY16_32. */
12101 case EM_XTENSA_OLD:
12102 case EM_XTENSA:
12103 return reloc_type == 1; /* R_XTENSA_32. */
12104 default:
12105 {
12106 static unsigned int prev_warn = 0;
12107
12108 /* Avoid repeating the same warning multiple times. */
12109 if (prev_warn != elf_header.e_machine)
12110 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12111 elf_header.e_machine);
12112 prev_warn = elf_header.e_machine;
12113 return FALSE;
12114 }
12115 }
12116 }
12117
12118 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12119 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12120
12121 static bfd_boolean
12122 is_32bit_pcrel_reloc (unsigned int reloc_type)
12123 {
12124 switch (elf_header.e_machine)
12125 /* Please keep this table alpha-sorted for ease of visual lookup. */
12126 {
12127 case EM_386:
12128 case EM_IAMCU:
12129 return reloc_type == 2; /* R_386_PC32. */
12130 case EM_68K:
12131 return reloc_type == 4; /* R_68K_PC32. */
12132 case EM_AARCH64:
12133 return reloc_type == 261; /* R_AARCH64_PREL32 */
12134 case EM_ADAPTEVA_EPIPHANY:
12135 return reloc_type == 6;
12136 case EM_ALPHA:
12137 return reloc_type == 10; /* R_ALPHA_SREL32. */
12138 case EM_ARC_COMPACT:
12139 case EM_ARC_COMPACT2:
12140 return reloc_type == 49; /* R_ARC_32_PCREL. */
12141 case EM_ARM:
12142 return reloc_type == 3; /* R_ARM_REL32 */
12143 case EM_AVR_OLD:
12144 case EM_AVR:
12145 return reloc_type == 36; /* R_AVR_32_PCREL. */
12146 case EM_MICROBLAZE:
12147 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12148 case EM_OR1K:
12149 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12150 case EM_PARISC:
12151 return reloc_type == 9; /* R_PARISC_PCREL32. */
12152 case EM_PPC:
12153 return reloc_type == 26; /* R_PPC_REL32. */
12154 case EM_PPC64:
12155 return reloc_type == 26; /* R_PPC64_REL32. */
12156 case EM_S390_OLD:
12157 case EM_S390:
12158 return reloc_type == 5; /* R_390_PC32. */
12159 case EM_SH:
12160 return reloc_type == 2; /* R_SH_REL32. */
12161 case EM_SPARC32PLUS:
12162 case EM_SPARCV9:
12163 case EM_SPARC:
12164 return reloc_type == 6; /* R_SPARC_DISP32. */
12165 case EM_SPU:
12166 return reloc_type == 13; /* R_SPU_REL32. */
12167 case EM_TILEGX:
12168 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12169 case EM_TILEPRO:
12170 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12171 case EM_VISIUM:
12172 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12173 case EM_X86_64:
12174 case EM_L1OM:
12175 case EM_K1OM:
12176 return reloc_type == 2; /* R_X86_64_PC32. */
12177 case EM_XTENSA_OLD:
12178 case EM_XTENSA:
12179 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12180 default:
12181 /* Do not abort or issue an error message here. Not all targets use
12182 pc-relative 32-bit relocs in their DWARF debug information and we
12183 have already tested for target coverage in is_32bit_abs_reloc. A
12184 more helpful warning message will be generated by apply_relocations
12185 anyway, so just return. */
12186 return FALSE;
12187 }
12188 }
12189
12190 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12191 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12192
12193 static bfd_boolean
12194 is_64bit_abs_reloc (unsigned int reloc_type)
12195 {
12196 switch (elf_header.e_machine)
12197 {
12198 case EM_AARCH64:
12199 return reloc_type == 257; /* R_AARCH64_ABS64. */
12200 case EM_ALPHA:
12201 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12202 case EM_IA_64:
12203 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
12204 case EM_PARISC:
12205 return reloc_type == 80; /* R_PARISC_DIR64. */
12206 case EM_PPC64:
12207 return reloc_type == 38; /* R_PPC64_ADDR64. */
12208 case EM_RISCV:
12209 return reloc_type == 2; /* R_RISCV_64. */
12210 case EM_SPARC32PLUS:
12211 case EM_SPARCV9:
12212 case EM_SPARC:
12213 return reloc_type == 54; /* R_SPARC_UA64. */
12214 case EM_X86_64:
12215 case EM_L1OM:
12216 case EM_K1OM:
12217 return reloc_type == 1; /* R_X86_64_64. */
12218 case EM_S390_OLD:
12219 case EM_S390:
12220 return reloc_type == 22; /* R_S390_64. */
12221 case EM_TILEGX:
12222 return reloc_type == 1; /* R_TILEGX_64. */
12223 case EM_MIPS:
12224 return reloc_type == 18; /* R_MIPS_64. */
12225 default:
12226 return FALSE;
12227 }
12228 }
12229
12230 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12231 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12232
12233 static bfd_boolean
12234 is_64bit_pcrel_reloc (unsigned int reloc_type)
12235 {
12236 switch (elf_header.e_machine)
12237 {
12238 case EM_AARCH64:
12239 return reloc_type == 260; /* R_AARCH64_PREL64. */
12240 case EM_ALPHA:
12241 return reloc_type == 11; /* R_ALPHA_SREL64. */
12242 case EM_IA_64:
12243 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
12244 case EM_PARISC:
12245 return reloc_type == 72; /* R_PARISC_PCREL64. */
12246 case EM_PPC64:
12247 return reloc_type == 44; /* R_PPC64_REL64. */
12248 case EM_SPARC32PLUS:
12249 case EM_SPARCV9:
12250 case EM_SPARC:
12251 return reloc_type == 46; /* R_SPARC_DISP64. */
12252 case EM_X86_64:
12253 case EM_L1OM:
12254 case EM_K1OM:
12255 return reloc_type == 24; /* R_X86_64_PC64. */
12256 case EM_S390_OLD:
12257 case EM_S390:
12258 return reloc_type == 23; /* R_S390_PC64. */
12259 case EM_TILEGX:
12260 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12261 default:
12262 return FALSE;
12263 }
12264 }
12265
12266 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12267 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12268
12269 static bfd_boolean
12270 is_24bit_abs_reloc (unsigned int reloc_type)
12271 {
12272 switch (elf_header.e_machine)
12273 {
12274 case EM_CYGNUS_MN10200:
12275 case EM_MN10200:
12276 return reloc_type == 4; /* R_MN10200_24. */
12277 case EM_FT32:
12278 return reloc_type == 5; /* R_FT32_20. */
12279 default:
12280 return FALSE;
12281 }
12282 }
12283
12284 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12285 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12286
12287 static bfd_boolean
12288 is_16bit_abs_reloc (unsigned int reloc_type)
12289 {
12290 /* Please keep this table alpha-sorted for ease of visual lookup. */
12291 switch (elf_header.e_machine)
12292 {
12293 case EM_ARC:
12294 case EM_ARC_COMPACT:
12295 case EM_ARC_COMPACT2:
12296 return reloc_type == 2; /* R_ARC_16. */
12297 case EM_ADAPTEVA_EPIPHANY:
12298 return reloc_type == 5;
12299 case EM_AVR_OLD:
12300 case EM_AVR:
12301 return reloc_type == 4; /* R_AVR_16. */
12302 case EM_CYGNUS_D10V:
12303 case EM_D10V:
12304 return reloc_type == 3; /* R_D10V_16. */
12305 case EM_H8S:
12306 case EM_H8_300:
12307 case EM_H8_300H:
12308 return reloc_type == R_H8_DIR16;
12309 case EM_IP2K_OLD:
12310 case EM_IP2K:
12311 return reloc_type == 1; /* R_IP2K_16. */
12312 case EM_M32C_OLD:
12313 case EM_M32C:
12314 return reloc_type == 1; /* R_M32C_16 */
12315 case EM_CYGNUS_MN10200:
12316 case EM_MN10200:
12317 return reloc_type == 2; /* R_MN10200_16. */
12318 case EM_CYGNUS_MN10300:
12319 case EM_MN10300:
12320 return reloc_type == 2; /* R_MN10300_16. */
12321 case EM_MSP430:
12322 if (uses_msp430x_relocs ())
12323 return reloc_type == 2; /* R_MSP430_ABS16. */
12324 /* Fall through. */
12325 case EM_MSP430_OLD:
12326 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12327 case EM_NDS32:
12328 return reloc_type == 19; /* R_NDS32_RELA. */
12329 case EM_ALTERA_NIOS2:
12330 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12331 case EM_NIOS32:
12332 return reloc_type == 9; /* R_NIOS_16. */
12333 case EM_OR1K:
12334 return reloc_type == 2; /* R_OR1K_16. */
12335 case EM_TI_PRU:
12336 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12337 case EM_TI_C6000:
12338 return reloc_type == 2; /* R_C6000_ABS16. */
12339 case EM_VISIUM:
12340 return reloc_type == 2; /* R_VISIUM_16. */
12341 case EM_XC16X:
12342 case EM_C166:
12343 return reloc_type == 2; /* R_XC16C_ABS_16. */
12344 case EM_XGATE:
12345 return reloc_type == 3; /* R_XGATE_16. */
12346 default:
12347 return FALSE;
12348 }
12349 }
12350
12351 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12352 relocation entries (possibly formerly used for SHT_GROUP sections). */
12353
12354 static bfd_boolean
12355 is_none_reloc (unsigned int reloc_type)
12356 {
12357 switch (elf_header.e_machine)
12358 {
12359 case EM_386: /* R_386_NONE. */
12360 case EM_68K: /* R_68K_NONE. */
12361 case EM_ADAPTEVA_EPIPHANY:
12362 case EM_ALPHA: /* R_ALPHA_NONE. */
12363 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12364 case EM_ARC: /* R_ARC_NONE. */
12365 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12366 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12367 case EM_ARM: /* R_ARM_NONE. */
12368 case EM_C166: /* R_XC16X_NONE. */
12369 case EM_CRIS: /* R_CRIS_NONE. */
12370 case EM_FT32: /* R_FT32_NONE. */
12371 case EM_IA_64: /* R_IA64_NONE. */
12372 case EM_K1OM: /* R_X86_64_NONE. */
12373 case EM_L1OM: /* R_X86_64_NONE. */
12374 case EM_M32R: /* R_M32R_NONE. */
12375 case EM_MIPS: /* R_MIPS_NONE. */
12376 case EM_MN10300: /* R_MN10300_NONE. */
12377 case EM_MOXIE: /* R_MOXIE_NONE. */
12378 case EM_NIOS32: /* R_NIOS_NONE. */
12379 case EM_OR1K: /* R_OR1K_NONE. */
12380 case EM_PARISC: /* R_PARISC_NONE. */
12381 case EM_PPC64: /* R_PPC64_NONE. */
12382 case EM_PPC: /* R_PPC_NONE. */
12383 case EM_RISCV: /* R_RISCV_NONE. */
12384 case EM_S390: /* R_390_NONE. */
12385 case EM_S390_OLD:
12386 case EM_SH: /* R_SH_NONE. */
12387 case EM_SPARC32PLUS:
12388 case EM_SPARC: /* R_SPARC_NONE. */
12389 case EM_SPARCV9:
12390 case EM_TILEGX: /* R_TILEGX_NONE. */
12391 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12392 case EM_TI_C6000:/* R_C6000_NONE. */
12393 case EM_X86_64: /* R_X86_64_NONE. */
12394 case EM_XC16X:
12395 return reloc_type == 0;
12396
12397 case EM_AARCH64:
12398 return reloc_type == 0 || reloc_type == 256;
12399 case EM_AVR_OLD:
12400 case EM_AVR:
12401 return (reloc_type == 0 /* R_AVR_NONE. */
12402 || reloc_type == 30 /* R_AVR_DIFF8. */
12403 || reloc_type == 31 /* R_AVR_DIFF16. */
12404 || reloc_type == 32 /* R_AVR_DIFF32. */);
12405 case EM_METAG:
12406 return reloc_type == 3; /* R_METAG_NONE. */
12407 case EM_NDS32:
12408 return (reloc_type == 0 /* R_XTENSA_NONE. */
12409 || reloc_type == 204 /* R_NDS32_DIFF8. */
12410 || reloc_type == 205 /* R_NDS32_DIFF16. */
12411 || reloc_type == 206 /* R_NDS32_DIFF32. */
12412 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12413 case EM_TI_PRU:
12414 return (reloc_type == 0 /* R_PRU_NONE. */
12415 || reloc_type == 65 /* R_PRU_DIFF8. */
12416 || reloc_type == 66 /* R_PRU_DIFF16. */
12417 || reloc_type == 67 /* R_PRU_DIFF32. */);
12418 case EM_XTENSA_OLD:
12419 case EM_XTENSA:
12420 return (reloc_type == 0 /* R_XTENSA_NONE. */
12421 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12422 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12423 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12424 }
12425 return FALSE;
12426 }
12427
12428 /* Returns TRUE if there is a relocation against
12429 section NAME at OFFSET bytes. */
12430
12431 bfd_boolean
12432 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12433 {
12434 Elf_Internal_Rela * relocs;
12435 Elf_Internal_Rela * rp;
12436
12437 if (dsec == NULL || dsec->reloc_info == NULL)
12438 return FALSE;
12439
12440 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12441
12442 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12443 if (rp->r_offset == offset)
12444 return TRUE;
12445
12446 return FALSE;
12447 }
12448
12449 /* Apply relocations to a section.
12450 Returns TRUE upon success, FALSE otherwise.
12451 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12452 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12453 will be set to the number of relocs loaded.
12454
12455 Note: So far support has been added only for those relocations
12456 which can be found in debug sections. FIXME: Add support for
12457 more relocations ? */
12458
12459 static bfd_boolean
12460 apply_relocations (void * file,
12461 const Elf_Internal_Shdr * section,
12462 unsigned char * start,
12463 bfd_size_type size,
12464 void ** relocs_return,
12465 unsigned long * num_relocs_return)
12466 {
12467 Elf_Internal_Shdr * relsec;
12468 unsigned char * end = start + size;
12469 bfd_boolean res = TRUE;
12470
12471 if (relocs_return != NULL)
12472 {
12473 * (Elf_Internal_Rela **) relocs_return = NULL;
12474 * num_relocs_return = 0;
12475 }
12476
12477 if (elf_header.e_type != ET_REL)
12478 /* No relocs to apply. */
12479 return TRUE;
12480
12481 /* Find the reloc section associated with the section. */
12482 for (relsec = section_headers;
12483 relsec < section_headers + elf_header.e_shnum;
12484 ++relsec)
12485 {
12486 bfd_boolean is_rela;
12487 unsigned long num_relocs;
12488 Elf_Internal_Rela * relocs;
12489 Elf_Internal_Rela * rp;
12490 Elf_Internal_Shdr * symsec;
12491 Elf_Internal_Sym * symtab;
12492 unsigned long num_syms;
12493 Elf_Internal_Sym * sym;
12494
12495 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12496 || relsec->sh_info >= elf_header.e_shnum
12497 || section_headers + relsec->sh_info != section
12498 || relsec->sh_size == 0
12499 || relsec->sh_link >= elf_header.e_shnum)
12500 continue;
12501
12502 is_rela = relsec->sh_type == SHT_RELA;
12503
12504 if (is_rela)
12505 {
12506 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12507 relsec->sh_size, & relocs, & num_relocs))
12508 return FALSE;
12509 }
12510 else
12511 {
12512 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12513 relsec->sh_size, & relocs, & num_relocs))
12514 return FALSE;
12515 }
12516
12517 /* SH uses RELA but uses in place value instead of the addend field. */
12518 if (elf_header.e_machine == EM_SH)
12519 is_rela = FALSE;
12520
12521 symsec = section_headers + relsec->sh_link;
12522 if (symsec->sh_type != SHT_SYMTAB
12523 && symsec->sh_type != SHT_DYNSYM)
12524 return FALSE;
12525 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12526
12527 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12528 {
12529 bfd_vma addend;
12530 unsigned int reloc_type;
12531 unsigned int reloc_size;
12532 unsigned char * rloc;
12533 unsigned long sym_index;
12534
12535 reloc_type = get_reloc_type (rp->r_info);
12536
12537 if (target_specific_reloc_handling (rp, start, end, symtab, num_syms))
12538 continue;
12539 else if (is_none_reloc (reloc_type))
12540 continue;
12541 else if (is_32bit_abs_reloc (reloc_type)
12542 || is_32bit_pcrel_reloc (reloc_type))
12543 reloc_size = 4;
12544 else if (is_64bit_abs_reloc (reloc_type)
12545 || is_64bit_pcrel_reloc (reloc_type))
12546 reloc_size = 8;
12547 else if (is_24bit_abs_reloc (reloc_type))
12548 reloc_size = 3;
12549 else if (is_16bit_abs_reloc (reloc_type))
12550 reloc_size = 2;
12551 else
12552 {
12553 static unsigned int prev_reloc = 0;
12554 if (reloc_type != prev_reloc)
12555 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12556 reloc_type, printable_section_name (section));
12557 prev_reloc = reloc_type;
12558 res = FALSE;
12559 continue;
12560 }
12561
12562 rloc = start + rp->r_offset;
12563 if ((rloc + reloc_size) > end || (rloc < start))
12564 {
12565 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12566 (unsigned long) rp->r_offset,
12567 printable_section_name (section));
12568 res = FALSE;
12569 continue;
12570 }
12571
12572 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12573 if (sym_index >= num_syms)
12574 {
12575 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12576 sym_index, printable_section_name (section));
12577 res = FALSE;
12578 continue;
12579 }
12580 sym = symtab + sym_index;
12581
12582 /* If the reloc has a symbol associated with it,
12583 make sure that it is of an appropriate type.
12584
12585 Relocations against symbols without type can happen.
12586 Gcc -feliminate-dwarf2-dups may generate symbols
12587 without type for debug info.
12588
12589 Icc generates relocations against function symbols
12590 instead of local labels.
12591
12592 Relocations against object symbols can happen, eg when
12593 referencing a global array. For an example of this see
12594 the _clz.o binary in libgcc.a. */
12595 if (sym != symtab
12596 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12597 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12598 {
12599 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12600 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12601 (long int)(rp - relocs),
12602 printable_section_name (relsec));
12603 res = FALSE;
12604 continue;
12605 }
12606
12607 addend = 0;
12608 if (is_rela)
12609 addend += rp->r_addend;
12610 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12611 partial_inplace. */
12612 if (!is_rela
12613 || (elf_header.e_machine == EM_XTENSA
12614 && reloc_type == 1)
12615 || ((elf_header.e_machine == EM_PJ
12616 || elf_header.e_machine == EM_PJ_OLD)
12617 && reloc_type == 1)
12618 || ((elf_header.e_machine == EM_D30V
12619 || elf_header.e_machine == EM_CYGNUS_D30V)
12620 && reloc_type == 12))
12621 addend += byte_get (rloc, reloc_size);
12622
12623 if (is_32bit_pcrel_reloc (reloc_type)
12624 || is_64bit_pcrel_reloc (reloc_type))
12625 {
12626 /* On HPPA, all pc-relative relocations are biased by 8. */
12627 if (elf_header.e_machine == EM_PARISC)
12628 addend -= 8;
12629 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12630 reloc_size);
12631 }
12632 else
12633 byte_put (rloc, addend + sym->st_value, reloc_size);
12634 }
12635
12636 free (symtab);
12637 /* Let the target specific reloc processing code know that
12638 we have finished with these relocs. */
12639 target_specific_reloc_handling (NULL, NULL, NULL, NULL, 0);
12640
12641 if (relocs_return)
12642 {
12643 * (Elf_Internal_Rela **) relocs_return = relocs;
12644 * num_relocs_return = num_relocs;
12645 }
12646 else
12647 free (relocs);
12648
12649 break;
12650 }
12651
12652 return res;
12653 }
12654
12655 #ifdef SUPPORT_DISASSEMBLY
12656 static bfd_boolean
12657 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12658 {
12659 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12660
12661 /* FIXME: XXX -- to be done --- XXX */
12662
12663 return TRUE;
12664 }
12665 #endif
12666
12667 /* Reads in the contents of SECTION from FILE, returning a pointer
12668 to a malloc'ed buffer or NULL if something went wrong. */
12669
12670 static char *
12671 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12672 {
12673 bfd_size_type num_bytes;
12674
12675 num_bytes = section->sh_size;
12676
12677 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12678 {
12679 printf (_("\nSection '%s' has no data to dump.\n"),
12680 printable_section_name (section));
12681 return NULL;
12682 }
12683
12684 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12685 _("section contents"));
12686 }
12687
12688 /* Uncompresses a section that was compressed using zlib, in place. */
12689
12690 static bfd_boolean
12691 uncompress_section_contents (unsigned char **buffer,
12692 dwarf_size_type uncompressed_size,
12693 dwarf_size_type *size)
12694 {
12695 dwarf_size_type compressed_size = *size;
12696 unsigned char * compressed_buffer = *buffer;
12697 unsigned char * uncompressed_buffer;
12698 z_stream strm;
12699 int rc;
12700
12701 /* It is possible the section consists of several compressed
12702 buffers concatenated together, so we uncompress in a loop. */
12703 /* PR 18313: The state field in the z_stream structure is supposed
12704 to be invisible to the user (ie us), but some compilers will
12705 still complain about it being used without initialisation. So
12706 we first zero the entire z_stream structure and then set the fields
12707 that we need. */
12708 memset (& strm, 0, sizeof strm);
12709 strm.avail_in = compressed_size;
12710 strm.next_in = (Bytef *) compressed_buffer;
12711 strm.avail_out = uncompressed_size;
12712 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12713
12714 rc = inflateInit (& strm);
12715 while (strm.avail_in > 0)
12716 {
12717 if (rc != Z_OK)
12718 goto fail;
12719 strm.next_out = ((Bytef *) uncompressed_buffer
12720 + (uncompressed_size - strm.avail_out));
12721 rc = inflate (&strm, Z_FINISH);
12722 if (rc != Z_STREAM_END)
12723 goto fail;
12724 rc = inflateReset (& strm);
12725 }
12726 rc = inflateEnd (& strm);
12727 if (rc != Z_OK
12728 || strm.avail_out != 0)
12729 goto fail;
12730
12731 *buffer = uncompressed_buffer;
12732 *size = uncompressed_size;
12733 return TRUE;
12734
12735 fail:
12736 free (uncompressed_buffer);
12737 /* Indicate decompression failure. */
12738 *buffer = NULL;
12739 return FALSE;
12740 }
12741
12742 static bfd_boolean
12743 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12744 {
12745 Elf_Internal_Shdr * relsec;
12746 bfd_size_type num_bytes;
12747 unsigned char * data;
12748 unsigned char * end;
12749 unsigned char * real_start;
12750 unsigned char * start;
12751 bfd_boolean some_strings_shown;
12752
12753 real_start = start = (unsigned char *) get_section_contents (section,
12754 file);
12755 if (start == NULL)
12756 return FALSE;
12757 num_bytes = section->sh_size;
12758
12759 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12760
12761 if (decompress_dumps)
12762 {
12763 dwarf_size_type new_size = num_bytes;
12764 dwarf_size_type uncompressed_size = 0;
12765
12766 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12767 {
12768 Elf_Internal_Chdr chdr;
12769 unsigned int compression_header_size
12770 = get_compression_header (& chdr, (unsigned char *) start,
12771 num_bytes);
12772
12773 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12774 {
12775 warn (_("section '%s' has unsupported compress type: %d\n"),
12776 printable_section_name (section), chdr.ch_type);
12777 return FALSE;
12778 }
12779 else if (chdr.ch_addralign != section->sh_addralign)
12780 {
12781 warn (_("compressed section '%s' is corrupted\n"),
12782 printable_section_name (section));
12783 return FALSE;
12784 }
12785 uncompressed_size = chdr.ch_size;
12786 start += compression_header_size;
12787 new_size -= compression_header_size;
12788 }
12789 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12790 {
12791 /* Read the zlib header. In this case, it should be "ZLIB"
12792 followed by the uncompressed section size, 8 bytes in
12793 big-endian order. */
12794 uncompressed_size = start[4]; uncompressed_size <<= 8;
12795 uncompressed_size += start[5]; uncompressed_size <<= 8;
12796 uncompressed_size += start[6]; uncompressed_size <<= 8;
12797 uncompressed_size += start[7]; uncompressed_size <<= 8;
12798 uncompressed_size += start[8]; uncompressed_size <<= 8;
12799 uncompressed_size += start[9]; uncompressed_size <<= 8;
12800 uncompressed_size += start[10]; uncompressed_size <<= 8;
12801 uncompressed_size += start[11];
12802 start += 12;
12803 new_size -= 12;
12804 }
12805
12806 if (uncompressed_size)
12807 {
12808 if (uncompress_section_contents (& start,
12809 uncompressed_size, & new_size))
12810 num_bytes = new_size;
12811 else
12812 {
12813 error (_("Unable to decompress section %s\n"),
12814 printable_section_name (section));
12815 return FALSE;
12816 }
12817 }
12818 else
12819 start = real_start;
12820 }
12821
12822 /* If the section being dumped has relocations against it the user might
12823 be expecting these relocations to have been applied. Check for this
12824 case and issue a warning message in order to avoid confusion.
12825 FIXME: Maybe we ought to have an option that dumps a section with
12826 relocs applied ? */
12827 for (relsec = section_headers;
12828 relsec < section_headers + elf_header.e_shnum;
12829 ++relsec)
12830 {
12831 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12832 || relsec->sh_info >= elf_header.e_shnum
12833 || section_headers + relsec->sh_info != section
12834 || relsec->sh_size == 0
12835 || relsec->sh_link >= elf_header.e_shnum)
12836 continue;
12837
12838 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12839 break;
12840 }
12841
12842 data = start;
12843 end = start + num_bytes;
12844 some_strings_shown = FALSE;
12845
12846 while (data < end)
12847 {
12848 while (!ISPRINT (* data))
12849 if (++ data >= end)
12850 break;
12851
12852 if (data < end)
12853 {
12854 size_t maxlen = end - data;
12855
12856 #ifndef __MSVCRT__
12857 /* PR 11128: Use two separate invocations in order to work
12858 around bugs in the Solaris 8 implementation of printf. */
12859 printf (" [%6tx] ", data - start);
12860 #else
12861 printf (" [%6Ix] ", (size_t) (data - start));
12862 #endif
12863 if (maxlen > 0)
12864 {
12865 print_symbol ((int) maxlen, (const char *) data);
12866 putchar ('\n');
12867 data += strnlen ((const char *) data, maxlen);
12868 }
12869 else
12870 {
12871 printf (_("<corrupt>\n"));
12872 data = end;
12873 }
12874 some_strings_shown = TRUE;
12875 }
12876 }
12877
12878 if (! some_strings_shown)
12879 printf (_(" No strings found in this section."));
12880
12881 free (real_start);
12882
12883 putchar ('\n');
12884 return TRUE;
12885 }
12886
12887 static bfd_boolean
12888 dump_section_as_bytes (Elf_Internal_Shdr * section,
12889 FILE * file,
12890 bfd_boolean relocate)
12891 {
12892 Elf_Internal_Shdr * relsec;
12893 bfd_size_type bytes;
12894 bfd_size_type section_size;
12895 bfd_vma addr;
12896 unsigned char * data;
12897 unsigned char * real_start;
12898 unsigned char * start;
12899
12900 real_start = start = (unsigned char *) get_section_contents (section, file);
12901 if (start == NULL)
12902 return FALSE;
12903
12904 section_size = section->sh_size;
12905
12906 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12907
12908 if (decompress_dumps)
12909 {
12910 dwarf_size_type new_size = section_size;
12911 dwarf_size_type uncompressed_size = 0;
12912
12913 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12914 {
12915 Elf_Internal_Chdr chdr;
12916 unsigned int compression_header_size
12917 = get_compression_header (& chdr, start, section_size);
12918
12919 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12920 {
12921 warn (_("section '%s' has unsupported compress type: %d\n"),
12922 printable_section_name (section), chdr.ch_type);
12923 return FALSE;
12924 }
12925 else if (chdr.ch_addralign != section->sh_addralign)
12926 {
12927 warn (_("compressed section '%s' is corrupted\n"),
12928 printable_section_name (section));
12929 return FALSE;
12930 }
12931 uncompressed_size = chdr.ch_size;
12932 start += compression_header_size;
12933 new_size -= compression_header_size;
12934 }
12935 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12936 {
12937 /* Read the zlib header. In this case, it should be "ZLIB"
12938 followed by the uncompressed section size, 8 bytes in
12939 big-endian order. */
12940 uncompressed_size = start[4]; uncompressed_size <<= 8;
12941 uncompressed_size += start[5]; uncompressed_size <<= 8;
12942 uncompressed_size += start[6]; uncompressed_size <<= 8;
12943 uncompressed_size += start[7]; uncompressed_size <<= 8;
12944 uncompressed_size += start[8]; uncompressed_size <<= 8;
12945 uncompressed_size += start[9]; uncompressed_size <<= 8;
12946 uncompressed_size += start[10]; uncompressed_size <<= 8;
12947 uncompressed_size += start[11];
12948 start += 12;
12949 new_size -= 12;
12950 }
12951
12952 if (uncompressed_size)
12953 {
12954 if (uncompress_section_contents (& start, uncompressed_size,
12955 & new_size))
12956 {
12957 section_size = new_size;
12958 }
12959 else
12960 {
12961 error (_("Unable to decompress section %s\n"),
12962 printable_section_name (section));
12963 /* FIXME: Print the section anyway ? */
12964 return FALSE;
12965 }
12966 }
12967 else
12968 start = real_start;
12969 }
12970
12971 if (relocate)
12972 {
12973 if (! apply_relocations (file, section, start, section_size, NULL, NULL))
12974 return FALSE;
12975 }
12976 else
12977 {
12978 /* If the section being dumped has relocations against it the user might
12979 be expecting these relocations to have been applied. Check for this
12980 case and issue a warning message in order to avoid confusion.
12981 FIXME: Maybe we ought to have an option that dumps a section with
12982 relocs applied ? */
12983 for (relsec = section_headers;
12984 relsec < section_headers + elf_header.e_shnum;
12985 ++relsec)
12986 {
12987 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12988 || relsec->sh_info >= elf_header.e_shnum
12989 || section_headers + relsec->sh_info != section
12990 || relsec->sh_size == 0
12991 || relsec->sh_link >= elf_header.e_shnum)
12992 continue;
12993
12994 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12995 break;
12996 }
12997 }
12998
12999 addr = section->sh_addr;
13000 bytes = section_size;
13001 data = start;
13002
13003 while (bytes)
13004 {
13005 int j;
13006 int k;
13007 int lbytes;
13008
13009 lbytes = (bytes > 16 ? 16 : bytes);
13010
13011 printf (" 0x%8.8lx ", (unsigned long) addr);
13012
13013 for (j = 0; j < 16; j++)
13014 {
13015 if (j < lbytes)
13016 printf ("%2.2x", data[j]);
13017 else
13018 printf (" ");
13019
13020 if ((j & 3) == 3)
13021 printf (" ");
13022 }
13023
13024 for (j = 0; j < lbytes; j++)
13025 {
13026 k = data[j];
13027 if (k >= ' ' && k < 0x7f)
13028 printf ("%c", k);
13029 else
13030 printf (".");
13031 }
13032
13033 putchar ('\n');
13034
13035 data += lbytes;
13036 addr += lbytes;
13037 bytes -= lbytes;
13038 }
13039
13040 free (real_start);
13041
13042 putchar ('\n');
13043 return TRUE;
13044 }
13045
13046 static bfd_boolean
13047 load_specific_debug_section (enum dwarf_section_display_enum debug,
13048 const Elf_Internal_Shdr * sec, void * file)
13049 {
13050 struct dwarf_section * section = &debug_displays [debug].section;
13051 char buf [64];
13052
13053 /* If it is already loaded, do nothing. */
13054 if (section->start != NULL)
13055 return TRUE;
13056
13057 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13058 section->address = sec->sh_addr;
13059 section->user_data = NULL;
13060 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
13061 sec->sh_offset, 1,
13062 sec->sh_size, buf);
13063 if (section->start == NULL)
13064 section->size = 0;
13065 else
13066 {
13067 unsigned char *start = section->start;
13068 dwarf_size_type size = sec->sh_size;
13069 dwarf_size_type uncompressed_size = 0;
13070
13071 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13072 {
13073 Elf_Internal_Chdr chdr;
13074 unsigned int compression_header_size;
13075
13076 if (size < (is_32bit_elf
13077 ? sizeof (Elf32_External_Chdr)
13078 : sizeof (Elf64_External_Chdr)))
13079 {
13080 warn (_("compressed section %s is too small to contain a compression header"),
13081 section->name);
13082 return FALSE;
13083 }
13084
13085 compression_header_size = get_compression_header (&chdr, start, size);
13086
13087 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13088 {
13089 warn (_("section '%s' has unsupported compress type: %d\n"),
13090 section->name, chdr.ch_type);
13091 return FALSE;
13092 }
13093 else if (chdr.ch_addralign != sec->sh_addralign)
13094 {
13095 warn (_("compressed section '%s' is corrupted\n"),
13096 section->name);
13097 return FALSE;
13098 }
13099 uncompressed_size = chdr.ch_size;
13100 start += compression_header_size;
13101 size -= compression_header_size;
13102 }
13103 else if (size > 12 && streq ((char *) start, "ZLIB"))
13104 {
13105 /* Read the zlib header. In this case, it should be "ZLIB"
13106 followed by the uncompressed section size, 8 bytes in
13107 big-endian order. */
13108 uncompressed_size = start[4]; uncompressed_size <<= 8;
13109 uncompressed_size += start[5]; uncompressed_size <<= 8;
13110 uncompressed_size += start[6]; uncompressed_size <<= 8;
13111 uncompressed_size += start[7]; uncompressed_size <<= 8;
13112 uncompressed_size += start[8]; uncompressed_size <<= 8;
13113 uncompressed_size += start[9]; uncompressed_size <<= 8;
13114 uncompressed_size += start[10]; uncompressed_size <<= 8;
13115 uncompressed_size += start[11];
13116 start += 12;
13117 size -= 12;
13118 }
13119
13120 if (uncompressed_size)
13121 {
13122 if (uncompress_section_contents (&start, uncompressed_size,
13123 &size))
13124 {
13125 /* Free the compressed buffer, update the section buffer
13126 and the section size if uncompress is successful. */
13127 free (section->start);
13128 section->start = start;
13129 }
13130 else
13131 {
13132 error (_("Unable to decompress section %s\n"),
13133 printable_section_name (sec));
13134 return FALSE;
13135 }
13136 }
13137
13138 section->size = size;
13139 }
13140
13141 if (section->start == NULL)
13142 return FALSE;
13143
13144 if (debug_displays [debug].relocate)
13145 {
13146 if (! apply_relocations ((FILE *) file, sec, section->start, section->size,
13147 & section->reloc_info, & section->num_relocs))
13148 return FALSE;
13149 }
13150 else
13151 {
13152 section->reloc_info = NULL;
13153 section->num_relocs = 0;
13154 }
13155
13156 return TRUE;
13157 }
13158
13159 /* If this is not NULL, load_debug_section will only look for sections
13160 within the list of sections given here. */
13161 static unsigned int * section_subset = NULL;
13162
13163 bfd_boolean
13164 load_debug_section (enum dwarf_section_display_enum debug, void * file)
13165 {
13166 struct dwarf_section * section = &debug_displays [debug].section;
13167 Elf_Internal_Shdr * sec;
13168
13169 /* Locate the debug section. */
13170 sec = find_section_in_set (section->uncompressed_name, section_subset);
13171 if (sec != NULL)
13172 section->name = section->uncompressed_name;
13173 else
13174 {
13175 sec = find_section_in_set (section->compressed_name, section_subset);
13176 if (sec != NULL)
13177 section->name = section->compressed_name;
13178 }
13179 if (sec == NULL)
13180 return FALSE;
13181
13182 /* If we're loading from a subset of sections, and we've loaded
13183 a section matching this name before, it's likely that it's a
13184 different one. */
13185 if (section_subset != NULL)
13186 free_debug_section (debug);
13187
13188 return load_specific_debug_section (debug, sec, (FILE *) file);
13189 }
13190
13191 void
13192 free_debug_section (enum dwarf_section_display_enum debug)
13193 {
13194 struct dwarf_section * section = &debug_displays [debug].section;
13195
13196 if (section->start == NULL)
13197 return;
13198
13199 free ((char *) section->start);
13200 section->start = NULL;
13201 section->address = 0;
13202 section->size = 0;
13203 }
13204
13205 static bfd_boolean
13206 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
13207 {
13208 char * name = SECTION_NAME (section);
13209 const char * print_name = printable_section_name (section);
13210 bfd_size_type length;
13211 bfd_boolean result = TRUE;
13212 int i;
13213
13214 length = section->sh_size;
13215 if (length == 0)
13216 {
13217 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13218 return TRUE;
13219 }
13220 if (section->sh_type == SHT_NOBITS)
13221 {
13222 /* There is no point in dumping the contents of a debugging section
13223 which has the NOBITS type - the bits in the file will be random.
13224 This can happen when a file containing a .eh_frame section is
13225 stripped with the --only-keep-debug command line option. */
13226 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13227 print_name);
13228 return FALSE;
13229 }
13230
13231 if (const_strneq (name, ".gnu.linkonce.wi."))
13232 name = ".debug_info";
13233
13234 /* See if we know how to display the contents of this section. */
13235 for (i = 0; i < max; i++)
13236 if (streq (debug_displays[i].section.uncompressed_name, name)
13237 || (i == line && const_strneq (name, ".debug_line."))
13238 || streq (debug_displays[i].section.compressed_name, name))
13239 {
13240 struct dwarf_section * sec = &debug_displays [i].section;
13241 int secondary = (section != find_section (name));
13242
13243 if (secondary)
13244 free_debug_section ((enum dwarf_section_display_enum) i);
13245
13246 if (i == line && const_strneq (name, ".debug_line."))
13247 sec->name = name;
13248 else if (streq (sec->uncompressed_name, name))
13249 sec->name = sec->uncompressed_name;
13250 else
13251 sec->name = sec->compressed_name;
13252 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
13253 section, file))
13254 {
13255 /* If this debug section is part of a CU/TU set in a .dwp file,
13256 restrict load_debug_section to the sections in that set. */
13257 section_subset = find_cu_tu_set (file, shndx);
13258
13259 result &= debug_displays[i].display (sec, file);
13260
13261 section_subset = NULL;
13262
13263 if (secondary || (i != info && i != abbrev))
13264 free_debug_section ((enum dwarf_section_display_enum) i);
13265 }
13266
13267 break;
13268 }
13269
13270 if (i == max)
13271 {
13272 printf (_("Unrecognized debug section: %s\n"), print_name);
13273 result = FALSE;
13274 }
13275
13276 return result;
13277 }
13278
13279 /* Set DUMP_SECTS for all sections where dumps were requested
13280 based on section name. */
13281
13282 static void
13283 initialise_dumps_byname (void)
13284 {
13285 struct dump_list_entry * cur;
13286
13287 for (cur = dump_sects_byname; cur; cur = cur->next)
13288 {
13289 unsigned int i;
13290 bfd_boolean any = FALSE;
13291
13292 for (i = 0; i < elf_header.e_shnum; i++)
13293 if (streq (SECTION_NAME (section_headers + i), cur->name))
13294 {
13295 request_dump_bynumber (i, cur->type);
13296 any = TRUE;
13297 }
13298
13299 if (!any)
13300 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13301 cur->name);
13302 }
13303 }
13304
13305 static bfd_boolean
13306 process_section_contents (FILE * file)
13307 {
13308 Elf_Internal_Shdr * section;
13309 unsigned int i;
13310 bfd_boolean res = TRUE;
13311
13312 if (! do_dump)
13313 return TRUE;
13314
13315 initialise_dumps_byname ();
13316
13317 for (i = 0, section = section_headers;
13318 i < elf_header.e_shnum && i < num_dump_sects;
13319 i++, section++)
13320 {
13321 #ifdef SUPPORT_DISASSEMBLY
13322 if (dump_sects[i] & DISASS_DUMP)
13323 disassemble_section (section, file);
13324 #endif
13325 if (dump_sects[i] & HEX_DUMP)
13326 {
13327 if (! dump_section_as_bytes (section, file, FALSE))
13328 res = FALSE;
13329 }
13330
13331 if (dump_sects[i] & RELOC_DUMP)
13332 {
13333 if (! dump_section_as_bytes (section, file, TRUE))
13334 res = FALSE;
13335 }
13336
13337 if (dump_sects[i] & STRING_DUMP)
13338 {
13339 if (! dump_section_as_strings (section, file))
13340 res = FALSE;
13341 }
13342
13343 if (dump_sects[i] & DEBUG_DUMP)
13344 {
13345 if (! display_debug_section (i, section, file))
13346 res = FALSE;
13347 }
13348 }
13349
13350 /* Check to see if the user requested a
13351 dump of a section that does not exist. */
13352 while (i < num_dump_sects)
13353 {
13354 if (dump_sects[i])
13355 {
13356 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13357 res = FALSE;
13358 }
13359 i++;
13360 }
13361
13362 return res;
13363 }
13364
13365 static void
13366 process_mips_fpe_exception (int mask)
13367 {
13368 if (mask)
13369 {
13370 bfd_boolean first = TRUE;
13371
13372 if (mask & OEX_FPU_INEX)
13373 fputs ("INEX", stdout), first = FALSE;
13374 if (mask & OEX_FPU_UFLO)
13375 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13376 if (mask & OEX_FPU_OFLO)
13377 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13378 if (mask & OEX_FPU_DIV0)
13379 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13380 if (mask & OEX_FPU_INVAL)
13381 printf ("%sINVAL", first ? "" : "|");
13382 }
13383 else
13384 fputs ("0", stdout);
13385 }
13386
13387 /* Display's the value of TAG at location P. If TAG is
13388 greater than 0 it is assumed to be an unknown tag, and
13389 a message is printed to this effect. Otherwise it is
13390 assumed that a message has already been printed.
13391
13392 If the bottom bit of TAG is set it assumed to have a
13393 string value, otherwise it is assumed to have an integer
13394 value.
13395
13396 Returns an updated P pointing to the first unread byte
13397 beyond the end of TAG's value.
13398
13399 Reads at or beyond END will not be made. */
13400
13401 static unsigned char *
13402 display_tag_value (signed int tag,
13403 unsigned char * p,
13404 const unsigned char * const end)
13405 {
13406 unsigned long val;
13407
13408 if (tag > 0)
13409 printf (" Tag_unknown_%d: ", tag);
13410
13411 if (p >= end)
13412 {
13413 warn (_("<corrupt tag>\n"));
13414 }
13415 else if (tag & 1)
13416 {
13417 /* PR 17531 file: 027-19978-0.004. */
13418 size_t maxlen = (end - p) - 1;
13419
13420 putchar ('"');
13421 if (maxlen > 0)
13422 {
13423 print_symbol ((int) maxlen, (const char *) p);
13424 p += strnlen ((char *) p, maxlen) + 1;
13425 }
13426 else
13427 {
13428 printf (_("<corrupt string tag>"));
13429 p = (unsigned char *) end;
13430 }
13431 printf ("\"\n");
13432 }
13433 else
13434 {
13435 unsigned int len;
13436
13437 val = read_uleb128 (p, &len, end);
13438 p += len;
13439 printf ("%ld (0x%lx)\n", val, val);
13440 }
13441
13442 assert (p <= end);
13443 return p;
13444 }
13445
13446 /* ARM EABI attributes section. */
13447 typedef struct
13448 {
13449 unsigned int tag;
13450 const char * name;
13451 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13452 unsigned int type;
13453 const char ** table;
13454 } arm_attr_public_tag;
13455
13456 static const char * arm_attr_tag_CPU_arch[] =
13457 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13458 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13459 "v8-M.mainline"};
13460 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13461 static const char * arm_attr_tag_THUMB_ISA_use[] =
13462 {"No", "Thumb-1", "Thumb-2", "Yes"};
13463 static const char * arm_attr_tag_FP_arch[] =
13464 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13465 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13466 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13467 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13468 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13469 "NEON for ARMv8.1"};
13470 static const char * arm_attr_tag_PCS_config[] =
13471 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13472 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13473 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13474 {"V6", "SB", "TLS", "Unused"};
13475 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13476 {"Absolute", "PC-relative", "SB-relative", "None"};
13477 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13478 {"Absolute", "PC-relative", "None"};
13479 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13480 {"None", "direct", "GOT-indirect"};
13481 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13482 {"None", "??? 1", "2", "??? 3", "4"};
13483 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13484 static const char * arm_attr_tag_ABI_FP_denormal[] =
13485 {"Unused", "Needed", "Sign only"};
13486 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13487 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13488 static const char * arm_attr_tag_ABI_FP_number_model[] =
13489 {"Unused", "Finite", "RTABI", "IEEE 754"};
13490 static const char * arm_attr_tag_ABI_enum_size[] =
13491 {"Unused", "small", "int", "forced to int"};
13492 static const char * arm_attr_tag_ABI_HardFP_use[] =
13493 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13494 static const char * arm_attr_tag_ABI_VFP_args[] =
13495 {"AAPCS", "VFP registers", "custom", "compatible"};
13496 static const char * arm_attr_tag_ABI_WMMX_args[] =
13497 {"AAPCS", "WMMX registers", "custom"};
13498 static const char * arm_attr_tag_ABI_optimization_goals[] =
13499 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13500 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13501 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13502 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13503 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13504 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13505 static const char * arm_attr_tag_FP_HP_extension[] =
13506 {"Not Allowed", "Allowed"};
13507 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13508 {"None", "IEEE 754", "Alternative Format"};
13509 static const char * arm_attr_tag_DSP_extension[] =
13510 {"Follow architecture", "Allowed"};
13511 static const char * arm_attr_tag_MPextension_use[] =
13512 {"Not Allowed", "Allowed"};
13513 static const char * arm_attr_tag_DIV_use[] =
13514 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13515 "Allowed in v7-A with integer division extension"};
13516 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13517 static const char * arm_attr_tag_Virtualization_use[] =
13518 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13519 "TrustZone and Virtualization Extensions"};
13520 static const char * arm_attr_tag_MPextension_use_legacy[] =
13521 {"Not Allowed", "Allowed"};
13522
13523 #define LOOKUP(id, name) \
13524 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13525 static arm_attr_public_tag arm_attr_public_tags[] =
13526 {
13527 {4, "CPU_raw_name", 1, NULL},
13528 {5, "CPU_name", 1, NULL},
13529 LOOKUP(6, CPU_arch),
13530 {7, "CPU_arch_profile", 0, NULL},
13531 LOOKUP(8, ARM_ISA_use),
13532 LOOKUP(9, THUMB_ISA_use),
13533 LOOKUP(10, FP_arch),
13534 LOOKUP(11, WMMX_arch),
13535 LOOKUP(12, Advanced_SIMD_arch),
13536 LOOKUP(13, PCS_config),
13537 LOOKUP(14, ABI_PCS_R9_use),
13538 LOOKUP(15, ABI_PCS_RW_data),
13539 LOOKUP(16, ABI_PCS_RO_data),
13540 LOOKUP(17, ABI_PCS_GOT_use),
13541 LOOKUP(18, ABI_PCS_wchar_t),
13542 LOOKUP(19, ABI_FP_rounding),
13543 LOOKUP(20, ABI_FP_denormal),
13544 LOOKUP(21, ABI_FP_exceptions),
13545 LOOKUP(22, ABI_FP_user_exceptions),
13546 LOOKUP(23, ABI_FP_number_model),
13547 {24, "ABI_align_needed", 0, NULL},
13548 {25, "ABI_align_preserved", 0, NULL},
13549 LOOKUP(26, ABI_enum_size),
13550 LOOKUP(27, ABI_HardFP_use),
13551 LOOKUP(28, ABI_VFP_args),
13552 LOOKUP(29, ABI_WMMX_args),
13553 LOOKUP(30, ABI_optimization_goals),
13554 LOOKUP(31, ABI_FP_optimization_goals),
13555 {32, "compatibility", 0, NULL},
13556 LOOKUP(34, CPU_unaligned_access),
13557 LOOKUP(36, FP_HP_extension),
13558 LOOKUP(38, ABI_FP_16bit_format),
13559 LOOKUP(42, MPextension_use),
13560 LOOKUP(44, DIV_use),
13561 LOOKUP(46, DSP_extension),
13562 {64, "nodefaults", 0, NULL},
13563 {65, "also_compatible_with", 0, NULL},
13564 LOOKUP(66, T2EE_use),
13565 {67, "conformance", 1, NULL},
13566 LOOKUP(68, Virtualization_use),
13567 LOOKUP(70, MPextension_use_legacy)
13568 };
13569 #undef LOOKUP
13570
13571 static unsigned char *
13572 display_arm_attribute (unsigned char * p,
13573 const unsigned char * const end)
13574 {
13575 unsigned int tag;
13576 unsigned int len;
13577 unsigned int val;
13578 arm_attr_public_tag * attr;
13579 unsigned i;
13580 unsigned int type;
13581
13582 tag = read_uleb128 (p, &len, end);
13583 p += len;
13584 attr = NULL;
13585 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13586 {
13587 if (arm_attr_public_tags[i].tag == tag)
13588 {
13589 attr = &arm_attr_public_tags[i];
13590 break;
13591 }
13592 }
13593
13594 if (attr)
13595 {
13596 printf (" Tag_%s: ", attr->name);
13597 switch (attr->type)
13598 {
13599 case 0:
13600 switch (tag)
13601 {
13602 case 7: /* Tag_CPU_arch_profile. */
13603 val = read_uleb128 (p, &len, end);
13604 p += len;
13605 switch (val)
13606 {
13607 case 0: printf (_("None\n")); break;
13608 case 'A': printf (_("Application\n")); break;
13609 case 'R': printf (_("Realtime\n")); break;
13610 case 'M': printf (_("Microcontroller\n")); break;
13611 case 'S': printf (_("Application or Realtime\n")); break;
13612 default: printf ("??? (%d)\n", val); break;
13613 }
13614 break;
13615
13616 case 24: /* Tag_align_needed. */
13617 val = read_uleb128 (p, &len, end);
13618 p += len;
13619 switch (val)
13620 {
13621 case 0: printf (_("None\n")); break;
13622 case 1: printf (_("8-byte\n")); break;
13623 case 2: printf (_("4-byte\n")); break;
13624 case 3: printf ("??? 3\n"); break;
13625 default:
13626 if (val <= 12)
13627 printf (_("8-byte and up to %d-byte extended\n"),
13628 1 << val);
13629 else
13630 printf ("??? (%d)\n", val);
13631 break;
13632 }
13633 break;
13634
13635 case 25: /* Tag_align_preserved. */
13636 val = read_uleb128 (p, &len, end);
13637 p += len;
13638 switch (val)
13639 {
13640 case 0: printf (_("None\n")); break;
13641 case 1: printf (_("8-byte, except leaf SP\n")); break;
13642 case 2: printf (_("8-byte\n")); break;
13643 case 3: printf ("??? 3\n"); break;
13644 default:
13645 if (val <= 12)
13646 printf (_("8-byte and up to %d-byte extended\n"),
13647 1 << val);
13648 else
13649 printf ("??? (%d)\n", val);
13650 break;
13651 }
13652 break;
13653
13654 case 32: /* Tag_compatibility. */
13655 {
13656 val = read_uleb128 (p, &len, end);
13657 p += len;
13658 printf (_("flag = %d, vendor = "), val);
13659 if (p < end - 1)
13660 {
13661 size_t maxlen = (end - p) - 1;
13662
13663 print_symbol ((int) maxlen, (const char *) p);
13664 p += strnlen ((char *) p, maxlen) + 1;
13665 }
13666 else
13667 {
13668 printf (_("<corrupt>"));
13669 p = (unsigned char *) end;
13670 }
13671 putchar ('\n');
13672 }
13673 break;
13674
13675 case 64: /* Tag_nodefaults. */
13676 /* PR 17531: file: 001-505008-0.01. */
13677 if (p < end)
13678 p++;
13679 printf (_("True\n"));
13680 break;
13681
13682 case 65: /* Tag_also_compatible_with. */
13683 val = read_uleb128 (p, &len, end);
13684 p += len;
13685 if (val == 6 /* Tag_CPU_arch. */)
13686 {
13687 val = read_uleb128 (p, &len, end);
13688 p += len;
13689 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13690 printf ("??? (%d)\n", val);
13691 else
13692 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13693 }
13694 else
13695 printf ("???\n");
13696 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13697 ;
13698 break;
13699
13700 default:
13701 printf (_("<unknown: %d>\n"), tag);
13702 break;
13703 }
13704 return p;
13705
13706 case 1:
13707 return display_tag_value (-1, p, end);
13708 case 2:
13709 return display_tag_value (0, p, end);
13710
13711 default:
13712 assert (attr->type & 0x80);
13713 val = read_uleb128 (p, &len, end);
13714 p += len;
13715 type = attr->type & 0x7f;
13716 if (val >= type)
13717 printf ("??? (%d)\n", val);
13718 else
13719 printf ("%s\n", attr->table[val]);
13720 return p;
13721 }
13722 }
13723
13724 return display_tag_value (tag, p, end);
13725 }
13726
13727 static unsigned char *
13728 display_gnu_attribute (unsigned char * p,
13729 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
13730 const unsigned char * const end)
13731 {
13732 int tag;
13733 unsigned int len;
13734 unsigned int val;
13735
13736 tag = read_uleb128 (p, &len, end);
13737 p += len;
13738
13739 /* Tag_compatibility is the only generic GNU attribute defined at
13740 present. */
13741 if (tag == 32)
13742 {
13743 val = read_uleb128 (p, &len, end);
13744 p += len;
13745
13746 printf (_("flag = %d, vendor = "), val);
13747 if (p == end)
13748 {
13749 printf (_("<corrupt>\n"));
13750 warn (_("corrupt vendor attribute\n"));
13751 }
13752 else
13753 {
13754 if (p < end - 1)
13755 {
13756 size_t maxlen = (end - p) - 1;
13757
13758 print_symbol ((int) maxlen, (const char *) p);
13759 p += strnlen ((char *) p, maxlen) + 1;
13760 }
13761 else
13762 {
13763 printf (_("<corrupt>"));
13764 p = (unsigned char *) end;
13765 }
13766 putchar ('\n');
13767 }
13768 return p;
13769 }
13770
13771 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13772 return display_proc_gnu_attribute (p, tag, end);
13773
13774 return display_tag_value (tag, p, end);
13775 }
13776
13777 static unsigned char *
13778 display_power_gnu_attribute (unsigned char * p,
13779 unsigned int tag,
13780 const unsigned char * const end)
13781 {
13782 unsigned int len;
13783 unsigned int val;
13784
13785 if (tag == Tag_GNU_Power_ABI_FP)
13786 {
13787 val = read_uleb128 (p, &len, end);
13788 p += len;
13789 printf (" Tag_GNU_Power_ABI_FP: ");
13790 if (len == 0)
13791 {
13792 printf (_("<corrupt>\n"));
13793 return p;
13794 }
13795
13796 if (val > 15)
13797 printf ("(%#x), ", val);
13798
13799 switch (val & 3)
13800 {
13801 case 0:
13802 printf (_("unspecified hard/soft float, "));
13803 break;
13804 case 1:
13805 printf (_("hard float, "));
13806 break;
13807 case 2:
13808 printf (_("soft float, "));
13809 break;
13810 case 3:
13811 printf (_("single-precision hard float, "));
13812 break;
13813 }
13814
13815 switch (val & 0xC)
13816 {
13817 case 0:
13818 printf (_("unspecified long double\n"));
13819 break;
13820 case 4:
13821 printf (_("128-bit IBM long double\n"));
13822 break;
13823 case 8:
13824 printf (_("64-bit long double\n"));
13825 break;
13826 case 12:
13827 printf (_("128-bit IEEE long double\n"));
13828 break;
13829 }
13830 return p;
13831 }
13832
13833 if (tag == Tag_GNU_Power_ABI_Vector)
13834 {
13835 val = read_uleb128 (p, &len, end);
13836 p += len;
13837 printf (" Tag_GNU_Power_ABI_Vector: ");
13838 if (len == 0)
13839 {
13840 printf (_("<corrupt>\n"));
13841 return p;
13842 }
13843
13844 if (val > 3)
13845 printf ("(%#x), ", val);
13846
13847 switch (val & 3)
13848 {
13849 case 0:
13850 printf (_("unspecified\n"));
13851 break;
13852 case 1:
13853 printf (_("generic\n"));
13854 break;
13855 case 2:
13856 printf ("AltiVec\n");
13857 break;
13858 case 3:
13859 printf ("SPE\n");
13860 break;
13861 }
13862 return p;
13863 }
13864
13865 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13866 {
13867 val = read_uleb128 (p, &len, end);
13868 p += len;
13869 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13870 if (len == 0)
13871 {
13872 printf (_("<corrupt>\n"));
13873 return p;
13874 }
13875
13876 if (val > 2)
13877 printf ("(%#x), ", val);
13878
13879 switch (val & 3)
13880 {
13881 case 0:
13882 printf (_("unspecified\n"));
13883 break;
13884 case 1:
13885 printf ("r3/r4\n");
13886 break;
13887 case 2:
13888 printf (_("memory\n"));
13889 break;
13890 case 3:
13891 printf ("???\n");
13892 break;
13893 }
13894 return p;
13895 }
13896
13897 return display_tag_value (tag & 1, p, end);
13898 }
13899
13900 static unsigned char *
13901 display_s390_gnu_attribute (unsigned char * p,
13902 unsigned int tag,
13903 const unsigned char * const end)
13904 {
13905 unsigned int len;
13906 int val;
13907
13908 if (tag == Tag_GNU_S390_ABI_Vector)
13909 {
13910 val = read_uleb128 (p, &len, end);
13911 p += len;
13912 printf (" Tag_GNU_S390_ABI_Vector: ");
13913
13914 switch (val)
13915 {
13916 case 0:
13917 printf (_("any\n"));
13918 break;
13919 case 1:
13920 printf (_("software\n"));
13921 break;
13922 case 2:
13923 printf (_("hardware\n"));
13924 break;
13925 default:
13926 printf ("??? (%d)\n", val);
13927 break;
13928 }
13929 return p;
13930 }
13931
13932 return display_tag_value (tag & 1, p, end);
13933 }
13934
13935 static void
13936 display_sparc_hwcaps (unsigned int mask)
13937 {
13938 if (mask)
13939 {
13940 bfd_boolean first = TRUE;
13941
13942 if (mask & ELF_SPARC_HWCAP_MUL32)
13943 fputs ("mul32", stdout), first = FALSE;
13944 if (mask & ELF_SPARC_HWCAP_DIV32)
13945 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
13946 if (mask & ELF_SPARC_HWCAP_FSMULD)
13947 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
13948 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13949 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
13950 if (mask & ELF_SPARC_HWCAP_POPC)
13951 printf ("%spopc", first ? "" : "|"), first = FALSE;
13952 if (mask & ELF_SPARC_HWCAP_VIS)
13953 printf ("%svis", first ? "" : "|"), first = FALSE;
13954 if (mask & ELF_SPARC_HWCAP_VIS2)
13955 printf ("%svis2", first ? "" : "|"), first = FALSE;
13956 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13957 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
13958 if (mask & ELF_SPARC_HWCAP_FMAF)
13959 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
13960 if (mask & ELF_SPARC_HWCAP_VIS3)
13961 printf ("%svis3", first ? "" : "|"), first = FALSE;
13962 if (mask & ELF_SPARC_HWCAP_HPC)
13963 printf ("%shpc", first ? "" : "|"), first = FALSE;
13964 if (mask & ELF_SPARC_HWCAP_RANDOM)
13965 printf ("%srandom", first ? "" : "|"), first = FALSE;
13966 if (mask & ELF_SPARC_HWCAP_TRANS)
13967 printf ("%strans", first ? "" : "|"), first = FALSE;
13968 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13969 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
13970 if (mask & ELF_SPARC_HWCAP_IMA)
13971 printf ("%sima", first ? "" : "|"), first = FALSE;
13972 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13973 printf ("%scspare", first ? "" : "|"), first = FALSE;
13974 }
13975 else
13976 fputc ('0', stdout);
13977 fputc ('\n', stdout);
13978 }
13979
13980 static void
13981 display_sparc_hwcaps2 (unsigned int mask)
13982 {
13983 if (mask)
13984 {
13985 bfd_boolean first = TRUE;
13986
13987 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13988 fputs ("fjathplus", stdout), first = FALSE;
13989 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13990 printf ("%svis3b", first ? "" : "|"), first = FALSE;
13991 if (mask & ELF_SPARC_HWCAP2_ADP)
13992 printf ("%sadp", first ? "" : "|"), first = FALSE;
13993 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13994 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
13995 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13996 printf ("%smwait", first ? "" : "|"), first = FALSE;
13997 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13998 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
13999 if (mask & ELF_SPARC_HWCAP2_XMONT)
14000 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14001 if (mask & ELF_SPARC_HWCAP2_NSEC)
14002 printf ("%snsec", first ? "" : "|"), first = FALSE;
14003 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14004 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14005 if (mask & ELF_SPARC_HWCAP2_FJDES)
14006 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14007 if (mask & ELF_SPARC_HWCAP2_FJAES)
14008 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14009 }
14010 else
14011 fputc ('0', stdout);
14012 fputc ('\n', stdout);
14013 }
14014
14015 static unsigned char *
14016 display_sparc_gnu_attribute (unsigned char * p,
14017 unsigned int tag,
14018 const unsigned char * const end)
14019 {
14020 unsigned int len;
14021 int val;
14022
14023 if (tag == Tag_GNU_Sparc_HWCAPS)
14024 {
14025 val = read_uleb128 (p, &len, end);
14026 p += len;
14027 printf (" Tag_GNU_Sparc_HWCAPS: ");
14028 display_sparc_hwcaps (val);
14029 return p;
14030 }
14031 if (tag == Tag_GNU_Sparc_HWCAPS2)
14032 {
14033 val = read_uleb128 (p, &len, end);
14034 p += len;
14035 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14036 display_sparc_hwcaps2 (val);
14037 return p;
14038 }
14039
14040 return display_tag_value (tag, p, end);
14041 }
14042
14043 static void
14044 print_mips_fp_abi_value (unsigned int val)
14045 {
14046 switch (val)
14047 {
14048 case Val_GNU_MIPS_ABI_FP_ANY:
14049 printf (_("Hard or soft float\n"));
14050 break;
14051 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14052 printf (_("Hard float (double precision)\n"));
14053 break;
14054 case Val_GNU_MIPS_ABI_FP_SINGLE:
14055 printf (_("Hard float (single precision)\n"));
14056 break;
14057 case Val_GNU_MIPS_ABI_FP_SOFT:
14058 printf (_("Soft float\n"));
14059 break;
14060 case Val_GNU_MIPS_ABI_FP_OLD_64:
14061 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14062 break;
14063 case Val_GNU_MIPS_ABI_FP_XX:
14064 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14065 break;
14066 case Val_GNU_MIPS_ABI_FP_64:
14067 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14068 break;
14069 case Val_GNU_MIPS_ABI_FP_64A:
14070 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14071 break;
14072 case Val_GNU_MIPS_ABI_FP_NAN2008:
14073 printf (_("NaN 2008 compatibility\n"));
14074 break;
14075 default:
14076 printf ("??? (%d)\n", val);
14077 break;
14078 }
14079 }
14080
14081 static unsigned char *
14082 display_mips_gnu_attribute (unsigned char * p,
14083 unsigned int tag,
14084 const unsigned char * const end)
14085 {
14086 if (tag == Tag_GNU_MIPS_ABI_FP)
14087 {
14088 unsigned int len;
14089 unsigned int val;
14090
14091 val = read_uleb128 (p, &len, end);
14092 p += len;
14093 printf (" Tag_GNU_MIPS_ABI_FP: ");
14094
14095 print_mips_fp_abi_value (val);
14096
14097 return p;
14098 }
14099
14100 if (tag == Tag_GNU_MIPS_ABI_MSA)
14101 {
14102 unsigned int len;
14103 unsigned int val;
14104
14105 val = read_uleb128 (p, &len, end);
14106 p += len;
14107 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14108
14109 switch (val)
14110 {
14111 case Val_GNU_MIPS_ABI_MSA_ANY:
14112 printf (_("Any MSA or not\n"));
14113 break;
14114 case Val_GNU_MIPS_ABI_MSA_128:
14115 printf (_("128-bit MSA\n"));
14116 break;
14117 default:
14118 printf ("??? (%d)\n", val);
14119 break;
14120 }
14121 return p;
14122 }
14123
14124 return display_tag_value (tag & 1, p, end);
14125 }
14126
14127 static unsigned char *
14128 display_tic6x_attribute (unsigned char * p,
14129 const unsigned char * const end)
14130 {
14131 unsigned int tag;
14132 unsigned int len;
14133 int val;
14134
14135 tag = read_uleb128 (p, &len, end);
14136 p += len;
14137
14138 switch (tag)
14139 {
14140 case Tag_ISA:
14141 val = read_uleb128 (p, &len, end);
14142 p += len;
14143 printf (" Tag_ISA: ");
14144
14145 switch (val)
14146 {
14147 case C6XABI_Tag_ISA_none:
14148 printf (_("None\n"));
14149 break;
14150 case C6XABI_Tag_ISA_C62X:
14151 printf ("C62x\n");
14152 break;
14153 case C6XABI_Tag_ISA_C67X:
14154 printf ("C67x\n");
14155 break;
14156 case C6XABI_Tag_ISA_C67XP:
14157 printf ("C67x+\n");
14158 break;
14159 case C6XABI_Tag_ISA_C64X:
14160 printf ("C64x\n");
14161 break;
14162 case C6XABI_Tag_ISA_C64XP:
14163 printf ("C64x+\n");
14164 break;
14165 case C6XABI_Tag_ISA_C674X:
14166 printf ("C674x\n");
14167 break;
14168 default:
14169 printf ("??? (%d)\n", val);
14170 break;
14171 }
14172 return p;
14173
14174 case Tag_ABI_wchar_t:
14175 val = read_uleb128 (p, &len, end);
14176 p += len;
14177 printf (" Tag_ABI_wchar_t: ");
14178 switch (val)
14179 {
14180 case 0:
14181 printf (_("Not used\n"));
14182 break;
14183 case 1:
14184 printf (_("2 bytes\n"));
14185 break;
14186 case 2:
14187 printf (_("4 bytes\n"));
14188 break;
14189 default:
14190 printf ("??? (%d)\n", val);
14191 break;
14192 }
14193 return p;
14194
14195 case Tag_ABI_stack_align_needed:
14196 val = read_uleb128 (p, &len, end);
14197 p += len;
14198 printf (" Tag_ABI_stack_align_needed: ");
14199 switch (val)
14200 {
14201 case 0:
14202 printf (_("8-byte\n"));
14203 break;
14204 case 1:
14205 printf (_("16-byte\n"));
14206 break;
14207 default:
14208 printf ("??? (%d)\n", val);
14209 break;
14210 }
14211 return p;
14212
14213 case Tag_ABI_stack_align_preserved:
14214 val = read_uleb128 (p, &len, end);
14215 p += len;
14216 printf (" Tag_ABI_stack_align_preserved: ");
14217 switch (val)
14218 {
14219 case 0:
14220 printf (_("8-byte\n"));
14221 break;
14222 case 1:
14223 printf (_("16-byte\n"));
14224 break;
14225 default:
14226 printf ("??? (%d)\n", val);
14227 break;
14228 }
14229 return p;
14230
14231 case Tag_ABI_DSBT:
14232 val = read_uleb128 (p, &len, end);
14233 p += len;
14234 printf (" Tag_ABI_DSBT: ");
14235 switch (val)
14236 {
14237 case 0:
14238 printf (_("DSBT addressing not used\n"));
14239 break;
14240 case 1:
14241 printf (_("DSBT addressing used\n"));
14242 break;
14243 default:
14244 printf ("??? (%d)\n", val);
14245 break;
14246 }
14247 return p;
14248
14249 case Tag_ABI_PID:
14250 val = read_uleb128 (p, &len, end);
14251 p += len;
14252 printf (" Tag_ABI_PID: ");
14253 switch (val)
14254 {
14255 case 0:
14256 printf (_("Data addressing position-dependent\n"));
14257 break;
14258 case 1:
14259 printf (_("Data addressing position-independent, GOT near DP\n"));
14260 break;
14261 case 2:
14262 printf (_("Data addressing position-independent, GOT far from DP\n"));
14263 break;
14264 default:
14265 printf ("??? (%d)\n", val);
14266 break;
14267 }
14268 return p;
14269
14270 case Tag_ABI_PIC:
14271 val = read_uleb128 (p, &len, end);
14272 p += len;
14273 printf (" Tag_ABI_PIC: ");
14274 switch (val)
14275 {
14276 case 0:
14277 printf (_("Code addressing position-dependent\n"));
14278 break;
14279 case 1:
14280 printf (_("Code addressing position-independent\n"));
14281 break;
14282 default:
14283 printf ("??? (%d)\n", val);
14284 break;
14285 }
14286 return p;
14287
14288 case Tag_ABI_array_object_alignment:
14289 val = read_uleb128 (p, &len, end);
14290 p += len;
14291 printf (" Tag_ABI_array_object_alignment: ");
14292 switch (val)
14293 {
14294 case 0:
14295 printf (_("8-byte\n"));
14296 break;
14297 case 1:
14298 printf (_("4-byte\n"));
14299 break;
14300 case 2:
14301 printf (_("16-byte\n"));
14302 break;
14303 default:
14304 printf ("??? (%d)\n", val);
14305 break;
14306 }
14307 return p;
14308
14309 case Tag_ABI_array_object_align_expected:
14310 val = read_uleb128 (p, &len, end);
14311 p += len;
14312 printf (" Tag_ABI_array_object_align_expected: ");
14313 switch (val)
14314 {
14315 case 0:
14316 printf (_("8-byte\n"));
14317 break;
14318 case 1:
14319 printf (_("4-byte\n"));
14320 break;
14321 case 2:
14322 printf (_("16-byte\n"));
14323 break;
14324 default:
14325 printf ("??? (%d)\n", val);
14326 break;
14327 }
14328 return p;
14329
14330 case Tag_ABI_compatibility:
14331 {
14332 val = read_uleb128 (p, &len, end);
14333 p += len;
14334 printf (" Tag_ABI_compatibility: ");
14335 printf (_("flag = %d, vendor = "), val);
14336 if (p < end - 1)
14337 {
14338 size_t maxlen = (end - p) - 1;
14339
14340 print_symbol ((int) maxlen, (const char *) p);
14341 p += strnlen ((char *) p, maxlen) + 1;
14342 }
14343 else
14344 {
14345 printf (_("<corrupt>"));
14346 p = (unsigned char *) end;
14347 }
14348 putchar ('\n');
14349 return p;
14350 }
14351
14352 case Tag_ABI_conformance:
14353 {
14354 printf (" Tag_ABI_conformance: \"");
14355 if (p < end - 1)
14356 {
14357 size_t maxlen = (end - p) - 1;
14358
14359 print_symbol ((int) maxlen, (const char *) p);
14360 p += strnlen ((char *) p, maxlen) + 1;
14361 }
14362 else
14363 {
14364 printf (_("<corrupt>"));
14365 p = (unsigned char *) end;
14366 }
14367 printf ("\"\n");
14368 return p;
14369 }
14370 }
14371
14372 return display_tag_value (tag, p, end);
14373 }
14374
14375 static void
14376 display_raw_attribute (unsigned char * p, unsigned char const * const end)
14377 {
14378 unsigned long addr = 0;
14379 size_t bytes = end - p;
14380
14381 assert (end > p);
14382 while (bytes)
14383 {
14384 int j;
14385 int k;
14386 int lbytes = (bytes > 16 ? 16 : bytes);
14387
14388 printf (" 0x%8.8lx ", addr);
14389
14390 for (j = 0; j < 16; j++)
14391 {
14392 if (j < lbytes)
14393 printf ("%2.2x", p[j]);
14394 else
14395 printf (" ");
14396
14397 if ((j & 3) == 3)
14398 printf (" ");
14399 }
14400
14401 for (j = 0; j < lbytes; j++)
14402 {
14403 k = p[j];
14404 if (k >= ' ' && k < 0x7f)
14405 printf ("%c", k);
14406 else
14407 printf (".");
14408 }
14409
14410 putchar ('\n');
14411
14412 p += lbytes;
14413 bytes -= lbytes;
14414 addr += lbytes;
14415 }
14416
14417 putchar ('\n');
14418 }
14419
14420 static unsigned char *
14421 display_msp430x_attribute (unsigned char * p,
14422 const unsigned char * const end)
14423 {
14424 unsigned int len;
14425 unsigned int val;
14426 unsigned int tag;
14427
14428 tag = read_uleb128 (p, & len, end);
14429 p += len;
14430
14431 switch (tag)
14432 {
14433 case OFBA_MSPABI_Tag_ISA:
14434 val = read_uleb128 (p, &len, end);
14435 p += len;
14436 printf (" Tag_ISA: ");
14437 switch (val)
14438 {
14439 case 0: printf (_("None\n")); break;
14440 case 1: printf (_("MSP430\n")); break;
14441 case 2: printf (_("MSP430X\n")); break;
14442 default: printf ("??? (%d)\n", val); break;
14443 }
14444 break;
14445
14446 case OFBA_MSPABI_Tag_Code_Model:
14447 val = read_uleb128 (p, &len, end);
14448 p += len;
14449 printf (" Tag_Code_Model: ");
14450 switch (val)
14451 {
14452 case 0: printf (_("None\n")); break;
14453 case 1: printf (_("Small\n")); break;
14454 case 2: printf (_("Large\n")); break;
14455 default: printf ("??? (%d)\n", val); break;
14456 }
14457 break;
14458
14459 case OFBA_MSPABI_Tag_Data_Model:
14460 val = read_uleb128 (p, &len, end);
14461 p += len;
14462 printf (" Tag_Data_Model: ");
14463 switch (val)
14464 {
14465 case 0: printf (_("None\n")); break;
14466 case 1: printf (_("Small\n")); break;
14467 case 2: printf (_("Large\n")); break;
14468 case 3: printf (_("Restricted Large\n")); break;
14469 default: printf ("??? (%d)\n", val); break;
14470 }
14471 break;
14472
14473 default:
14474 printf (_(" <unknown tag %d>: "), tag);
14475
14476 if (tag & 1)
14477 {
14478 putchar ('"');
14479 if (p < end - 1)
14480 {
14481 size_t maxlen = (end - p) - 1;
14482
14483 print_symbol ((int) maxlen, (const char *) p);
14484 p += strnlen ((char *) p, maxlen) + 1;
14485 }
14486 else
14487 {
14488 printf (_("<corrupt>"));
14489 p = (unsigned char *) end;
14490 }
14491 printf ("\"\n");
14492 }
14493 else
14494 {
14495 val = read_uleb128 (p, &len, end);
14496 p += len;
14497 printf ("%d (0x%x)\n", val, val);
14498 }
14499 break;
14500 }
14501
14502 assert (p <= end);
14503 return p;
14504 }
14505
14506 static bfd_boolean
14507 process_attributes (FILE * file,
14508 const char * public_name,
14509 unsigned int proc_type,
14510 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14511 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
14512 {
14513 Elf_Internal_Shdr * sect;
14514 unsigned i;
14515 bfd_boolean res = TRUE;
14516
14517 /* Find the section header so that we get the size. */
14518 for (i = 0, sect = section_headers;
14519 i < elf_header.e_shnum;
14520 i++, sect++)
14521 {
14522 unsigned char * contents;
14523 unsigned char * p;
14524
14525 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14526 continue;
14527
14528 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14529 sect->sh_size, _("attributes"));
14530 if (contents == NULL)
14531 {
14532 res = FALSE;
14533 continue;
14534 }
14535
14536 p = contents;
14537 /* The first character is the version of the attributes.
14538 Currently only version 1, (aka 'A') is recognised here. */
14539 if (*p != 'A')
14540 {
14541 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
14542 res = FALSE;
14543 }
14544 else
14545 {
14546 bfd_vma section_len;
14547
14548 section_len = sect->sh_size - 1;
14549 p++;
14550
14551 while (section_len > 0)
14552 {
14553 bfd_vma attr_len;
14554 unsigned int namelen;
14555 bfd_boolean public_section;
14556 bfd_boolean gnu_section;
14557
14558 if (section_len <= 4)
14559 {
14560 error (_("Tag section ends prematurely\n"));
14561 res = FALSE;
14562 break;
14563 }
14564 attr_len = byte_get (p, 4);
14565 p += 4;
14566
14567 if (attr_len > section_len)
14568 {
14569 error (_("Bad attribute length (%u > %u)\n"),
14570 (unsigned) attr_len, (unsigned) section_len);
14571 attr_len = section_len;
14572 res = FALSE;
14573 }
14574 /* PR 17531: file: 001-101425-0.004 */
14575 else if (attr_len < 5)
14576 {
14577 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14578 res = FALSE;
14579 break;
14580 }
14581
14582 section_len -= attr_len;
14583 attr_len -= 4;
14584
14585 namelen = strnlen ((char *) p, attr_len) + 1;
14586 if (namelen == 0 || namelen >= attr_len)
14587 {
14588 error (_("Corrupt attribute section name\n"));
14589 res = FALSE;
14590 break;
14591 }
14592
14593 printf (_("Attribute Section: "));
14594 print_symbol (INT_MAX, (const char *) p);
14595 putchar ('\n');
14596
14597 if (public_name && streq ((char *) p, public_name))
14598 public_section = TRUE;
14599 else
14600 public_section = FALSE;
14601
14602 if (streq ((char *) p, "gnu"))
14603 gnu_section = TRUE;
14604 else
14605 gnu_section = FALSE;
14606
14607 p += namelen;
14608 attr_len -= namelen;
14609
14610 while (attr_len > 0 && p < contents + sect->sh_size)
14611 {
14612 int tag;
14613 int val;
14614 bfd_vma size;
14615 unsigned char * end;
14616
14617 /* PR binutils/17531: Safe handling of corrupt files. */
14618 if (attr_len < 6)
14619 {
14620 error (_("Unused bytes at end of section\n"));
14621 res = FALSE;
14622 section_len = 0;
14623 break;
14624 }
14625
14626 tag = *(p++);
14627 size = byte_get (p, 4);
14628 if (size > attr_len)
14629 {
14630 error (_("Bad subsection length (%u > %u)\n"),
14631 (unsigned) size, (unsigned) attr_len);
14632 res = FALSE;
14633 size = attr_len;
14634 }
14635 /* PR binutils/17531: Safe handling of corrupt files. */
14636 if (size < 6)
14637 {
14638 error (_("Bad subsection length (%u < 6)\n"),
14639 (unsigned) size);
14640 res = FALSE;
14641 section_len = 0;
14642 break;
14643 }
14644
14645 attr_len -= size;
14646 end = p + size - 1;
14647 assert (end <= contents + sect->sh_size);
14648 p += 4;
14649
14650 switch (tag)
14651 {
14652 case 1:
14653 printf (_("File Attributes\n"));
14654 break;
14655 case 2:
14656 printf (_("Section Attributes:"));
14657 goto do_numlist;
14658 case 3:
14659 printf (_("Symbol Attributes:"));
14660 /* Fall through. */
14661 do_numlist:
14662 for (;;)
14663 {
14664 unsigned int j;
14665
14666 val = read_uleb128 (p, &j, end);
14667 p += j;
14668 if (val == 0)
14669 break;
14670 printf (" %d", val);
14671 }
14672 printf ("\n");
14673 break;
14674 default:
14675 printf (_("Unknown tag: %d\n"), tag);
14676 public_section = FALSE;
14677 break;
14678 }
14679
14680 if (public_section && display_pub_attribute != NULL)
14681 {
14682 while (p < end)
14683 p = display_pub_attribute (p, end);
14684 assert (p == end);
14685 }
14686 else if (gnu_section && display_proc_gnu_attribute != NULL)
14687 {
14688 while (p < end)
14689 p = display_gnu_attribute (p,
14690 display_proc_gnu_attribute,
14691 end);
14692 assert (p == end);
14693 }
14694 else if (p < end)
14695 {
14696 printf (_(" Unknown attribute:\n"));
14697 display_raw_attribute (p, end);
14698 p = end;
14699 }
14700 else
14701 attr_len = 0;
14702 }
14703 }
14704 }
14705
14706 free (contents);
14707 }
14708
14709 return res;
14710 }
14711
14712 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14713 Print the Address, Access and Initial fields of an entry at VMA ADDR
14714 and return the VMA of the next entry, or -1 if there was a problem.
14715 Does not read from DATA_END or beyond. */
14716
14717 static bfd_vma
14718 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14719 unsigned char * data_end)
14720 {
14721 printf (" ");
14722 print_vma (addr, LONG_HEX);
14723 printf (" ");
14724 if (addr < pltgot + 0xfff0)
14725 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14726 else
14727 printf ("%10s", "");
14728 printf (" ");
14729 if (data == NULL)
14730 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14731 else
14732 {
14733 bfd_vma entry;
14734 unsigned char * from = data + addr - pltgot;
14735
14736 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14737 {
14738 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14739 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14740 return (bfd_vma) -1;
14741 }
14742 else
14743 {
14744 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14745 print_vma (entry, LONG_HEX);
14746 }
14747 }
14748 return addr + (is_32bit_elf ? 4 : 8);
14749 }
14750
14751 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14752 PLTGOT. Print the Address and Initial fields of an entry at VMA
14753 ADDR and return the VMA of the next entry. */
14754
14755 static bfd_vma
14756 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14757 {
14758 printf (" ");
14759 print_vma (addr, LONG_HEX);
14760 printf (" ");
14761 if (data == NULL)
14762 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14763 else
14764 {
14765 bfd_vma entry;
14766
14767 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14768 print_vma (entry, LONG_HEX);
14769 }
14770 return addr + (is_32bit_elf ? 4 : 8);
14771 }
14772
14773 static void
14774 print_mips_ases (unsigned int mask)
14775 {
14776 if (mask & AFL_ASE_DSP)
14777 fputs ("\n\tDSP ASE", stdout);
14778 if (mask & AFL_ASE_DSPR2)
14779 fputs ("\n\tDSP R2 ASE", stdout);
14780 if (mask & AFL_ASE_DSPR3)
14781 fputs ("\n\tDSP R3 ASE", stdout);
14782 if (mask & AFL_ASE_EVA)
14783 fputs ("\n\tEnhanced VA Scheme", stdout);
14784 if (mask & AFL_ASE_MCU)
14785 fputs ("\n\tMCU (MicroController) ASE", stdout);
14786 if (mask & AFL_ASE_MDMX)
14787 fputs ("\n\tMDMX ASE", stdout);
14788 if (mask & AFL_ASE_MIPS3D)
14789 fputs ("\n\tMIPS-3D ASE", stdout);
14790 if (mask & AFL_ASE_MT)
14791 fputs ("\n\tMT ASE", stdout);
14792 if (mask & AFL_ASE_SMARTMIPS)
14793 fputs ("\n\tSmartMIPS ASE", stdout);
14794 if (mask & AFL_ASE_VIRT)
14795 fputs ("\n\tVZ ASE", stdout);
14796 if (mask & AFL_ASE_MSA)
14797 fputs ("\n\tMSA ASE", stdout);
14798 if (mask & AFL_ASE_MIPS16)
14799 fputs ("\n\tMIPS16 ASE", stdout);
14800 if (mask & AFL_ASE_MICROMIPS)
14801 fputs ("\n\tMICROMIPS ASE", stdout);
14802 if (mask & AFL_ASE_XPA)
14803 fputs ("\n\tXPA ASE", stdout);
14804 if (mask == 0)
14805 fprintf (stdout, "\n\t%s", _("None"));
14806 else if ((mask & ~AFL_ASE_MASK) != 0)
14807 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14808 }
14809
14810 static void
14811 print_mips_isa_ext (unsigned int isa_ext)
14812 {
14813 switch (isa_ext)
14814 {
14815 case 0:
14816 fputs (_("None"), stdout);
14817 break;
14818 case AFL_EXT_XLR:
14819 fputs ("RMI XLR", stdout);
14820 break;
14821 case AFL_EXT_OCTEON3:
14822 fputs ("Cavium Networks Octeon3", stdout);
14823 break;
14824 case AFL_EXT_OCTEON2:
14825 fputs ("Cavium Networks Octeon2", stdout);
14826 break;
14827 case AFL_EXT_OCTEONP:
14828 fputs ("Cavium Networks OcteonP", stdout);
14829 break;
14830 case AFL_EXT_LOONGSON_3A:
14831 fputs ("Loongson 3A", stdout);
14832 break;
14833 case AFL_EXT_OCTEON:
14834 fputs ("Cavium Networks Octeon", stdout);
14835 break;
14836 case AFL_EXT_5900:
14837 fputs ("Toshiba R5900", stdout);
14838 break;
14839 case AFL_EXT_4650:
14840 fputs ("MIPS R4650", stdout);
14841 break;
14842 case AFL_EXT_4010:
14843 fputs ("LSI R4010", stdout);
14844 break;
14845 case AFL_EXT_4100:
14846 fputs ("NEC VR4100", stdout);
14847 break;
14848 case AFL_EXT_3900:
14849 fputs ("Toshiba R3900", stdout);
14850 break;
14851 case AFL_EXT_10000:
14852 fputs ("MIPS R10000", stdout);
14853 break;
14854 case AFL_EXT_SB1:
14855 fputs ("Broadcom SB-1", stdout);
14856 break;
14857 case AFL_EXT_4111:
14858 fputs ("NEC VR4111/VR4181", stdout);
14859 break;
14860 case AFL_EXT_4120:
14861 fputs ("NEC VR4120", stdout);
14862 break;
14863 case AFL_EXT_5400:
14864 fputs ("NEC VR5400", stdout);
14865 break;
14866 case AFL_EXT_5500:
14867 fputs ("NEC VR5500", stdout);
14868 break;
14869 case AFL_EXT_LOONGSON_2E:
14870 fputs ("ST Microelectronics Loongson 2E", stdout);
14871 break;
14872 case AFL_EXT_LOONGSON_2F:
14873 fputs ("ST Microelectronics Loongson 2F", stdout);
14874 break;
14875 default:
14876 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14877 }
14878 }
14879
14880 static signed int
14881 get_mips_reg_size (int reg_size)
14882 {
14883 return (reg_size == AFL_REG_NONE) ? 0
14884 : (reg_size == AFL_REG_32) ? 32
14885 : (reg_size == AFL_REG_64) ? 64
14886 : (reg_size == AFL_REG_128) ? 128
14887 : -1;
14888 }
14889
14890 static bfd_boolean
14891 process_mips_specific (FILE * file)
14892 {
14893 Elf_Internal_Dyn * entry;
14894 Elf_Internal_Shdr *sect = NULL;
14895 size_t liblist_offset = 0;
14896 size_t liblistno = 0;
14897 size_t conflictsno = 0;
14898 size_t options_offset = 0;
14899 size_t conflicts_offset = 0;
14900 size_t pltrelsz = 0;
14901 size_t pltrel = 0;
14902 bfd_vma pltgot = 0;
14903 bfd_vma mips_pltgot = 0;
14904 bfd_vma jmprel = 0;
14905 bfd_vma local_gotno = 0;
14906 bfd_vma gotsym = 0;
14907 bfd_vma symtabno = 0;
14908 bfd_boolean res = TRUE;
14909
14910 if (! process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14911 display_mips_gnu_attribute))
14912 res = FALSE;
14913
14914 sect = find_section (".MIPS.abiflags");
14915
14916 if (sect != NULL)
14917 {
14918 Elf_External_ABIFlags_v0 *abiflags_ext;
14919 Elf_Internal_ABIFlags_v0 abiflags_in;
14920
14921 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14922 {
14923 error (_("Corrupt MIPS ABI Flags section.\n"));
14924 res = FALSE;
14925 }
14926 else
14927 {
14928 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14929 sect->sh_size, _("MIPS ABI Flags section"));
14930 if (abiflags_ext)
14931 {
14932 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14933 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14934 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14935 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14936 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14937 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14938 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14939 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14940 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14941 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14942 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14943
14944 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14945 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14946 if (abiflags_in.isa_rev > 1)
14947 printf ("r%d", abiflags_in.isa_rev);
14948 printf ("\nGPR size: %d",
14949 get_mips_reg_size (abiflags_in.gpr_size));
14950 printf ("\nCPR1 size: %d",
14951 get_mips_reg_size (abiflags_in.cpr1_size));
14952 printf ("\nCPR2 size: %d",
14953 get_mips_reg_size (abiflags_in.cpr2_size));
14954 fputs ("\nFP ABI: ", stdout);
14955 print_mips_fp_abi_value (abiflags_in.fp_abi);
14956 fputs ("ISA Extension: ", stdout);
14957 print_mips_isa_ext (abiflags_in.isa_ext);
14958 fputs ("\nASEs:", stdout);
14959 print_mips_ases (abiflags_in.ases);
14960 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14961 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14962 fputc ('\n', stdout);
14963 free (abiflags_ext);
14964 }
14965 }
14966 }
14967
14968 /* We have a lot of special sections. Thanks SGI! */
14969 if (dynamic_section == NULL)
14970 /* No information available. */
14971 return res;
14972
14973 for (entry = dynamic_section;
14974 /* PR 17531 file: 012-50589-0.004. */
14975 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14976 ++entry)
14977 switch (entry->d_tag)
14978 {
14979 case DT_MIPS_LIBLIST:
14980 liblist_offset
14981 = offset_from_vma (file, entry->d_un.d_val,
14982 liblistno * sizeof (Elf32_External_Lib));
14983 break;
14984 case DT_MIPS_LIBLISTNO:
14985 liblistno = entry->d_un.d_val;
14986 break;
14987 case DT_MIPS_OPTIONS:
14988 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14989 break;
14990 case DT_MIPS_CONFLICT:
14991 conflicts_offset
14992 = offset_from_vma (file, entry->d_un.d_val,
14993 conflictsno * sizeof (Elf32_External_Conflict));
14994 break;
14995 case DT_MIPS_CONFLICTNO:
14996 conflictsno = entry->d_un.d_val;
14997 break;
14998 case DT_PLTGOT:
14999 pltgot = entry->d_un.d_ptr;
15000 break;
15001 case DT_MIPS_LOCAL_GOTNO:
15002 local_gotno = entry->d_un.d_val;
15003 break;
15004 case DT_MIPS_GOTSYM:
15005 gotsym = entry->d_un.d_val;
15006 break;
15007 case DT_MIPS_SYMTABNO:
15008 symtabno = entry->d_un.d_val;
15009 break;
15010 case DT_MIPS_PLTGOT:
15011 mips_pltgot = entry->d_un.d_ptr;
15012 break;
15013 case DT_PLTREL:
15014 pltrel = entry->d_un.d_val;
15015 break;
15016 case DT_PLTRELSZ:
15017 pltrelsz = entry->d_un.d_val;
15018 break;
15019 case DT_JMPREL:
15020 jmprel = entry->d_un.d_ptr;
15021 break;
15022 default:
15023 break;
15024 }
15025
15026 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15027 {
15028 Elf32_External_Lib * elib;
15029 size_t cnt;
15030
15031 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
15032 liblistno,
15033 sizeof (Elf32_External_Lib),
15034 _("liblist section data"));
15035 if (elib)
15036 {
15037 printf (_("\nSection '.liblist' contains %lu entries:\n"),
15038 (unsigned long) liblistno);
15039 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15040 stdout);
15041
15042 for (cnt = 0; cnt < liblistno; ++cnt)
15043 {
15044 Elf32_Lib liblist;
15045 time_t atime;
15046 char timebuf[128];
15047 struct tm * tmp;
15048
15049 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15050 atime = BYTE_GET (elib[cnt].l_time_stamp);
15051 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15052 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15053 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15054
15055 tmp = gmtime (&atime);
15056 snprintf (timebuf, sizeof (timebuf),
15057 "%04u-%02u-%02uT%02u:%02u:%02u",
15058 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15059 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15060
15061 printf ("%3lu: ", (unsigned long) cnt);
15062 if (VALID_DYNAMIC_NAME (liblist.l_name))
15063 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15064 else
15065 printf (_("<corrupt: %9ld>"), liblist.l_name);
15066 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15067 liblist.l_version);
15068
15069 if (liblist.l_flags == 0)
15070 puts (_(" NONE"));
15071 else
15072 {
15073 static const struct
15074 {
15075 const char * name;
15076 int bit;
15077 }
15078 l_flags_vals[] =
15079 {
15080 { " EXACT_MATCH", LL_EXACT_MATCH },
15081 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15082 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15083 { " EXPORTS", LL_EXPORTS },
15084 { " DELAY_LOAD", LL_DELAY_LOAD },
15085 { " DELTA", LL_DELTA }
15086 };
15087 int flags = liblist.l_flags;
15088 size_t fcnt;
15089
15090 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15091 if ((flags & l_flags_vals[fcnt].bit) != 0)
15092 {
15093 fputs (l_flags_vals[fcnt].name, stdout);
15094 flags ^= l_flags_vals[fcnt].bit;
15095 }
15096 if (flags != 0)
15097 printf (" %#x", (unsigned int) flags);
15098
15099 puts ("");
15100 }
15101 }
15102
15103 free (elib);
15104 }
15105 else
15106 res = FALSE;
15107 }
15108
15109 if (options_offset != 0)
15110 {
15111 Elf_External_Options * eopt;
15112 Elf_Internal_Options * iopt;
15113 Elf_Internal_Options * option;
15114 size_t offset;
15115 int cnt;
15116 sect = section_headers;
15117
15118 /* Find the section header so that we get the size. */
15119 sect = find_section_by_type (SHT_MIPS_OPTIONS);
15120 /* PR 17533 file: 012-277276-0.004. */
15121 if (sect == NULL)
15122 {
15123 error (_("No MIPS_OPTIONS header found\n"));
15124 return FALSE;
15125 }
15126
15127 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
15128 sect->sh_size, _("options"));
15129 if (eopt)
15130 {
15131 iopt = (Elf_Internal_Options *)
15132 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15133 if (iopt == NULL)
15134 {
15135 error (_("Out of memory allocating space for MIPS options\n"));
15136 return FALSE;
15137 }
15138
15139 offset = cnt = 0;
15140 option = iopt;
15141
15142 while (offset <= sect->sh_size - sizeof (* eopt))
15143 {
15144 Elf_External_Options * eoption;
15145
15146 eoption = (Elf_External_Options *) ((char *) eopt + offset);
15147
15148 option->kind = BYTE_GET (eoption->kind);
15149 option->size = BYTE_GET (eoption->size);
15150 option->section = BYTE_GET (eoption->section);
15151 option->info = BYTE_GET (eoption->info);
15152
15153 /* PR 17531: file: ffa0fa3b. */
15154 if (option->size < sizeof (* eopt)
15155 || offset + option->size > sect->sh_size)
15156 {
15157 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15158 return FALSE;
15159 }
15160 offset += option->size;
15161
15162 ++option;
15163 ++cnt;
15164 }
15165
15166 printf (_("\nSection '%s' contains %d entries:\n"),
15167 printable_section_name (sect), cnt);
15168
15169 option = iopt;
15170 offset = 0;
15171
15172 while (cnt-- > 0)
15173 {
15174 size_t len;
15175
15176 switch (option->kind)
15177 {
15178 case ODK_NULL:
15179 /* This shouldn't happen. */
15180 printf (" NULL %d %lx", option->section, option->info);
15181 break;
15182 case ODK_REGINFO:
15183 printf (" REGINFO ");
15184 if (elf_header.e_machine == EM_MIPS)
15185 {
15186 /* 32bit form. */
15187 Elf32_External_RegInfo * ereg;
15188 Elf32_RegInfo reginfo;
15189
15190 ereg = (Elf32_External_RegInfo *) (option + 1);
15191 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15192 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15193 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15194 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15195 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15196 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15197
15198 printf ("GPR %08lx GP 0x%lx\n",
15199 reginfo.ri_gprmask,
15200 (unsigned long) reginfo.ri_gp_value);
15201 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15202 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15203 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15204 }
15205 else
15206 {
15207 /* 64 bit form. */
15208 Elf64_External_RegInfo * ereg;
15209 Elf64_Internal_RegInfo reginfo;
15210
15211 ereg = (Elf64_External_RegInfo *) (option + 1);
15212 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15213 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15214 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15215 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15216 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15217 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15218
15219 printf ("GPR %08lx GP 0x",
15220 reginfo.ri_gprmask);
15221 printf_vma (reginfo.ri_gp_value);
15222 printf ("\n");
15223
15224 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15225 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15226 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15227 }
15228 ++option;
15229 continue;
15230 case ODK_EXCEPTIONS:
15231 fputs (" EXCEPTIONS fpe_min(", stdout);
15232 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15233 fputs (") fpe_max(", stdout);
15234 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15235 fputs (")", stdout);
15236
15237 if (option->info & OEX_PAGE0)
15238 fputs (" PAGE0", stdout);
15239 if (option->info & OEX_SMM)
15240 fputs (" SMM", stdout);
15241 if (option->info & OEX_FPDBUG)
15242 fputs (" FPDBUG", stdout);
15243 if (option->info & OEX_DISMISS)
15244 fputs (" DISMISS", stdout);
15245 break;
15246 case ODK_PAD:
15247 fputs (" PAD ", stdout);
15248 if (option->info & OPAD_PREFIX)
15249 fputs (" PREFIX", stdout);
15250 if (option->info & OPAD_POSTFIX)
15251 fputs (" POSTFIX", stdout);
15252 if (option->info & OPAD_SYMBOL)
15253 fputs (" SYMBOL", stdout);
15254 break;
15255 case ODK_HWPATCH:
15256 fputs (" HWPATCH ", stdout);
15257 if (option->info & OHW_R4KEOP)
15258 fputs (" R4KEOP", stdout);
15259 if (option->info & OHW_R8KPFETCH)
15260 fputs (" R8KPFETCH", stdout);
15261 if (option->info & OHW_R5KEOP)
15262 fputs (" R5KEOP", stdout);
15263 if (option->info & OHW_R5KCVTL)
15264 fputs (" R5KCVTL", stdout);
15265 break;
15266 case ODK_FILL:
15267 fputs (" FILL ", stdout);
15268 /* XXX Print content of info word? */
15269 break;
15270 case ODK_TAGS:
15271 fputs (" TAGS ", stdout);
15272 /* XXX Print content of info word? */
15273 break;
15274 case ODK_HWAND:
15275 fputs (" HWAND ", stdout);
15276 if (option->info & OHWA0_R4KEOP_CHECKED)
15277 fputs (" R4KEOP_CHECKED", stdout);
15278 if (option->info & OHWA0_R4KEOP_CLEAN)
15279 fputs (" R4KEOP_CLEAN", stdout);
15280 break;
15281 case ODK_HWOR:
15282 fputs (" HWOR ", stdout);
15283 if (option->info & OHWA0_R4KEOP_CHECKED)
15284 fputs (" R4KEOP_CHECKED", stdout);
15285 if (option->info & OHWA0_R4KEOP_CLEAN)
15286 fputs (" R4KEOP_CLEAN", stdout);
15287 break;
15288 case ODK_GP_GROUP:
15289 printf (" GP_GROUP %#06lx self-contained %#06lx",
15290 option->info & OGP_GROUP,
15291 (option->info & OGP_SELF) >> 16);
15292 break;
15293 case ODK_IDENT:
15294 printf (" IDENT %#06lx self-contained %#06lx",
15295 option->info & OGP_GROUP,
15296 (option->info & OGP_SELF) >> 16);
15297 break;
15298 default:
15299 /* This shouldn't happen. */
15300 printf (" %3d ??? %d %lx",
15301 option->kind, option->section, option->info);
15302 break;
15303 }
15304
15305 len = sizeof (* eopt);
15306 while (len < option->size)
15307 {
15308 unsigned char datum = * ((unsigned char *) eopt + offset + len);
15309
15310 if (ISPRINT (datum))
15311 printf ("%c", datum);
15312 else
15313 printf ("\\%03o", datum);
15314 len ++;
15315 }
15316 fputs ("\n", stdout);
15317
15318 offset += option->size;
15319 ++option;
15320 }
15321
15322 free (eopt);
15323 }
15324 else
15325 res = FALSE;
15326 }
15327
15328 if (conflicts_offset != 0 && conflictsno != 0)
15329 {
15330 Elf32_Conflict * iconf;
15331 size_t cnt;
15332
15333 if (dynamic_symbols == NULL)
15334 {
15335 error (_("conflict list found without a dynamic symbol table\n"));
15336 return FALSE;
15337 }
15338
15339 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
15340 if (iconf == NULL)
15341 {
15342 error (_("Out of memory allocating space for dynamic conflicts\n"));
15343 return FALSE;
15344 }
15345
15346 if (is_32bit_elf)
15347 {
15348 Elf32_External_Conflict * econf32;
15349
15350 econf32 = (Elf32_External_Conflict *)
15351 get_data (NULL, file, conflicts_offset, conflictsno,
15352 sizeof (* econf32), _("conflict"));
15353 if (!econf32)
15354 return FALSE;
15355
15356 for (cnt = 0; cnt < conflictsno; ++cnt)
15357 iconf[cnt] = BYTE_GET (econf32[cnt]);
15358
15359 free (econf32);
15360 }
15361 else
15362 {
15363 Elf64_External_Conflict * econf64;
15364
15365 econf64 = (Elf64_External_Conflict *)
15366 get_data (NULL, file, conflicts_offset, conflictsno,
15367 sizeof (* econf64), _("conflict"));
15368 if (!econf64)
15369 return FALSE;
15370
15371 for (cnt = 0; cnt < conflictsno; ++cnt)
15372 iconf[cnt] = BYTE_GET (econf64[cnt]);
15373
15374 free (econf64);
15375 }
15376
15377 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15378 (unsigned long) conflictsno);
15379 puts (_(" Num: Index Value Name"));
15380
15381 for (cnt = 0; cnt < conflictsno; ++cnt)
15382 {
15383 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
15384
15385 if (iconf[cnt] >= num_dynamic_syms)
15386 printf (_("<corrupt symbol index>"));
15387 else
15388 {
15389 Elf_Internal_Sym * psym;
15390
15391 psym = & dynamic_symbols[iconf[cnt]];
15392 print_vma (psym->st_value, FULL_HEX);
15393 putchar (' ');
15394 if (VALID_DYNAMIC_NAME (psym->st_name))
15395 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15396 else
15397 printf (_("<corrupt: %14ld>"), psym->st_name);
15398 }
15399 putchar ('\n');
15400 }
15401
15402 free (iconf);
15403 }
15404
15405 if (pltgot != 0 && local_gotno != 0)
15406 {
15407 bfd_vma ent, local_end, global_end;
15408 size_t i, offset;
15409 unsigned char * data;
15410 unsigned char * data_end;
15411 int addr_size;
15412
15413 ent = pltgot;
15414 addr_size = (is_32bit_elf ? 4 : 8);
15415 local_end = pltgot + local_gotno * addr_size;
15416
15417 /* PR binutils/17533 file: 012-111227-0.004 */
15418 if (symtabno < gotsym)
15419 {
15420 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15421 (unsigned long) gotsym, (unsigned long) symtabno);
15422 return FALSE;
15423 }
15424
15425 global_end = local_end + (symtabno - gotsym) * addr_size;
15426 /* PR 17531: file: 54c91a34. */
15427 if (global_end < local_end)
15428 {
15429 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15430 return FALSE;
15431 }
15432
15433 offset = offset_from_vma (file, pltgot, global_end - pltgot);
15434 data = (unsigned char *) get_data (NULL, file, offset,
15435 global_end - pltgot, 1,
15436 _("Global Offset Table data"));
15437 if (data == NULL)
15438 return FALSE;
15439 data_end = data + (global_end - pltgot);
15440
15441 printf (_("\nPrimary GOT:\n"));
15442 printf (_(" Canonical gp value: "));
15443 print_vma (pltgot + 0x7ff0, LONG_HEX);
15444 printf ("\n\n");
15445
15446 printf (_(" Reserved entries:\n"));
15447 printf (_(" %*s %10s %*s Purpose\n"),
15448 addr_size * 2, _("Address"), _("Access"),
15449 addr_size * 2, _("Initial"));
15450 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15451 printf (_(" Lazy resolver\n"));
15452 if (ent == (bfd_vma) -1)
15453 goto got_print_fail;
15454 if (data
15455 && (byte_get (data + ent - pltgot, addr_size)
15456 >> (addr_size * 8 - 1)) != 0)
15457 {
15458 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15459 printf (_(" Module pointer (GNU extension)\n"));
15460 if (ent == (bfd_vma) -1)
15461 goto got_print_fail;
15462 }
15463 printf ("\n");
15464
15465 if (ent < local_end)
15466 {
15467 printf (_(" Local entries:\n"));
15468 printf (" %*s %10s %*s\n",
15469 addr_size * 2, _("Address"), _("Access"),
15470 addr_size * 2, _("Initial"));
15471 while (ent < local_end)
15472 {
15473 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15474 printf ("\n");
15475 if (ent == (bfd_vma) -1)
15476 goto got_print_fail;
15477 }
15478 printf ("\n");
15479 }
15480
15481 if (gotsym < symtabno)
15482 {
15483 int sym_width;
15484
15485 printf (_(" Global entries:\n"));
15486 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15487 addr_size * 2, _("Address"),
15488 _("Access"),
15489 addr_size * 2, _("Initial"),
15490 addr_size * 2, _("Sym.Val."),
15491 _("Type"),
15492 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15493 _("Ndx"), _("Name"));
15494
15495 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15496
15497 for (i = gotsym; i < symtabno; i++)
15498 {
15499 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15500 printf (" ");
15501
15502 if (dynamic_symbols == NULL)
15503 printf (_("<no dynamic symbols>"));
15504 else if (i < num_dynamic_syms)
15505 {
15506 Elf_Internal_Sym * psym = dynamic_symbols + i;
15507
15508 print_vma (psym->st_value, LONG_HEX);
15509 printf (" %-7s %3s ",
15510 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15511 get_symbol_index_type (psym->st_shndx));
15512
15513 if (VALID_DYNAMIC_NAME (psym->st_name))
15514 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15515 else
15516 printf (_("<corrupt: %14ld>"), psym->st_name);
15517 }
15518 else
15519 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15520 (unsigned long) i);
15521
15522 printf ("\n");
15523 if (ent == (bfd_vma) -1)
15524 break;
15525 }
15526 printf ("\n");
15527 }
15528
15529 got_print_fail:
15530 if (data)
15531 free (data);
15532 }
15533
15534 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15535 {
15536 bfd_vma ent, end;
15537 size_t offset, rel_offset;
15538 unsigned long count, i;
15539 unsigned char * data;
15540 int addr_size, sym_width;
15541 Elf_Internal_Rela * rels;
15542
15543 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15544 if (pltrel == DT_RELA)
15545 {
15546 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15547 return FALSE;
15548 }
15549 else
15550 {
15551 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15552 return FALSE;
15553 }
15554
15555 ent = mips_pltgot;
15556 addr_size = (is_32bit_elf ? 4 : 8);
15557 end = mips_pltgot + (2 + count) * addr_size;
15558
15559 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15560 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15561 1, _("Procedure Linkage Table data"));
15562 if (data == NULL)
15563 return FALSE;
15564
15565 printf ("\nPLT GOT:\n\n");
15566 printf (_(" Reserved entries:\n"));
15567 printf (_(" %*s %*s Purpose\n"),
15568 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15569 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15570 printf (_(" PLT lazy resolver\n"));
15571 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15572 printf (_(" Module pointer\n"));
15573 printf ("\n");
15574
15575 printf (_(" Entries:\n"));
15576 printf (" %*s %*s %*s %-7s %3s %s\n",
15577 addr_size * 2, _("Address"),
15578 addr_size * 2, _("Initial"),
15579 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15580 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15581 for (i = 0; i < count; i++)
15582 {
15583 unsigned long idx = get_reloc_symindex (rels[i].r_info);
15584
15585 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15586 printf (" ");
15587
15588 if (idx >= num_dynamic_syms)
15589 printf (_("<corrupt symbol index: %lu>"), idx);
15590 else
15591 {
15592 Elf_Internal_Sym * psym = dynamic_symbols + idx;
15593
15594 print_vma (psym->st_value, LONG_HEX);
15595 printf (" %-7s %3s ",
15596 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15597 get_symbol_index_type (psym->st_shndx));
15598 if (VALID_DYNAMIC_NAME (psym->st_name))
15599 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15600 else
15601 printf (_("<corrupt: %14ld>"), psym->st_name);
15602 }
15603 printf ("\n");
15604 }
15605 printf ("\n");
15606
15607 if (data)
15608 free (data);
15609 free (rels);
15610 }
15611
15612 return res;
15613 }
15614
15615 static bfd_boolean
15616 process_nds32_specific (FILE * file)
15617 {
15618 Elf_Internal_Shdr *sect = NULL;
15619
15620 sect = find_section (".nds32_e_flags");
15621 if (sect != NULL)
15622 {
15623 unsigned int *flag;
15624
15625 printf ("\nNDS32 elf flags section:\n");
15626 flag = get_data (NULL, file, sect->sh_offset, 1,
15627 sect->sh_size, _("NDS32 elf flags section"));
15628
15629 if (! flag)
15630 return FALSE;
15631
15632 switch ((*flag) & 0x3)
15633 {
15634 case 0:
15635 printf ("(VEC_SIZE):\tNo entry.\n");
15636 break;
15637 case 1:
15638 printf ("(VEC_SIZE):\t4 bytes\n");
15639 break;
15640 case 2:
15641 printf ("(VEC_SIZE):\t16 bytes\n");
15642 break;
15643 case 3:
15644 printf ("(VEC_SIZE):\treserved\n");
15645 break;
15646 }
15647 }
15648
15649 return TRUE;
15650 }
15651
15652 static bfd_boolean
15653 process_gnu_liblist (FILE * file)
15654 {
15655 Elf_Internal_Shdr * section;
15656 Elf_Internal_Shdr * string_sec;
15657 Elf32_External_Lib * elib;
15658 char * strtab;
15659 size_t strtab_size;
15660 size_t cnt;
15661 unsigned i;
15662 bfd_boolean res = TRUE;
15663
15664 if (! do_arch)
15665 return TRUE;
15666
15667 for (i = 0, section = section_headers;
15668 i < elf_header.e_shnum;
15669 i++, section++)
15670 {
15671 switch (section->sh_type)
15672 {
15673 case SHT_GNU_LIBLIST:
15674 if (section->sh_link >= elf_header.e_shnum)
15675 break;
15676
15677 elib = (Elf32_External_Lib *)
15678 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15679 _("liblist section data"));
15680
15681 if (elib == NULL)
15682 {
15683 res = FALSE;
15684 break;
15685 }
15686
15687 string_sec = section_headers + section->sh_link;
15688 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15689 string_sec->sh_size,
15690 _("liblist string table"));
15691 if (strtab == NULL
15692 || section->sh_entsize != sizeof (Elf32_External_Lib))
15693 {
15694 free (elib);
15695 free (strtab);
15696 res = FALSE;
15697 break;
15698 }
15699 strtab_size = string_sec->sh_size;
15700
15701 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15702 printable_section_name (section),
15703 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15704
15705 puts (_(" Library Time Stamp Checksum Version Flags"));
15706
15707 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15708 ++cnt)
15709 {
15710 Elf32_Lib liblist;
15711 time_t atime;
15712 char timebuf[128];
15713 struct tm * tmp;
15714
15715 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15716 atime = BYTE_GET (elib[cnt].l_time_stamp);
15717 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15718 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15719 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15720
15721 tmp = gmtime (&atime);
15722 snprintf (timebuf, sizeof (timebuf),
15723 "%04u-%02u-%02uT%02u:%02u:%02u",
15724 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15725 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15726
15727 printf ("%3lu: ", (unsigned long) cnt);
15728 if (do_wide)
15729 printf ("%-20s", liblist.l_name < strtab_size
15730 ? strtab + liblist.l_name : _("<corrupt>"));
15731 else
15732 printf ("%-20.20s", liblist.l_name < strtab_size
15733 ? strtab + liblist.l_name : _("<corrupt>"));
15734 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15735 liblist.l_version, liblist.l_flags);
15736 }
15737
15738 free (elib);
15739 free (strtab);
15740 }
15741 }
15742
15743 return res;
15744 }
15745
15746 static const char *
15747 get_note_type (unsigned e_type)
15748 {
15749 static char buff[64];
15750
15751 if (elf_header.e_type == ET_CORE)
15752 switch (e_type)
15753 {
15754 case NT_AUXV:
15755 return _("NT_AUXV (auxiliary vector)");
15756 case NT_PRSTATUS:
15757 return _("NT_PRSTATUS (prstatus structure)");
15758 case NT_FPREGSET:
15759 return _("NT_FPREGSET (floating point registers)");
15760 case NT_PRPSINFO:
15761 return _("NT_PRPSINFO (prpsinfo structure)");
15762 case NT_TASKSTRUCT:
15763 return _("NT_TASKSTRUCT (task structure)");
15764 case NT_PRXFPREG:
15765 return _("NT_PRXFPREG (user_xfpregs structure)");
15766 case NT_PPC_VMX:
15767 return _("NT_PPC_VMX (ppc Altivec registers)");
15768 case NT_PPC_VSX:
15769 return _("NT_PPC_VSX (ppc VSX registers)");
15770 case NT_386_TLS:
15771 return _("NT_386_TLS (x86 TLS information)");
15772 case NT_386_IOPERM:
15773 return _("NT_386_IOPERM (x86 I/O permissions)");
15774 case NT_X86_XSTATE:
15775 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15776 case NT_S390_HIGH_GPRS:
15777 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15778 case NT_S390_TIMER:
15779 return _("NT_S390_TIMER (s390 timer register)");
15780 case NT_S390_TODCMP:
15781 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15782 case NT_S390_TODPREG:
15783 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15784 case NT_S390_CTRS:
15785 return _("NT_S390_CTRS (s390 control registers)");
15786 case NT_S390_PREFIX:
15787 return _("NT_S390_PREFIX (s390 prefix register)");
15788 case NT_S390_LAST_BREAK:
15789 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15790 case NT_S390_SYSTEM_CALL:
15791 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15792 case NT_S390_TDB:
15793 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15794 case NT_S390_VXRS_LOW:
15795 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15796 case NT_S390_VXRS_HIGH:
15797 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15798 case NT_ARM_VFP:
15799 return _("NT_ARM_VFP (arm VFP registers)");
15800 case NT_ARM_TLS:
15801 return _("NT_ARM_TLS (AArch TLS registers)");
15802 case NT_ARM_HW_BREAK:
15803 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15804 case NT_ARM_HW_WATCH:
15805 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15806 case NT_PSTATUS:
15807 return _("NT_PSTATUS (pstatus structure)");
15808 case NT_FPREGS:
15809 return _("NT_FPREGS (floating point registers)");
15810 case NT_PSINFO:
15811 return _("NT_PSINFO (psinfo structure)");
15812 case NT_LWPSTATUS:
15813 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15814 case NT_LWPSINFO:
15815 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15816 case NT_WIN32PSTATUS:
15817 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15818 case NT_SIGINFO:
15819 return _("NT_SIGINFO (siginfo_t data)");
15820 case NT_FILE:
15821 return _("NT_FILE (mapped files)");
15822 default:
15823 break;
15824 }
15825 else
15826 switch (e_type)
15827 {
15828 case NT_VERSION:
15829 return _("NT_VERSION (version)");
15830 case NT_ARCH:
15831 return _("NT_ARCH (architecture)");
15832 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
15833 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
15834 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
15835 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
15836 default:
15837 break;
15838 }
15839
15840 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15841 return buff;
15842 }
15843
15844 static bfd_boolean
15845 print_core_note (Elf_Internal_Note *pnote)
15846 {
15847 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15848 bfd_vma count, page_size;
15849 unsigned char *descdata, *filenames, *descend;
15850
15851 if (pnote->type != NT_FILE)
15852 return TRUE;
15853
15854 #ifndef BFD64
15855 if (!is_32bit_elf)
15856 {
15857 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15858 /* Still "successful". */
15859 return TRUE;
15860 }
15861 #endif
15862
15863 if (pnote->descsz < 2 * addr_size)
15864 {
15865 error (_(" Malformed note - too short for header\n"));
15866 return FALSE;
15867 }
15868
15869 descdata = (unsigned char *) pnote->descdata;
15870 descend = descdata + pnote->descsz;
15871
15872 if (descdata[pnote->descsz - 1] != '\0')
15873 {
15874 error (_(" Malformed note - does not end with \\0\n"));
15875 return FALSE;
15876 }
15877
15878 count = byte_get (descdata, addr_size);
15879 descdata += addr_size;
15880
15881 page_size = byte_get (descdata, addr_size);
15882 descdata += addr_size;
15883
15884 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15885 {
15886 error (_(" Malformed note - too short for supplied file count\n"));
15887 return FALSE;
15888 }
15889
15890 printf (_(" Page size: "));
15891 print_vma (page_size, DEC);
15892 printf ("\n");
15893
15894 printf (_(" %*s%*s%*s\n"),
15895 (int) (2 + 2 * addr_size), _("Start"),
15896 (int) (4 + 2 * addr_size), _("End"),
15897 (int) (4 + 2 * addr_size), _("Page Offset"));
15898 filenames = descdata + count * 3 * addr_size;
15899 while (count-- > 0)
15900 {
15901 bfd_vma start, end, file_ofs;
15902
15903 if (filenames == descend)
15904 {
15905 error (_(" Malformed note - filenames end too early\n"));
15906 return FALSE;
15907 }
15908
15909 start = byte_get (descdata, addr_size);
15910 descdata += addr_size;
15911 end = byte_get (descdata, addr_size);
15912 descdata += addr_size;
15913 file_ofs = byte_get (descdata, addr_size);
15914 descdata += addr_size;
15915
15916 printf (" ");
15917 print_vma (start, FULL_HEX);
15918 printf (" ");
15919 print_vma (end, FULL_HEX);
15920 printf (" ");
15921 print_vma (file_ofs, FULL_HEX);
15922 printf ("\n %s\n", filenames);
15923
15924 filenames += 1 + strlen ((char *) filenames);
15925 }
15926
15927 return TRUE;
15928 }
15929
15930 static const char *
15931 get_gnu_elf_note_type (unsigned e_type)
15932 {
15933 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
15934 switch (e_type)
15935 {
15936 case NT_GNU_ABI_TAG:
15937 return _("NT_GNU_ABI_TAG (ABI version tag)");
15938 case NT_GNU_HWCAP:
15939 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15940 case NT_GNU_BUILD_ID:
15941 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15942 case NT_GNU_GOLD_VERSION:
15943 return _("NT_GNU_GOLD_VERSION (gold version)");
15944 case NT_GNU_PROPERTY_TYPE_0:
15945 return _("NT_GNU_PROPERTY_TYPE_0");
15946 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
15947 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
15948 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
15949 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
15950 default:
15951 {
15952 static char buff[64];
15953
15954 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15955 return buff;
15956 }
15957 }
15958 }
15959
15960 static void
15961 decode_x86_isa (unsigned int bitmask)
15962 {
15963 while (bitmask)
15964 {
15965 unsigned int bit = bitmask & (- bitmask);
15966
15967 bitmask &= ~ bit;
15968 switch (bit)
15969 {
15970 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
15971 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
15972 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
15973 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
15974 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
15975 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
15976 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
15977 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
15978 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
15979 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
15980 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
15981 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
15982 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
15983 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
15984 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
15985 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
15986 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
15987 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
15988 default: printf (_("<unknown: %x>"), bit); break;
15989 }
15990 if (bitmask)
15991 printf (", ");
15992 }
15993 }
15994
15995 static void
15996 print_gnu_property_note (Elf_Internal_Note * pnote)
15997 {
15998 unsigned char * ptr = (unsigned char *) pnote->descdata;
15999 unsigned char * ptr_end = ptr + pnote->descsz;
16000 unsigned int size = is_32bit_elf ? 4 : 8;
16001
16002 printf (_(" Properties: "));
16003
16004 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16005 {
16006 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16007 return;
16008 }
16009
16010 while (1)
16011 {
16012 unsigned int j;
16013 unsigned int type = byte_get (ptr, 4);
16014 unsigned int datasz = byte_get (ptr + 4, 4);
16015
16016 ptr += 8;
16017
16018 if ((ptr + datasz) > ptr_end)
16019 {
16020 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16021 type, datasz);
16022 break;
16023 }
16024
16025 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16026 {
16027 if (elf_header.e_machine == EM_X86_64
16028 || elf_header.e_machine == EM_IAMCU
16029 || elf_header.e_machine == EM_386)
16030 {
16031 switch (type)
16032 {
16033 case GNU_PROPERTY_X86_ISA_1_USED:
16034 printf ("x86 ISA used: ");
16035 if (datasz != 4)
16036 printf (_("<corrupt length: %#x> "), datasz);
16037 else
16038 decode_x86_isa (byte_get (ptr, 4));
16039 goto next;
16040
16041 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16042 printf ("x86 ISA needed: ");
16043 if (datasz != 4)
16044 printf (_("<corrupt length: %#x> "), datasz);
16045 else
16046 decode_x86_isa (byte_get (ptr, 4));
16047 goto next;
16048
16049 default:
16050 break;
16051 }
16052 }
16053 }
16054 else
16055 {
16056 switch (type)
16057 {
16058 case GNU_PROPERTY_STACK_SIZE:
16059 printf (_("stack size: "));
16060 if (datasz != size)
16061 printf (_("<corrupt length: %#x> "), datasz);
16062 else
16063 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16064 goto next;
16065
16066 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16067 printf ("no copy on protected ");
16068 if (datasz)
16069 printf (_("<corrupt length: %#x> "), datasz);
16070 goto next;
16071
16072 default:
16073 break;
16074 }
16075 }
16076
16077 if (type < GNU_PROPERTY_LOPROC)
16078 printf (_("<unknown type %#x data: "), type);
16079 else if (type < GNU_PROPERTY_LOUSER)
16080 printf (_("<procesor-specific type %#x data: "), type);
16081 else
16082 printf (_("<application-specific type %#x data: "), type);
16083 for (j = 0; j < datasz; ++j)
16084 printf ("%02x ", ptr[j] & 0xff);
16085 printf (">");
16086
16087 next:
16088 ptr += ((datasz + (size - 1)) & ~ (size - 1));
16089 if (ptr == ptr_end)
16090 break;
16091 else
16092 {
16093 if (do_wide)
16094 printf (", ");
16095 else
16096 printf ("\n\t");
16097 }
16098
16099 if (ptr > (ptr_end - 8))
16100 {
16101 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16102 break;
16103 }
16104 }
16105
16106 printf ("\n");
16107 }
16108
16109 static bfd_boolean
16110 print_gnu_note (Elf_Internal_Note *pnote)
16111 {
16112 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
16113 switch (pnote->type)
16114 {
16115 case NT_GNU_BUILD_ID:
16116 {
16117 unsigned long i;
16118
16119 printf (_(" Build ID: "));
16120 for (i = 0; i < pnote->descsz; ++i)
16121 printf ("%02x", pnote->descdata[i] & 0xff);
16122 printf ("\n");
16123 }
16124 break;
16125
16126 case NT_GNU_ABI_TAG:
16127 {
16128 unsigned long os, major, minor, subminor;
16129 const char *osname;
16130
16131 /* PR 17531: file: 030-599401-0.004. */
16132 if (pnote->descsz < 16)
16133 {
16134 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16135 break;
16136 }
16137
16138 os = byte_get ((unsigned char *) pnote->descdata, 4);
16139 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16140 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16141 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16142
16143 switch (os)
16144 {
16145 case GNU_ABI_TAG_LINUX:
16146 osname = "Linux";
16147 break;
16148 case GNU_ABI_TAG_HURD:
16149 osname = "Hurd";
16150 break;
16151 case GNU_ABI_TAG_SOLARIS:
16152 osname = "Solaris";
16153 break;
16154 case GNU_ABI_TAG_FREEBSD:
16155 osname = "FreeBSD";
16156 break;
16157 case GNU_ABI_TAG_NETBSD:
16158 osname = "NetBSD";
16159 break;
16160 case GNU_ABI_TAG_SYLLABLE:
16161 osname = "Syllable";
16162 break;
16163 case GNU_ABI_TAG_NACL:
16164 osname = "NaCl";
16165 break;
16166 default:
16167 osname = "Unknown";
16168 break;
16169 }
16170
16171 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
16172 major, minor, subminor);
16173 }
16174 break;
16175
16176 case NT_GNU_GOLD_VERSION:
16177 {
16178 unsigned long i;
16179
16180 printf (_(" Version: "));
16181 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
16182 printf ("%c", pnote->descdata[i]);
16183 printf ("\n");
16184 }
16185 break;
16186
16187 case NT_GNU_HWCAP:
16188 {
16189 unsigned long num_entries, mask;
16190
16191 /* Hardware capabilities information. Word 0 is the number of entries.
16192 Word 1 is a bitmask of enabled entries. The rest of the descriptor
16193 is a series of entries, where each entry is a single byte followed
16194 by a nul terminated string. The byte gives the bit number to test
16195 if enabled in the bitmask. */
16196 printf (_(" Hardware Capabilities: "));
16197 if (pnote->descsz < 8)
16198 {
16199 error (_("<corrupt GNU_HWCAP>\n"));
16200 return FALSE;
16201 }
16202 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
16203 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16204 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
16205 /* FIXME: Add code to display the entries... */
16206 }
16207 break;
16208
16209 case NT_GNU_PROPERTY_TYPE_0:
16210 print_gnu_property_note (pnote);
16211 break;
16212
16213 default:
16214 /* Handle unrecognised types. An error message should have already been
16215 created by get_gnu_elf_note_type(), so all that we need to do is to
16216 display the data. */
16217 {
16218 unsigned long i;
16219
16220 printf (_(" Description data: "));
16221 for (i = 0; i < pnote->descsz; ++i)
16222 printf ("%02x ", pnote->descdata[i] & 0xff);
16223 printf ("\n");
16224 }
16225 break;
16226 }
16227
16228 return TRUE;
16229 }
16230
16231 static const char *
16232 get_v850_elf_note_type (enum v850_notes n_type)
16233 {
16234 static char buff[64];
16235
16236 switch (n_type)
16237 {
16238 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
16239 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
16240 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
16241 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
16242 case V850_NOTE_CACHE_INFO: return _("Use of cache");
16243 case V850_NOTE_MMU_INFO: return _("Use of MMU");
16244 default:
16245 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
16246 return buff;
16247 }
16248 }
16249
16250 static bfd_boolean
16251 print_v850_note (Elf_Internal_Note * pnote)
16252 {
16253 unsigned int val;
16254
16255 if (pnote->descsz != 4)
16256 return FALSE;
16257
16258 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
16259
16260 if (val == 0)
16261 {
16262 printf (_("not set\n"));
16263 return TRUE;
16264 }
16265
16266 switch (pnote->type)
16267 {
16268 case V850_NOTE_ALIGNMENT:
16269 switch (val)
16270 {
16271 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
16272 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
16273 }
16274 break;
16275
16276 case V850_NOTE_DATA_SIZE:
16277 switch (val)
16278 {
16279 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
16280 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
16281 }
16282 break;
16283
16284 case V850_NOTE_FPU_INFO:
16285 switch (val)
16286 {
16287 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
16288 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
16289 }
16290 break;
16291
16292 case V850_NOTE_MMU_INFO:
16293 case V850_NOTE_CACHE_INFO:
16294 case V850_NOTE_SIMD_INFO:
16295 if (val == EF_RH850_SIMD)
16296 {
16297 printf (_("yes\n"));
16298 return TRUE;
16299 }
16300 break;
16301
16302 default:
16303 /* An 'unknown note type' message will already have been displayed. */
16304 break;
16305 }
16306
16307 printf (_("unknown value: %x\n"), val);
16308 return FALSE;
16309 }
16310
16311 static bfd_boolean
16312 process_netbsd_elf_note (Elf_Internal_Note * pnote)
16313 {
16314 unsigned int version;
16315
16316 switch (pnote->type)
16317 {
16318 case NT_NETBSD_IDENT:
16319 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
16320 if ((version / 10000) % 100)
16321 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
16322 version, version / 100000000, (version / 1000000) % 100,
16323 (version / 10000) % 100 > 26 ? "Z" : "",
16324 'A' + (version / 10000) % 26);
16325 else
16326 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
16327 version, version / 100000000, (version / 1000000) % 100,
16328 (version / 100) % 100);
16329 return TRUE;
16330
16331 case NT_NETBSD_MARCH:
16332 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
16333 pnote->descdata);
16334 return TRUE;
16335
16336 default:
16337 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
16338 pnote->type);
16339 return FALSE;
16340 }
16341 }
16342
16343 static const char *
16344 get_freebsd_elfcore_note_type (unsigned e_type)
16345 {
16346 switch (e_type)
16347 {
16348 case NT_FREEBSD_THRMISC:
16349 return _("NT_THRMISC (thrmisc structure)");
16350 case NT_FREEBSD_PROCSTAT_PROC:
16351 return _("NT_PROCSTAT_PROC (proc data)");
16352 case NT_FREEBSD_PROCSTAT_FILES:
16353 return _("NT_PROCSTAT_FILES (files data)");
16354 case NT_FREEBSD_PROCSTAT_VMMAP:
16355 return _("NT_PROCSTAT_VMMAP (vmmap data)");
16356 case NT_FREEBSD_PROCSTAT_GROUPS:
16357 return _("NT_PROCSTAT_GROUPS (groups data)");
16358 case NT_FREEBSD_PROCSTAT_UMASK:
16359 return _("NT_PROCSTAT_UMASK (umask data)");
16360 case NT_FREEBSD_PROCSTAT_RLIMIT:
16361 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
16362 case NT_FREEBSD_PROCSTAT_OSREL:
16363 return _("NT_PROCSTAT_OSREL (osreldate data)");
16364 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
16365 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
16366 case NT_FREEBSD_PROCSTAT_AUXV:
16367 return _("NT_PROCSTAT_AUXV (auxv data)");
16368 }
16369 return get_note_type (e_type);
16370 }
16371
16372 static const char *
16373 get_netbsd_elfcore_note_type (unsigned e_type)
16374 {
16375 static char buff[64];
16376
16377 if (e_type == NT_NETBSDCORE_PROCINFO)
16378 {
16379 /* NetBSD core "procinfo" structure. */
16380 return _("NetBSD procinfo structure");
16381 }
16382
16383 /* As of Jan 2002 there are no other machine-independent notes
16384 defined for NetBSD core files. If the note type is less
16385 than the start of the machine-dependent note types, we don't
16386 understand it. */
16387
16388 if (e_type < NT_NETBSDCORE_FIRSTMACH)
16389 {
16390 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16391 return buff;
16392 }
16393
16394 switch (elf_header.e_machine)
16395 {
16396 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
16397 and PT_GETFPREGS == mach+2. */
16398
16399 case EM_OLD_ALPHA:
16400 case EM_ALPHA:
16401 case EM_SPARC:
16402 case EM_SPARC32PLUS:
16403 case EM_SPARCV9:
16404 switch (e_type)
16405 {
16406 case NT_NETBSDCORE_FIRSTMACH + 0:
16407 return _("PT_GETREGS (reg structure)");
16408 case NT_NETBSDCORE_FIRSTMACH + 2:
16409 return _("PT_GETFPREGS (fpreg structure)");
16410 default:
16411 break;
16412 }
16413 break;
16414
16415 /* On all other arch's, PT_GETREGS == mach+1 and
16416 PT_GETFPREGS == mach+3. */
16417 default:
16418 switch (e_type)
16419 {
16420 case NT_NETBSDCORE_FIRSTMACH + 1:
16421 return _("PT_GETREGS (reg structure)");
16422 case NT_NETBSDCORE_FIRSTMACH + 3:
16423 return _("PT_GETFPREGS (fpreg structure)");
16424 default:
16425 break;
16426 }
16427 }
16428
16429 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
16430 e_type - NT_NETBSDCORE_FIRSTMACH);
16431 return buff;
16432 }
16433
16434 static const char *
16435 get_stapsdt_note_type (unsigned e_type)
16436 {
16437 static char buff[64];
16438
16439 switch (e_type)
16440 {
16441 case NT_STAPSDT:
16442 return _("NT_STAPSDT (SystemTap probe descriptors)");
16443
16444 default:
16445 break;
16446 }
16447
16448 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16449 return buff;
16450 }
16451
16452 static bfd_boolean
16453 print_stapsdt_note (Elf_Internal_Note *pnote)
16454 {
16455 int addr_size = is_32bit_elf ? 4 : 8;
16456 char *data = pnote->descdata;
16457 char *data_end = pnote->descdata + pnote->descsz;
16458 bfd_vma pc, base_addr, semaphore;
16459 char *provider, *probe, *arg_fmt;
16460
16461 pc = byte_get ((unsigned char *) data, addr_size);
16462 data += addr_size;
16463 base_addr = byte_get ((unsigned char *) data, addr_size);
16464 data += addr_size;
16465 semaphore = byte_get ((unsigned char *) data, addr_size);
16466 data += addr_size;
16467
16468 provider = data;
16469 data += strlen (data) + 1;
16470 probe = data;
16471 data += strlen (data) + 1;
16472 arg_fmt = data;
16473 data += strlen (data) + 1;
16474
16475 printf (_(" Provider: %s\n"), provider);
16476 printf (_(" Name: %s\n"), probe);
16477 printf (_(" Location: "));
16478 print_vma (pc, FULL_HEX);
16479 printf (_(", Base: "));
16480 print_vma (base_addr, FULL_HEX);
16481 printf (_(", Semaphore: "));
16482 print_vma (semaphore, FULL_HEX);
16483 printf ("\n");
16484 printf (_(" Arguments: %s\n"), arg_fmt);
16485
16486 return data == data_end;
16487 }
16488
16489 static const char *
16490 get_ia64_vms_note_type (unsigned e_type)
16491 {
16492 static char buff[64];
16493
16494 switch (e_type)
16495 {
16496 case NT_VMS_MHD:
16497 return _("NT_VMS_MHD (module header)");
16498 case NT_VMS_LNM:
16499 return _("NT_VMS_LNM (language name)");
16500 case NT_VMS_SRC:
16501 return _("NT_VMS_SRC (source files)");
16502 case NT_VMS_TITLE:
16503 return "NT_VMS_TITLE";
16504 case NT_VMS_EIDC:
16505 return _("NT_VMS_EIDC (consistency check)");
16506 case NT_VMS_FPMODE:
16507 return _("NT_VMS_FPMODE (FP mode)");
16508 case NT_VMS_LINKTIME:
16509 return "NT_VMS_LINKTIME";
16510 case NT_VMS_IMGNAM:
16511 return _("NT_VMS_IMGNAM (image name)");
16512 case NT_VMS_IMGID:
16513 return _("NT_VMS_IMGID (image id)");
16514 case NT_VMS_LINKID:
16515 return _("NT_VMS_LINKID (link id)");
16516 case NT_VMS_IMGBID:
16517 return _("NT_VMS_IMGBID (build id)");
16518 case NT_VMS_GSTNAM:
16519 return _("NT_VMS_GSTNAM (sym table name)");
16520 case NT_VMS_ORIG_DYN:
16521 return "NT_VMS_ORIG_DYN";
16522 case NT_VMS_PATCHTIME:
16523 return "NT_VMS_PATCHTIME";
16524 default:
16525 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16526 return buff;
16527 }
16528 }
16529
16530 static bfd_boolean
16531 print_ia64_vms_note (Elf_Internal_Note * pnote)
16532 {
16533 switch (pnote->type)
16534 {
16535 case NT_VMS_MHD:
16536 if (pnote->descsz > 36)
16537 {
16538 size_t l = strlen (pnote->descdata + 34);
16539 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16540 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16541 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16542 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16543 }
16544 else
16545 printf (_(" Invalid size\n"));
16546 break;
16547 case NT_VMS_LNM:
16548 printf (_(" Language: %s\n"), pnote->descdata);
16549 break;
16550 #ifdef BFD64
16551 case NT_VMS_FPMODE:
16552 printf (_(" Floating Point mode: "));
16553 printf ("0x%016" BFD_VMA_FMT "x\n",
16554 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
16555 break;
16556 case NT_VMS_LINKTIME:
16557 printf (_(" Link time: "));
16558 print_vms_time
16559 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16560 printf ("\n");
16561 break;
16562 case NT_VMS_PATCHTIME:
16563 printf (_(" Patch time: "));
16564 print_vms_time
16565 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16566 printf ("\n");
16567 break;
16568 case NT_VMS_ORIG_DYN:
16569 printf (_(" Major id: %u, minor id: %u\n"),
16570 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16571 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
16572 printf (_(" Last modified : "));
16573 print_vms_time
16574 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
16575 printf (_("\n Link flags : "));
16576 printf ("0x%016" BFD_VMA_FMT "x\n",
16577 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
16578 printf (_(" Header flags: 0x%08x\n"),
16579 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
16580 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16581 break;
16582 #endif
16583 case NT_VMS_IMGNAM:
16584 printf (_(" Image name: %s\n"), pnote->descdata);
16585 break;
16586 case NT_VMS_GSTNAM:
16587 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16588 break;
16589 case NT_VMS_IMGID:
16590 printf (_(" Image id: %s\n"), pnote->descdata);
16591 break;
16592 case NT_VMS_LINKID:
16593 printf (_(" Linker id: %s\n"), pnote->descdata);
16594 break;
16595 default:
16596 return FALSE;
16597 }
16598 return TRUE;
16599 }
16600
16601 static bfd_boolean
16602 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
16603 FILE * file,
16604 Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
16605 {
16606 static unsigned long global_offset = 0;
16607 unsigned long i;
16608 unsigned long strtab_size = 0;
16609 char * strtab = NULL;
16610 Elf_Internal_Sym * symtab = NULL;
16611 unsigned long nsyms = 0;
16612 Elf_Internal_Shdr * symsec = NULL;
16613 unsigned int desc_size = is_32bit_elf ? 4 : 8;
16614
16615 if (pnote->descsz == 0)
16616 {
16617 printf (_(" Applies from offset %#lx\n"), global_offset);
16618 return TRUE;
16619 }
16620
16621 if (pnote->descsz != desc_size)
16622 {
16623 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
16624 printf (_(" <invalid descsz>"));
16625 return FALSE;
16626 }
16627
16628 /* Load the symbols. */
16629 for (symsec = section_headers;
16630 symsec < section_headers + elf_header.e_shnum;
16631 symsec ++)
16632 {
16633 if (symsec->sh_type == SHT_SYMTAB)
16634 {
16635 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
16636
16637 if (symsec->sh_link < elf_header.e_shnum)
16638 {
16639 Elf_Internal_Shdr * strtab_sec = section_headers + symsec->sh_link;
16640
16641 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
16642 1, strtab_sec->sh_size,
16643 _("string table"));
16644 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
16645 }
16646 }
16647 }
16648
16649 printf (_(" Applies from offset"));
16650
16651 for (i = 0; i < pnote->descsz; i += desc_size)
16652 {
16653 Elf_Internal_Sym * saved_sym = NULL;
16654 Elf_Internal_Sym * sym;
16655 unsigned long offset;
16656
16657 offset = byte_get ((unsigned char *) pnote->descdata + i, desc_size);
16658
16659 if (i + desc_size == pnote->descsz)
16660 printf (_(" %#lx"), offset);
16661 else
16662 printf (_(" %#lx, "), offset);
16663
16664 if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN)
16665 global_offset = offset;
16666
16667 if (symtab == NULL || strtab == NULL)
16668 continue;
16669
16670 /* Find a symbol whose value matches offset. */
16671 for (sym = symtab; sym < symtab + nsyms; sym ++)
16672 if (sym->st_value == offset)
16673 {
16674 if (sym->st_name < strtab_size)
16675 {
16676 if (strtab[sym->st_name] == 0)
16677 continue;
16678
16679 if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN)
16680 {
16681 /* For OPEN attributes we prefer GLOBAL symbols, if there
16682 is one that matches. But keep a record of a matching
16683 LOCAL symbol, just in case that is all that we can find. */
16684 if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
16685 {
16686 saved_sym = sym;
16687 continue;
16688 }
16689 printf (_(" (file: %s)"), strtab + sym->st_name);
16690 }
16691 else if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
16692 continue;
16693 else
16694 printf (_(" (function: %s)"), strtab + sym->st_name);
16695 break;
16696 }
16697 }
16698
16699 if (sym == symtab + nsyms)
16700 {
16701 if (saved_sym)
16702 printf (_(" (file: %s)"), strtab + saved_sym->st_name);
16703 else
16704 printf (_(" (<symbol name unknown>)"));
16705 }
16706 }
16707
16708 printf ("\n");
16709 return TRUE;
16710 }
16711
16712 static bfd_boolean
16713 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
16714 {
16715 char name_type;
16716 char name_attribute;
16717 char * expected_types;
16718 const char * name = pnote->namedata;
16719 const char * text;
16720 int left;
16721
16722 if (name == NULL || pnote->namesz < 2)
16723 {
16724 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
16725 print_symbol (-20, _(" <corrupt name field>"));
16726 return FALSE;
16727 }
16728
16729 switch ((name_type = * name))
16730 {
16731 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
16732 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
16733 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
16734 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
16735 printf ("%c", * name);
16736 break;
16737 default:
16738 error (_("unrecognised attribute type in name field: %d\n"), name_type);
16739 print_symbol (-20, _("<unknown name type>"));
16740 return FALSE;
16741 }
16742
16743 left = 19;
16744 ++ name;
16745 text = NULL;
16746
16747 switch ((name_attribute = * name))
16748 {
16749 case GNU_BUILD_ATTRIBUTE_VERSION:
16750 text = _("<version>");
16751 expected_types = "$";
16752 ++ name;
16753 break;
16754 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
16755 text = _("<stack prot>");
16756 expected_types = "!+";
16757 ++ name;
16758 break;
16759 case GNU_BUILD_ATTRIBUTE_RELRO:
16760 text = _("<relro>");
16761 expected_types = "!+";
16762 ++ name;
16763 break;
16764 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
16765 text = _("<stack size>");
16766 expected_types = "*";
16767 ++ name;
16768 break;
16769 case GNU_BUILD_ATTRIBUTE_TOOL:
16770 text = _("<tool>");
16771 expected_types = "$";
16772 ++ name;
16773 break;
16774 case GNU_BUILD_ATTRIBUTE_ABI:
16775 text = _("<ABI>");
16776 expected_types = "$*";
16777 ++ name;
16778 break;
16779 case GNU_BUILD_ATTRIBUTE_PIC:
16780 text = _("<PIC>");
16781 expected_types = "*";
16782 ++ name;
16783 break;
16784
16785 default:
16786 if (ISPRINT (* name))
16787 {
16788 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
16789
16790 if (len > left && ! do_wide)
16791 len = left;
16792 printf ("%.*s ", len, name);
16793 left -= len;
16794 name += len + 1;
16795 }
16796 else
16797 {
16798 error (_("unexpected character in name field\n"));
16799 print_symbol (- left, _("<unknown attribute>"));
16800 return 0;
16801 }
16802 expected_types = "*$!+";
16803 break;
16804 }
16805
16806 if (text)
16807 {
16808 printf ("%s", text);
16809 left -= strlen (text);
16810 }
16811
16812 if (strchr (expected_types, name_type) == NULL)
16813 warn (_("attribute does not have the expected type\n"));
16814
16815 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
16816 {
16817 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
16818 (unsigned long) pnote->namesz,
16819 (long) (name - pnote->namedata));
16820 return FALSE;
16821 }
16822
16823 if (left < 1 && ! do_wide)
16824 return TRUE;
16825
16826 switch (name_type)
16827 {
16828 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
16829 {
16830 unsigned int bytes = pnote->namesz - (name - pnote->namedata);
16831 unsigned long val = 0;
16832 unsigned int shift = 0;
16833
16834 while (bytes --)
16835 {
16836 unsigned long byte = (* name ++) & 0xff;
16837
16838 val |= byte << shift;
16839 shift += 8;
16840 }
16841
16842 if (name_attribute == GNU_BUILD_ATTRIBUTE_PIC)
16843 {
16844 char * pic_type = NULL;
16845
16846 switch (val)
16847 {
16848 case 0: pic_type = "static"; break;
16849 case 1: pic_type = "pic"; break;
16850 case 2: pic_type = "PIC"; break;
16851 case 3: pic_type = "pie"; break;
16852 case 4: pic_type = "PIE"; break;
16853 }
16854
16855 if (pic_type != NULL)
16856 {
16857 if (do_wide)
16858 left -= printf ("%s", pic_type);
16859 else
16860 left -= printf ("%-.*s", left, pic_type);
16861 break;
16862 }
16863 }
16864
16865 if (do_wide)
16866 left -= printf ("0x%lx", val);
16867 else
16868 left -= printf ("0x%-.*lx", left, val);
16869 }
16870 break;
16871 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
16872 left -= print_symbol (- left, name);
16873 break;
16874 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
16875 left -= print_symbol (- left, "true");
16876 break;
16877 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
16878 left -= print_symbol (- left, "false");
16879 break;
16880 }
16881
16882 if (do_wide && left > 0)
16883 printf ("%-*s", left, " ");
16884
16885 return TRUE;
16886 }
16887
16888 /* Note that by the ELF standard, the name field is already null byte
16889 terminated, and namesz includes the terminating null byte.
16890 I.E. the value of namesz for the name "FSF" is 4.
16891
16892 If the value of namesz is zero, there is no name present. */
16893
16894 static bfd_boolean
16895 process_note (Elf_Internal_Note * pnote,
16896 FILE * file,
16897 Elf_Internal_Shdr * section)
16898 {
16899 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16900 const char * nt;
16901
16902 if (pnote->namesz == 0)
16903 /* If there is no note name, then use the default set of
16904 note type strings. */
16905 nt = get_note_type (pnote->type);
16906
16907 else if (const_strneq (pnote->namedata, "GNU"))
16908 /* GNU-specific object file notes. */
16909 nt = get_gnu_elf_note_type (pnote->type);
16910
16911 else if (const_strneq (pnote->namedata, "FreeBSD"))
16912 /* FreeBSD-specific core file notes. */
16913 nt = get_freebsd_elfcore_note_type (pnote->type);
16914
16915 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16916 /* NetBSD-specific core file notes. */
16917 nt = get_netbsd_elfcore_note_type (pnote->type);
16918
16919 else if (const_strneq (pnote->namedata, "NetBSD"))
16920 /* NetBSD-specific core file notes. */
16921 return process_netbsd_elf_note (pnote);
16922
16923 else if (strneq (pnote->namedata, "SPU/", 4))
16924 {
16925 /* SPU-specific core file notes. */
16926 nt = pnote->namedata + 4;
16927 name = "SPU";
16928 }
16929
16930 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16931 /* VMS/ia64-specific file notes. */
16932 nt = get_ia64_vms_note_type (pnote->type);
16933
16934 else if (const_strneq (pnote->namedata, "stapsdt"))
16935 nt = get_stapsdt_note_type (pnote->type);
16936
16937 else
16938 /* Don't recognize this note name; just use the default set of
16939 note type strings. */
16940 nt = get_note_type (pnote->type);
16941
16942 printf (" ");
16943
16944 if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
16945 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
16946 print_gnu_build_attribute_name (pnote);
16947 else
16948 print_symbol (-20, name);
16949
16950 if (do_wide)
16951 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
16952 else
16953 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
16954
16955 if (const_strneq (pnote->namedata, "IPF/VMS"))
16956 return print_ia64_vms_note (pnote);
16957 else if (const_strneq (pnote->namedata, "GNU"))
16958 return print_gnu_note (pnote);
16959 else if (const_strneq (pnote->namedata, "stapsdt"))
16960 return print_stapsdt_note (pnote);
16961 else if (const_strneq (pnote->namedata, "CORE"))
16962 return print_core_note (pnote);
16963 else if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
16964 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
16965 return print_gnu_build_attribute_description (pnote, file, section);
16966
16967 if (pnote->descsz)
16968 {
16969 unsigned long i;
16970
16971 printf (_(" description data: "));
16972 for (i = 0; i < pnote->descsz; i++)
16973 printf ("%02x ", pnote->descdata[i]);
16974 }
16975
16976 if (do_wide)
16977 printf ("\n");
16978
16979 return TRUE;
16980 }
16981
16982 static bfd_boolean
16983 process_notes_at (FILE * file,
16984 Elf_Internal_Shdr * section,
16985 bfd_vma offset,
16986 bfd_vma length)
16987 {
16988 Elf_External_Note * pnotes;
16989 Elf_External_Note * external;
16990 char * end;
16991 bfd_boolean res = TRUE;
16992
16993 if (length <= 0)
16994 return FALSE;
16995
16996 if (section)
16997 {
16998 pnotes = (Elf_External_Note *) get_section_contents (section, file);
16999 if (pnotes)
17000 {
17001 if (! apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL))
17002 return FALSE;
17003 }
17004 }
17005 else
17006 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
17007 _("notes"));
17008 if (pnotes == NULL)
17009 return FALSE;
17010
17011 external = pnotes;
17012
17013 if (section)
17014 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
17015 else
17016 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
17017 (unsigned long) offset, (unsigned long) length);
17018
17019 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
17020
17021 end = (char *) pnotes + length;
17022 while ((char *) external < end)
17023 {
17024 Elf_Internal_Note inote;
17025 size_t min_notesz;
17026 char *next;
17027 char * temp = NULL;
17028 size_t data_remaining = end - (char *) external;
17029
17030 if (!is_ia64_vms ())
17031 {
17032 /* PR binutils/15191
17033 Make sure that there is enough data to read. */
17034 min_notesz = offsetof (Elf_External_Note, name);
17035 if (data_remaining < min_notesz)
17036 {
17037 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
17038 (int) data_remaining);
17039 break;
17040 }
17041 inote.type = BYTE_GET (external->type);
17042 inote.namesz = BYTE_GET (external->namesz);
17043 inote.namedata = external->name;
17044 inote.descsz = BYTE_GET (external->descsz);
17045 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
17046 /* PR 17531: file: 3443835e. */
17047 if (inote.descdata < (char *) pnotes || inote.descdata > end)
17048 {
17049 warn (_("Corrupt note: name size is too big: (got: %lx, expected no more than: %lx)\n"),
17050 inote.namesz, (long)(end - inote.namedata));
17051 inote.descdata = inote.namedata;
17052 inote.namesz = 0;
17053 }
17054
17055 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17056 next = inote.descdata + align_power (inote.descsz, 2);
17057 }
17058 else
17059 {
17060 Elf64_External_VMS_Note *vms_external;
17061
17062 /* PR binutils/15191
17063 Make sure that there is enough data to read. */
17064 min_notesz = offsetof (Elf64_External_VMS_Note, name);
17065 if (data_remaining < min_notesz)
17066 {
17067 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
17068 (int) data_remaining);
17069 break;
17070 }
17071
17072 vms_external = (Elf64_External_VMS_Note *) external;
17073 inote.type = BYTE_GET (vms_external->type);
17074 inote.namesz = BYTE_GET (vms_external->namesz);
17075 inote.namedata = vms_external->name;
17076 inote.descsz = BYTE_GET (vms_external->descsz);
17077 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
17078 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17079 next = inote.descdata + align_power (inote.descsz, 3);
17080 }
17081
17082 if (inote.descdata < (char *) external + min_notesz
17083 || next < (char *) external + min_notesz
17084 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
17085 || inote.namedata + inote.namesz < inote.namedata
17086 || inote.descdata + inote.descsz < inote.descdata
17087 || data_remaining < (size_t)(next - (char *) external))
17088 {
17089 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
17090 (unsigned long) ((char *) external - (char *) pnotes));
17091 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
17092 inote.type, inote.namesz, inote.descsz);
17093 break;
17094 }
17095
17096 external = (Elf_External_Note *) next;
17097
17098 /* Verify that name is null terminated. It appears that at least
17099 one version of Linux (RedHat 6.0) generates corefiles that don't
17100 comply with the ELF spec by failing to include the null byte in
17101 namesz. */
17102 if (inote.namedata[inote.namesz - 1] != '\0')
17103 {
17104 temp = (char *) malloc (inote.namesz + 1);
17105 if (temp == NULL)
17106 {
17107 error (_("Out of memory allocating space for inote name\n"));
17108 res = FALSE;
17109 break;
17110 }
17111
17112 memcpy (temp, inote.namedata, inote.namesz);
17113 temp[inote.namesz] = 0;
17114
17115 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
17116 inote.namedata = temp;
17117 }
17118
17119 if (! process_note (& inote, file, section))
17120 res = FALSE;
17121
17122 if (temp != NULL)
17123 {
17124 free (temp);
17125 temp = NULL;
17126 }
17127 }
17128
17129 free (pnotes);
17130
17131 return res;
17132 }
17133
17134 static bfd_boolean
17135 process_corefile_note_segments (FILE * file)
17136 {
17137 Elf_Internal_Phdr * segment;
17138 unsigned int i;
17139 bfd_boolean res = TRUE;
17140
17141 if (! get_program_headers (file))
17142 return TRUE;
17143
17144 for (i = 0, segment = program_headers;
17145 i < elf_header.e_phnum;
17146 i++, segment++)
17147 {
17148 if (segment->p_type == PT_NOTE)
17149 if (! process_notes_at (file, NULL,
17150 (bfd_vma) segment->p_offset,
17151 (bfd_vma) segment->p_filesz))
17152 res = FALSE;
17153 }
17154
17155 return res;
17156 }
17157
17158 static bfd_boolean
17159 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
17160 {
17161 Elf_External_Note * pnotes;
17162 Elf_External_Note * external;
17163 char * end;
17164 bfd_boolean res = TRUE;
17165
17166 if (length <= 0)
17167 return FALSE;
17168
17169 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
17170 _("v850 notes"));
17171 if (pnotes == NULL)
17172 return FALSE;
17173
17174 external = pnotes;
17175 end = (char*) pnotes + length;
17176
17177 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
17178 (unsigned long) offset, (unsigned long) length);
17179
17180 while ((char *) external + sizeof (Elf_External_Note) < end)
17181 {
17182 Elf_External_Note * next;
17183 Elf_Internal_Note inote;
17184
17185 inote.type = BYTE_GET (external->type);
17186 inote.namesz = BYTE_GET (external->namesz);
17187 inote.namedata = external->name;
17188 inote.descsz = BYTE_GET (external->descsz);
17189 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
17190 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17191
17192 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
17193 {
17194 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
17195 inote.descdata = inote.namedata;
17196 inote.namesz = 0;
17197 }
17198
17199 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
17200
17201 if ( ((char *) next > end)
17202 || ((char *) next < (char *) pnotes))
17203 {
17204 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
17205 (unsigned long) ((char *) external - (char *) pnotes));
17206 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
17207 inote.type, inote.namesz, inote.descsz);
17208 break;
17209 }
17210
17211 external = next;
17212
17213 /* Prevent out-of-bounds indexing. */
17214 if ( inote.namedata + inote.namesz > end
17215 || inote.namedata + inote.namesz < inote.namedata)
17216 {
17217 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
17218 (unsigned long) ((char *) external - (char *) pnotes));
17219 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
17220 inote.type, inote.namesz, inote.descsz);
17221 break;
17222 }
17223
17224 printf (" %s: ", get_v850_elf_note_type (inote.type));
17225
17226 if (! print_v850_note (& inote))
17227 {
17228 res = FALSE;
17229 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
17230 inote.namesz, inote.descsz);
17231 }
17232 }
17233
17234 free (pnotes);
17235
17236 return res;
17237 }
17238
17239 static bfd_boolean
17240 process_note_sections (FILE * file)
17241 {
17242 Elf_Internal_Shdr * section;
17243 unsigned long i;
17244 unsigned int n = 0;
17245 bfd_boolean res = TRUE;
17246
17247 for (i = 0, section = section_headers;
17248 i < elf_header.e_shnum && section != NULL;
17249 i++, section++)
17250 {
17251 if (section->sh_type == SHT_NOTE)
17252 {
17253 if (! process_notes_at (file, section,
17254 (bfd_vma) section->sh_offset,
17255 (bfd_vma) section->sh_size))
17256 res = FALSE;
17257 n++;
17258 }
17259
17260 if (( elf_header.e_machine == EM_V800
17261 || elf_header.e_machine == EM_V850
17262 || elf_header.e_machine == EM_CYGNUS_V850)
17263 && section->sh_type == SHT_RENESAS_INFO)
17264 {
17265 if (! process_v850_notes (file,
17266 (bfd_vma) section->sh_offset,
17267 (bfd_vma) section->sh_size))
17268 res = FALSE;
17269 n++;
17270 }
17271 }
17272
17273 if (n == 0)
17274 /* Try processing NOTE segments instead. */
17275 return process_corefile_note_segments (file);
17276
17277 return res;
17278 }
17279
17280 static bfd_boolean
17281 process_notes (FILE * file)
17282 {
17283 /* If we have not been asked to display the notes then do nothing. */
17284 if (! do_notes)
17285 return TRUE;
17286
17287 if (elf_header.e_type != ET_CORE)
17288 return process_note_sections (file);
17289
17290 /* No program headers means no NOTE segment. */
17291 if (elf_header.e_phnum > 0)
17292 return process_corefile_note_segments (file);
17293
17294 printf (_("No note segments present in the core file.\n"));
17295 return TRUE;
17296 }
17297
17298 static unsigned char *
17299 display_public_gnu_attributes (unsigned char * start,
17300 const unsigned char * const end)
17301 {
17302 printf (_(" Unknown GNU attribute: %s\n"), start);
17303
17304 start += strnlen ((char *) start, end - start);
17305 display_raw_attribute (start, end);
17306
17307 return (unsigned char *) end;
17308 }
17309
17310 static unsigned char *
17311 display_generic_attribute (unsigned char * start,
17312 unsigned int tag,
17313 const unsigned char * const end)
17314 {
17315 if (tag == 0)
17316 return (unsigned char *) end;
17317
17318 return display_tag_value (tag, start, end);
17319 }
17320
17321 static bfd_boolean
17322 process_arch_specific (FILE * file)
17323 {
17324 if (! do_arch)
17325 return TRUE;
17326
17327 switch (elf_header.e_machine)
17328 {
17329 case EM_ARM:
17330 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
17331 display_arm_attribute,
17332 display_generic_attribute);
17333
17334 case EM_MIPS:
17335 case EM_MIPS_RS3_LE:
17336 return process_mips_specific (file);
17337
17338 case EM_MSP430:
17339 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
17340 display_msp430x_attribute,
17341 display_generic_attribute);
17342
17343 case EM_NDS32:
17344 return process_nds32_specific (file);
17345
17346 case EM_PPC:
17347 case EM_PPC64:
17348 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17349 display_power_gnu_attribute);
17350
17351 case EM_S390:
17352 case EM_S390_OLD:
17353 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17354 display_s390_gnu_attribute);
17355
17356 case EM_SPARC:
17357 case EM_SPARC32PLUS:
17358 case EM_SPARCV9:
17359 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17360 display_sparc_gnu_attribute);
17361
17362 case EM_TI_C6000:
17363 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
17364 display_tic6x_attribute,
17365 display_generic_attribute);
17366
17367 default:
17368 return process_attributes (file, "gnu", SHT_GNU_ATTRIBUTES,
17369 display_public_gnu_attributes,
17370 display_generic_attribute);
17371 }
17372 }
17373
17374 static bfd_boolean
17375 get_file_header (FILE * file)
17376 {
17377 /* Read in the identity array. */
17378 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
17379 return FALSE;
17380
17381 /* Determine how to read the rest of the header. */
17382 switch (elf_header.e_ident[EI_DATA])
17383 {
17384 default:
17385 case ELFDATANONE:
17386 case ELFDATA2LSB:
17387 byte_get = byte_get_little_endian;
17388 byte_put = byte_put_little_endian;
17389 break;
17390 case ELFDATA2MSB:
17391 byte_get = byte_get_big_endian;
17392 byte_put = byte_put_big_endian;
17393 break;
17394 }
17395
17396 /* For now we only support 32 bit and 64 bit ELF files. */
17397 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
17398
17399 /* Read in the rest of the header. */
17400 if (is_32bit_elf)
17401 {
17402 Elf32_External_Ehdr ehdr32;
17403
17404 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
17405 return FALSE;
17406
17407 elf_header.e_type = BYTE_GET (ehdr32.e_type);
17408 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
17409 elf_header.e_version = BYTE_GET (ehdr32.e_version);
17410 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
17411 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
17412 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
17413 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
17414 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
17415 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
17416 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
17417 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
17418 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
17419 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
17420 }
17421 else
17422 {
17423 Elf64_External_Ehdr ehdr64;
17424
17425 /* If we have been compiled with sizeof (bfd_vma) == 4, then
17426 we will not be able to cope with the 64bit data found in
17427 64 ELF files. Detect this now and abort before we start
17428 overwriting things. */
17429 if (sizeof (bfd_vma) < 8)
17430 {
17431 error (_("This instance of readelf has been built without support for a\n\
17432 64 bit data type and so it cannot read 64 bit ELF files.\n"));
17433 return FALSE;
17434 }
17435
17436 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
17437 return FALSE;
17438
17439 elf_header.e_type = BYTE_GET (ehdr64.e_type);
17440 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
17441 elf_header.e_version = BYTE_GET (ehdr64.e_version);
17442 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
17443 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
17444 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
17445 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
17446 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
17447 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
17448 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
17449 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
17450 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
17451 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
17452 }
17453
17454 if (elf_header.e_shoff)
17455 {
17456 /* There may be some extensions in the first section header. Don't
17457 bomb if we can't read it. */
17458 if (is_32bit_elf)
17459 get_32bit_section_headers (file, TRUE);
17460 else
17461 get_64bit_section_headers (file, TRUE);
17462 }
17463
17464 return TRUE;
17465 }
17466
17467 /* Process one ELF object file according to the command line options.
17468 This file may actually be stored in an archive. The file is
17469 positioned at the start of the ELF object. Returns TRUE if no
17470 problems were encountered, FALSE otherwise. */
17471
17472 static bfd_boolean
17473 process_object (char * file_name, FILE * file)
17474 {
17475 unsigned int i;
17476 bfd_boolean res = TRUE;
17477
17478 if (! get_file_header (file))
17479 {
17480 error (_("%s: Failed to read file header\n"), file_name);
17481 return FALSE;
17482 }
17483
17484 /* Initialise per file variables. */
17485 for (i = ARRAY_SIZE (version_info); i--;)
17486 version_info[i] = 0;
17487
17488 for (i = ARRAY_SIZE (dynamic_info); i--;)
17489 dynamic_info[i] = 0;
17490 dynamic_info_DT_GNU_HASH = 0;
17491
17492 /* Process the file. */
17493 if (show_name)
17494 printf (_("\nFile: %s\n"), file_name);
17495
17496 /* Initialise the dump_sects array from the cmdline_dump_sects array.
17497 Note we do this even if cmdline_dump_sects is empty because we
17498 must make sure that the dump_sets array is zeroed out before each
17499 object file is processed. */
17500 if (num_dump_sects > num_cmdline_dump_sects)
17501 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
17502
17503 if (num_cmdline_dump_sects > 0)
17504 {
17505 if (num_dump_sects == 0)
17506 /* A sneaky way of allocating the dump_sects array. */
17507 request_dump_bynumber (num_cmdline_dump_sects, 0);
17508
17509 assert (num_dump_sects >= num_cmdline_dump_sects);
17510 memcpy (dump_sects, cmdline_dump_sects,
17511 num_cmdline_dump_sects * sizeof (* dump_sects));
17512 }
17513
17514 if (! process_file_header ())
17515 return FALSE;
17516
17517 if (! process_section_headers (file))
17518 {
17519 /* Without loaded section headers we cannot process lots of things. */
17520 do_unwind = do_version = do_dump = do_arch = FALSE;
17521
17522 if (! do_using_dynamic)
17523 do_syms = do_dyn_syms = do_reloc = FALSE;
17524 }
17525
17526 if (! process_section_groups (file))
17527 /* Without loaded section groups we cannot process unwind. */
17528 do_unwind = FALSE;
17529
17530 if (process_program_headers (file))
17531 process_dynamic_section (file);
17532 else
17533 res = FALSE;
17534
17535 if (! process_relocs (file))
17536 res = FALSE;
17537
17538 if (! process_unwind (file))
17539 res = FALSE;
17540
17541 if (! process_symbol_table (file))
17542 res = FALSE;
17543
17544 if (! process_syminfo (file))
17545 res = FALSE;
17546
17547 if (! process_version_sections (file))
17548 res = FALSE;
17549
17550 if (! process_section_contents (file))
17551 res = FALSE;
17552
17553 if (! process_notes (file))
17554 res = FALSE;
17555
17556 if (! process_gnu_liblist (file))
17557 res = FALSE;
17558
17559 if (! process_arch_specific (file))
17560 res = FALSE;
17561
17562 if (program_headers)
17563 {
17564 free (program_headers);
17565 program_headers = NULL;
17566 }
17567
17568 if (section_headers)
17569 {
17570 free (section_headers);
17571 section_headers = NULL;
17572 }
17573
17574 if (string_table)
17575 {
17576 free (string_table);
17577 string_table = NULL;
17578 string_table_length = 0;
17579 }
17580
17581 if (dynamic_strings)
17582 {
17583 free (dynamic_strings);
17584 dynamic_strings = NULL;
17585 dynamic_strings_length = 0;
17586 }
17587
17588 if (dynamic_symbols)
17589 {
17590 free (dynamic_symbols);
17591 dynamic_symbols = NULL;
17592 num_dynamic_syms = 0;
17593 }
17594
17595 if (dynamic_syminfo)
17596 {
17597 free (dynamic_syminfo);
17598 dynamic_syminfo = NULL;
17599 }
17600
17601 if (dynamic_section)
17602 {
17603 free (dynamic_section);
17604 dynamic_section = NULL;
17605 }
17606
17607 if (section_headers_groups)
17608 {
17609 free (section_headers_groups);
17610 section_headers_groups = NULL;
17611 }
17612
17613 if (section_groups)
17614 {
17615 struct group_list * g;
17616 struct group_list * next;
17617
17618 for (i = 0; i < group_count; i++)
17619 {
17620 for (g = section_groups [i].root; g != NULL; g = next)
17621 {
17622 next = g->next;
17623 free (g);
17624 }
17625 }
17626
17627 free (section_groups);
17628 section_groups = NULL;
17629 }
17630
17631 free_debug_memory ();
17632
17633 return res;
17634 }
17635
17636 /* Process an ELF archive.
17637 On entry the file is positioned just after the ARMAG string.
17638 Returns TRUE upon success, FALSE otherwise. */
17639
17640 static bfd_boolean
17641 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
17642 {
17643 struct archive_info arch;
17644 struct archive_info nested_arch;
17645 size_t got;
17646 bfd_boolean ret = TRUE;
17647
17648 show_name = TRUE;
17649
17650 /* The ARCH structure is used to hold information about this archive. */
17651 arch.file_name = NULL;
17652 arch.file = NULL;
17653 arch.index_array = NULL;
17654 arch.sym_table = NULL;
17655 arch.longnames = NULL;
17656
17657 /* The NESTED_ARCH structure is used as a single-item cache of information
17658 about a nested archive (when members of a thin archive reside within
17659 another regular archive file). */
17660 nested_arch.file_name = NULL;
17661 nested_arch.file = NULL;
17662 nested_arch.index_array = NULL;
17663 nested_arch.sym_table = NULL;
17664 nested_arch.longnames = NULL;
17665
17666 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
17667 {
17668 ret = FALSE;
17669 goto out;
17670 }
17671
17672 if (do_archive_index)
17673 {
17674 if (arch.sym_table == NULL)
17675 error (_("%s: unable to dump the index as none was found\n"), file_name);
17676 else
17677 {
17678 unsigned long i, l;
17679 unsigned long current_pos;
17680
17681 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
17682 file_name, (unsigned long) arch.index_num, arch.sym_size);
17683 current_pos = ftell (file);
17684
17685 for (i = l = 0; i < arch.index_num; i++)
17686 {
17687 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
17688 {
17689 char * member_name;
17690
17691 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
17692
17693 if (member_name != NULL)
17694 {
17695 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
17696
17697 if (qualified_name != NULL)
17698 {
17699 printf (_("Contents of binary %s at offset "), qualified_name);
17700 (void) print_vma (arch.index_array[i], PREFIX_HEX);
17701 putchar ('\n');
17702 free (qualified_name);
17703 }
17704 }
17705 }
17706
17707 if (l >= arch.sym_size)
17708 {
17709 error (_("%s: end of the symbol table reached before the end of the index\n"),
17710 file_name);
17711 ret = FALSE;
17712 break;
17713 }
17714 /* PR 17531: file: 0b6630b2. */
17715 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
17716 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
17717 }
17718
17719 if (arch.uses_64bit_indicies)
17720 l = (l + 7) & ~ 7;
17721 else
17722 l += l & 1;
17723
17724 if (l < arch.sym_size)
17725 {
17726 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
17727 file_name, arch.sym_size - l);
17728 ret = FALSE;
17729 }
17730
17731 if (fseek (file, current_pos, SEEK_SET) != 0)
17732 {
17733 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
17734 ret = FALSE;
17735 goto out;
17736 }
17737 }
17738
17739 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
17740 && !do_segments && !do_header && !do_dump && !do_version
17741 && !do_histogram && !do_debugging && !do_arch && !do_notes
17742 && !do_section_groups && !do_dyn_syms)
17743 {
17744 ret = TRUE; /* Archive index only. */
17745 goto out;
17746 }
17747 }
17748
17749 while (1)
17750 {
17751 char * name;
17752 size_t namelen;
17753 char * qualified_name;
17754
17755 /* Read the next archive header. */
17756 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
17757 {
17758 error (_("%s: failed to seek to next archive header\n"), file_name);
17759 return FALSE;
17760 }
17761 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
17762 if (got != sizeof arch.arhdr)
17763 {
17764 if (got == 0)
17765 break;
17766 error (_("%s: failed to read archive header\n"), file_name);
17767 ret = FALSE;
17768 break;
17769 }
17770 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
17771 {
17772 error (_("%s: did not find a valid archive header\n"), arch.file_name);
17773 ret = FALSE;
17774 break;
17775 }
17776
17777 arch.next_arhdr_offset += sizeof arch.arhdr;
17778
17779 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
17780 if (archive_file_size & 01)
17781 ++archive_file_size;
17782
17783 name = get_archive_member_name (&arch, &nested_arch);
17784 if (name == NULL)
17785 {
17786 error (_("%s: bad archive file name\n"), file_name);
17787 ret = FALSE;
17788 break;
17789 }
17790 namelen = strlen (name);
17791
17792 qualified_name = make_qualified_name (&arch, &nested_arch, name);
17793 if (qualified_name == NULL)
17794 {
17795 error (_("%s: bad archive file name\n"), file_name);
17796 ret = FALSE;
17797 break;
17798 }
17799
17800 if (is_thin_archive && arch.nested_member_origin == 0)
17801 {
17802 /* This is a proxy for an external member of a thin archive. */
17803 FILE * member_file;
17804 char * member_file_name = adjust_relative_path (file_name, name, namelen);
17805
17806 if (member_file_name == NULL)
17807 {
17808 ret = FALSE;
17809 break;
17810 }
17811
17812 member_file = fopen (member_file_name, "rb");
17813 if (member_file == NULL)
17814 {
17815 error (_("Input file '%s' is not readable.\n"), member_file_name);
17816 free (member_file_name);
17817 ret = FALSE;
17818 break;
17819 }
17820
17821 archive_file_offset = arch.nested_member_origin;
17822
17823 if (! process_object (qualified_name, member_file))
17824 ret = FALSE;
17825
17826 fclose (member_file);
17827 free (member_file_name);
17828 }
17829 else if (is_thin_archive)
17830 {
17831 /* PR 15140: Allow for corrupt thin archives. */
17832 if (nested_arch.file == NULL)
17833 {
17834 error (_("%s: contains corrupt thin archive: %s\n"),
17835 file_name, name);
17836 ret = FALSE;
17837 break;
17838 }
17839
17840 /* This is a proxy for a member of a nested archive. */
17841 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17842
17843 /* The nested archive file will have been opened and setup by
17844 get_archive_member_name. */
17845 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17846 {
17847 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17848 ret = FALSE;
17849 break;
17850 }
17851
17852 if (! process_object (qualified_name, nested_arch.file))
17853 ret = FALSE;
17854 }
17855 else
17856 {
17857 archive_file_offset = arch.next_arhdr_offset;
17858 arch.next_arhdr_offset += archive_file_size;
17859
17860 if (! process_object (qualified_name, file))
17861 ret = FALSE;
17862 }
17863
17864 if (dump_sects != NULL)
17865 {
17866 free (dump_sects);
17867 dump_sects = NULL;
17868 num_dump_sects = 0;
17869 }
17870
17871 free (qualified_name);
17872 }
17873
17874 out:
17875 if (nested_arch.file != NULL)
17876 fclose (nested_arch.file);
17877 release_archive (&nested_arch);
17878 release_archive (&arch);
17879
17880 return ret;
17881 }
17882
17883 static bfd_boolean
17884 process_file (char * file_name)
17885 {
17886 FILE * file;
17887 struct stat statbuf;
17888 char armag[SARMAG];
17889 bfd_boolean ret = TRUE;
17890
17891 if (stat (file_name, &statbuf) < 0)
17892 {
17893 if (errno == ENOENT)
17894 error (_("'%s': No such file\n"), file_name);
17895 else
17896 error (_("Could not locate '%s'. System error message: %s\n"),
17897 file_name, strerror (errno));
17898 return FALSE;
17899 }
17900
17901 if (! S_ISREG (statbuf.st_mode))
17902 {
17903 error (_("'%s' is not an ordinary file\n"), file_name);
17904 return FALSE;
17905 }
17906
17907 file = fopen (file_name, "rb");
17908 if (file == NULL)
17909 {
17910 error (_("Input file '%s' is not readable.\n"), file_name);
17911 return FALSE;
17912 }
17913
17914 if (fread (armag, SARMAG, 1, file) != 1)
17915 {
17916 error (_("%s: Failed to read file's magic number\n"), file_name);
17917 fclose (file);
17918 return FALSE;
17919 }
17920
17921 current_file_size = (bfd_size_type) statbuf.st_size;
17922
17923 if (memcmp (armag, ARMAG, SARMAG) == 0)
17924 {
17925 if (! process_archive (file_name, file, FALSE))
17926 ret = FALSE;
17927 }
17928 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17929 {
17930 if ( ! process_archive (file_name, file, TRUE))
17931 ret = FALSE;
17932 }
17933 else
17934 {
17935 if (do_archive_index)
17936 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17937 file_name);
17938
17939 rewind (file);
17940 archive_file_size = archive_file_offset = 0;
17941
17942 if (! process_object (file_name, file))
17943 ret = FALSE;
17944 }
17945
17946 fclose (file);
17947 current_file_size = 0;
17948
17949 return ret;
17950 }
17951
17952 #ifdef SUPPORT_DISASSEMBLY
17953 /* Needed by the i386 disassembler. For extra credit, someone could
17954 fix this so that we insert symbolic addresses here, esp for GOT/PLT
17955 symbols. */
17956
17957 void
17958 print_address (unsigned int addr, FILE * outfile)
17959 {
17960 fprintf (outfile,"0x%8.8x", addr);
17961 }
17962
17963 /* Needed by the i386 disassembler. */
17964 void
17965 db_task_printsym (unsigned int addr)
17966 {
17967 print_address (addr, stderr);
17968 }
17969 #endif
17970
17971 int
17972 main (int argc, char ** argv)
17973 {
17974 int err;
17975
17976 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17977 setlocale (LC_MESSAGES, "");
17978 #endif
17979 #if defined (HAVE_SETLOCALE)
17980 setlocale (LC_CTYPE, "");
17981 #endif
17982 bindtextdomain (PACKAGE, LOCALEDIR);
17983 textdomain (PACKAGE);
17984
17985 expandargv (&argc, &argv);
17986
17987 parse_args (argc, argv);
17988
17989 if (num_dump_sects > 0)
17990 {
17991 /* Make a copy of the dump_sects array. */
17992 cmdline_dump_sects = (dump_type *)
17993 malloc (num_dump_sects * sizeof (* dump_sects));
17994 if (cmdline_dump_sects == NULL)
17995 error (_("Out of memory allocating dump request table.\n"));
17996 else
17997 {
17998 memcpy (cmdline_dump_sects, dump_sects,
17999 num_dump_sects * sizeof (* dump_sects));
18000 num_cmdline_dump_sects = num_dump_sects;
18001 }
18002 }
18003
18004 if (optind < (argc - 1))
18005 show_name = TRUE;
18006 else if (optind >= argc)
18007 {
18008 warn (_("Nothing to do.\n"));
18009 usage (stderr);
18010 }
18011
18012 err = FALSE;
18013 while (optind < argc)
18014 if (! process_file (argv[optind++]))
18015 err = TRUE;
18016
18017 if (dump_sects != NULL)
18018 free (dump_sects);
18019 if (cmdline_dump_sects != NULL)
18020 free (cmdline_dump_sects);
18021
18022 return err ? EXIT_FAILURE : EXIT_SUCCESS;
18023 }
This page took 0.463352 seconds and 5 git commands to generate.