Fix the loading of the dynamic string table in a file without sections.
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h. */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/ia64.h"
113 #include "elf/ip2k.h"
114 #include "elf/lm32.h"
115 #include "elf/iq2000.h"
116 #include "elf/m32c.h"
117 #include "elf/m32r.h"
118 #include "elf/m68k.h"
119 #include "elf/m68hc11.h"
120 #include "elf/mcore.h"
121 #include "elf/mep.h"
122 #include "elf/metag.h"
123 #include "elf/microblaze.h"
124 #include "elf/mips.h"
125 #include "elf/mmix.h"
126 #include "elf/mn10200.h"
127 #include "elf/mn10300.h"
128 #include "elf/moxie.h"
129 #include "elf/mt.h"
130 #include "elf/msp430.h"
131 #include "elf/nds32.h"
132 #include "elf/nios2.h"
133 #include "elf/or1k.h"
134 #include "elf/pj.h"
135 #include "elf/ppc.h"
136 #include "elf/ppc64.h"
137 #include "elf/pru.h"
138 #include "elf/riscv.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/wasm32.h"
153 #include "elf/x86-64.h"
154 #include "elf/xc16x.h"
155 #include "elf/xgate.h"
156 #include "elf/xstormy16.h"
157 #include "elf/xtensa.h"
158
159 #include "getopt.h"
160 #include "libiberty.h"
161 #include "safe-ctype.h"
162 #include "filenames.h"
163
164 #ifndef offsetof
165 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166 #endif
167
168 typedef struct elf_section_list
169 {
170 Elf_Internal_Shdr * hdr;
171 struct elf_section_list * next;
172 } elf_section_list;
173
174 /* Flag bits indicating particular types of dump. */
175 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
176 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
177 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
178 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
179 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
180
181 typedef unsigned char dump_type;
182
183 /* A linked list of the section names for which dumps were requested. */
184 struct dump_list_entry
185 {
186 char * name;
187 dump_type type;
188 struct dump_list_entry * next;
189 };
190
191 typedef struct filedata
192 {
193 const char * file_name;
194 FILE * handle;
195 bfd_size_type file_size;
196 Elf_Internal_Ehdr file_header;
197 Elf_Internal_Shdr * section_headers;
198 Elf_Internal_Phdr * program_headers;
199 char * string_table;
200 unsigned long string_table_length;
201 /* A dynamic array of flags indicating for which sections a dump of
202 some kind has been requested. It is reset on a per-object file
203 basis and then initialised from the cmdline_dump_sects array,
204 the results of interpreting the -w switch, and the
205 dump_sects_byname list. */
206 dump_type * dump_sects;
207 unsigned int num_dump_sects;
208 } Filedata;
209
210 char * program_name = "readelf";
211
212 static unsigned long archive_file_offset;
213 static unsigned long archive_file_size;
214 static unsigned long dynamic_addr;
215 static bfd_size_type dynamic_size;
216 static size_t dynamic_nent;
217 static char * dynamic_strings;
218 static unsigned long dynamic_strings_length;
219 static unsigned long num_dynamic_syms;
220 static Elf_Internal_Sym * dynamic_symbols;
221 static Elf_Internal_Syminfo * dynamic_syminfo;
222 static unsigned long dynamic_syminfo_offset;
223 static unsigned int dynamic_syminfo_nent;
224 static char program_interpreter[PATH_MAX];
225 static bfd_vma dynamic_info[DT_ENCODING];
226 static bfd_vma dynamic_info_DT_GNU_HASH;
227 static bfd_vma version_info[16];
228 static Elf_Internal_Dyn * dynamic_section;
229 static elf_section_list * symtab_shndx_list;
230 static bfd_boolean show_name = FALSE;
231 static bfd_boolean do_dynamic = FALSE;
232 static bfd_boolean do_syms = FALSE;
233 static bfd_boolean do_dyn_syms = FALSE;
234 static bfd_boolean do_reloc = FALSE;
235 static bfd_boolean do_sections = FALSE;
236 static bfd_boolean do_section_groups = FALSE;
237 static bfd_boolean do_section_details = FALSE;
238 static bfd_boolean do_segments = FALSE;
239 static bfd_boolean do_unwind = FALSE;
240 static bfd_boolean do_using_dynamic = FALSE;
241 static bfd_boolean do_header = FALSE;
242 static bfd_boolean do_dump = FALSE;
243 static bfd_boolean do_version = FALSE;
244 static bfd_boolean do_histogram = FALSE;
245 static bfd_boolean do_debugging = FALSE;
246 static bfd_boolean do_arch = FALSE;
247 static bfd_boolean do_notes = FALSE;
248 static bfd_boolean do_archive_index = FALSE;
249 static bfd_boolean is_32bit_elf = FALSE;
250 static bfd_boolean decompress_dumps = FALSE;
251
252 struct group_list
253 {
254 struct group_list * next;
255 unsigned int section_index;
256 };
257
258 struct group
259 {
260 struct group_list * root;
261 unsigned int group_index;
262 };
263
264 static size_t group_count;
265 static struct group * section_groups;
266 static struct group ** section_headers_groups;
267
268 /* A dynamic array of flags indicating for which sections a dump
269 has been requested via command line switches. */
270 static Filedata cmdline;
271
272 static struct dump_list_entry * dump_sects_byname;
273
274 /* How to print a vma value. */
275 typedef enum print_mode
276 {
277 HEX,
278 DEC,
279 DEC_5,
280 UNSIGNED,
281 PREFIX_HEX,
282 FULL_HEX,
283 LONG_HEX
284 }
285 print_mode;
286
287 /* Versioned symbol info. */
288 enum versioned_symbol_info
289 {
290 symbol_undefined,
291 symbol_hidden,
292 symbol_public
293 };
294
295 static const char * get_symbol_version_string
296 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
297 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
298
299 #define UNKNOWN -1
300
301 #define SECTION_NAME(X) \
302 ((X) == NULL ? _("<none>") \
303 : filedata->string_table == NULL ? _("<no-strings>") \
304 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
305 : filedata->string_table + (X)->sh_name))
306
307 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
308
309 #define GET_ELF_SYMBOLS(file, section, sym_count) \
310 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
311 : get_64bit_elf_symbols (file, section, sym_count))
312
313 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
314 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
315 already been called and verified that the string exists. */
316 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
317
318 #define REMOVE_ARCH_BITS(ADDR) \
319 do \
320 { \
321 if (filedata->file_header.e_machine == EM_ARM) \
322 (ADDR) &= ~1; \
323 } \
324 while (0)
325 \f
326 /* Print a BFD_VMA to an internal buffer, for use in error messages.
327 BFD_FMA_FMT can't be used in translated strings. */
328
329 static const char *
330 bfd_vmatoa (char *fmtch, bfd_vma value)
331 {
332 /* bfd_vmatoa is used more then once in a printf call for output.
333 Cycle through an array of buffers. */
334 static int buf_pos = 0;
335 static struct bfd_vmatoa_buf
336 {
337 char place[64];
338 } buf[4];
339 char *ret;
340 char fmt[32];
341
342 ret = buf[buf_pos++].place;
343 buf_pos %= ARRAY_SIZE (buf);
344
345 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
346 snprintf (ret, sizeof (buf[0].place), fmt, value);
347 return ret;
348 }
349
350 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
351 OFFSET + the offset of the current archive member, if we are examining an
352 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
353 allocate a buffer using malloc and fill that. In either case return the
354 pointer to the start of the retrieved data or NULL if something went wrong.
355 If something does go wrong and REASON is not NULL then emit an error
356 message using REASON as part of the context. */
357
358 static void *
359 get_data (void * var,
360 Filedata * filedata,
361 unsigned long offset,
362 bfd_size_type size,
363 bfd_size_type nmemb,
364 const char * reason)
365 {
366 void * mvar;
367 bfd_size_type amt = size * nmemb;
368
369 if (size == 0 || nmemb == 0)
370 return NULL;
371
372 /* If the size_t type is smaller than the bfd_size_type, eg because
373 you are building a 32-bit tool on a 64-bit host, then make sure
374 that when the sizes are cast to (size_t) no information is lost. */
375 if (sizeof (size_t) < sizeof (bfd_size_type)
376 && ( (bfd_size_type) ((size_t) size) != size
377 || (bfd_size_type) ((size_t) nmemb) != nmemb))
378 {
379 if (reason)
380 error (_("Size truncation prevents reading %s"
381 " elements of size %s for %s\n"),
382 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
383 return NULL;
384 }
385
386 /* Check for size overflow. */
387 if (amt < nmemb)
388 {
389 if (reason)
390 error (_("Size overflow prevents reading %s"
391 " elements of size %s for %s\n"),
392 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
393 return NULL;
394 }
395
396 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
397 attempting to allocate memory when the read is bound to fail. */
398 if (amt > filedata->file_size
399 || offset + archive_file_offset + amt > filedata->file_size)
400 {
401 if (reason)
402 error (_("Reading %s bytes extends past end of file for %s\n"),
403 bfd_vmatoa ("u", amt), reason);
404 return NULL;
405 }
406
407 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
408 {
409 if (reason)
410 error (_("Unable to seek to 0x%lx for %s\n"),
411 archive_file_offset + offset, reason);
412 return NULL;
413 }
414
415 mvar = var;
416 if (mvar == NULL)
417 {
418 /* Check for overflow. */
419 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
420 /* + 1 so that we can '\0' terminate invalid string table sections. */
421 mvar = malloc ((size_t) amt + 1);
422
423 if (mvar == NULL)
424 {
425 if (reason)
426 error (_("Out of memory allocating %s bytes for %s\n"),
427 bfd_vmatoa ("u", amt), reason);
428 return NULL;
429 }
430
431 ((char *) mvar)[amt] = '\0';
432 }
433
434 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
435 {
436 if (reason)
437 error (_("Unable to read in %s bytes of %s\n"),
438 bfd_vmatoa ("u", amt), reason);
439 if (mvar != var)
440 free (mvar);
441 return NULL;
442 }
443
444 return mvar;
445 }
446
447 /* Print a VMA value in the MODE specified.
448 Returns the number of characters displayed. */
449
450 static unsigned int
451 print_vma (bfd_vma vma, print_mode mode)
452 {
453 unsigned int nc = 0;
454
455 switch (mode)
456 {
457 case FULL_HEX:
458 nc = printf ("0x");
459 /* Fall through. */
460 case LONG_HEX:
461 #ifdef BFD64
462 if (is_32bit_elf)
463 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
464 #endif
465 printf_vma (vma);
466 return nc + 16;
467
468 case DEC_5:
469 if (vma <= 99999)
470 return printf ("%5" BFD_VMA_FMT "d", vma);
471 /* Fall through. */
472 case PREFIX_HEX:
473 nc = printf ("0x");
474 /* Fall through. */
475 case HEX:
476 return nc + printf ("%" BFD_VMA_FMT "x", vma);
477
478 case DEC:
479 return printf ("%" BFD_VMA_FMT "d", vma);
480
481 case UNSIGNED:
482 return printf ("%" BFD_VMA_FMT "u", vma);
483
484 default:
485 /* FIXME: Report unrecognised mode ? */
486 return 0;
487 }
488 }
489
490 /* Display a symbol on stdout. Handles the display of control characters and
491 multibye characters (assuming the host environment supports them).
492
493 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
494
495 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
496 padding as necessary.
497
498 Returns the number of emitted characters. */
499
500 static unsigned int
501 print_symbol (signed int width, const char *symbol)
502 {
503 bfd_boolean extra_padding = FALSE;
504 signed int num_printed = 0;
505 #ifdef HAVE_MBSTATE_T
506 mbstate_t state;
507 #endif
508 unsigned int width_remaining;
509
510 if (width < 0)
511 {
512 /* Keep the width positive. This helps the code below. */
513 width = - width;
514 extra_padding = TRUE;
515 }
516 assert (width != 0);
517
518 if (do_wide)
519 /* Set the remaining width to a very large value.
520 This simplifies the code below. */
521 width_remaining = INT_MAX;
522 else
523 width_remaining = width;
524
525 #ifdef HAVE_MBSTATE_T
526 /* Initialise the multibyte conversion state. */
527 memset (& state, 0, sizeof (state));
528 #endif
529
530 while (width_remaining)
531 {
532 size_t n;
533 const char c = *symbol++;
534
535 if (c == 0)
536 break;
537
538 /* Do not print control characters directly as they can affect terminal
539 settings. Such characters usually appear in the names generated
540 by the assembler for local labels. */
541 if (ISCNTRL (c))
542 {
543 if (width_remaining < 2)
544 break;
545
546 printf ("^%c", c + 0x40);
547 width_remaining -= 2;
548 num_printed += 2;
549 }
550 else if (ISPRINT (c))
551 {
552 putchar (c);
553 width_remaining --;
554 num_printed ++;
555 }
556 else
557 {
558 #ifdef HAVE_MBSTATE_T
559 wchar_t w;
560 #endif
561 /* Let printf do the hard work of displaying multibyte characters. */
562 printf ("%.1s", symbol - 1);
563 width_remaining --;
564 num_printed ++;
565
566 #ifdef HAVE_MBSTATE_T
567 /* Try to find out how many bytes made up the character that was
568 just printed. Advance the symbol pointer past the bytes that
569 were displayed. */
570 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
571 #else
572 n = 1;
573 #endif
574 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
575 symbol += (n - 1);
576 }
577 }
578
579 if (extra_padding && num_printed < width)
580 {
581 /* Fill in the remaining spaces. */
582 printf ("%-*s", width - num_printed, " ");
583 num_printed = width;
584 }
585
586 return num_printed;
587 }
588
589 /* Returns a pointer to a static buffer containing a printable version of
590 the given section's name. Like print_symbol, except that it does not try
591 to print multibyte characters, it just interprets them as hex values. */
592
593 static const char *
594 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
595 {
596 #define MAX_PRINT_SEC_NAME_LEN 128
597 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
598 const char * name = SECTION_NAME (sec);
599 char * buf = sec_name_buf;
600 char c;
601 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
602
603 while ((c = * name ++) != 0)
604 {
605 if (ISCNTRL (c))
606 {
607 if (remaining < 2)
608 break;
609
610 * buf ++ = '^';
611 * buf ++ = c + 0x40;
612 remaining -= 2;
613 }
614 else if (ISPRINT (c))
615 {
616 * buf ++ = c;
617 remaining -= 1;
618 }
619 else
620 {
621 static char hex[17] = "0123456789ABCDEF";
622
623 if (remaining < 4)
624 break;
625 * buf ++ = '<';
626 * buf ++ = hex[(c & 0xf0) >> 4];
627 * buf ++ = hex[c & 0x0f];
628 * buf ++ = '>';
629 remaining -= 4;
630 }
631
632 if (remaining == 0)
633 break;
634 }
635
636 * buf = 0;
637 return sec_name_buf;
638 }
639
640 static const char *
641 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
642 {
643 if (ndx >= filedata->file_header.e_shnum)
644 return _("<corrupt>");
645
646 return printable_section_name (filedata, filedata->section_headers + ndx);
647 }
648
649 /* Return a pointer to section NAME, or NULL if no such section exists. */
650
651 static Elf_Internal_Shdr *
652 find_section (Filedata * filedata, const char * name)
653 {
654 unsigned int i;
655
656 if (filedata->section_headers == NULL)
657 return NULL;
658
659 for (i = 0; i < filedata->file_header.e_shnum; i++)
660 if (streq (SECTION_NAME (filedata->section_headers + i), name))
661 return filedata->section_headers + i;
662
663 return NULL;
664 }
665
666 /* Return a pointer to a section containing ADDR, or NULL if no such
667 section exists. */
668
669 static Elf_Internal_Shdr *
670 find_section_by_address (Filedata * filedata, bfd_vma addr)
671 {
672 unsigned int i;
673
674 if (filedata->section_headers == NULL)
675 return NULL;
676
677 for (i = 0; i < filedata->file_header.e_shnum; i++)
678 {
679 Elf_Internal_Shdr *sec = filedata->section_headers + i;
680
681 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
682 return sec;
683 }
684
685 return NULL;
686 }
687
688 static Elf_Internal_Shdr *
689 find_section_by_type (Filedata * filedata, unsigned int type)
690 {
691 unsigned int i;
692
693 if (filedata->section_headers == NULL)
694 return NULL;
695
696 for (i = 0; i < filedata->file_header.e_shnum; i++)
697 {
698 Elf_Internal_Shdr *sec = filedata->section_headers + i;
699
700 if (sec->sh_type == type)
701 return sec;
702 }
703
704 return NULL;
705 }
706
707 /* Return a pointer to section NAME, or NULL if no such section exists,
708 restricted to the list of sections given in SET. */
709
710 static Elf_Internal_Shdr *
711 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
712 {
713 unsigned int i;
714
715 if (filedata->section_headers == NULL)
716 return NULL;
717
718 if (set != NULL)
719 {
720 while ((i = *set++) > 0)
721 {
722 /* See PR 21156 for a reproducer. */
723 if (i >= filedata->file_header.e_shnum)
724 continue; /* FIXME: Should we issue an error message ? */
725
726 if (streq (SECTION_NAME (filedata->section_headers + i), name))
727 return filedata->section_headers + i;
728 }
729 }
730
731 return find_section (filedata, name);
732 }
733
734 /* Read an unsigned LEB128 encoded value from DATA.
735 Set *LENGTH_RETURN to the number of bytes read. */
736
737 static inline unsigned long
738 read_uleb128 (unsigned char * data,
739 unsigned int * length_return,
740 const unsigned char * const end)
741 {
742 return read_leb128 (data, length_return, FALSE, end);
743 }
744
745 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
746 This OS has so many departures from the ELF standard that we test it at
747 many places. */
748
749 static inline bfd_boolean
750 is_ia64_vms (Filedata * filedata)
751 {
752 return filedata->file_header.e_machine == EM_IA_64
753 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
754 }
755
756 /* Guess the relocation size commonly used by the specific machines. */
757
758 static bfd_boolean
759 guess_is_rela (unsigned int e_machine)
760 {
761 switch (e_machine)
762 {
763 /* Targets that use REL relocations. */
764 case EM_386:
765 case EM_IAMCU:
766 case EM_ARM:
767 case EM_D10V:
768 case EM_CYGNUS_D10V:
769 case EM_DLX:
770 case EM_MIPS:
771 case EM_MIPS_RS3_LE:
772 case EM_CYGNUS_M32R:
773 case EM_SCORE:
774 case EM_XGATE:
775 return FALSE;
776
777 /* Targets that use RELA relocations. */
778 case EM_68K:
779 case EM_AARCH64:
780 case EM_ADAPTEVA_EPIPHANY:
781 case EM_ALPHA:
782 case EM_ALTERA_NIOS2:
783 case EM_ARC:
784 case EM_ARC_COMPACT:
785 case EM_ARC_COMPACT2:
786 case EM_AVR:
787 case EM_AVR_OLD:
788 case EM_BLACKFIN:
789 case EM_CR16:
790 case EM_CRIS:
791 case EM_CRX:
792 case EM_D30V:
793 case EM_CYGNUS_D30V:
794 case EM_FR30:
795 case EM_FT32:
796 case EM_CYGNUS_FR30:
797 case EM_CYGNUS_FRV:
798 case EM_H8S:
799 case EM_H8_300:
800 case EM_H8_300H:
801 case EM_IA_64:
802 case EM_IP2K:
803 case EM_IP2K_OLD:
804 case EM_IQ2000:
805 case EM_LATTICEMICO32:
806 case EM_M32C_OLD:
807 case EM_M32C:
808 case EM_M32R:
809 case EM_MCORE:
810 case EM_CYGNUS_MEP:
811 case EM_METAG:
812 case EM_MMIX:
813 case EM_MN10200:
814 case EM_CYGNUS_MN10200:
815 case EM_MN10300:
816 case EM_CYGNUS_MN10300:
817 case EM_MOXIE:
818 case EM_MSP430:
819 case EM_MSP430_OLD:
820 case EM_MT:
821 case EM_NDS32:
822 case EM_NIOS32:
823 case EM_OR1K:
824 case EM_PPC64:
825 case EM_PPC:
826 case EM_TI_PRU:
827 case EM_RISCV:
828 case EM_RL78:
829 case EM_RX:
830 case EM_S390:
831 case EM_S390_OLD:
832 case EM_SH:
833 case EM_SPARC:
834 case EM_SPARC32PLUS:
835 case EM_SPARCV9:
836 case EM_SPU:
837 case EM_TI_C6000:
838 case EM_TILEGX:
839 case EM_TILEPRO:
840 case EM_V800:
841 case EM_V850:
842 case EM_CYGNUS_V850:
843 case EM_VAX:
844 case EM_VISIUM:
845 case EM_X86_64:
846 case EM_L1OM:
847 case EM_K1OM:
848 case EM_XSTORMY16:
849 case EM_XTENSA:
850 case EM_XTENSA_OLD:
851 case EM_MICROBLAZE:
852 case EM_MICROBLAZE_OLD:
853 case EM_WEBASSEMBLY:
854 return TRUE;
855
856 case EM_68HC05:
857 case EM_68HC08:
858 case EM_68HC11:
859 case EM_68HC16:
860 case EM_FX66:
861 case EM_ME16:
862 case EM_MMA:
863 case EM_NCPU:
864 case EM_NDR1:
865 case EM_PCP:
866 case EM_ST100:
867 case EM_ST19:
868 case EM_ST7:
869 case EM_ST9PLUS:
870 case EM_STARCORE:
871 case EM_SVX:
872 case EM_TINYJ:
873 default:
874 warn (_("Don't know about relocations on this machine architecture\n"));
875 return FALSE;
876 }
877 }
878
879 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
880 Returns TRUE upon success, FALSE otherwise. If successful then a
881 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
882 and the number of relocs loaded is placed in *NRELASP. It is the caller's
883 responsibility to free the allocated buffer. */
884
885 static bfd_boolean
886 slurp_rela_relocs (Filedata * filedata,
887 unsigned long rel_offset,
888 unsigned long rel_size,
889 Elf_Internal_Rela ** relasp,
890 unsigned long * nrelasp)
891 {
892 Elf_Internal_Rela * relas;
893 size_t nrelas;
894 unsigned int i;
895
896 if (is_32bit_elf)
897 {
898 Elf32_External_Rela * erelas;
899
900 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
901 rel_size, _("32-bit relocation data"));
902 if (!erelas)
903 return FALSE;
904
905 nrelas = rel_size / sizeof (Elf32_External_Rela);
906
907 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
908 sizeof (Elf_Internal_Rela));
909
910 if (relas == NULL)
911 {
912 free (erelas);
913 error (_("out of memory parsing relocs\n"));
914 return FALSE;
915 }
916
917 for (i = 0; i < nrelas; i++)
918 {
919 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
920 relas[i].r_info = BYTE_GET (erelas[i].r_info);
921 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
922 }
923
924 free (erelas);
925 }
926 else
927 {
928 Elf64_External_Rela * erelas;
929
930 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
931 rel_size, _("64-bit relocation data"));
932 if (!erelas)
933 return FALSE;
934
935 nrelas = rel_size / sizeof (Elf64_External_Rela);
936
937 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
938 sizeof (Elf_Internal_Rela));
939
940 if (relas == NULL)
941 {
942 free (erelas);
943 error (_("out of memory parsing relocs\n"));
944 return FALSE;
945 }
946
947 for (i = 0; i < nrelas; i++)
948 {
949 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
950 relas[i].r_info = BYTE_GET (erelas[i].r_info);
951 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
952
953 /* The #ifdef BFD64 below is to prevent a compile time
954 warning. We know that if we do not have a 64 bit data
955 type that we will never execute this code anyway. */
956 #ifdef BFD64
957 if (filedata->file_header.e_machine == EM_MIPS
958 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
959 {
960 /* In little-endian objects, r_info isn't really a
961 64-bit little-endian value: it has a 32-bit
962 little-endian symbol index followed by four
963 individual byte fields. Reorder INFO
964 accordingly. */
965 bfd_vma inf = relas[i].r_info;
966 inf = (((inf & 0xffffffff) << 32)
967 | ((inf >> 56) & 0xff)
968 | ((inf >> 40) & 0xff00)
969 | ((inf >> 24) & 0xff0000)
970 | ((inf >> 8) & 0xff000000));
971 relas[i].r_info = inf;
972 }
973 #endif /* BFD64 */
974 }
975
976 free (erelas);
977 }
978
979 *relasp = relas;
980 *nrelasp = nrelas;
981 return TRUE;
982 }
983
984 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
985 Returns TRUE upon success, FALSE otherwise. If successful then a
986 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
987 and the number of relocs loaded is placed in *NRELSP. It is the caller's
988 responsibility to free the allocated buffer. */
989
990 static bfd_boolean
991 slurp_rel_relocs (Filedata * filedata,
992 unsigned long rel_offset,
993 unsigned long rel_size,
994 Elf_Internal_Rela ** relsp,
995 unsigned long * nrelsp)
996 {
997 Elf_Internal_Rela * rels;
998 size_t nrels;
999 unsigned int i;
1000
1001 if (is_32bit_elf)
1002 {
1003 Elf32_External_Rel * erels;
1004
1005 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1006 rel_size, _("32-bit relocation data"));
1007 if (!erels)
1008 return FALSE;
1009
1010 nrels = rel_size / sizeof (Elf32_External_Rel);
1011
1012 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1013
1014 if (rels == NULL)
1015 {
1016 free (erels);
1017 error (_("out of memory parsing relocs\n"));
1018 return FALSE;
1019 }
1020
1021 for (i = 0; i < nrels; i++)
1022 {
1023 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1024 rels[i].r_info = BYTE_GET (erels[i].r_info);
1025 rels[i].r_addend = 0;
1026 }
1027
1028 free (erels);
1029 }
1030 else
1031 {
1032 Elf64_External_Rel * erels;
1033
1034 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1035 rel_size, _("64-bit relocation data"));
1036 if (!erels)
1037 return FALSE;
1038
1039 nrels = rel_size / sizeof (Elf64_External_Rel);
1040
1041 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1042
1043 if (rels == NULL)
1044 {
1045 free (erels);
1046 error (_("out of memory parsing relocs\n"));
1047 return FALSE;
1048 }
1049
1050 for (i = 0; i < nrels; i++)
1051 {
1052 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1053 rels[i].r_info = BYTE_GET (erels[i].r_info);
1054 rels[i].r_addend = 0;
1055
1056 /* The #ifdef BFD64 below is to prevent a compile time
1057 warning. We know that if we do not have a 64 bit data
1058 type that we will never execute this code anyway. */
1059 #ifdef BFD64
1060 if (filedata->file_header.e_machine == EM_MIPS
1061 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1062 {
1063 /* In little-endian objects, r_info isn't really a
1064 64-bit little-endian value: it has a 32-bit
1065 little-endian symbol index followed by four
1066 individual byte fields. Reorder INFO
1067 accordingly. */
1068 bfd_vma inf = rels[i].r_info;
1069 inf = (((inf & 0xffffffff) << 32)
1070 | ((inf >> 56) & 0xff)
1071 | ((inf >> 40) & 0xff00)
1072 | ((inf >> 24) & 0xff0000)
1073 | ((inf >> 8) & 0xff000000));
1074 rels[i].r_info = inf;
1075 }
1076 #endif /* BFD64 */
1077 }
1078
1079 free (erels);
1080 }
1081
1082 *relsp = rels;
1083 *nrelsp = nrels;
1084 return TRUE;
1085 }
1086
1087 /* Returns the reloc type extracted from the reloc info field. */
1088
1089 static unsigned int
1090 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1091 {
1092 if (is_32bit_elf)
1093 return ELF32_R_TYPE (reloc_info);
1094
1095 switch (filedata->file_header.e_machine)
1096 {
1097 case EM_MIPS:
1098 /* Note: We assume that reloc_info has already been adjusted for us. */
1099 return ELF64_MIPS_R_TYPE (reloc_info);
1100
1101 case EM_SPARCV9:
1102 return ELF64_R_TYPE_ID (reloc_info);
1103
1104 default:
1105 return ELF64_R_TYPE (reloc_info);
1106 }
1107 }
1108
1109 /* Return the symbol index extracted from the reloc info field. */
1110
1111 static bfd_vma
1112 get_reloc_symindex (bfd_vma reloc_info)
1113 {
1114 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1115 }
1116
1117 static inline bfd_boolean
1118 uses_msp430x_relocs (Filedata * filedata)
1119 {
1120 return
1121 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1122 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1123 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1124 /* TI compiler uses ELFOSABI_NONE. */
1125 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1126 }
1127
1128 /* Display the contents of the relocation data found at the specified
1129 offset. */
1130
1131 static bfd_boolean
1132 dump_relocations (Filedata * filedata,
1133 unsigned long rel_offset,
1134 unsigned long rel_size,
1135 Elf_Internal_Sym * symtab,
1136 unsigned long nsyms,
1137 char * strtab,
1138 unsigned long strtablen,
1139 int is_rela,
1140 bfd_boolean is_dynsym)
1141 {
1142 unsigned long i;
1143 Elf_Internal_Rela * rels;
1144 bfd_boolean res = TRUE;
1145
1146 if (is_rela == UNKNOWN)
1147 is_rela = guess_is_rela (filedata->file_header.e_machine);
1148
1149 if (is_rela)
1150 {
1151 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1152 return FALSE;
1153 }
1154 else
1155 {
1156 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1157 return FALSE;
1158 }
1159
1160 if (is_32bit_elf)
1161 {
1162 if (is_rela)
1163 {
1164 if (do_wide)
1165 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1166 else
1167 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1168 }
1169 else
1170 {
1171 if (do_wide)
1172 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1173 else
1174 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1175 }
1176 }
1177 else
1178 {
1179 if (is_rela)
1180 {
1181 if (do_wide)
1182 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1183 else
1184 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1185 }
1186 else
1187 {
1188 if (do_wide)
1189 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1190 else
1191 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1192 }
1193 }
1194
1195 for (i = 0; i < rel_size; i++)
1196 {
1197 const char * rtype;
1198 bfd_vma offset;
1199 bfd_vma inf;
1200 bfd_vma symtab_index;
1201 bfd_vma type;
1202
1203 offset = rels[i].r_offset;
1204 inf = rels[i].r_info;
1205
1206 type = get_reloc_type (filedata, inf);
1207 symtab_index = get_reloc_symindex (inf);
1208
1209 if (is_32bit_elf)
1210 {
1211 printf ("%8.8lx %8.8lx ",
1212 (unsigned long) offset & 0xffffffff,
1213 (unsigned long) inf & 0xffffffff);
1214 }
1215 else
1216 {
1217 #if BFD_HOST_64BIT_LONG
1218 printf (do_wide
1219 ? "%16.16lx %16.16lx "
1220 : "%12.12lx %12.12lx ",
1221 offset, inf);
1222 #elif BFD_HOST_64BIT_LONG_LONG
1223 #ifndef __MSVCRT__
1224 printf (do_wide
1225 ? "%16.16llx %16.16llx "
1226 : "%12.12llx %12.12llx ",
1227 offset, inf);
1228 #else
1229 printf (do_wide
1230 ? "%16.16I64x %16.16I64x "
1231 : "%12.12I64x %12.12I64x ",
1232 offset, inf);
1233 #endif
1234 #else
1235 printf (do_wide
1236 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1237 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1238 _bfd_int64_high (offset),
1239 _bfd_int64_low (offset),
1240 _bfd_int64_high (inf),
1241 _bfd_int64_low (inf));
1242 #endif
1243 }
1244
1245 switch (filedata->file_header.e_machine)
1246 {
1247 default:
1248 rtype = NULL;
1249 break;
1250
1251 case EM_AARCH64:
1252 rtype = elf_aarch64_reloc_type (type);
1253 break;
1254
1255 case EM_M32R:
1256 case EM_CYGNUS_M32R:
1257 rtype = elf_m32r_reloc_type (type);
1258 break;
1259
1260 case EM_386:
1261 case EM_IAMCU:
1262 rtype = elf_i386_reloc_type (type);
1263 break;
1264
1265 case EM_68HC11:
1266 case EM_68HC12:
1267 rtype = elf_m68hc11_reloc_type (type);
1268 break;
1269
1270 case EM_68K:
1271 rtype = elf_m68k_reloc_type (type);
1272 break;
1273
1274 case EM_AVR:
1275 case EM_AVR_OLD:
1276 rtype = elf_avr_reloc_type (type);
1277 break;
1278
1279 case EM_OLD_SPARCV9:
1280 case EM_SPARC32PLUS:
1281 case EM_SPARCV9:
1282 case EM_SPARC:
1283 rtype = elf_sparc_reloc_type (type);
1284 break;
1285
1286 case EM_SPU:
1287 rtype = elf_spu_reloc_type (type);
1288 break;
1289
1290 case EM_V800:
1291 rtype = v800_reloc_type (type);
1292 break;
1293 case EM_V850:
1294 case EM_CYGNUS_V850:
1295 rtype = v850_reloc_type (type);
1296 break;
1297
1298 case EM_D10V:
1299 case EM_CYGNUS_D10V:
1300 rtype = elf_d10v_reloc_type (type);
1301 break;
1302
1303 case EM_D30V:
1304 case EM_CYGNUS_D30V:
1305 rtype = elf_d30v_reloc_type (type);
1306 break;
1307
1308 case EM_DLX:
1309 rtype = elf_dlx_reloc_type (type);
1310 break;
1311
1312 case EM_SH:
1313 rtype = elf_sh_reloc_type (type);
1314 break;
1315
1316 case EM_MN10300:
1317 case EM_CYGNUS_MN10300:
1318 rtype = elf_mn10300_reloc_type (type);
1319 break;
1320
1321 case EM_MN10200:
1322 case EM_CYGNUS_MN10200:
1323 rtype = elf_mn10200_reloc_type (type);
1324 break;
1325
1326 case EM_FR30:
1327 case EM_CYGNUS_FR30:
1328 rtype = elf_fr30_reloc_type (type);
1329 break;
1330
1331 case EM_CYGNUS_FRV:
1332 rtype = elf_frv_reloc_type (type);
1333 break;
1334
1335 case EM_FT32:
1336 rtype = elf_ft32_reloc_type (type);
1337 break;
1338
1339 case EM_MCORE:
1340 rtype = elf_mcore_reloc_type (type);
1341 break;
1342
1343 case EM_MMIX:
1344 rtype = elf_mmix_reloc_type (type);
1345 break;
1346
1347 case EM_MOXIE:
1348 rtype = elf_moxie_reloc_type (type);
1349 break;
1350
1351 case EM_MSP430:
1352 if (uses_msp430x_relocs (filedata))
1353 {
1354 rtype = elf_msp430x_reloc_type (type);
1355 break;
1356 }
1357 /* Fall through. */
1358 case EM_MSP430_OLD:
1359 rtype = elf_msp430_reloc_type (type);
1360 break;
1361
1362 case EM_NDS32:
1363 rtype = elf_nds32_reloc_type (type);
1364 break;
1365
1366 case EM_PPC:
1367 rtype = elf_ppc_reloc_type (type);
1368 break;
1369
1370 case EM_PPC64:
1371 rtype = elf_ppc64_reloc_type (type);
1372 break;
1373
1374 case EM_MIPS:
1375 case EM_MIPS_RS3_LE:
1376 rtype = elf_mips_reloc_type (type);
1377 break;
1378
1379 case EM_RISCV:
1380 rtype = elf_riscv_reloc_type (type);
1381 break;
1382
1383 case EM_ALPHA:
1384 rtype = elf_alpha_reloc_type (type);
1385 break;
1386
1387 case EM_ARM:
1388 rtype = elf_arm_reloc_type (type);
1389 break;
1390
1391 case EM_ARC:
1392 case EM_ARC_COMPACT:
1393 case EM_ARC_COMPACT2:
1394 rtype = elf_arc_reloc_type (type);
1395 break;
1396
1397 case EM_PARISC:
1398 rtype = elf_hppa_reloc_type (type);
1399 break;
1400
1401 case EM_H8_300:
1402 case EM_H8_300H:
1403 case EM_H8S:
1404 rtype = elf_h8_reloc_type (type);
1405 break;
1406
1407 case EM_OR1K:
1408 rtype = elf_or1k_reloc_type (type);
1409 break;
1410
1411 case EM_PJ:
1412 case EM_PJ_OLD:
1413 rtype = elf_pj_reloc_type (type);
1414 break;
1415 case EM_IA_64:
1416 rtype = elf_ia64_reloc_type (type);
1417 break;
1418
1419 case EM_CRIS:
1420 rtype = elf_cris_reloc_type (type);
1421 break;
1422
1423 case EM_X86_64:
1424 case EM_L1OM:
1425 case EM_K1OM:
1426 rtype = elf_x86_64_reloc_type (type);
1427 break;
1428
1429 case EM_S370:
1430 rtype = i370_reloc_type (type);
1431 break;
1432
1433 case EM_S390_OLD:
1434 case EM_S390:
1435 rtype = elf_s390_reloc_type (type);
1436 break;
1437
1438 case EM_SCORE:
1439 rtype = elf_score_reloc_type (type);
1440 break;
1441
1442 case EM_XSTORMY16:
1443 rtype = elf_xstormy16_reloc_type (type);
1444 break;
1445
1446 case EM_CRX:
1447 rtype = elf_crx_reloc_type (type);
1448 break;
1449
1450 case EM_VAX:
1451 rtype = elf_vax_reloc_type (type);
1452 break;
1453
1454 case EM_VISIUM:
1455 rtype = elf_visium_reloc_type (type);
1456 break;
1457
1458 case EM_ADAPTEVA_EPIPHANY:
1459 rtype = elf_epiphany_reloc_type (type);
1460 break;
1461
1462 case EM_IP2K:
1463 case EM_IP2K_OLD:
1464 rtype = elf_ip2k_reloc_type (type);
1465 break;
1466
1467 case EM_IQ2000:
1468 rtype = elf_iq2000_reloc_type (type);
1469 break;
1470
1471 case EM_XTENSA_OLD:
1472 case EM_XTENSA:
1473 rtype = elf_xtensa_reloc_type (type);
1474 break;
1475
1476 case EM_LATTICEMICO32:
1477 rtype = elf_lm32_reloc_type (type);
1478 break;
1479
1480 case EM_M32C_OLD:
1481 case EM_M32C:
1482 rtype = elf_m32c_reloc_type (type);
1483 break;
1484
1485 case EM_MT:
1486 rtype = elf_mt_reloc_type (type);
1487 break;
1488
1489 case EM_BLACKFIN:
1490 rtype = elf_bfin_reloc_type (type);
1491 break;
1492
1493 case EM_CYGNUS_MEP:
1494 rtype = elf_mep_reloc_type (type);
1495 break;
1496
1497 case EM_CR16:
1498 rtype = elf_cr16_reloc_type (type);
1499 break;
1500
1501 case EM_MICROBLAZE:
1502 case EM_MICROBLAZE_OLD:
1503 rtype = elf_microblaze_reloc_type (type);
1504 break;
1505
1506 case EM_RL78:
1507 rtype = elf_rl78_reloc_type (type);
1508 break;
1509
1510 case EM_RX:
1511 rtype = elf_rx_reloc_type (type);
1512 break;
1513
1514 case EM_METAG:
1515 rtype = elf_metag_reloc_type (type);
1516 break;
1517
1518 case EM_XC16X:
1519 case EM_C166:
1520 rtype = elf_xc16x_reloc_type (type);
1521 break;
1522
1523 case EM_TI_C6000:
1524 rtype = elf_tic6x_reloc_type (type);
1525 break;
1526
1527 case EM_TILEGX:
1528 rtype = elf_tilegx_reloc_type (type);
1529 break;
1530
1531 case EM_TILEPRO:
1532 rtype = elf_tilepro_reloc_type (type);
1533 break;
1534
1535 case EM_WEBASSEMBLY:
1536 rtype = elf_wasm32_reloc_type (type);
1537 break;
1538
1539 case EM_XGATE:
1540 rtype = elf_xgate_reloc_type (type);
1541 break;
1542
1543 case EM_ALTERA_NIOS2:
1544 rtype = elf_nios2_reloc_type (type);
1545 break;
1546
1547 case EM_TI_PRU:
1548 rtype = elf_pru_reloc_type (type);
1549 break;
1550 }
1551
1552 if (rtype == NULL)
1553 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1554 else
1555 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1556
1557 if (filedata->file_header.e_machine == EM_ALPHA
1558 && rtype != NULL
1559 && streq (rtype, "R_ALPHA_LITUSE")
1560 && is_rela)
1561 {
1562 switch (rels[i].r_addend)
1563 {
1564 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1565 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1566 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1567 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1568 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1569 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1570 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1571 default: rtype = NULL;
1572 }
1573
1574 if (rtype)
1575 printf (" (%s)", rtype);
1576 else
1577 {
1578 putchar (' ');
1579 printf (_("<unknown addend: %lx>"),
1580 (unsigned long) rels[i].r_addend);
1581 res = FALSE;
1582 }
1583 }
1584 else if (symtab_index)
1585 {
1586 if (symtab == NULL || symtab_index >= nsyms)
1587 {
1588 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1589 res = FALSE;
1590 }
1591 else
1592 {
1593 Elf_Internal_Sym * psym;
1594 const char * version_string;
1595 enum versioned_symbol_info sym_info;
1596 unsigned short vna_other;
1597
1598 psym = symtab + symtab_index;
1599
1600 version_string
1601 = get_symbol_version_string (filedata, is_dynsym,
1602 strtab, strtablen,
1603 symtab_index,
1604 psym,
1605 &sym_info,
1606 &vna_other);
1607
1608 printf (" ");
1609
1610 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1611 {
1612 const char * name;
1613 unsigned int len;
1614 unsigned int width = is_32bit_elf ? 8 : 14;
1615
1616 /* Relocations against GNU_IFUNC symbols do not use the value
1617 of the symbol as the address to relocate against. Instead
1618 they invoke the function named by the symbol and use its
1619 result as the address for relocation.
1620
1621 To indicate this to the user, do not display the value of
1622 the symbol in the "Symbols's Value" field. Instead show
1623 its name followed by () as a hint that the symbol is
1624 invoked. */
1625
1626 if (strtab == NULL
1627 || psym->st_name == 0
1628 || psym->st_name >= strtablen)
1629 name = "??";
1630 else
1631 name = strtab + psym->st_name;
1632
1633 len = print_symbol (width, name);
1634 if (version_string)
1635 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1636 version_string);
1637 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1638 }
1639 else
1640 {
1641 print_vma (psym->st_value, LONG_HEX);
1642
1643 printf (is_32bit_elf ? " " : " ");
1644 }
1645
1646 if (psym->st_name == 0)
1647 {
1648 const char * sec_name = "<null>";
1649 char name_buf[40];
1650
1651 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1652 {
1653 if (psym->st_shndx < filedata->file_header.e_shnum)
1654 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1655 else if (psym->st_shndx == SHN_ABS)
1656 sec_name = "ABS";
1657 else if (psym->st_shndx == SHN_COMMON)
1658 sec_name = "COMMON";
1659 else if ((filedata->file_header.e_machine == EM_MIPS
1660 && psym->st_shndx == SHN_MIPS_SCOMMON)
1661 || (filedata->file_header.e_machine == EM_TI_C6000
1662 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1663 sec_name = "SCOMMON";
1664 else if (filedata->file_header.e_machine == EM_MIPS
1665 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1666 sec_name = "SUNDEF";
1667 else if ((filedata->file_header.e_machine == EM_X86_64
1668 || filedata->file_header.e_machine == EM_L1OM
1669 || filedata->file_header.e_machine == EM_K1OM)
1670 && psym->st_shndx == SHN_X86_64_LCOMMON)
1671 sec_name = "LARGE_COMMON";
1672 else if (filedata->file_header.e_machine == EM_IA_64
1673 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1674 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1675 sec_name = "ANSI_COM";
1676 else if (is_ia64_vms (filedata)
1677 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1678 sec_name = "VMS_SYMVEC";
1679 else
1680 {
1681 sprintf (name_buf, "<section 0x%x>",
1682 (unsigned int) psym->st_shndx);
1683 sec_name = name_buf;
1684 }
1685 }
1686 print_symbol (22, sec_name);
1687 }
1688 else if (strtab == NULL)
1689 printf (_("<string table index: %3ld>"), psym->st_name);
1690 else if (psym->st_name >= strtablen)
1691 {
1692 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1693 res = FALSE;
1694 }
1695 else
1696 {
1697 print_symbol (22, strtab + psym->st_name);
1698 if (version_string)
1699 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1700 version_string);
1701 }
1702
1703 if (is_rela)
1704 {
1705 bfd_vma off = rels[i].r_addend;
1706
1707 if ((bfd_signed_vma) off < 0)
1708 printf (" - %" BFD_VMA_FMT "x", - off);
1709 else
1710 printf (" + %" BFD_VMA_FMT "x", off);
1711 }
1712 }
1713 }
1714 else if (is_rela)
1715 {
1716 bfd_vma off = rels[i].r_addend;
1717
1718 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1719 if ((bfd_signed_vma) off < 0)
1720 printf ("-%" BFD_VMA_FMT "x", - off);
1721 else
1722 printf ("%" BFD_VMA_FMT "x", off);
1723 }
1724
1725 if (filedata->file_header.e_machine == EM_SPARCV9
1726 && rtype != NULL
1727 && streq (rtype, "R_SPARC_OLO10"))
1728 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1729
1730 putchar ('\n');
1731
1732 #ifdef BFD64
1733 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1734 {
1735 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1736 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1737 const char * rtype2 = elf_mips_reloc_type (type2);
1738 const char * rtype3 = elf_mips_reloc_type (type3);
1739
1740 printf (" Type2: ");
1741
1742 if (rtype2 == NULL)
1743 printf (_("unrecognized: %-7lx"),
1744 (unsigned long) type2 & 0xffffffff);
1745 else
1746 printf ("%-17.17s", rtype2);
1747
1748 printf ("\n Type3: ");
1749
1750 if (rtype3 == NULL)
1751 printf (_("unrecognized: %-7lx"),
1752 (unsigned long) type3 & 0xffffffff);
1753 else
1754 printf ("%-17.17s", rtype3);
1755
1756 putchar ('\n');
1757 }
1758 #endif /* BFD64 */
1759 }
1760
1761 free (rels);
1762
1763 return res;
1764 }
1765
1766 static const char *
1767 get_mips_dynamic_type (unsigned long type)
1768 {
1769 switch (type)
1770 {
1771 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1772 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1773 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1774 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1775 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1776 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1777 case DT_MIPS_MSYM: return "MIPS_MSYM";
1778 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1779 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1780 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1781 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1782 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1783 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1784 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1785 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1786 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1787 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1788 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1789 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1790 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1791 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1792 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1793 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1794 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1795 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1796 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1797 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1798 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1799 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1800 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1801 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1802 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1803 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1804 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1805 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1806 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1807 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1808 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1809 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1810 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1811 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1812 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1813 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1814 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1815 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1816 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1817 default:
1818 return NULL;
1819 }
1820 }
1821
1822 static const char *
1823 get_sparc64_dynamic_type (unsigned long type)
1824 {
1825 switch (type)
1826 {
1827 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1828 default:
1829 return NULL;
1830 }
1831 }
1832
1833 static const char *
1834 get_ppc_dynamic_type (unsigned long type)
1835 {
1836 switch (type)
1837 {
1838 case DT_PPC_GOT: return "PPC_GOT";
1839 case DT_PPC_OPT: return "PPC_OPT";
1840 default:
1841 return NULL;
1842 }
1843 }
1844
1845 static const char *
1846 get_ppc64_dynamic_type (unsigned long type)
1847 {
1848 switch (type)
1849 {
1850 case DT_PPC64_GLINK: return "PPC64_GLINK";
1851 case DT_PPC64_OPD: return "PPC64_OPD";
1852 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1853 case DT_PPC64_OPT: return "PPC64_OPT";
1854 default:
1855 return NULL;
1856 }
1857 }
1858
1859 static const char *
1860 get_parisc_dynamic_type (unsigned long type)
1861 {
1862 switch (type)
1863 {
1864 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1865 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1866 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1867 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1868 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1869 case DT_HP_PREINIT: return "HP_PREINIT";
1870 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1871 case DT_HP_NEEDED: return "HP_NEEDED";
1872 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1873 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1874 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1875 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1876 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1877 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1878 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1879 case DT_HP_FILTERED: return "HP_FILTERED";
1880 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1881 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1882 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1883 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1884 case DT_PLT: return "PLT";
1885 case DT_PLT_SIZE: return "PLT_SIZE";
1886 case DT_DLT: return "DLT";
1887 case DT_DLT_SIZE: return "DLT_SIZE";
1888 default:
1889 return NULL;
1890 }
1891 }
1892
1893 static const char *
1894 get_ia64_dynamic_type (unsigned long type)
1895 {
1896 switch (type)
1897 {
1898 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1899 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1900 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1901 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1902 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1903 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1904 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1905 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1906 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1907 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1908 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1909 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1910 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1911 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1912 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1913 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1914 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1915 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1916 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1917 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1918 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1919 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1920 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1921 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1922 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1923 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1924 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1925 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1926 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1927 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1928 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1929 default:
1930 return NULL;
1931 }
1932 }
1933
1934 static const char *
1935 get_solaris_section_type (unsigned long type)
1936 {
1937 switch (type)
1938 {
1939 case 0x6fffffee: return "SUNW_ancillary";
1940 case 0x6fffffef: return "SUNW_capchain";
1941 case 0x6ffffff0: return "SUNW_capinfo";
1942 case 0x6ffffff1: return "SUNW_symsort";
1943 case 0x6ffffff2: return "SUNW_tlssort";
1944 case 0x6ffffff3: return "SUNW_LDYNSYM";
1945 case 0x6ffffff4: return "SUNW_dof";
1946 case 0x6ffffff5: return "SUNW_cap";
1947 case 0x6ffffff6: return "SUNW_SIGNATURE";
1948 case 0x6ffffff7: return "SUNW_ANNOTATE";
1949 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1950 case 0x6ffffff9: return "SUNW_DEBUG";
1951 case 0x6ffffffa: return "SUNW_move";
1952 case 0x6ffffffb: return "SUNW_COMDAT";
1953 case 0x6ffffffc: return "SUNW_syminfo";
1954 case 0x6ffffffd: return "SUNW_verdef";
1955 case 0x6ffffffe: return "SUNW_verneed";
1956 case 0x6fffffff: return "SUNW_versym";
1957 case 0x70000000: return "SPARC_GOTDATA";
1958 default: return NULL;
1959 }
1960 }
1961
1962 static const char *
1963 get_alpha_dynamic_type (unsigned long type)
1964 {
1965 switch (type)
1966 {
1967 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1968 default: return NULL;
1969 }
1970 }
1971
1972 static const char *
1973 get_score_dynamic_type (unsigned long type)
1974 {
1975 switch (type)
1976 {
1977 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1978 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1979 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1980 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1981 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1982 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1983 default: return NULL;
1984 }
1985 }
1986
1987 static const char *
1988 get_tic6x_dynamic_type (unsigned long type)
1989 {
1990 switch (type)
1991 {
1992 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1993 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1994 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1995 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1996 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1997 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1998 default: return NULL;
1999 }
2000 }
2001
2002 static const char *
2003 get_nios2_dynamic_type (unsigned long type)
2004 {
2005 switch (type)
2006 {
2007 case DT_NIOS2_GP: return "NIOS2_GP";
2008 default: return NULL;
2009 }
2010 }
2011
2012 static const char *
2013 get_solaris_dynamic_type (unsigned long type)
2014 {
2015 switch (type)
2016 {
2017 case 0x6000000d: return "SUNW_AUXILIARY";
2018 case 0x6000000e: return "SUNW_RTLDINF";
2019 case 0x6000000f: return "SUNW_FILTER";
2020 case 0x60000010: return "SUNW_CAP";
2021 case 0x60000011: return "SUNW_SYMTAB";
2022 case 0x60000012: return "SUNW_SYMSZ";
2023 case 0x60000013: return "SUNW_SORTENT";
2024 case 0x60000014: return "SUNW_SYMSORT";
2025 case 0x60000015: return "SUNW_SYMSORTSZ";
2026 case 0x60000016: return "SUNW_TLSSORT";
2027 case 0x60000017: return "SUNW_TLSSORTSZ";
2028 case 0x60000018: return "SUNW_CAPINFO";
2029 case 0x60000019: return "SUNW_STRPAD";
2030 case 0x6000001a: return "SUNW_CAPCHAIN";
2031 case 0x6000001b: return "SUNW_LDMACH";
2032 case 0x6000001d: return "SUNW_CAPCHAINENT";
2033 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2034 case 0x60000021: return "SUNW_PARENT";
2035 case 0x60000023: return "SUNW_ASLR";
2036 case 0x60000025: return "SUNW_RELAX";
2037 case 0x60000029: return "SUNW_NXHEAP";
2038 case 0x6000002b: return "SUNW_NXSTACK";
2039
2040 case 0x70000001: return "SPARC_REGISTER";
2041 case 0x7ffffffd: return "AUXILIARY";
2042 case 0x7ffffffe: return "USED";
2043 case 0x7fffffff: return "FILTER";
2044
2045 default: return NULL;
2046 }
2047 }
2048
2049 static const char *
2050 get_dynamic_type (Filedata * filedata, unsigned long type)
2051 {
2052 static char buff[64];
2053
2054 switch (type)
2055 {
2056 case DT_NULL: return "NULL";
2057 case DT_NEEDED: return "NEEDED";
2058 case DT_PLTRELSZ: return "PLTRELSZ";
2059 case DT_PLTGOT: return "PLTGOT";
2060 case DT_HASH: return "HASH";
2061 case DT_STRTAB: return "STRTAB";
2062 case DT_SYMTAB: return "SYMTAB";
2063 case DT_RELA: return "RELA";
2064 case DT_RELASZ: return "RELASZ";
2065 case DT_RELAENT: return "RELAENT";
2066 case DT_STRSZ: return "STRSZ";
2067 case DT_SYMENT: return "SYMENT";
2068 case DT_INIT: return "INIT";
2069 case DT_FINI: return "FINI";
2070 case DT_SONAME: return "SONAME";
2071 case DT_RPATH: return "RPATH";
2072 case DT_SYMBOLIC: return "SYMBOLIC";
2073 case DT_REL: return "REL";
2074 case DT_RELSZ: return "RELSZ";
2075 case DT_RELENT: return "RELENT";
2076 case DT_PLTREL: return "PLTREL";
2077 case DT_DEBUG: return "DEBUG";
2078 case DT_TEXTREL: return "TEXTREL";
2079 case DT_JMPREL: return "JMPREL";
2080 case DT_BIND_NOW: return "BIND_NOW";
2081 case DT_INIT_ARRAY: return "INIT_ARRAY";
2082 case DT_FINI_ARRAY: return "FINI_ARRAY";
2083 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2084 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2085 case DT_RUNPATH: return "RUNPATH";
2086 case DT_FLAGS: return "FLAGS";
2087
2088 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2089 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2090 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2091
2092 case DT_CHECKSUM: return "CHECKSUM";
2093 case DT_PLTPADSZ: return "PLTPADSZ";
2094 case DT_MOVEENT: return "MOVEENT";
2095 case DT_MOVESZ: return "MOVESZ";
2096 case DT_FEATURE: return "FEATURE";
2097 case DT_POSFLAG_1: return "POSFLAG_1";
2098 case DT_SYMINSZ: return "SYMINSZ";
2099 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2100
2101 case DT_ADDRRNGLO: return "ADDRRNGLO";
2102 case DT_CONFIG: return "CONFIG";
2103 case DT_DEPAUDIT: return "DEPAUDIT";
2104 case DT_AUDIT: return "AUDIT";
2105 case DT_PLTPAD: return "PLTPAD";
2106 case DT_MOVETAB: return "MOVETAB";
2107 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2108
2109 case DT_VERSYM: return "VERSYM";
2110
2111 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2112 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2113 case DT_RELACOUNT: return "RELACOUNT";
2114 case DT_RELCOUNT: return "RELCOUNT";
2115 case DT_FLAGS_1: return "FLAGS_1";
2116 case DT_VERDEF: return "VERDEF";
2117 case DT_VERDEFNUM: return "VERDEFNUM";
2118 case DT_VERNEED: return "VERNEED";
2119 case DT_VERNEEDNUM: return "VERNEEDNUM";
2120
2121 case DT_AUXILIARY: return "AUXILIARY";
2122 case DT_USED: return "USED";
2123 case DT_FILTER: return "FILTER";
2124
2125 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2126 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2127 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2128 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2129 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2130 case DT_GNU_HASH: return "GNU_HASH";
2131
2132 default:
2133 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2134 {
2135 const char * result;
2136
2137 switch (filedata->file_header.e_machine)
2138 {
2139 case EM_MIPS:
2140 case EM_MIPS_RS3_LE:
2141 result = get_mips_dynamic_type (type);
2142 break;
2143 case EM_SPARCV9:
2144 result = get_sparc64_dynamic_type (type);
2145 break;
2146 case EM_PPC:
2147 result = get_ppc_dynamic_type (type);
2148 break;
2149 case EM_PPC64:
2150 result = get_ppc64_dynamic_type (type);
2151 break;
2152 case EM_IA_64:
2153 result = get_ia64_dynamic_type (type);
2154 break;
2155 case EM_ALPHA:
2156 result = get_alpha_dynamic_type (type);
2157 break;
2158 case EM_SCORE:
2159 result = get_score_dynamic_type (type);
2160 break;
2161 case EM_TI_C6000:
2162 result = get_tic6x_dynamic_type (type);
2163 break;
2164 case EM_ALTERA_NIOS2:
2165 result = get_nios2_dynamic_type (type);
2166 break;
2167 default:
2168 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2169 result = get_solaris_dynamic_type (type);
2170 else
2171 result = NULL;
2172 break;
2173 }
2174
2175 if (result != NULL)
2176 return result;
2177
2178 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2179 }
2180 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2181 || (filedata->file_header.e_machine == EM_PARISC
2182 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2183 {
2184 const char * result;
2185
2186 switch (filedata->file_header.e_machine)
2187 {
2188 case EM_PARISC:
2189 result = get_parisc_dynamic_type (type);
2190 break;
2191 case EM_IA_64:
2192 result = get_ia64_dynamic_type (type);
2193 break;
2194 default:
2195 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2196 result = get_solaris_dynamic_type (type);
2197 else
2198 result = NULL;
2199 break;
2200 }
2201
2202 if (result != NULL)
2203 return result;
2204
2205 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2206 type);
2207 }
2208 else
2209 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2210
2211 return buff;
2212 }
2213 }
2214
2215 static char *
2216 get_file_type (unsigned e_type)
2217 {
2218 static char buff[32];
2219
2220 switch (e_type)
2221 {
2222 case ET_NONE: return _("NONE (None)");
2223 case ET_REL: return _("REL (Relocatable file)");
2224 case ET_EXEC: return _("EXEC (Executable file)");
2225 case ET_DYN: return _("DYN (Shared object file)");
2226 case ET_CORE: return _("CORE (Core file)");
2227
2228 default:
2229 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2230 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2231 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2232 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2233 else
2234 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2235 return buff;
2236 }
2237 }
2238
2239 static char *
2240 get_machine_name (unsigned e_machine)
2241 {
2242 static char buff[64]; /* XXX */
2243
2244 switch (e_machine)
2245 {
2246 /* Please keep this switch table sorted by increasing EM_ value. */
2247 /* 0 */
2248 case EM_NONE: return _("None");
2249 case EM_M32: return "WE32100";
2250 case EM_SPARC: return "Sparc";
2251 case EM_386: return "Intel 80386";
2252 case EM_68K: return "MC68000";
2253 case EM_88K: return "MC88000";
2254 case EM_IAMCU: return "Intel MCU";
2255 case EM_MIPS: return "MIPS R3000";
2256 case EM_S370: return "IBM System/370";
2257 /* 10 */
2258 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2259 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2260 case EM_PARISC: return "HPPA";
2261 case EM_VPP550: return "Fujitsu VPP500";
2262 case EM_SPARC32PLUS: return "Sparc v8+" ;
2263 case EM_PPC: return "PowerPC";
2264 /* 20 */
2265 case EM_PPC64: return "PowerPC64";
2266 case EM_S390_OLD:
2267 case EM_S390: return "IBM S/390";
2268 case EM_SPU: return "SPU";
2269 /* 30 */
2270 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2271 case EM_FR20: return "Fujitsu FR20";
2272 case EM_RH32: return "TRW RH32";
2273 case EM_MCORE: return "MCORE";
2274 /* 40 */
2275 case EM_ARM: return "ARM";
2276 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2277 case EM_SH: return "Renesas / SuperH SH";
2278 case EM_SPARCV9: return "Sparc v9";
2279 case EM_TRICORE: return "Siemens Tricore";
2280 case EM_ARC: return "ARC";
2281 case EM_H8_300: return "Renesas H8/300";
2282 case EM_H8_300H: return "Renesas H8/300H";
2283 case EM_H8S: return "Renesas H8S";
2284 case EM_H8_500: return "Renesas H8/500";
2285 /* 50 */
2286 case EM_IA_64: return "Intel IA-64";
2287 case EM_MIPS_X: return "Stanford MIPS-X";
2288 case EM_COLDFIRE: return "Motorola Coldfire";
2289 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2290 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2291 case EM_PCP: return "Siemens PCP";
2292 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2293 case EM_NDR1: return "Denso NDR1 microprocesspr";
2294 case EM_STARCORE: return "Motorola Star*Core processor";
2295 case EM_ME16: return "Toyota ME16 processor";
2296 /* 60 */
2297 case EM_ST100: return "STMicroelectronics ST100 processor";
2298 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2299 case EM_X86_64: return "Advanced Micro Devices X86-64";
2300 case EM_PDSP: return "Sony DSP processor";
2301 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2302 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2303 case EM_FX66: return "Siemens FX66 microcontroller";
2304 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2305 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2306 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2307 /* 70 */
2308 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2309 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2310 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2311 case EM_SVX: return "Silicon Graphics SVx";
2312 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2313 case EM_VAX: return "Digital VAX";
2314 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2315 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2316 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2317 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2318 /* 80 */
2319 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2320 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2321 case EM_PRISM: return "Vitesse Prism";
2322 case EM_AVR_OLD:
2323 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2324 case EM_CYGNUS_FR30:
2325 case EM_FR30: return "Fujitsu FR30";
2326 case EM_CYGNUS_D10V:
2327 case EM_D10V: return "d10v";
2328 case EM_CYGNUS_D30V:
2329 case EM_D30V: return "d30v";
2330 case EM_CYGNUS_V850:
2331 case EM_V850: return "Renesas V850";
2332 case EM_CYGNUS_M32R:
2333 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2334 case EM_CYGNUS_MN10300:
2335 case EM_MN10300: return "mn10300";
2336 /* 90 */
2337 case EM_CYGNUS_MN10200:
2338 case EM_MN10200: return "mn10200";
2339 case EM_PJ: return "picoJava";
2340 case EM_OR1K: return "OpenRISC 1000";
2341 case EM_ARC_COMPACT: return "ARCompact";
2342 case EM_XTENSA_OLD:
2343 case EM_XTENSA: return "Tensilica Xtensa Processor";
2344 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2345 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2346 case EM_NS32K: return "National Semiconductor 32000 series";
2347 case EM_TPC: return "Tenor Network TPC processor";
2348 case EM_SNP1K: return "Trebia SNP 1000 processor";
2349 /* 100 */
2350 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2351 case EM_IP2K_OLD:
2352 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2353 case EM_MAX: return "MAX Processor";
2354 case EM_CR: return "National Semiconductor CompactRISC";
2355 case EM_F2MC16: return "Fujitsu F2MC16";
2356 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2357 case EM_BLACKFIN: return "Analog Devices Blackfin";
2358 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2359 case EM_SEP: return "Sharp embedded microprocessor";
2360 case EM_ARCA: return "Arca RISC microprocessor";
2361 /* 110 */
2362 case EM_UNICORE: return "Unicore";
2363 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2364 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2365 case EM_ALTERA_NIOS2: return "Altera Nios II";
2366 case EM_CRX: return "National Semiconductor CRX microprocessor";
2367 case EM_XGATE: return "Motorola XGATE embedded processor";
2368 case EM_C166:
2369 case EM_XC16X: return "Infineon Technologies xc16x";
2370 case EM_M16C: return "Renesas M16C series microprocessors";
2371 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2372 case EM_CE: return "Freescale Communication Engine RISC core";
2373 /* 120 */
2374 case EM_M32C: return "Renesas M32c";
2375 /* 130 */
2376 case EM_TSK3000: return "Altium TSK3000 core";
2377 case EM_RS08: return "Freescale RS08 embedded processor";
2378 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2379 case EM_SCORE: return "SUNPLUS S+Core";
2380 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2381 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2382 case EM_LATTICEMICO32: return "Lattice Mico32";
2383 case EM_SE_C17: return "Seiko Epson C17 family";
2384 /* 140 */
2385 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2386 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2387 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2388 case EM_TI_PRU: return "TI PRU I/O processor";
2389 /* 160 */
2390 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2391 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2392 case EM_R32C: return "Renesas R32C series microprocessors";
2393 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2394 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2395 case EM_8051: return "Intel 8051 and variants";
2396 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2397 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2398 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2399 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2400 /* 170 */
2401 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2402 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2403 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2404 case EM_RX: return "Renesas RX";
2405 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2406 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2407 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2408 case EM_CR16:
2409 case EM_MICROBLAZE:
2410 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2411 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2412 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2413 /* 180 */
2414 case EM_L1OM: return "Intel L1OM";
2415 case EM_K1OM: return "Intel K1OM";
2416 case EM_INTEL182: return "Intel (reserved)";
2417 case EM_AARCH64: return "AArch64";
2418 case EM_ARM184: return "ARM (reserved)";
2419 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2420 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2421 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2422 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2423 /* 190 */
2424 case EM_CUDA: return "NVIDIA CUDA architecture";
2425 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2426 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2427 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2428 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2429 case EM_ARC_COMPACT2: return "ARCv2";
2430 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2431 case EM_RL78: return "Renesas RL78";
2432 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2433 case EM_78K0R: return "Renesas 78K0R";
2434 /* 200 */
2435 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2436 case EM_BA1: return "Beyond BA1 CPU architecture";
2437 case EM_BA2: return "Beyond BA2 CPU architecture";
2438 case EM_XCORE: return "XMOS xCORE processor family";
2439 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2440 /* 210 */
2441 case EM_KM32: return "KM211 KM32 32-bit processor";
2442 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2443 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2444 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2445 case EM_KVARC: return "KM211 KVARC processor";
2446 case EM_CDP: return "Paneve CDP architecture family";
2447 case EM_COGE: return "Cognitive Smart Memory Processor";
2448 case EM_COOL: return "Bluechip Systems CoolEngine";
2449 case EM_NORC: return "Nanoradio Optimized RISC";
2450 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2451 /* 220 */
2452 case EM_Z80: return "Zilog Z80";
2453 case EM_VISIUM: return "CDS VISIUMcore processor";
2454 case EM_FT32: return "FTDI Chip FT32";
2455 case EM_MOXIE: return "Moxie";
2456 case EM_AMDGPU: return "AMD GPU";
2457 case EM_RISCV: return "RISC-V";
2458 case EM_LANAI: return "Lanai 32-bit processor";
2459 case EM_BPF: return "Linux BPF";
2460
2461 /* Large numbers... */
2462 case EM_MT: return "Morpho Techologies MT processor";
2463 case EM_ALPHA: return "Alpha";
2464 case EM_WEBASSEMBLY: return "Web Assembly";
2465 case EM_DLX: return "OpenDLX";
2466 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2467 case EM_IQ2000: return "Vitesse IQ2000";
2468 case EM_M32C_OLD:
2469 case EM_NIOS32: return "Altera Nios";
2470 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2471 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2472 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2473
2474 default:
2475 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2476 return buff;
2477 }
2478 }
2479
2480 static void
2481 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2482 {
2483 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2484 other compilers don't a specific architecture type in the e_flags, and
2485 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2486 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2487 architectures.
2488
2489 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2490 but also sets a specific architecture type in the e_flags field.
2491
2492 However, when decoding the flags we don't worry if we see an
2493 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2494 ARCEM architecture type. */
2495
2496 switch (e_flags & EF_ARC_MACH_MSK)
2497 {
2498 /* We only expect these to occur for EM_ARC_COMPACT2. */
2499 case EF_ARC_CPU_ARCV2EM:
2500 strcat (buf, ", ARC EM");
2501 break;
2502 case EF_ARC_CPU_ARCV2HS:
2503 strcat (buf, ", ARC HS");
2504 break;
2505
2506 /* We only expect these to occur for EM_ARC_COMPACT. */
2507 case E_ARC_MACH_ARC600:
2508 strcat (buf, ", ARC600");
2509 break;
2510 case E_ARC_MACH_ARC601:
2511 strcat (buf, ", ARC601");
2512 break;
2513 case E_ARC_MACH_ARC700:
2514 strcat (buf, ", ARC700");
2515 break;
2516
2517 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2518 new ELF with new architecture being read by an old version of
2519 readelf, or (c) An ELF built with non-GNU compiler that does not
2520 set the architecture in the e_flags. */
2521 default:
2522 if (e_machine == EM_ARC_COMPACT)
2523 strcat (buf, ", Unknown ARCompact");
2524 else
2525 strcat (buf, ", Unknown ARC");
2526 break;
2527 }
2528
2529 switch (e_flags & EF_ARC_OSABI_MSK)
2530 {
2531 case E_ARC_OSABI_ORIG:
2532 strcat (buf, ", (ABI:legacy)");
2533 break;
2534 case E_ARC_OSABI_V2:
2535 strcat (buf, ", (ABI:v2)");
2536 break;
2537 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2538 case E_ARC_OSABI_V3:
2539 strcat (buf, ", v3 no-legacy-syscalls ABI");
2540 break;
2541 case E_ARC_OSABI_V4:
2542 strcat (buf, ", v4 ABI");
2543 break;
2544 default:
2545 strcat (buf, ", unrecognised ARC OSABI flag");
2546 break;
2547 }
2548 }
2549
2550 static void
2551 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2552 {
2553 unsigned eabi;
2554 bfd_boolean unknown = FALSE;
2555
2556 eabi = EF_ARM_EABI_VERSION (e_flags);
2557 e_flags &= ~ EF_ARM_EABIMASK;
2558
2559 /* Handle "generic" ARM flags. */
2560 if (e_flags & EF_ARM_RELEXEC)
2561 {
2562 strcat (buf, ", relocatable executable");
2563 e_flags &= ~ EF_ARM_RELEXEC;
2564 }
2565
2566 /* Now handle EABI specific flags. */
2567 switch (eabi)
2568 {
2569 default:
2570 strcat (buf, ", <unrecognized EABI>");
2571 if (e_flags)
2572 unknown = TRUE;
2573 break;
2574
2575 case EF_ARM_EABI_VER1:
2576 strcat (buf, ", Version1 EABI");
2577 while (e_flags)
2578 {
2579 unsigned flag;
2580
2581 /* Process flags one bit at a time. */
2582 flag = e_flags & - e_flags;
2583 e_flags &= ~ flag;
2584
2585 switch (flag)
2586 {
2587 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2588 strcat (buf, ", sorted symbol tables");
2589 break;
2590
2591 default:
2592 unknown = TRUE;
2593 break;
2594 }
2595 }
2596 break;
2597
2598 case EF_ARM_EABI_VER2:
2599 strcat (buf, ", Version2 EABI");
2600 while (e_flags)
2601 {
2602 unsigned flag;
2603
2604 /* Process flags one bit at a time. */
2605 flag = e_flags & - e_flags;
2606 e_flags &= ~ flag;
2607
2608 switch (flag)
2609 {
2610 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2611 strcat (buf, ", sorted symbol tables");
2612 break;
2613
2614 case EF_ARM_DYNSYMSUSESEGIDX:
2615 strcat (buf, ", dynamic symbols use segment index");
2616 break;
2617
2618 case EF_ARM_MAPSYMSFIRST:
2619 strcat (buf, ", mapping symbols precede others");
2620 break;
2621
2622 default:
2623 unknown = TRUE;
2624 break;
2625 }
2626 }
2627 break;
2628
2629 case EF_ARM_EABI_VER3:
2630 strcat (buf, ", Version3 EABI");
2631 break;
2632
2633 case EF_ARM_EABI_VER4:
2634 strcat (buf, ", Version4 EABI");
2635 while (e_flags)
2636 {
2637 unsigned flag;
2638
2639 /* Process flags one bit at a time. */
2640 flag = e_flags & - e_flags;
2641 e_flags &= ~ flag;
2642
2643 switch (flag)
2644 {
2645 case EF_ARM_BE8:
2646 strcat (buf, ", BE8");
2647 break;
2648
2649 case EF_ARM_LE8:
2650 strcat (buf, ", LE8");
2651 break;
2652
2653 default:
2654 unknown = TRUE;
2655 break;
2656 }
2657 }
2658 break;
2659
2660 case EF_ARM_EABI_VER5:
2661 strcat (buf, ", Version5 EABI");
2662 while (e_flags)
2663 {
2664 unsigned flag;
2665
2666 /* Process flags one bit at a time. */
2667 flag = e_flags & - e_flags;
2668 e_flags &= ~ flag;
2669
2670 switch (flag)
2671 {
2672 case EF_ARM_BE8:
2673 strcat (buf, ", BE8");
2674 break;
2675
2676 case EF_ARM_LE8:
2677 strcat (buf, ", LE8");
2678 break;
2679
2680 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2681 strcat (buf, ", soft-float ABI");
2682 break;
2683
2684 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2685 strcat (buf, ", hard-float ABI");
2686 break;
2687
2688 default:
2689 unknown = TRUE;
2690 break;
2691 }
2692 }
2693 break;
2694
2695 case EF_ARM_EABI_UNKNOWN:
2696 strcat (buf, ", GNU EABI");
2697 while (e_flags)
2698 {
2699 unsigned flag;
2700
2701 /* Process flags one bit at a time. */
2702 flag = e_flags & - e_flags;
2703 e_flags &= ~ flag;
2704
2705 switch (flag)
2706 {
2707 case EF_ARM_INTERWORK:
2708 strcat (buf, ", interworking enabled");
2709 break;
2710
2711 case EF_ARM_APCS_26:
2712 strcat (buf, ", uses APCS/26");
2713 break;
2714
2715 case EF_ARM_APCS_FLOAT:
2716 strcat (buf, ", uses APCS/float");
2717 break;
2718
2719 case EF_ARM_PIC:
2720 strcat (buf, ", position independent");
2721 break;
2722
2723 case EF_ARM_ALIGN8:
2724 strcat (buf, ", 8 bit structure alignment");
2725 break;
2726
2727 case EF_ARM_NEW_ABI:
2728 strcat (buf, ", uses new ABI");
2729 break;
2730
2731 case EF_ARM_OLD_ABI:
2732 strcat (buf, ", uses old ABI");
2733 break;
2734
2735 case EF_ARM_SOFT_FLOAT:
2736 strcat (buf, ", software FP");
2737 break;
2738
2739 case EF_ARM_VFP_FLOAT:
2740 strcat (buf, ", VFP");
2741 break;
2742
2743 case EF_ARM_MAVERICK_FLOAT:
2744 strcat (buf, ", Maverick FP");
2745 break;
2746
2747 default:
2748 unknown = TRUE;
2749 break;
2750 }
2751 }
2752 }
2753
2754 if (unknown)
2755 strcat (buf,_(", <unknown>"));
2756 }
2757
2758 static void
2759 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2760 {
2761 --size; /* Leave space for null terminator. */
2762
2763 switch (e_flags & EF_AVR_MACH)
2764 {
2765 case E_AVR_MACH_AVR1:
2766 strncat (buf, ", avr:1", size);
2767 break;
2768 case E_AVR_MACH_AVR2:
2769 strncat (buf, ", avr:2", size);
2770 break;
2771 case E_AVR_MACH_AVR25:
2772 strncat (buf, ", avr:25", size);
2773 break;
2774 case E_AVR_MACH_AVR3:
2775 strncat (buf, ", avr:3", size);
2776 break;
2777 case E_AVR_MACH_AVR31:
2778 strncat (buf, ", avr:31", size);
2779 break;
2780 case E_AVR_MACH_AVR35:
2781 strncat (buf, ", avr:35", size);
2782 break;
2783 case E_AVR_MACH_AVR4:
2784 strncat (buf, ", avr:4", size);
2785 break;
2786 case E_AVR_MACH_AVR5:
2787 strncat (buf, ", avr:5", size);
2788 break;
2789 case E_AVR_MACH_AVR51:
2790 strncat (buf, ", avr:51", size);
2791 break;
2792 case E_AVR_MACH_AVR6:
2793 strncat (buf, ", avr:6", size);
2794 break;
2795 case E_AVR_MACH_AVRTINY:
2796 strncat (buf, ", avr:100", size);
2797 break;
2798 case E_AVR_MACH_XMEGA1:
2799 strncat (buf, ", avr:101", size);
2800 break;
2801 case E_AVR_MACH_XMEGA2:
2802 strncat (buf, ", avr:102", size);
2803 break;
2804 case E_AVR_MACH_XMEGA3:
2805 strncat (buf, ", avr:103", size);
2806 break;
2807 case E_AVR_MACH_XMEGA4:
2808 strncat (buf, ", avr:104", size);
2809 break;
2810 case E_AVR_MACH_XMEGA5:
2811 strncat (buf, ", avr:105", size);
2812 break;
2813 case E_AVR_MACH_XMEGA6:
2814 strncat (buf, ", avr:106", size);
2815 break;
2816 case E_AVR_MACH_XMEGA7:
2817 strncat (buf, ", avr:107", size);
2818 break;
2819 default:
2820 strncat (buf, ", avr:<unknown>", size);
2821 break;
2822 }
2823
2824 size -= strlen (buf);
2825 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2826 strncat (buf, ", link-relax", size);
2827 }
2828
2829 static void
2830 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2831 {
2832 unsigned abi;
2833 unsigned arch;
2834 unsigned config;
2835 unsigned version;
2836 bfd_boolean has_fpu = FALSE;
2837 unsigned int r = 0;
2838
2839 static const char *ABI_STRINGS[] =
2840 {
2841 "ABI v0", /* use r5 as return register; only used in N1213HC */
2842 "ABI v1", /* use r0 as return register */
2843 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2844 "ABI v2fp", /* for FPU */
2845 "AABI",
2846 "ABI2 FP+"
2847 };
2848 static const char *VER_STRINGS[] =
2849 {
2850 "Andes ELF V1.3 or older",
2851 "Andes ELF V1.3.1",
2852 "Andes ELF V1.4"
2853 };
2854 static const char *ARCH_STRINGS[] =
2855 {
2856 "",
2857 "Andes Star v1.0",
2858 "Andes Star v2.0",
2859 "Andes Star v3.0",
2860 "Andes Star v3.0m"
2861 };
2862
2863 abi = EF_NDS_ABI & e_flags;
2864 arch = EF_NDS_ARCH & e_flags;
2865 config = EF_NDS_INST & e_flags;
2866 version = EF_NDS32_ELF_VERSION & e_flags;
2867
2868 memset (buf, 0, size);
2869
2870 switch (abi)
2871 {
2872 case E_NDS_ABI_V0:
2873 case E_NDS_ABI_V1:
2874 case E_NDS_ABI_V2:
2875 case E_NDS_ABI_V2FP:
2876 case E_NDS_ABI_AABI:
2877 case E_NDS_ABI_V2FP_PLUS:
2878 /* In case there are holes in the array. */
2879 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2880 break;
2881
2882 default:
2883 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2884 break;
2885 }
2886
2887 switch (version)
2888 {
2889 case E_NDS32_ELF_VER_1_2:
2890 case E_NDS32_ELF_VER_1_3:
2891 case E_NDS32_ELF_VER_1_4:
2892 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2893 break;
2894
2895 default:
2896 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2897 break;
2898 }
2899
2900 if (E_NDS_ABI_V0 == abi)
2901 {
2902 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2903 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2904 if (arch == E_NDS_ARCH_STAR_V1_0)
2905 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2906 return;
2907 }
2908
2909 switch (arch)
2910 {
2911 case E_NDS_ARCH_STAR_V1_0:
2912 case E_NDS_ARCH_STAR_V2_0:
2913 case E_NDS_ARCH_STAR_V3_0:
2914 case E_NDS_ARCH_STAR_V3_M:
2915 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2916 break;
2917
2918 default:
2919 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2920 /* ARCH version determines how the e_flags are interpreted.
2921 If it is unknown, we cannot proceed. */
2922 return;
2923 }
2924
2925 /* Newer ABI; Now handle architecture specific flags. */
2926 if (arch == E_NDS_ARCH_STAR_V1_0)
2927 {
2928 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2929 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2930
2931 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2932 r += snprintf (buf + r, size -r, ", MAC");
2933
2934 if (config & E_NDS32_HAS_DIV_INST)
2935 r += snprintf (buf + r, size -r, ", DIV");
2936
2937 if (config & E_NDS32_HAS_16BIT_INST)
2938 r += snprintf (buf + r, size -r, ", 16b");
2939 }
2940 else
2941 {
2942 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2943 {
2944 if (version <= E_NDS32_ELF_VER_1_3)
2945 r += snprintf (buf + r, size -r, ", [B8]");
2946 else
2947 r += snprintf (buf + r, size -r, ", EX9");
2948 }
2949
2950 if (config & E_NDS32_HAS_MAC_DX_INST)
2951 r += snprintf (buf + r, size -r, ", MAC_DX");
2952
2953 if (config & E_NDS32_HAS_DIV_DX_INST)
2954 r += snprintf (buf + r, size -r, ", DIV_DX");
2955
2956 if (config & E_NDS32_HAS_16BIT_INST)
2957 {
2958 if (version <= E_NDS32_ELF_VER_1_3)
2959 r += snprintf (buf + r, size -r, ", 16b");
2960 else
2961 r += snprintf (buf + r, size -r, ", IFC");
2962 }
2963 }
2964
2965 if (config & E_NDS32_HAS_EXT_INST)
2966 r += snprintf (buf + r, size -r, ", PERF1");
2967
2968 if (config & E_NDS32_HAS_EXT2_INST)
2969 r += snprintf (buf + r, size -r, ", PERF2");
2970
2971 if (config & E_NDS32_HAS_FPU_INST)
2972 {
2973 has_fpu = TRUE;
2974 r += snprintf (buf + r, size -r, ", FPU_SP");
2975 }
2976
2977 if (config & E_NDS32_HAS_FPU_DP_INST)
2978 {
2979 has_fpu = TRUE;
2980 r += snprintf (buf + r, size -r, ", FPU_DP");
2981 }
2982
2983 if (config & E_NDS32_HAS_FPU_MAC_INST)
2984 {
2985 has_fpu = TRUE;
2986 r += snprintf (buf + r, size -r, ", FPU_MAC");
2987 }
2988
2989 if (has_fpu)
2990 {
2991 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2992 {
2993 case E_NDS32_FPU_REG_8SP_4DP:
2994 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2995 break;
2996 case E_NDS32_FPU_REG_16SP_8DP:
2997 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2998 break;
2999 case E_NDS32_FPU_REG_32SP_16DP:
3000 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3001 break;
3002 case E_NDS32_FPU_REG_32SP_32DP:
3003 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3004 break;
3005 }
3006 }
3007
3008 if (config & E_NDS32_HAS_AUDIO_INST)
3009 r += snprintf (buf + r, size -r, ", AUDIO");
3010
3011 if (config & E_NDS32_HAS_STRING_INST)
3012 r += snprintf (buf + r, size -r, ", STR");
3013
3014 if (config & E_NDS32_HAS_REDUCED_REGS)
3015 r += snprintf (buf + r, size -r, ", 16REG");
3016
3017 if (config & E_NDS32_HAS_VIDEO_INST)
3018 {
3019 if (version <= E_NDS32_ELF_VER_1_3)
3020 r += snprintf (buf + r, size -r, ", VIDEO");
3021 else
3022 r += snprintf (buf + r, size -r, ", SATURATION");
3023 }
3024
3025 if (config & E_NDS32_HAS_ENCRIPT_INST)
3026 r += snprintf (buf + r, size -r, ", ENCRP");
3027
3028 if (config & E_NDS32_HAS_L2C_INST)
3029 r += snprintf (buf + r, size -r, ", L2C");
3030 }
3031
3032 static char *
3033 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3034 {
3035 static char buf[1024];
3036
3037 buf[0] = '\0';
3038
3039 if (e_flags)
3040 {
3041 switch (e_machine)
3042 {
3043 default:
3044 break;
3045
3046 case EM_ARC_COMPACT2:
3047 case EM_ARC_COMPACT:
3048 decode_ARC_machine_flags (e_flags, e_machine, buf);
3049 break;
3050
3051 case EM_ARM:
3052 decode_ARM_machine_flags (e_flags, buf);
3053 break;
3054
3055 case EM_AVR:
3056 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3057 break;
3058
3059 case EM_BLACKFIN:
3060 if (e_flags & EF_BFIN_PIC)
3061 strcat (buf, ", PIC");
3062
3063 if (e_flags & EF_BFIN_FDPIC)
3064 strcat (buf, ", FDPIC");
3065
3066 if (e_flags & EF_BFIN_CODE_IN_L1)
3067 strcat (buf, ", code in L1");
3068
3069 if (e_flags & EF_BFIN_DATA_IN_L1)
3070 strcat (buf, ", data in L1");
3071
3072 break;
3073
3074 case EM_CYGNUS_FRV:
3075 switch (e_flags & EF_FRV_CPU_MASK)
3076 {
3077 case EF_FRV_CPU_GENERIC:
3078 break;
3079
3080 default:
3081 strcat (buf, ", fr???");
3082 break;
3083
3084 case EF_FRV_CPU_FR300:
3085 strcat (buf, ", fr300");
3086 break;
3087
3088 case EF_FRV_CPU_FR400:
3089 strcat (buf, ", fr400");
3090 break;
3091 case EF_FRV_CPU_FR405:
3092 strcat (buf, ", fr405");
3093 break;
3094
3095 case EF_FRV_CPU_FR450:
3096 strcat (buf, ", fr450");
3097 break;
3098
3099 case EF_FRV_CPU_FR500:
3100 strcat (buf, ", fr500");
3101 break;
3102 case EF_FRV_CPU_FR550:
3103 strcat (buf, ", fr550");
3104 break;
3105
3106 case EF_FRV_CPU_SIMPLE:
3107 strcat (buf, ", simple");
3108 break;
3109 case EF_FRV_CPU_TOMCAT:
3110 strcat (buf, ", tomcat");
3111 break;
3112 }
3113 break;
3114
3115 case EM_68K:
3116 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3117 strcat (buf, ", m68000");
3118 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3119 strcat (buf, ", cpu32");
3120 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3121 strcat (buf, ", fido_a");
3122 else
3123 {
3124 char const * isa = _("unknown");
3125 char const * mac = _("unknown mac");
3126 char const * additional = NULL;
3127
3128 switch (e_flags & EF_M68K_CF_ISA_MASK)
3129 {
3130 case EF_M68K_CF_ISA_A_NODIV:
3131 isa = "A";
3132 additional = ", nodiv";
3133 break;
3134 case EF_M68K_CF_ISA_A:
3135 isa = "A";
3136 break;
3137 case EF_M68K_CF_ISA_A_PLUS:
3138 isa = "A+";
3139 break;
3140 case EF_M68K_CF_ISA_B_NOUSP:
3141 isa = "B";
3142 additional = ", nousp";
3143 break;
3144 case EF_M68K_CF_ISA_B:
3145 isa = "B";
3146 break;
3147 case EF_M68K_CF_ISA_C:
3148 isa = "C";
3149 break;
3150 case EF_M68K_CF_ISA_C_NODIV:
3151 isa = "C";
3152 additional = ", nodiv";
3153 break;
3154 }
3155 strcat (buf, ", cf, isa ");
3156 strcat (buf, isa);
3157 if (additional)
3158 strcat (buf, additional);
3159 if (e_flags & EF_M68K_CF_FLOAT)
3160 strcat (buf, ", float");
3161 switch (e_flags & EF_M68K_CF_MAC_MASK)
3162 {
3163 case 0:
3164 mac = NULL;
3165 break;
3166 case EF_M68K_CF_MAC:
3167 mac = "mac";
3168 break;
3169 case EF_M68K_CF_EMAC:
3170 mac = "emac";
3171 break;
3172 case EF_M68K_CF_EMAC_B:
3173 mac = "emac_b";
3174 break;
3175 }
3176 if (mac)
3177 {
3178 strcat (buf, ", ");
3179 strcat (buf, mac);
3180 }
3181 }
3182 break;
3183
3184 case EM_CYGNUS_MEP:
3185 switch (e_flags & EF_MEP_CPU_MASK)
3186 {
3187 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3188 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3189 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3190 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3191 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3192 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3193 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3194 }
3195
3196 switch (e_flags & EF_MEP_COP_MASK)
3197 {
3198 case EF_MEP_COP_NONE: break;
3199 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3200 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3201 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3202 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3203 default: strcat (buf, _("<unknown MeP copro type>")); break;
3204 }
3205
3206 if (e_flags & EF_MEP_LIBRARY)
3207 strcat (buf, ", Built for Library");
3208
3209 if (e_flags & EF_MEP_INDEX_MASK)
3210 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3211 e_flags & EF_MEP_INDEX_MASK);
3212
3213 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3214 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3215 e_flags & ~ EF_MEP_ALL_FLAGS);
3216 break;
3217
3218 case EM_PPC:
3219 if (e_flags & EF_PPC_EMB)
3220 strcat (buf, ", emb");
3221
3222 if (e_flags & EF_PPC_RELOCATABLE)
3223 strcat (buf, _(", relocatable"));
3224
3225 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3226 strcat (buf, _(", relocatable-lib"));
3227 break;
3228
3229 case EM_PPC64:
3230 if (e_flags & EF_PPC64_ABI)
3231 {
3232 char abi[] = ", abiv0";
3233
3234 abi[6] += e_flags & EF_PPC64_ABI;
3235 strcat (buf, abi);
3236 }
3237 break;
3238
3239 case EM_V800:
3240 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3241 strcat (buf, ", RH850 ABI");
3242
3243 if (e_flags & EF_V800_850E3)
3244 strcat (buf, ", V3 architecture");
3245
3246 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3247 strcat (buf, ", FPU not used");
3248
3249 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3250 strcat (buf, ", regmode: COMMON");
3251
3252 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3253 strcat (buf, ", r4 not used");
3254
3255 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3256 strcat (buf, ", r30 not used");
3257
3258 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3259 strcat (buf, ", r5 not used");
3260
3261 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3262 strcat (buf, ", r2 not used");
3263
3264 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3265 {
3266 switch (e_flags & - e_flags)
3267 {
3268 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3269 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3270 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3271 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3272 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3273 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3274 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3275 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3276 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3277 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3278 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3279 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3280 default: break;
3281 }
3282 }
3283 break;
3284
3285 case EM_V850:
3286 case EM_CYGNUS_V850:
3287 switch (e_flags & EF_V850_ARCH)
3288 {
3289 case E_V850E3V5_ARCH:
3290 strcat (buf, ", v850e3v5");
3291 break;
3292 case E_V850E2V3_ARCH:
3293 strcat (buf, ", v850e2v3");
3294 break;
3295 case E_V850E2_ARCH:
3296 strcat (buf, ", v850e2");
3297 break;
3298 case E_V850E1_ARCH:
3299 strcat (buf, ", v850e1");
3300 break;
3301 case E_V850E_ARCH:
3302 strcat (buf, ", v850e");
3303 break;
3304 case E_V850_ARCH:
3305 strcat (buf, ", v850");
3306 break;
3307 default:
3308 strcat (buf, _(", unknown v850 architecture variant"));
3309 break;
3310 }
3311 break;
3312
3313 case EM_M32R:
3314 case EM_CYGNUS_M32R:
3315 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3316 strcat (buf, ", m32r");
3317 break;
3318
3319 case EM_MIPS:
3320 case EM_MIPS_RS3_LE:
3321 if (e_flags & EF_MIPS_NOREORDER)
3322 strcat (buf, ", noreorder");
3323
3324 if (e_flags & EF_MIPS_PIC)
3325 strcat (buf, ", pic");
3326
3327 if (e_flags & EF_MIPS_CPIC)
3328 strcat (buf, ", cpic");
3329
3330 if (e_flags & EF_MIPS_UCODE)
3331 strcat (buf, ", ugen_reserved");
3332
3333 if (e_flags & EF_MIPS_ABI2)
3334 strcat (buf, ", abi2");
3335
3336 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3337 strcat (buf, ", odk first");
3338
3339 if (e_flags & EF_MIPS_32BITMODE)
3340 strcat (buf, ", 32bitmode");
3341
3342 if (e_flags & EF_MIPS_NAN2008)
3343 strcat (buf, ", nan2008");
3344
3345 if (e_flags & EF_MIPS_FP64)
3346 strcat (buf, ", fp64");
3347
3348 switch ((e_flags & EF_MIPS_MACH))
3349 {
3350 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3351 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3352 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3353 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3354 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3355 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3356 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3357 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3358 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3359 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3360 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3361 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3362 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3363 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3364 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3365 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3366 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3367 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3368 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3369 case 0:
3370 /* We simply ignore the field in this case to avoid confusion:
3371 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3372 extension. */
3373 break;
3374 default: strcat (buf, _(", unknown CPU")); break;
3375 }
3376
3377 switch ((e_flags & EF_MIPS_ABI))
3378 {
3379 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3380 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3381 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3382 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3383 case 0:
3384 /* We simply ignore the field in this case to avoid confusion:
3385 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3386 This means it is likely to be an o32 file, but not for
3387 sure. */
3388 break;
3389 default: strcat (buf, _(", unknown ABI")); break;
3390 }
3391
3392 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3393 strcat (buf, ", mdmx");
3394
3395 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3396 strcat (buf, ", mips16");
3397
3398 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3399 strcat (buf, ", micromips");
3400
3401 switch ((e_flags & EF_MIPS_ARCH))
3402 {
3403 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3404 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3405 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3406 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3407 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3408 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3409 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3410 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3411 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3412 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3413 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3414 default: strcat (buf, _(", unknown ISA")); break;
3415 }
3416 break;
3417
3418 case EM_NDS32:
3419 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3420 break;
3421
3422 case EM_RISCV:
3423 if (e_flags & EF_RISCV_RVC)
3424 strcat (buf, ", RVC");
3425
3426 switch (e_flags & EF_RISCV_FLOAT_ABI)
3427 {
3428 case EF_RISCV_FLOAT_ABI_SOFT:
3429 strcat (buf, ", soft-float ABI");
3430 break;
3431
3432 case EF_RISCV_FLOAT_ABI_SINGLE:
3433 strcat (buf, ", single-float ABI");
3434 break;
3435
3436 case EF_RISCV_FLOAT_ABI_DOUBLE:
3437 strcat (buf, ", double-float ABI");
3438 break;
3439
3440 case EF_RISCV_FLOAT_ABI_QUAD:
3441 strcat (buf, ", quad-float ABI");
3442 break;
3443 }
3444 break;
3445
3446 case EM_SH:
3447 switch ((e_flags & EF_SH_MACH_MASK))
3448 {
3449 case EF_SH1: strcat (buf, ", sh1"); break;
3450 case EF_SH2: strcat (buf, ", sh2"); break;
3451 case EF_SH3: strcat (buf, ", sh3"); break;
3452 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3453 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3454 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3455 case EF_SH3E: strcat (buf, ", sh3e"); break;
3456 case EF_SH4: strcat (buf, ", sh4"); break;
3457 case EF_SH5: strcat (buf, ", sh5"); break;
3458 case EF_SH2E: strcat (buf, ", sh2e"); break;
3459 case EF_SH4A: strcat (buf, ", sh4a"); break;
3460 case EF_SH2A: strcat (buf, ", sh2a"); break;
3461 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3462 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3463 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3464 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3465 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3466 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3467 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3468 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3469 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3470 default: strcat (buf, _(", unknown ISA")); break;
3471 }
3472
3473 if (e_flags & EF_SH_PIC)
3474 strcat (buf, ", pic");
3475
3476 if (e_flags & EF_SH_FDPIC)
3477 strcat (buf, ", fdpic");
3478 break;
3479
3480 case EM_OR1K:
3481 if (e_flags & EF_OR1K_NODELAY)
3482 strcat (buf, ", no delay");
3483 break;
3484
3485 case EM_SPARCV9:
3486 if (e_flags & EF_SPARC_32PLUS)
3487 strcat (buf, ", v8+");
3488
3489 if (e_flags & EF_SPARC_SUN_US1)
3490 strcat (buf, ", ultrasparcI");
3491
3492 if (e_flags & EF_SPARC_SUN_US3)
3493 strcat (buf, ", ultrasparcIII");
3494
3495 if (e_flags & EF_SPARC_HAL_R1)
3496 strcat (buf, ", halr1");
3497
3498 if (e_flags & EF_SPARC_LEDATA)
3499 strcat (buf, ", ledata");
3500
3501 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3502 strcat (buf, ", tso");
3503
3504 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3505 strcat (buf, ", pso");
3506
3507 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3508 strcat (buf, ", rmo");
3509 break;
3510
3511 case EM_PARISC:
3512 switch (e_flags & EF_PARISC_ARCH)
3513 {
3514 case EFA_PARISC_1_0:
3515 strcpy (buf, ", PA-RISC 1.0");
3516 break;
3517 case EFA_PARISC_1_1:
3518 strcpy (buf, ", PA-RISC 1.1");
3519 break;
3520 case EFA_PARISC_2_0:
3521 strcpy (buf, ", PA-RISC 2.0");
3522 break;
3523 default:
3524 break;
3525 }
3526 if (e_flags & EF_PARISC_TRAPNIL)
3527 strcat (buf, ", trapnil");
3528 if (e_flags & EF_PARISC_EXT)
3529 strcat (buf, ", ext");
3530 if (e_flags & EF_PARISC_LSB)
3531 strcat (buf, ", lsb");
3532 if (e_flags & EF_PARISC_WIDE)
3533 strcat (buf, ", wide");
3534 if (e_flags & EF_PARISC_NO_KABP)
3535 strcat (buf, ", no kabp");
3536 if (e_flags & EF_PARISC_LAZYSWAP)
3537 strcat (buf, ", lazyswap");
3538 break;
3539
3540 case EM_PJ:
3541 case EM_PJ_OLD:
3542 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3543 strcat (buf, ", new calling convention");
3544
3545 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3546 strcat (buf, ", gnu calling convention");
3547 break;
3548
3549 case EM_IA_64:
3550 if ((e_flags & EF_IA_64_ABI64))
3551 strcat (buf, ", 64-bit");
3552 else
3553 strcat (buf, ", 32-bit");
3554 if ((e_flags & EF_IA_64_REDUCEDFP))
3555 strcat (buf, ", reduced fp model");
3556 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3557 strcat (buf, ", no function descriptors, constant gp");
3558 else if ((e_flags & EF_IA_64_CONS_GP))
3559 strcat (buf, ", constant gp");
3560 if ((e_flags & EF_IA_64_ABSOLUTE))
3561 strcat (buf, ", absolute");
3562 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3563 {
3564 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3565 strcat (buf, ", vms_linkages");
3566 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3567 {
3568 case EF_IA_64_VMS_COMCOD_SUCCESS:
3569 break;
3570 case EF_IA_64_VMS_COMCOD_WARNING:
3571 strcat (buf, ", warning");
3572 break;
3573 case EF_IA_64_VMS_COMCOD_ERROR:
3574 strcat (buf, ", error");
3575 break;
3576 case EF_IA_64_VMS_COMCOD_ABORT:
3577 strcat (buf, ", abort");
3578 break;
3579 default:
3580 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3581 e_flags & EF_IA_64_VMS_COMCOD);
3582 strcat (buf, ", <unknown>");
3583 }
3584 }
3585 break;
3586
3587 case EM_VAX:
3588 if ((e_flags & EF_VAX_NONPIC))
3589 strcat (buf, ", non-PIC");
3590 if ((e_flags & EF_VAX_DFLOAT))
3591 strcat (buf, ", D-Float");
3592 if ((e_flags & EF_VAX_GFLOAT))
3593 strcat (buf, ", G-Float");
3594 break;
3595
3596 case EM_VISIUM:
3597 if (e_flags & EF_VISIUM_ARCH_MCM)
3598 strcat (buf, ", mcm");
3599 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3600 strcat (buf, ", mcm24");
3601 if (e_flags & EF_VISIUM_ARCH_GR6)
3602 strcat (buf, ", gr6");
3603 break;
3604
3605 case EM_RL78:
3606 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3607 {
3608 case E_FLAG_RL78_ANY_CPU: break;
3609 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3610 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3611 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3612 }
3613 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3614 strcat (buf, ", 64-bit doubles");
3615 break;
3616
3617 case EM_RX:
3618 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3619 strcat (buf, ", 64-bit doubles");
3620 if (e_flags & E_FLAG_RX_DSP)
3621 strcat (buf, ", dsp");
3622 if (e_flags & E_FLAG_RX_PID)
3623 strcat (buf, ", pid");
3624 if (e_flags & E_FLAG_RX_ABI)
3625 strcat (buf, ", RX ABI");
3626 if (e_flags & E_FLAG_RX_SINSNS_SET)
3627 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3628 ? ", uses String instructions" : ", bans String instructions");
3629 if (e_flags & E_FLAG_RX_V2)
3630 strcat (buf, ", V2");
3631 break;
3632
3633 case EM_S390:
3634 if (e_flags & EF_S390_HIGH_GPRS)
3635 strcat (buf, ", highgprs");
3636 break;
3637
3638 case EM_TI_C6000:
3639 if ((e_flags & EF_C6000_REL))
3640 strcat (buf, ", relocatable module");
3641 break;
3642
3643 case EM_MSP430:
3644 strcat (buf, _(": architecture variant: "));
3645 switch (e_flags & EF_MSP430_MACH)
3646 {
3647 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3648 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3649 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3650 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3651 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3652 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3653 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3654 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3655 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3656 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3657 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3658 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3659 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3660 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3661 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3662 default:
3663 strcat (buf, _(": unknown")); break;
3664 }
3665
3666 if (e_flags & ~ EF_MSP430_MACH)
3667 strcat (buf, _(": unknown extra flag bits also present"));
3668 }
3669 }
3670
3671 return buf;
3672 }
3673
3674 static const char *
3675 get_osabi_name (Filedata * filedata, unsigned int osabi)
3676 {
3677 static char buff[32];
3678
3679 switch (osabi)
3680 {
3681 case ELFOSABI_NONE: return "UNIX - System V";
3682 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3683 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3684 case ELFOSABI_GNU: return "UNIX - GNU";
3685 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3686 case ELFOSABI_AIX: return "UNIX - AIX";
3687 case ELFOSABI_IRIX: return "UNIX - IRIX";
3688 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3689 case ELFOSABI_TRU64: return "UNIX - TRU64";
3690 case ELFOSABI_MODESTO: return "Novell - Modesto";
3691 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3692 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3693 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3694 case ELFOSABI_AROS: return "AROS";
3695 case ELFOSABI_FENIXOS: return "FenixOS";
3696 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3697 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3698 default:
3699 if (osabi >= 64)
3700 switch (filedata->file_header.e_machine)
3701 {
3702 case EM_ARM:
3703 switch (osabi)
3704 {
3705 case ELFOSABI_ARM: return "ARM";
3706 default:
3707 break;
3708 }
3709 break;
3710
3711 case EM_MSP430:
3712 case EM_MSP430_OLD:
3713 case EM_VISIUM:
3714 switch (osabi)
3715 {
3716 case ELFOSABI_STANDALONE: return _("Standalone App");
3717 default:
3718 break;
3719 }
3720 break;
3721
3722 case EM_TI_C6000:
3723 switch (osabi)
3724 {
3725 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3726 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3727 default:
3728 break;
3729 }
3730 break;
3731
3732 default:
3733 break;
3734 }
3735 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3736 return buff;
3737 }
3738 }
3739
3740 static const char *
3741 get_aarch64_segment_type (unsigned long type)
3742 {
3743 switch (type)
3744 {
3745 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3746 default: return NULL;
3747 }
3748 }
3749
3750 static const char *
3751 get_arm_segment_type (unsigned long type)
3752 {
3753 switch (type)
3754 {
3755 case PT_ARM_EXIDX: return "EXIDX";
3756 default: return NULL;
3757 }
3758 }
3759
3760 static const char *
3761 get_s390_segment_type (unsigned long type)
3762 {
3763 switch (type)
3764 {
3765 case PT_S390_PGSTE: return "S390_PGSTE";
3766 default: return NULL;
3767 }
3768 }
3769
3770 static const char *
3771 get_mips_segment_type (unsigned long type)
3772 {
3773 switch (type)
3774 {
3775 case PT_MIPS_REGINFO: return "REGINFO";
3776 case PT_MIPS_RTPROC: return "RTPROC";
3777 case PT_MIPS_OPTIONS: return "OPTIONS";
3778 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3779 default: return NULL;
3780 }
3781 }
3782
3783 static const char *
3784 get_parisc_segment_type (unsigned long type)
3785 {
3786 switch (type)
3787 {
3788 case PT_HP_TLS: return "HP_TLS";
3789 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3790 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3791 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3792 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3793 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3794 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3795 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3796 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3797 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3798 case PT_HP_PARALLEL: return "HP_PARALLEL";
3799 case PT_HP_FASTBIND: return "HP_FASTBIND";
3800 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3801 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3802 case PT_HP_STACK: return "HP_STACK";
3803 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3804 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3805 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3806 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3807 default: return NULL;
3808 }
3809 }
3810
3811 static const char *
3812 get_ia64_segment_type (unsigned long type)
3813 {
3814 switch (type)
3815 {
3816 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3817 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3818 case PT_HP_TLS: return "HP_TLS";
3819 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3820 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3821 case PT_IA_64_HP_STACK: return "HP_STACK";
3822 default: return NULL;
3823 }
3824 }
3825
3826 static const char *
3827 get_tic6x_segment_type (unsigned long type)
3828 {
3829 switch (type)
3830 {
3831 case PT_C6000_PHATTR: return "C6000_PHATTR";
3832 default: return NULL;
3833 }
3834 }
3835
3836 static const char *
3837 get_solaris_segment_type (unsigned long type)
3838 {
3839 switch (type)
3840 {
3841 case 0x6464e550: return "PT_SUNW_UNWIND";
3842 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3843 case 0x6ffffff7: return "PT_LOSUNW";
3844 case 0x6ffffffa: return "PT_SUNWBSS";
3845 case 0x6ffffffb: return "PT_SUNWSTACK";
3846 case 0x6ffffffc: return "PT_SUNWDTRACE";
3847 case 0x6ffffffd: return "PT_SUNWCAP";
3848 case 0x6fffffff: return "PT_HISUNW";
3849 default: return NULL;
3850 }
3851 }
3852
3853 static const char *
3854 get_segment_type (Filedata * filedata, unsigned long p_type)
3855 {
3856 static char buff[32];
3857
3858 switch (p_type)
3859 {
3860 case PT_NULL: return "NULL";
3861 case PT_LOAD: return "LOAD";
3862 case PT_DYNAMIC: return "DYNAMIC";
3863 case PT_INTERP: return "INTERP";
3864 case PT_NOTE: return "NOTE";
3865 case PT_SHLIB: return "SHLIB";
3866 case PT_PHDR: return "PHDR";
3867 case PT_TLS: return "TLS";
3868 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3869 case PT_GNU_STACK: return "GNU_STACK";
3870 case PT_GNU_RELRO: return "GNU_RELRO";
3871
3872 default:
3873 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3874 {
3875 sprintf (buff, "GNU_MBIND+%#lx",
3876 p_type - PT_GNU_MBIND_LO);
3877 }
3878 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3879 {
3880 const char * result;
3881
3882 switch (filedata->file_header.e_machine)
3883 {
3884 case EM_AARCH64:
3885 result = get_aarch64_segment_type (p_type);
3886 break;
3887 case EM_ARM:
3888 result = get_arm_segment_type (p_type);
3889 break;
3890 case EM_MIPS:
3891 case EM_MIPS_RS3_LE:
3892 result = get_mips_segment_type (p_type);
3893 break;
3894 case EM_PARISC:
3895 result = get_parisc_segment_type (p_type);
3896 break;
3897 case EM_IA_64:
3898 result = get_ia64_segment_type (p_type);
3899 break;
3900 case EM_TI_C6000:
3901 result = get_tic6x_segment_type (p_type);
3902 break;
3903 case EM_S390:
3904 case EM_S390_OLD:
3905 result = get_s390_segment_type (p_type);
3906 break;
3907 default:
3908 result = NULL;
3909 break;
3910 }
3911
3912 if (result != NULL)
3913 return result;
3914
3915 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3916 }
3917 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3918 {
3919 const char * result;
3920
3921 switch (filedata->file_header.e_machine)
3922 {
3923 case EM_PARISC:
3924 result = get_parisc_segment_type (p_type);
3925 break;
3926 case EM_IA_64:
3927 result = get_ia64_segment_type (p_type);
3928 break;
3929 default:
3930 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3931 result = get_solaris_segment_type (p_type);
3932 else
3933 result = NULL;
3934 break;
3935 }
3936
3937 if (result != NULL)
3938 return result;
3939
3940 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3941 }
3942 else
3943 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3944
3945 return buff;
3946 }
3947 }
3948
3949 static const char *
3950 get_arc_section_type_name (unsigned int sh_type)
3951 {
3952 switch (sh_type)
3953 {
3954 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
3955 default:
3956 break;
3957 }
3958 return NULL;
3959 }
3960
3961 static const char *
3962 get_mips_section_type_name (unsigned int sh_type)
3963 {
3964 switch (sh_type)
3965 {
3966 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3967 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3968 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3969 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3970 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3971 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3972 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3973 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3974 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3975 case SHT_MIPS_RELD: return "MIPS_RELD";
3976 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3977 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3978 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3979 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3980 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3981 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3982 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3983 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3984 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3985 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3986 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3987 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3988 case SHT_MIPS_LINE: return "MIPS_LINE";
3989 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3990 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3991 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3992 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3993 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3994 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3995 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3996 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3997 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3998 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3999 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4000 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4001 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4002 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4003 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4004 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4005 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4006 default:
4007 break;
4008 }
4009 return NULL;
4010 }
4011
4012 static const char *
4013 get_parisc_section_type_name (unsigned int sh_type)
4014 {
4015 switch (sh_type)
4016 {
4017 case SHT_PARISC_EXT: return "PARISC_EXT";
4018 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4019 case SHT_PARISC_DOC: return "PARISC_DOC";
4020 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4021 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4022 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4023 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4024 default: return NULL;
4025 }
4026 }
4027
4028 static const char *
4029 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4030 {
4031 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4032 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4033 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4034
4035 switch (sh_type)
4036 {
4037 case SHT_IA_64_EXT: return "IA_64_EXT";
4038 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4039 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4040 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4041 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4042 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4043 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4044 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4045 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4046 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4047 default:
4048 break;
4049 }
4050 return NULL;
4051 }
4052
4053 static const char *
4054 get_x86_64_section_type_name (unsigned int sh_type)
4055 {
4056 switch (sh_type)
4057 {
4058 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4059 default: return NULL;
4060 }
4061 }
4062
4063 static const char *
4064 get_aarch64_section_type_name (unsigned int sh_type)
4065 {
4066 switch (sh_type)
4067 {
4068 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4069 default: return NULL;
4070 }
4071 }
4072
4073 static const char *
4074 get_arm_section_type_name (unsigned int sh_type)
4075 {
4076 switch (sh_type)
4077 {
4078 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4079 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4080 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4081 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4082 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4083 default: return NULL;
4084 }
4085 }
4086
4087 static const char *
4088 get_tic6x_section_type_name (unsigned int sh_type)
4089 {
4090 switch (sh_type)
4091 {
4092 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4093 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4094 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4095 case SHT_TI_ICODE: return "TI_ICODE";
4096 case SHT_TI_XREF: return "TI_XREF";
4097 case SHT_TI_HANDLER: return "TI_HANDLER";
4098 case SHT_TI_INITINFO: return "TI_INITINFO";
4099 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4100 default: return NULL;
4101 }
4102 }
4103
4104 static const char *
4105 get_msp430x_section_type_name (unsigned int sh_type)
4106 {
4107 switch (sh_type)
4108 {
4109 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4110 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4111 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4112 default: return NULL;
4113 }
4114 }
4115
4116 static const char *
4117 get_v850_section_type_name (unsigned int sh_type)
4118 {
4119 switch (sh_type)
4120 {
4121 case SHT_V850_SCOMMON: return "V850 Small Common";
4122 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4123 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4124 case SHT_RENESAS_IOP: return "RENESAS IOP";
4125 case SHT_RENESAS_INFO: return "RENESAS INFO";
4126 default: return NULL;
4127 }
4128 }
4129
4130 static const char *
4131 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4132 {
4133 static char buff[32];
4134 const char * result;
4135
4136 switch (sh_type)
4137 {
4138 case SHT_NULL: return "NULL";
4139 case SHT_PROGBITS: return "PROGBITS";
4140 case SHT_SYMTAB: return "SYMTAB";
4141 case SHT_STRTAB: return "STRTAB";
4142 case SHT_RELA: return "RELA";
4143 case SHT_HASH: return "HASH";
4144 case SHT_DYNAMIC: return "DYNAMIC";
4145 case SHT_NOTE: return "NOTE";
4146 case SHT_NOBITS: return "NOBITS";
4147 case SHT_REL: return "REL";
4148 case SHT_SHLIB: return "SHLIB";
4149 case SHT_DYNSYM: return "DYNSYM";
4150 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4151 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4152 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4153 case SHT_GNU_HASH: return "GNU_HASH";
4154 case SHT_GROUP: return "GROUP";
4155 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4156 case SHT_GNU_verdef: return "VERDEF";
4157 case SHT_GNU_verneed: return "VERNEED";
4158 case SHT_GNU_versym: return "VERSYM";
4159 case 0x6ffffff0: return "VERSYM";
4160 case 0x6ffffffc: return "VERDEF";
4161 case 0x7ffffffd: return "AUXILIARY";
4162 case 0x7fffffff: return "FILTER";
4163 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4164
4165 default:
4166 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4167 {
4168 switch (filedata->file_header.e_machine)
4169 {
4170 case EM_ARC:
4171 case EM_ARC_COMPACT:
4172 case EM_ARC_COMPACT2:
4173 result = get_arc_section_type_name (sh_type);
4174 break;
4175 case EM_MIPS:
4176 case EM_MIPS_RS3_LE:
4177 result = get_mips_section_type_name (sh_type);
4178 break;
4179 case EM_PARISC:
4180 result = get_parisc_section_type_name (sh_type);
4181 break;
4182 case EM_IA_64:
4183 result = get_ia64_section_type_name (filedata, sh_type);
4184 break;
4185 case EM_X86_64:
4186 case EM_L1OM:
4187 case EM_K1OM:
4188 result = get_x86_64_section_type_name (sh_type);
4189 break;
4190 case EM_AARCH64:
4191 result = get_aarch64_section_type_name (sh_type);
4192 break;
4193 case EM_ARM:
4194 result = get_arm_section_type_name (sh_type);
4195 break;
4196 case EM_TI_C6000:
4197 result = get_tic6x_section_type_name (sh_type);
4198 break;
4199 case EM_MSP430:
4200 result = get_msp430x_section_type_name (sh_type);
4201 break;
4202 case EM_V800:
4203 case EM_V850:
4204 case EM_CYGNUS_V850:
4205 result = get_v850_section_type_name (sh_type);
4206 break;
4207 default:
4208 result = NULL;
4209 break;
4210 }
4211
4212 if (result != NULL)
4213 return result;
4214
4215 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4216 }
4217 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4218 {
4219 switch (filedata->file_header.e_machine)
4220 {
4221 case EM_IA_64:
4222 result = get_ia64_section_type_name (filedata, sh_type);
4223 break;
4224 default:
4225 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4226 result = get_solaris_section_type (sh_type);
4227 else
4228 {
4229 switch (sh_type)
4230 {
4231 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4232 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4233 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4234 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4235 default:
4236 result = NULL;
4237 break;
4238 }
4239 }
4240 break;
4241 }
4242
4243 if (result != NULL)
4244 return result;
4245
4246 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4247 }
4248 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4249 {
4250 switch (filedata->file_header.e_machine)
4251 {
4252 case EM_V800:
4253 case EM_V850:
4254 case EM_CYGNUS_V850:
4255 result = get_v850_section_type_name (sh_type);
4256 break;
4257 default:
4258 result = NULL;
4259 break;
4260 }
4261
4262 if (result != NULL)
4263 return result;
4264
4265 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4266 }
4267 else
4268 /* This message is probably going to be displayed in a 15
4269 character wide field, so put the hex value first. */
4270 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4271
4272 return buff;
4273 }
4274 }
4275
4276 #define OPTION_DEBUG_DUMP 512
4277 #define OPTION_DYN_SYMS 513
4278 #define OPTION_DWARF_DEPTH 514
4279 #define OPTION_DWARF_START 515
4280 #define OPTION_DWARF_CHECK 516
4281
4282 static struct option options[] =
4283 {
4284 {"all", no_argument, 0, 'a'},
4285 {"file-header", no_argument, 0, 'h'},
4286 {"program-headers", no_argument, 0, 'l'},
4287 {"headers", no_argument, 0, 'e'},
4288 {"histogram", no_argument, 0, 'I'},
4289 {"segments", no_argument, 0, 'l'},
4290 {"sections", no_argument, 0, 'S'},
4291 {"section-headers", no_argument, 0, 'S'},
4292 {"section-groups", no_argument, 0, 'g'},
4293 {"section-details", no_argument, 0, 't'},
4294 {"full-section-name",no_argument, 0, 'N'},
4295 {"symbols", no_argument, 0, 's'},
4296 {"syms", no_argument, 0, 's'},
4297 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4298 {"relocs", no_argument, 0, 'r'},
4299 {"notes", no_argument, 0, 'n'},
4300 {"dynamic", no_argument, 0, 'd'},
4301 {"arch-specific", no_argument, 0, 'A'},
4302 {"version-info", no_argument, 0, 'V'},
4303 {"use-dynamic", no_argument, 0, 'D'},
4304 {"unwind", no_argument, 0, 'u'},
4305 {"archive-index", no_argument, 0, 'c'},
4306 {"hex-dump", required_argument, 0, 'x'},
4307 {"relocated-dump", required_argument, 0, 'R'},
4308 {"string-dump", required_argument, 0, 'p'},
4309 {"decompress", no_argument, 0, 'z'},
4310 #ifdef SUPPORT_DISASSEMBLY
4311 {"instruction-dump", required_argument, 0, 'i'},
4312 #endif
4313 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4314
4315 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4316 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4317 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4318
4319 {"version", no_argument, 0, 'v'},
4320 {"wide", no_argument, 0, 'W'},
4321 {"help", no_argument, 0, 'H'},
4322 {0, no_argument, 0, 0}
4323 };
4324
4325 static void
4326 usage (FILE * stream)
4327 {
4328 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4329 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4330 fprintf (stream, _(" Options are:\n\
4331 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4332 -h --file-header Display the ELF file header\n\
4333 -l --program-headers Display the program headers\n\
4334 --segments An alias for --program-headers\n\
4335 -S --section-headers Display the sections' header\n\
4336 --sections An alias for --section-headers\n\
4337 -g --section-groups Display the section groups\n\
4338 -t --section-details Display the section details\n\
4339 -e --headers Equivalent to: -h -l -S\n\
4340 -s --syms Display the symbol table\n\
4341 --symbols An alias for --syms\n\
4342 --dyn-syms Display the dynamic symbol table\n\
4343 -n --notes Display the core notes (if present)\n\
4344 -r --relocs Display the relocations (if present)\n\
4345 -u --unwind Display the unwind info (if present)\n\
4346 -d --dynamic Display the dynamic section (if present)\n\
4347 -V --version-info Display the version sections (if present)\n\
4348 -A --arch-specific Display architecture specific information (if any)\n\
4349 -c --archive-index Display the symbol/file index in an archive\n\
4350 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4351 -x --hex-dump=<number|name>\n\
4352 Dump the contents of section <number|name> as bytes\n\
4353 -p --string-dump=<number|name>\n\
4354 Dump the contents of section <number|name> as strings\n\
4355 -R --relocated-dump=<number|name>\n\
4356 Dump the contents of section <number|name> as relocated bytes\n\
4357 -z --decompress Decompress section before dumping it\n\
4358 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4359 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4360 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4361 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4362 =addr,=cu_index,=links,=follow-links]\n\
4363 Display the contents of DWARF debug sections\n"));
4364 fprintf (stream, _("\
4365 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4366 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4367 or deeper\n"));
4368 #ifdef SUPPORT_DISASSEMBLY
4369 fprintf (stream, _("\
4370 -i --instruction-dump=<number|name>\n\
4371 Disassemble the contents of section <number|name>\n"));
4372 #endif
4373 fprintf (stream, _("\
4374 -I --histogram Display histogram of bucket list lengths\n\
4375 -W --wide Allow output width to exceed 80 characters\n\
4376 @<file> Read options from <file>\n\
4377 -H --help Display this information\n\
4378 -v --version Display the version number of readelf\n"));
4379
4380 if (REPORT_BUGS_TO[0] && stream == stdout)
4381 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4382
4383 exit (stream == stdout ? 0 : 1);
4384 }
4385
4386 /* Record the fact that the user wants the contents of section number
4387 SECTION to be displayed using the method(s) encoded as flags bits
4388 in TYPE. Note, TYPE can be zero if we are creating the array for
4389 the first time. */
4390
4391 static void
4392 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4393 {
4394 if (section >= filedata->num_dump_sects)
4395 {
4396 dump_type * new_dump_sects;
4397
4398 new_dump_sects = (dump_type *) calloc (section + 1,
4399 sizeof (* new_dump_sects));
4400
4401 if (new_dump_sects == NULL)
4402 error (_("Out of memory allocating dump request table.\n"));
4403 else
4404 {
4405 if (filedata->dump_sects)
4406 {
4407 /* Copy current flag settings. */
4408 memcpy (new_dump_sects, filedata->dump_sects,
4409 filedata->num_dump_sects * sizeof (* new_dump_sects));
4410
4411 free (filedata->dump_sects);
4412 }
4413
4414 filedata->dump_sects = new_dump_sects;
4415 filedata->num_dump_sects = section + 1;
4416 }
4417 }
4418
4419 if (filedata->dump_sects)
4420 filedata->dump_sects[section] |= type;
4421 }
4422
4423 /* Request a dump by section name. */
4424
4425 static void
4426 request_dump_byname (const char * section, dump_type type)
4427 {
4428 struct dump_list_entry * new_request;
4429
4430 new_request = (struct dump_list_entry *)
4431 malloc (sizeof (struct dump_list_entry));
4432 if (!new_request)
4433 error (_("Out of memory allocating dump request table.\n"));
4434
4435 new_request->name = strdup (section);
4436 if (!new_request->name)
4437 error (_("Out of memory allocating dump request table.\n"));
4438
4439 new_request->type = type;
4440
4441 new_request->next = dump_sects_byname;
4442 dump_sects_byname = new_request;
4443 }
4444
4445 static inline void
4446 request_dump (Filedata * filedata, dump_type type)
4447 {
4448 int section;
4449 char * cp;
4450
4451 do_dump++;
4452 section = strtoul (optarg, & cp, 0);
4453
4454 if (! *cp && section >= 0)
4455 request_dump_bynumber (filedata, section, type);
4456 else
4457 request_dump_byname (optarg, type);
4458 }
4459
4460 static void
4461 parse_args (Filedata * filedata, int argc, char ** argv)
4462 {
4463 int c;
4464
4465 if (argc < 2)
4466 usage (stderr);
4467
4468 while ((c = getopt_long
4469 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4470 {
4471 switch (c)
4472 {
4473 case 0:
4474 /* Long options. */
4475 break;
4476 case 'H':
4477 usage (stdout);
4478 break;
4479
4480 case 'a':
4481 do_syms = TRUE;
4482 do_reloc = TRUE;
4483 do_unwind = TRUE;
4484 do_dynamic = TRUE;
4485 do_header = TRUE;
4486 do_sections = TRUE;
4487 do_section_groups = TRUE;
4488 do_segments = TRUE;
4489 do_version = TRUE;
4490 do_histogram = TRUE;
4491 do_arch = TRUE;
4492 do_notes = TRUE;
4493 break;
4494 case 'g':
4495 do_section_groups = TRUE;
4496 break;
4497 case 't':
4498 case 'N':
4499 do_sections = TRUE;
4500 do_section_details = TRUE;
4501 break;
4502 case 'e':
4503 do_header = TRUE;
4504 do_sections = TRUE;
4505 do_segments = TRUE;
4506 break;
4507 case 'A':
4508 do_arch = TRUE;
4509 break;
4510 case 'D':
4511 do_using_dynamic = TRUE;
4512 break;
4513 case 'r':
4514 do_reloc = TRUE;
4515 break;
4516 case 'u':
4517 do_unwind = TRUE;
4518 break;
4519 case 'h':
4520 do_header = TRUE;
4521 break;
4522 case 'l':
4523 do_segments = TRUE;
4524 break;
4525 case 's':
4526 do_syms = TRUE;
4527 break;
4528 case 'S':
4529 do_sections = TRUE;
4530 break;
4531 case 'd':
4532 do_dynamic = TRUE;
4533 break;
4534 case 'I':
4535 do_histogram = TRUE;
4536 break;
4537 case 'n':
4538 do_notes = TRUE;
4539 break;
4540 case 'c':
4541 do_archive_index = TRUE;
4542 break;
4543 case 'x':
4544 request_dump (filedata, HEX_DUMP);
4545 break;
4546 case 'p':
4547 request_dump (filedata, STRING_DUMP);
4548 break;
4549 case 'R':
4550 request_dump (filedata, RELOC_DUMP);
4551 break;
4552 case 'z':
4553 decompress_dumps = TRUE;
4554 break;
4555 case 'w':
4556 do_dump = TRUE;
4557 if (optarg == 0)
4558 {
4559 do_debugging = TRUE;
4560 dwarf_select_sections_all ();
4561 }
4562 else
4563 {
4564 do_debugging = FALSE;
4565 dwarf_select_sections_by_letters (optarg);
4566 }
4567 break;
4568 case OPTION_DEBUG_DUMP:
4569 do_dump = TRUE;
4570 if (optarg == 0)
4571 do_debugging = TRUE;
4572 else
4573 {
4574 do_debugging = FALSE;
4575 dwarf_select_sections_by_names (optarg);
4576 }
4577 break;
4578 case OPTION_DWARF_DEPTH:
4579 {
4580 char *cp;
4581
4582 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4583 }
4584 break;
4585 case OPTION_DWARF_START:
4586 {
4587 char *cp;
4588
4589 dwarf_start_die = strtoul (optarg, & cp, 0);
4590 }
4591 break;
4592 case OPTION_DWARF_CHECK:
4593 dwarf_check = TRUE;
4594 break;
4595 case OPTION_DYN_SYMS:
4596 do_dyn_syms = TRUE;
4597 break;
4598 #ifdef SUPPORT_DISASSEMBLY
4599 case 'i':
4600 request_dump (filedata, DISASS_DUMP);
4601 break;
4602 #endif
4603 case 'v':
4604 print_version (program_name);
4605 break;
4606 case 'V':
4607 do_version = TRUE;
4608 break;
4609 case 'W':
4610 do_wide = TRUE;
4611 break;
4612 default:
4613 /* xgettext:c-format */
4614 error (_("Invalid option '-%c'\n"), c);
4615 /* Fall through. */
4616 case '?':
4617 usage (stderr);
4618 }
4619 }
4620
4621 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4622 && !do_segments && !do_header && !do_dump && !do_version
4623 && !do_histogram && !do_debugging && !do_arch && !do_notes
4624 && !do_section_groups && !do_archive_index
4625 && !do_dyn_syms)
4626 usage (stderr);
4627 }
4628
4629 static const char *
4630 get_elf_class (unsigned int elf_class)
4631 {
4632 static char buff[32];
4633
4634 switch (elf_class)
4635 {
4636 case ELFCLASSNONE: return _("none");
4637 case ELFCLASS32: return "ELF32";
4638 case ELFCLASS64: return "ELF64";
4639 default:
4640 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4641 return buff;
4642 }
4643 }
4644
4645 static const char *
4646 get_data_encoding (unsigned int encoding)
4647 {
4648 static char buff[32];
4649
4650 switch (encoding)
4651 {
4652 case ELFDATANONE: return _("none");
4653 case ELFDATA2LSB: return _("2's complement, little endian");
4654 case ELFDATA2MSB: return _("2's complement, big endian");
4655 default:
4656 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4657 return buff;
4658 }
4659 }
4660
4661 /* Decode the data held in 'filedata->file_header'. */
4662
4663 static bfd_boolean
4664 process_file_header (Filedata * filedata)
4665 {
4666 Elf_Internal_Ehdr * header = & filedata->file_header;
4667
4668 if ( header->e_ident[EI_MAG0] != ELFMAG0
4669 || header->e_ident[EI_MAG1] != ELFMAG1
4670 || header->e_ident[EI_MAG2] != ELFMAG2
4671 || header->e_ident[EI_MAG3] != ELFMAG3)
4672 {
4673 error
4674 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4675 return FALSE;
4676 }
4677
4678 init_dwarf_regnames (header->e_machine);
4679
4680 if (do_header)
4681 {
4682 unsigned i;
4683
4684 printf (_("ELF Header:\n"));
4685 printf (_(" Magic: "));
4686 for (i = 0; i < EI_NIDENT; i++)
4687 printf ("%2.2x ", header->e_ident[i]);
4688 printf ("\n");
4689 printf (_(" Class: %s\n"),
4690 get_elf_class (header->e_ident[EI_CLASS]));
4691 printf (_(" Data: %s\n"),
4692 get_data_encoding (header->e_ident[EI_DATA]));
4693 printf (_(" Version: %d %s\n"),
4694 header->e_ident[EI_VERSION],
4695 (header->e_ident[EI_VERSION] == EV_CURRENT
4696 ? "(current)"
4697 : (header->e_ident[EI_VERSION] != EV_NONE
4698 ? _("<unknown: %lx>")
4699 : "")));
4700 printf (_(" OS/ABI: %s\n"),
4701 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4702 printf (_(" ABI Version: %d\n"),
4703 header->e_ident[EI_ABIVERSION]);
4704 printf (_(" Type: %s\n"),
4705 get_file_type (header->e_type));
4706 printf (_(" Machine: %s\n"),
4707 get_machine_name (header->e_machine));
4708 printf (_(" Version: 0x%lx\n"),
4709 (unsigned long) header->e_version);
4710
4711 printf (_(" Entry point address: "));
4712 print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4713 printf (_("\n Start of program headers: "));
4714 print_vma ((bfd_vma) header->e_phoff, DEC);
4715 printf (_(" (bytes into file)\n Start of section headers: "));
4716 print_vma ((bfd_vma) header->e_shoff, DEC);
4717 printf (_(" (bytes into file)\n"));
4718
4719 printf (_(" Flags: 0x%lx%s\n"),
4720 (unsigned long) header->e_flags,
4721 get_machine_flags (filedata, header->e_flags, header->e_machine));
4722 printf (_(" Size of this header: %ld (bytes)\n"),
4723 (long) header->e_ehsize);
4724 printf (_(" Size of program headers: %ld (bytes)\n"),
4725 (long) header->e_phentsize);
4726 printf (_(" Number of program headers: %ld"),
4727 (long) header->e_phnum);
4728 if (filedata->section_headers != NULL
4729 && header->e_phnum == PN_XNUM
4730 && filedata->section_headers[0].sh_info != 0)
4731 printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4732 putc ('\n', stdout);
4733 printf (_(" Size of section headers: %ld (bytes)\n"),
4734 (long) header->e_shentsize);
4735 printf (_(" Number of section headers: %ld"),
4736 (long) header->e_shnum);
4737 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4738 printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4739 putc ('\n', stdout);
4740 printf (_(" Section header string table index: %ld"),
4741 (long) header->e_shstrndx);
4742 if (filedata->section_headers != NULL
4743 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4744 printf (" (%u)", filedata->section_headers[0].sh_link);
4745 else if (header->e_shstrndx != SHN_UNDEF
4746 && header->e_shstrndx >= header->e_shnum)
4747 printf (_(" <corrupt: out of range>"));
4748 putc ('\n', stdout);
4749 }
4750
4751 if (filedata->section_headers != NULL)
4752 {
4753 if (header->e_phnum == PN_XNUM
4754 && filedata->section_headers[0].sh_info != 0)
4755 header->e_phnum = filedata->section_headers[0].sh_info;
4756 if (header->e_shnum == SHN_UNDEF)
4757 header->e_shnum = filedata->section_headers[0].sh_size;
4758 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4759 header->e_shstrndx = filedata->section_headers[0].sh_link;
4760 if (header->e_shstrndx >= header->e_shnum)
4761 header->e_shstrndx = SHN_UNDEF;
4762 free (filedata->section_headers);
4763 filedata->section_headers = NULL;
4764 }
4765
4766 return TRUE;
4767 }
4768
4769 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4770 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4771
4772 static bfd_boolean
4773 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4774 {
4775 Elf32_External_Phdr * phdrs;
4776 Elf32_External_Phdr * external;
4777 Elf_Internal_Phdr * internal;
4778 unsigned int i;
4779 unsigned int size = filedata->file_header.e_phentsize;
4780 unsigned int num = filedata->file_header.e_phnum;
4781
4782 /* PR binutils/17531: Cope with unexpected section header sizes. */
4783 if (size == 0 || num == 0)
4784 return FALSE;
4785 if (size < sizeof * phdrs)
4786 {
4787 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4788 return FALSE;
4789 }
4790 if (size > sizeof * phdrs)
4791 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4792
4793 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4794 size, num, _("program headers"));
4795 if (phdrs == NULL)
4796 return FALSE;
4797
4798 for (i = 0, internal = pheaders, external = phdrs;
4799 i < filedata->file_header.e_phnum;
4800 i++, internal++, external++)
4801 {
4802 internal->p_type = BYTE_GET (external->p_type);
4803 internal->p_offset = BYTE_GET (external->p_offset);
4804 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4805 internal->p_paddr = BYTE_GET (external->p_paddr);
4806 internal->p_filesz = BYTE_GET (external->p_filesz);
4807 internal->p_memsz = BYTE_GET (external->p_memsz);
4808 internal->p_flags = BYTE_GET (external->p_flags);
4809 internal->p_align = BYTE_GET (external->p_align);
4810 }
4811
4812 free (phdrs);
4813 return TRUE;
4814 }
4815
4816 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4817 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4818
4819 static bfd_boolean
4820 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4821 {
4822 Elf64_External_Phdr * phdrs;
4823 Elf64_External_Phdr * external;
4824 Elf_Internal_Phdr * internal;
4825 unsigned int i;
4826 unsigned int size = filedata->file_header.e_phentsize;
4827 unsigned int num = filedata->file_header.e_phnum;
4828
4829 /* PR binutils/17531: Cope with unexpected section header sizes. */
4830 if (size == 0 || num == 0)
4831 return FALSE;
4832 if (size < sizeof * phdrs)
4833 {
4834 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4835 return FALSE;
4836 }
4837 if (size > sizeof * phdrs)
4838 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4839
4840 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4841 size, num, _("program headers"));
4842 if (!phdrs)
4843 return FALSE;
4844
4845 for (i = 0, internal = pheaders, external = phdrs;
4846 i < filedata->file_header.e_phnum;
4847 i++, internal++, external++)
4848 {
4849 internal->p_type = BYTE_GET (external->p_type);
4850 internal->p_flags = BYTE_GET (external->p_flags);
4851 internal->p_offset = BYTE_GET (external->p_offset);
4852 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4853 internal->p_paddr = BYTE_GET (external->p_paddr);
4854 internal->p_filesz = BYTE_GET (external->p_filesz);
4855 internal->p_memsz = BYTE_GET (external->p_memsz);
4856 internal->p_align = BYTE_GET (external->p_align);
4857 }
4858
4859 free (phdrs);
4860 return TRUE;
4861 }
4862
4863 /* Returns TRUE if the program headers were read into `program_headers'. */
4864
4865 static bfd_boolean
4866 get_program_headers (Filedata * filedata)
4867 {
4868 Elf_Internal_Phdr * phdrs;
4869
4870 /* Check cache of prior read. */
4871 if (filedata->program_headers != NULL)
4872 return TRUE;
4873
4874 /* Be kind to memory checkers by looking for
4875 e_phnum values which we know must be invalid. */
4876 if (filedata->file_header.e_phnum
4877 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4878 >= filedata->file_size)
4879 {
4880 error (_("Too many program headers - %#x - the file is not that big\n"),
4881 filedata->file_header.e_phnum);
4882 return FALSE;
4883 }
4884
4885 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4886 sizeof (Elf_Internal_Phdr));
4887 if (phdrs == NULL)
4888 {
4889 error (_("Out of memory reading %u program headers\n"),
4890 filedata->file_header.e_phnum);
4891 return FALSE;
4892 }
4893
4894 if (is_32bit_elf
4895 ? get_32bit_program_headers (filedata, phdrs)
4896 : get_64bit_program_headers (filedata, phdrs))
4897 {
4898 filedata->program_headers = phdrs;
4899 return TRUE;
4900 }
4901
4902 free (phdrs);
4903 return FALSE;
4904 }
4905
4906 /* Returns TRUE if the program headers were loaded. */
4907
4908 static bfd_boolean
4909 process_program_headers (Filedata * filedata)
4910 {
4911 Elf_Internal_Phdr * segment;
4912 unsigned int i;
4913 Elf_Internal_Phdr * previous_load = NULL;
4914
4915 if (filedata->file_header.e_phnum == 0)
4916 {
4917 /* PR binutils/12467. */
4918 if (filedata->file_header.e_phoff != 0)
4919 {
4920 warn (_("possibly corrupt ELF header - it has a non-zero program"
4921 " header offset, but no program headers\n"));
4922 return FALSE;
4923 }
4924 else if (do_segments)
4925 printf (_("\nThere are no program headers in this file.\n"));
4926 return TRUE;
4927 }
4928
4929 if (do_segments && !do_header)
4930 {
4931 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4932 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
4933 printf (ngettext ("There is %d program header, starting at offset %s\n",
4934 "There are %d program headers, starting at offset %s\n",
4935 filedata->file_header.e_phnum),
4936 filedata->file_header.e_phnum,
4937 bfd_vmatoa ("u", filedata->file_header.e_phoff));
4938 }
4939
4940 if (! get_program_headers (filedata))
4941 return TRUE;
4942
4943 if (do_segments)
4944 {
4945 if (filedata->file_header.e_phnum > 1)
4946 printf (_("\nProgram Headers:\n"));
4947 else
4948 printf (_("\nProgram Headers:\n"));
4949
4950 if (is_32bit_elf)
4951 printf
4952 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4953 else if (do_wide)
4954 printf
4955 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4956 else
4957 {
4958 printf
4959 (_(" Type Offset VirtAddr PhysAddr\n"));
4960 printf
4961 (_(" FileSiz MemSiz Flags Align\n"));
4962 }
4963 }
4964
4965 dynamic_addr = 0;
4966 dynamic_size = 0;
4967
4968 for (i = 0, segment = filedata->program_headers;
4969 i < filedata->file_header.e_phnum;
4970 i++, segment++)
4971 {
4972 if (do_segments)
4973 {
4974 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
4975
4976 if (is_32bit_elf)
4977 {
4978 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4979 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4980 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4981 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4982 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4983 printf ("%c%c%c ",
4984 (segment->p_flags & PF_R ? 'R' : ' '),
4985 (segment->p_flags & PF_W ? 'W' : ' '),
4986 (segment->p_flags & PF_X ? 'E' : ' '));
4987 printf ("%#lx", (unsigned long) segment->p_align);
4988 }
4989 else if (do_wide)
4990 {
4991 if ((unsigned long) segment->p_offset == segment->p_offset)
4992 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4993 else
4994 {
4995 print_vma (segment->p_offset, FULL_HEX);
4996 putchar (' ');
4997 }
4998
4999 print_vma (segment->p_vaddr, FULL_HEX);
5000 putchar (' ');
5001 print_vma (segment->p_paddr, FULL_HEX);
5002 putchar (' ');
5003
5004 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5005 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5006 else
5007 {
5008 print_vma (segment->p_filesz, FULL_HEX);
5009 putchar (' ');
5010 }
5011
5012 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5013 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5014 else
5015 {
5016 print_vma (segment->p_memsz, FULL_HEX);
5017 }
5018
5019 printf (" %c%c%c ",
5020 (segment->p_flags & PF_R ? 'R' : ' '),
5021 (segment->p_flags & PF_W ? 'W' : ' '),
5022 (segment->p_flags & PF_X ? 'E' : ' '));
5023
5024 if ((unsigned long) segment->p_align == segment->p_align)
5025 printf ("%#lx", (unsigned long) segment->p_align);
5026 else
5027 {
5028 print_vma (segment->p_align, PREFIX_HEX);
5029 }
5030 }
5031 else
5032 {
5033 print_vma (segment->p_offset, FULL_HEX);
5034 putchar (' ');
5035 print_vma (segment->p_vaddr, FULL_HEX);
5036 putchar (' ');
5037 print_vma (segment->p_paddr, FULL_HEX);
5038 printf ("\n ");
5039 print_vma (segment->p_filesz, FULL_HEX);
5040 putchar (' ');
5041 print_vma (segment->p_memsz, FULL_HEX);
5042 printf (" %c%c%c ",
5043 (segment->p_flags & PF_R ? 'R' : ' '),
5044 (segment->p_flags & PF_W ? 'W' : ' '),
5045 (segment->p_flags & PF_X ? 'E' : ' '));
5046 print_vma (segment->p_align, PREFIX_HEX);
5047 }
5048
5049 putc ('\n', stdout);
5050 }
5051
5052 switch (segment->p_type)
5053 {
5054 case PT_LOAD:
5055 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5056 required by the ELF standard, several programs, including the Linux
5057 kernel, make use of non-ordered segments. */
5058 if (previous_load
5059 && previous_load->p_vaddr > segment->p_vaddr)
5060 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5061 #endif
5062 if (segment->p_memsz < segment->p_filesz)
5063 error (_("the segment's file size is larger than its memory size\n"));
5064 previous_load = segment;
5065 break;
5066
5067 case PT_PHDR:
5068 /* PR 20815 - Verify that the program header is loaded into memory. */
5069 if (i > 0 && previous_load != NULL)
5070 error (_("the PHDR segment must occur before any LOAD segment\n"));
5071 if (filedata->file_header.e_machine != EM_PARISC)
5072 {
5073 unsigned int j;
5074
5075 for (j = 1; j < filedata->file_header.e_phnum; j++)
5076 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5077 && (filedata->program_headers[j].p_vaddr
5078 + filedata->program_headers[j].p_memsz)
5079 >= (segment->p_vaddr + segment->p_filesz))
5080 break;
5081 if (j == filedata->file_header.e_phnum)
5082 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5083 }
5084 break;
5085
5086 case PT_DYNAMIC:
5087 if (dynamic_addr)
5088 error (_("more than one dynamic segment\n"));
5089
5090 /* By default, assume that the .dynamic section is the first
5091 section in the DYNAMIC segment. */
5092 dynamic_addr = segment->p_offset;
5093 dynamic_size = segment->p_filesz;
5094
5095 /* Try to locate the .dynamic section. If there is
5096 a section header table, we can easily locate it. */
5097 if (filedata->section_headers != NULL)
5098 {
5099 Elf_Internal_Shdr * sec;
5100
5101 sec = find_section (filedata, ".dynamic");
5102 if (sec == NULL || sec->sh_size == 0)
5103 {
5104 /* A corresponding .dynamic section is expected, but on
5105 IA-64/OpenVMS it is OK for it to be missing. */
5106 if (!is_ia64_vms (filedata))
5107 error (_("no .dynamic section in the dynamic segment\n"));
5108 break;
5109 }
5110
5111 if (sec->sh_type == SHT_NOBITS)
5112 {
5113 dynamic_size = 0;
5114 break;
5115 }
5116
5117 dynamic_addr = sec->sh_offset;
5118 dynamic_size = sec->sh_size;
5119
5120 if (dynamic_addr < segment->p_offset
5121 || dynamic_addr > segment->p_offset + segment->p_filesz)
5122 warn (_("the .dynamic section is not contained"
5123 " within the dynamic segment\n"));
5124 else if (dynamic_addr > segment->p_offset)
5125 warn (_("the .dynamic section is not the first section"
5126 " in the dynamic segment.\n"));
5127 }
5128
5129 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5130 segment. Check this after matching against the section headers
5131 so we don't warn on debuginfo file (which have NOBITS .dynamic
5132 sections). */
5133 if (dynamic_addr + dynamic_size >= filedata->file_size)
5134 {
5135 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5136 dynamic_addr = dynamic_size = 0;
5137 }
5138 break;
5139
5140 case PT_INTERP:
5141 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5142 SEEK_SET))
5143 error (_("Unable to find program interpreter name\n"));
5144 else
5145 {
5146 char fmt [32];
5147 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5148
5149 if (ret >= (int) sizeof (fmt) || ret < 0)
5150 error (_("Internal error: failed to create format string to display program interpreter\n"));
5151
5152 program_interpreter[0] = 0;
5153 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5154 error (_("Unable to read program interpreter name\n"));
5155
5156 if (do_segments)
5157 printf (_(" [Requesting program interpreter: %s]\n"),
5158 program_interpreter);
5159 }
5160 break;
5161 }
5162 }
5163
5164 if (do_segments
5165 && filedata->section_headers != NULL
5166 && filedata->string_table != NULL)
5167 {
5168 printf (_("\n Section to Segment mapping:\n"));
5169 printf (_(" Segment Sections...\n"));
5170
5171 for (i = 0; i < filedata->file_header.e_phnum; i++)
5172 {
5173 unsigned int j;
5174 Elf_Internal_Shdr * section;
5175
5176 segment = filedata->program_headers + i;
5177 section = filedata->section_headers + 1;
5178
5179 printf (" %2.2d ", i);
5180
5181 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5182 {
5183 if (!ELF_TBSS_SPECIAL (section, segment)
5184 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5185 printf ("%s ", printable_section_name (filedata, section));
5186 }
5187
5188 putc ('\n',stdout);
5189 }
5190 }
5191
5192 return TRUE;
5193 }
5194
5195
5196 /* Find the file offset corresponding to VMA by using the program headers. */
5197
5198 static long
5199 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5200 {
5201 Elf_Internal_Phdr * seg;
5202
5203 if (! get_program_headers (filedata))
5204 {
5205 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5206 return (long) vma;
5207 }
5208
5209 for (seg = filedata->program_headers;
5210 seg < filedata->program_headers + filedata->file_header.e_phnum;
5211 ++seg)
5212 {
5213 if (seg->p_type != PT_LOAD)
5214 continue;
5215
5216 if (vma >= (seg->p_vaddr & -seg->p_align)
5217 && vma + size <= seg->p_vaddr + seg->p_filesz)
5218 return vma - seg->p_vaddr + seg->p_offset;
5219 }
5220
5221 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5222 (unsigned long) vma);
5223 return (long) vma;
5224 }
5225
5226
5227 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5228 If PROBE is true, this is just a probe and we do not generate any error
5229 messages if the load fails. */
5230
5231 static bfd_boolean
5232 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5233 {
5234 Elf32_External_Shdr * shdrs;
5235 Elf_Internal_Shdr * internal;
5236 unsigned int i;
5237 unsigned int size = filedata->file_header.e_shentsize;
5238 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5239
5240 /* PR binutils/17531: Cope with unexpected section header sizes. */
5241 if (size == 0 || num == 0)
5242 return FALSE;
5243 if (size < sizeof * shdrs)
5244 {
5245 if (! probe)
5246 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5247 return FALSE;
5248 }
5249 if (!probe && size > sizeof * shdrs)
5250 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5251
5252 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5253 size, num,
5254 probe ? NULL : _("section headers"));
5255 if (shdrs == NULL)
5256 return FALSE;
5257
5258 free (filedata->section_headers);
5259 filedata->section_headers = (Elf_Internal_Shdr *)
5260 cmalloc (num, sizeof (Elf_Internal_Shdr));
5261 if (filedata->section_headers == NULL)
5262 {
5263 if (!probe)
5264 error (_("Out of memory reading %u section headers\n"), num);
5265 return FALSE;
5266 }
5267
5268 for (i = 0, internal = filedata->section_headers;
5269 i < num;
5270 i++, internal++)
5271 {
5272 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5273 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5274 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5275 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5276 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5277 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5278 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5279 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5280 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5281 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5282 if (!probe && internal->sh_link > num)
5283 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5284 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5285 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5286 }
5287
5288 free (shdrs);
5289 return TRUE;
5290 }
5291
5292 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5293
5294 static bfd_boolean
5295 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5296 {
5297 Elf64_External_Shdr * shdrs;
5298 Elf_Internal_Shdr * internal;
5299 unsigned int i;
5300 unsigned int size = filedata->file_header.e_shentsize;
5301 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5302
5303 /* PR binutils/17531: Cope with unexpected section header sizes. */
5304 if (size == 0 || num == 0)
5305 return FALSE;
5306
5307 if (size < sizeof * shdrs)
5308 {
5309 if (! probe)
5310 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5311 return FALSE;
5312 }
5313
5314 if (! probe && size > sizeof * shdrs)
5315 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5316
5317 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5318 filedata->file_header.e_shoff,
5319 size, num,
5320 probe ? NULL : _("section headers"));
5321 if (shdrs == NULL)
5322 return FALSE;
5323
5324 free (filedata->section_headers);
5325 filedata->section_headers = (Elf_Internal_Shdr *)
5326 cmalloc (num, sizeof (Elf_Internal_Shdr));
5327 if (filedata->section_headers == NULL)
5328 {
5329 if (! probe)
5330 error (_("Out of memory reading %u section headers\n"), num);
5331 return FALSE;
5332 }
5333
5334 for (i = 0, internal = filedata->section_headers;
5335 i < num;
5336 i++, internal++)
5337 {
5338 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5339 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5340 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5341 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5342 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5343 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5344 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5345 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5346 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5347 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5348 if (!probe && internal->sh_link > num)
5349 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5350 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5351 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5352 }
5353
5354 free (shdrs);
5355 return TRUE;
5356 }
5357
5358 static Elf_Internal_Sym *
5359 get_32bit_elf_symbols (Filedata * filedata,
5360 Elf_Internal_Shdr * section,
5361 unsigned long * num_syms_return)
5362 {
5363 unsigned long number = 0;
5364 Elf32_External_Sym * esyms = NULL;
5365 Elf_External_Sym_Shndx * shndx = NULL;
5366 Elf_Internal_Sym * isyms = NULL;
5367 Elf_Internal_Sym * psym;
5368 unsigned int j;
5369
5370 if (section->sh_size == 0)
5371 {
5372 if (num_syms_return != NULL)
5373 * num_syms_return = 0;
5374 return NULL;
5375 }
5376
5377 /* Run some sanity checks first. */
5378 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5379 {
5380 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5381 printable_section_name (filedata, section),
5382 (unsigned long) section->sh_entsize);
5383 goto exit_point;
5384 }
5385
5386 if (section->sh_size > filedata->file_size)
5387 {
5388 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5389 printable_section_name (filedata, section),
5390 (unsigned long) section->sh_size);
5391 goto exit_point;
5392 }
5393
5394 number = section->sh_size / section->sh_entsize;
5395
5396 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5397 {
5398 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5399 (unsigned long) section->sh_size,
5400 printable_section_name (filedata, section),
5401 (unsigned long) section->sh_entsize);
5402 goto exit_point;
5403 }
5404
5405 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5406 section->sh_size, _("symbols"));
5407 if (esyms == NULL)
5408 goto exit_point;
5409
5410 {
5411 elf_section_list * entry;
5412
5413 shndx = NULL;
5414 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5415 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5416 {
5417 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5418 entry->hdr->sh_offset,
5419 1, entry->hdr->sh_size,
5420 _("symbol table section indicies"));
5421 if (shndx == NULL)
5422 goto exit_point;
5423 /* PR17531: file: heap-buffer-overflow */
5424 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5425 {
5426 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5427 printable_section_name (filedata, entry->hdr),
5428 (unsigned long) entry->hdr->sh_size,
5429 (unsigned long) section->sh_size);
5430 goto exit_point;
5431 }
5432 }
5433 }
5434
5435 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5436
5437 if (isyms == NULL)
5438 {
5439 error (_("Out of memory reading %lu symbols\n"),
5440 (unsigned long) number);
5441 goto exit_point;
5442 }
5443
5444 for (j = 0, psym = isyms; j < number; j++, psym++)
5445 {
5446 psym->st_name = BYTE_GET (esyms[j].st_name);
5447 psym->st_value = BYTE_GET (esyms[j].st_value);
5448 psym->st_size = BYTE_GET (esyms[j].st_size);
5449 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5450 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5451 psym->st_shndx
5452 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5453 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5454 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5455 psym->st_info = BYTE_GET (esyms[j].st_info);
5456 psym->st_other = BYTE_GET (esyms[j].st_other);
5457 }
5458
5459 exit_point:
5460 if (shndx != NULL)
5461 free (shndx);
5462 if (esyms != NULL)
5463 free (esyms);
5464
5465 if (num_syms_return != NULL)
5466 * num_syms_return = isyms == NULL ? 0 : number;
5467
5468 return isyms;
5469 }
5470
5471 static Elf_Internal_Sym *
5472 get_64bit_elf_symbols (Filedata * filedata,
5473 Elf_Internal_Shdr * section,
5474 unsigned long * num_syms_return)
5475 {
5476 unsigned long number = 0;
5477 Elf64_External_Sym * esyms = NULL;
5478 Elf_External_Sym_Shndx * shndx = NULL;
5479 Elf_Internal_Sym * isyms = NULL;
5480 Elf_Internal_Sym * psym;
5481 unsigned int j;
5482
5483 if (section->sh_size == 0)
5484 {
5485 if (num_syms_return != NULL)
5486 * num_syms_return = 0;
5487 return NULL;
5488 }
5489
5490 /* Run some sanity checks first. */
5491 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5492 {
5493 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5494 printable_section_name (filedata, section),
5495 (unsigned long) section->sh_entsize);
5496 goto exit_point;
5497 }
5498
5499 if (section->sh_size > filedata->file_size)
5500 {
5501 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5502 printable_section_name (filedata, section),
5503 (unsigned long) section->sh_size);
5504 goto exit_point;
5505 }
5506
5507 number = section->sh_size / section->sh_entsize;
5508
5509 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5510 {
5511 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5512 (unsigned long) section->sh_size,
5513 printable_section_name (filedata, section),
5514 (unsigned long) section->sh_entsize);
5515 goto exit_point;
5516 }
5517
5518 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5519 section->sh_size, _("symbols"));
5520 if (!esyms)
5521 goto exit_point;
5522
5523 {
5524 elf_section_list * entry;
5525
5526 shndx = NULL;
5527 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5528 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5529 {
5530 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5531 entry->hdr->sh_offset,
5532 1, entry->hdr->sh_size,
5533 _("symbol table section indicies"));
5534 if (shndx == NULL)
5535 goto exit_point;
5536 /* PR17531: file: heap-buffer-overflow */
5537 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5538 {
5539 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5540 printable_section_name (filedata, entry->hdr),
5541 (unsigned long) entry->hdr->sh_size,
5542 (unsigned long) section->sh_size);
5543 goto exit_point;
5544 }
5545 }
5546 }
5547
5548 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5549
5550 if (isyms == NULL)
5551 {
5552 error (_("Out of memory reading %lu symbols\n"),
5553 (unsigned long) number);
5554 goto exit_point;
5555 }
5556
5557 for (j = 0, psym = isyms; j < number; j++, psym++)
5558 {
5559 psym->st_name = BYTE_GET (esyms[j].st_name);
5560 psym->st_info = BYTE_GET (esyms[j].st_info);
5561 psym->st_other = BYTE_GET (esyms[j].st_other);
5562 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5563
5564 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5565 psym->st_shndx
5566 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5567 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5568 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5569
5570 psym->st_value = BYTE_GET (esyms[j].st_value);
5571 psym->st_size = BYTE_GET (esyms[j].st_size);
5572 }
5573
5574 exit_point:
5575 if (shndx != NULL)
5576 free (shndx);
5577 if (esyms != NULL)
5578 free (esyms);
5579
5580 if (num_syms_return != NULL)
5581 * num_syms_return = isyms == NULL ? 0 : number;
5582
5583 return isyms;
5584 }
5585
5586 static const char *
5587 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5588 {
5589 static char buff[1024];
5590 char * p = buff;
5591 unsigned int field_size = is_32bit_elf ? 8 : 16;
5592 signed int sindex;
5593 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5594 bfd_vma os_flags = 0;
5595 bfd_vma proc_flags = 0;
5596 bfd_vma unknown_flags = 0;
5597 static const struct
5598 {
5599 const char * str;
5600 unsigned int len;
5601 }
5602 flags [] =
5603 {
5604 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5605 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5606 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5607 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5608 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5609 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5610 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5611 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5612 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5613 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5614 /* IA-64 specific. */
5615 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5616 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5617 /* IA-64 OpenVMS specific. */
5618 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5619 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5620 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5621 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5622 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5623 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5624 /* Generic. */
5625 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5626 /* SPARC specific. */
5627 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5628 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5629 /* ARM specific. */
5630 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5631 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5632 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5633 /* GNU specific. */
5634 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5635 /* VLE specific. */
5636 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5637 };
5638
5639 if (do_section_details)
5640 {
5641 sprintf (buff, "[%*.*lx]: ",
5642 field_size, field_size, (unsigned long) sh_flags);
5643 p += field_size + 4;
5644 }
5645
5646 while (sh_flags)
5647 {
5648 bfd_vma flag;
5649
5650 flag = sh_flags & - sh_flags;
5651 sh_flags &= ~ flag;
5652
5653 if (do_section_details)
5654 {
5655 switch (flag)
5656 {
5657 case SHF_WRITE: sindex = 0; break;
5658 case SHF_ALLOC: sindex = 1; break;
5659 case SHF_EXECINSTR: sindex = 2; break;
5660 case SHF_MERGE: sindex = 3; break;
5661 case SHF_STRINGS: sindex = 4; break;
5662 case SHF_INFO_LINK: sindex = 5; break;
5663 case SHF_LINK_ORDER: sindex = 6; break;
5664 case SHF_OS_NONCONFORMING: sindex = 7; break;
5665 case SHF_GROUP: sindex = 8; break;
5666 case SHF_TLS: sindex = 9; break;
5667 case SHF_EXCLUDE: sindex = 18; break;
5668 case SHF_COMPRESSED: sindex = 20; break;
5669 case SHF_GNU_MBIND: sindex = 24; break;
5670
5671 default:
5672 sindex = -1;
5673 switch (filedata->file_header.e_machine)
5674 {
5675 case EM_IA_64:
5676 if (flag == SHF_IA_64_SHORT)
5677 sindex = 10;
5678 else if (flag == SHF_IA_64_NORECOV)
5679 sindex = 11;
5680 #ifdef BFD64
5681 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5682 switch (flag)
5683 {
5684 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5685 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5686 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5687 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5688 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5689 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5690 default: break;
5691 }
5692 #endif
5693 break;
5694
5695 case EM_386:
5696 case EM_IAMCU:
5697 case EM_X86_64:
5698 case EM_L1OM:
5699 case EM_K1OM:
5700 case EM_OLD_SPARCV9:
5701 case EM_SPARC32PLUS:
5702 case EM_SPARCV9:
5703 case EM_SPARC:
5704 if (flag == SHF_ORDERED)
5705 sindex = 19;
5706 break;
5707
5708 case EM_ARM:
5709 switch (flag)
5710 {
5711 case SHF_ENTRYSECT: sindex = 21; break;
5712 case SHF_ARM_PURECODE: sindex = 22; break;
5713 case SHF_COMDEF: sindex = 23; break;
5714 default: break;
5715 }
5716 break;
5717 case EM_PPC:
5718 if (flag == SHF_PPC_VLE)
5719 sindex = 25;
5720 break;
5721
5722 default:
5723 break;
5724 }
5725 }
5726
5727 if (sindex != -1)
5728 {
5729 if (p != buff + field_size + 4)
5730 {
5731 if (size < (10 + 2))
5732 {
5733 warn (_("Internal error: not enough buffer room for section flag info"));
5734 return _("<unknown>");
5735 }
5736 size -= 2;
5737 *p++ = ',';
5738 *p++ = ' ';
5739 }
5740
5741 size -= flags [sindex].len;
5742 p = stpcpy (p, flags [sindex].str);
5743 }
5744 else if (flag & SHF_MASKOS)
5745 os_flags |= flag;
5746 else if (flag & SHF_MASKPROC)
5747 proc_flags |= flag;
5748 else
5749 unknown_flags |= flag;
5750 }
5751 else
5752 {
5753 switch (flag)
5754 {
5755 case SHF_WRITE: *p = 'W'; break;
5756 case SHF_ALLOC: *p = 'A'; break;
5757 case SHF_EXECINSTR: *p = 'X'; break;
5758 case SHF_MERGE: *p = 'M'; break;
5759 case SHF_STRINGS: *p = 'S'; break;
5760 case SHF_INFO_LINK: *p = 'I'; break;
5761 case SHF_LINK_ORDER: *p = 'L'; break;
5762 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5763 case SHF_GROUP: *p = 'G'; break;
5764 case SHF_TLS: *p = 'T'; break;
5765 case SHF_EXCLUDE: *p = 'E'; break;
5766 case SHF_COMPRESSED: *p = 'C'; break;
5767 case SHF_GNU_MBIND: *p = 'D'; break;
5768
5769 default:
5770 if ((filedata->file_header.e_machine == EM_X86_64
5771 || filedata->file_header.e_machine == EM_L1OM
5772 || filedata->file_header.e_machine == EM_K1OM)
5773 && flag == SHF_X86_64_LARGE)
5774 *p = 'l';
5775 else if (filedata->file_header.e_machine == EM_ARM
5776 && flag == SHF_ARM_PURECODE)
5777 *p = 'y';
5778 else if (filedata->file_header.e_machine == EM_PPC
5779 && flag == SHF_PPC_VLE)
5780 *p = 'v';
5781 else if (flag & SHF_MASKOS)
5782 {
5783 *p = 'o';
5784 sh_flags &= ~ SHF_MASKOS;
5785 }
5786 else if (flag & SHF_MASKPROC)
5787 {
5788 *p = 'p';
5789 sh_flags &= ~ SHF_MASKPROC;
5790 }
5791 else
5792 *p = 'x';
5793 break;
5794 }
5795 p++;
5796 }
5797 }
5798
5799 if (do_section_details)
5800 {
5801 if (os_flags)
5802 {
5803 size -= 5 + field_size;
5804 if (p != buff + field_size + 4)
5805 {
5806 if (size < (2 + 1))
5807 {
5808 warn (_("Internal error: not enough buffer room for section flag info"));
5809 return _("<unknown>");
5810 }
5811 size -= 2;
5812 *p++ = ',';
5813 *p++ = ' ';
5814 }
5815 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5816 (unsigned long) os_flags);
5817 p += 5 + field_size;
5818 }
5819 if (proc_flags)
5820 {
5821 size -= 7 + field_size;
5822 if (p != buff + field_size + 4)
5823 {
5824 if (size < (2 + 1))
5825 {
5826 warn (_("Internal error: not enough buffer room for section flag info"));
5827 return _("<unknown>");
5828 }
5829 size -= 2;
5830 *p++ = ',';
5831 *p++ = ' ';
5832 }
5833 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5834 (unsigned long) proc_flags);
5835 p += 7 + field_size;
5836 }
5837 if (unknown_flags)
5838 {
5839 size -= 10 + field_size;
5840 if (p != buff + field_size + 4)
5841 {
5842 if (size < (2 + 1))
5843 {
5844 warn (_("Internal error: not enough buffer room for section flag info"));
5845 return _("<unknown>");
5846 }
5847 size -= 2;
5848 *p++ = ',';
5849 *p++ = ' ';
5850 }
5851 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5852 (unsigned long) unknown_flags);
5853 p += 10 + field_size;
5854 }
5855 }
5856
5857 *p = '\0';
5858 return buff;
5859 }
5860
5861 static unsigned int
5862 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5863 {
5864 if (is_32bit_elf)
5865 {
5866 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5867
5868 if (size < sizeof (* echdr))
5869 {
5870 error (_("Compressed section is too small even for a compression header\n"));
5871 return 0;
5872 }
5873
5874 chdr->ch_type = BYTE_GET (echdr->ch_type);
5875 chdr->ch_size = BYTE_GET (echdr->ch_size);
5876 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5877 return sizeof (*echdr);
5878 }
5879 else
5880 {
5881 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5882
5883 if (size < sizeof (* echdr))
5884 {
5885 error (_("Compressed section is too small even for a compression header\n"));
5886 return 0;
5887 }
5888
5889 chdr->ch_type = BYTE_GET (echdr->ch_type);
5890 chdr->ch_size = BYTE_GET (echdr->ch_size);
5891 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5892 return sizeof (*echdr);
5893 }
5894 }
5895
5896 static bfd_boolean
5897 process_section_headers (Filedata * filedata)
5898 {
5899 Elf_Internal_Shdr * section;
5900 unsigned int i;
5901
5902 filedata->section_headers = NULL;
5903
5904 if (filedata->file_header.e_shnum == 0)
5905 {
5906 /* PR binutils/12467. */
5907 if (filedata->file_header.e_shoff != 0)
5908 {
5909 warn (_("possibly corrupt ELF file header - it has a non-zero"
5910 " section header offset, but no section headers\n"));
5911 return FALSE;
5912 }
5913 else if (do_sections)
5914 printf (_("\nThere are no sections in this file.\n"));
5915
5916 return TRUE;
5917 }
5918
5919 if (do_sections && !do_header)
5920 printf (ngettext ("There is %d section header, "
5921 "starting at offset 0x%lx:\n",
5922 "There are %d section headers, "
5923 "starting at offset 0x%lx:\n",
5924 filedata->file_header.e_shnum),
5925 filedata->file_header.e_shnum,
5926 (unsigned long) filedata->file_header.e_shoff);
5927
5928 if (is_32bit_elf)
5929 {
5930 if (! get_32bit_section_headers (filedata, FALSE))
5931 return FALSE;
5932 }
5933 else
5934 {
5935 if (! get_64bit_section_headers (filedata, FALSE))
5936 return FALSE;
5937 }
5938
5939 /* Read in the string table, so that we have names to display. */
5940 if (filedata->file_header.e_shstrndx != SHN_UNDEF
5941 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
5942 {
5943 section = filedata->section_headers + filedata->file_header.e_shstrndx;
5944
5945 if (section->sh_size != 0)
5946 {
5947 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
5948 1, section->sh_size,
5949 _("string table"));
5950
5951 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
5952 }
5953 }
5954
5955 /* Scan the sections for the dynamic symbol table
5956 and dynamic string table and debug sections. */
5957 dynamic_symbols = NULL;
5958 dynamic_strings = NULL;
5959 dynamic_syminfo = NULL;
5960 symtab_shndx_list = NULL;
5961
5962 eh_addr_size = is_32bit_elf ? 4 : 8;
5963 switch (filedata->file_header.e_machine)
5964 {
5965 case EM_MIPS:
5966 case EM_MIPS_RS3_LE:
5967 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5968 FDE addresses. However, the ABI also has a semi-official ILP32
5969 variant for which the normal FDE address size rules apply.
5970
5971 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5972 section, where XX is the size of longs in bits. Unfortunately,
5973 earlier compilers provided no way of distinguishing ILP32 objects
5974 from LP64 objects, so if there's any doubt, we should assume that
5975 the official LP64 form is being used. */
5976 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5977 && find_section (filedata, ".gcc_compiled_long32") == NULL)
5978 eh_addr_size = 8;
5979 break;
5980
5981 case EM_H8_300:
5982 case EM_H8_300H:
5983 switch (filedata->file_header.e_flags & EF_H8_MACH)
5984 {
5985 case E_H8_MACH_H8300:
5986 case E_H8_MACH_H8300HN:
5987 case E_H8_MACH_H8300SN:
5988 case E_H8_MACH_H8300SXN:
5989 eh_addr_size = 2;
5990 break;
5991 case E_H8_MACH_H8300H:
5992 case E_H8_MACH_H8300S:
5993 case E_H8_MACH_H8300SX:
5994 eh_addr_size = 4;
5995 break;
5996 }
5997 break;
5998
5999 case EM_M32C_OLD:
6000 case EM_M32C:
6001 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6002 {
6003 case EF_M32C_CPU_M16C:
6004 eh_addr_size = 2;
6005 break;
6006 }
6007 break;
6008 }
6009
6010 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6011 do \
6012 { \
6013 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6014 if (section->sh_entsize != expected_entsize) \
6015 { \
6016 char buf[40]; \
6017 sprintf_vma (buf, section->sh_entsize); \
6018 /* Note: coded this way so that there is a single string for \
6019 translation. */ \
6020 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6021 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6022 (unsigned) expected_entsize); \
6023 section->sh_entsize = expected_entsize; \
6024 } \
6025 } \
6026 while (0)
6027
6028 #define CHECK_ENTSIZE(section, i, type) \
6029 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6030 sizeof (Elf64_External_##type))
6031
6032 for (i = 0, section = filedata->section_headers;
6033 i < filedata->file_header.e_shnum;
6034 i++, section++)
6035 {
6036 char * name = SECTION_NAME (section);
6037
6038 if (section->sh_type == SHT_DYNSYM)
6039 {
6040 if (dynamic_symbols != NULL)
6041 {
6042 error (_("File contains multiple dynamic symbol tables\n"));
6043 continue;
6044 }
6045
6046 CHECK_ENTSIZE (section, i, Sym);
6047 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6048 }
6049 else if (section->sh_type == SHT_STRTAB
6050 && streq (name, ".dynstr"))
6051 {
6052 if (dynamic_strings != NULL)
6053 {
6054 error (_("File contains multiple dynamic string tables\n"));
6055 continue;
6056 }
6057
6058 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6059 1, section->sh_size,
6060 _("dynamic strings"));
6061 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6062 }
6063 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6064 {
6065 elf_section_list * entry = xmalloc (sizeof * entry);
6066
6067 entry->hdr = section;
6068 entry->next = symtab_shndx_list;
6069 symtab_shndx_list = entry;
6070 }
6071 else if (section->sh_type == SHT_SYMTAB)
6072 CHECK_ENTSIZE (section, i, Sym);
6073 else if (section->sh_type == SHT_GROUP)
6074 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6075 else if (section->sh_type == SHT_REL)
6076 CHECK_ENTSIZE (section, i, Rel);
6077 else if (section->sh_type == SHT_RELA)
6078 CHECK_ENTSIZE (section, i, Rela);
6079 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6080 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6081 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6082 || do_debug_str || do_debug_loc || do_debug_ranges
6083 || do_debug_addr || do_debug_cu_index || do_debug_links)
6084 && (const_strneq (name, ".debug_")
6085 || const_strneq (name, ".zdebug_")))
6086 {
6087 if (name[1] == 'z')
6088 name += sizeof (".zdebug_") - 1;
6089 else
6090 name += sizeof (".debug_") - 1;
6091
6092 if (do_debugging
6093 || (do_debug_info && const_strneq (name, "info"))
6094 || (do_debug_info && const_strneq (name, "types"))
6095 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6096 || (do_debug_lines && strcmp (name, "line") == 0)
6097 || (do_debug_lines && const_strneq (name, "line."))
6098 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6099 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6100 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6101 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6102 || (do_debug_aranges && const_strneq (name, "aranges"))
6103 || (do_debug_ranges && const_strneq (name, "ranges"))
6104 || (do_debug_ranges && const_strneq (name, "rnglists"))
6105 || (do_debug_frames && const_strneq (name, "frame"))
6106 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6107 || (do_debug_macinfo && const_strneq (name, "macro"))
6108 || (do_debug_str && const_strneq (name, "str"))
6109 || (do_debug_loc && const_strneq (name, "loc"))
6110 || (do_debug_loc && const_strneq (name, "loclists"))
6111 || (do_debug_addr && const_strneq (name, "addr"))
6112 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6113 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6114 )
6115 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6116 }
6117 /* Linkonce section to be combined with .debug_info at link time. */
6118 else if ((do_debugging || do_debug_info)
6119 && const_strneq (name, ".gnu.linkonce.wi."))
6120 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6121 else if (do_debug_frames && streq (name, ".eh_frame"))
6122 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6123 else if (do_gdb_index && (streq (name, ".gdb_index")
6124 || streq (name, ".debug_names")))
6125 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6126 /* Trace sections for Itanium VMS. */
6127 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6128 || do_trace_aranges)
6129 && const_strneq (name, ".trace_"))
6130 {
6131 name += sizeof (".trace_") - 1;
6132
6133 if (do_debugging
6134 || (do_trace_info && streq (name, "info"))
6135 || (do_trace_abbrevs && streq (name, "abbrev"))
6136 || (do_trace_aranges && streq (name, "aranges"))
6137 )
6138 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6139 }
6140 else if ((do_debugging || do_debug_links)
6141 && (const_strneq (name, ".gnu_debuglink")
6142 || const_strneq (name, ".gnu_debugaltlink")))
6143 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6144 }
6145
6146 if (! do_sections)
6147 return TRUE;
6148
6149 if (filedata->file_header.e_shnum > 1)
6150 printf (_("\nSection Headers:\n"));
6151 else
6152 printf (_("\nSection Header:\n"));
6153
6154 if (is_32bit_elf)
6155 {
6156 if (do_section_details)
6157 {
6158 printf (_(" [Nr] Name\n"));
6159 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6160 }
6161 else
6162 printf
6163 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6164 }
6165 else if (do_wide)
6166 {
6167 if (do_section_details)
6168 {
6169 printf (_(" [Nr] Name\n"));
6170 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6171 }
6172 else
6173 printf
6174 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6175 }
6176 else
6177 {
6178 if (do_section_details)
6179 {
6180 printf (_(" [Nr] Name\n"));
6181 printf (_(" Type Address Offset Link\n"));
6182 printf (_(" Size EntSize Info Align\n"));
6183 }
6184 else
6185 {
6186 printf (_(" [Nr] Name Type Address Offset\n"));
6187 printf (_(" Size EntSize Flags Link Info Align\n"));
6188 }
6189 }
6190
6191 if (do_section_details)
6192 printf (_(" Flags\n"));
6193
6194 for (i = 0, section = filedata->section_headers;
6195 i < filedata->file_header.e_shnum;
6196 i++, section++)
6197 {
6198 /* Run some sanity checks on the section header. */
6199
6200 /* Check the sh_link field. */
6201 switch (section->sh_type)
6202 {
6203 case SHT_SYMTAB_SHNDX:
6204 case SHT_GROUP:
6205 case SHT_HASH:
6206 case SHT_GNU_HASH:
6207 case SHT_GNU_versym:
6208 case SHT_REL:
6209 case SHT_RELA:
6210 if (section->sh_link < 1
6211 || section->sh_link >= filedata->file_header.e_shnum
6212 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6213 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6214 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6215 i, section->sh_link);
6216 break;
6217
6218 case SHT_DYNAMIC:
6219 case SHT_SYMTAB:
6220 case SHT_DYNSYM:
6221 case SHT_GNU_verneed:
6222 case SHT_GNU_verdef:
6223 case SHT_GNU_LIBLIST:
6224 if (section->sh_link < 1
6225 || section->sh_link >= filedata->file_header.e_shnum
6226 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6227 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6228 i, section->sh_link);
6229 break;
6230
6231 case SHT_INIT_ARRAY:
6232 case SHT_FINI_ARRAY:
6233 case SHT_PREINIT_ARRAY:
6234 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6235 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6236 i, section->sh_link);
6237 break;
6238
6239 default:
6240 /* FIXME: Add support for target specific section types. */
6241 #if 0 /* Currently we do not check other section types as there are too
6242 many special cases. Stab sections for example have a type
6243 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6244 section. */
6245 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6246 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6247 i, section->sh_link);
6248 #endif
6249 break;
6250 }
6251
6252 /* Check the sh_info field. */
6253 switch (section->sh_type)
6254 {
6255 case SHT_REL:
6256 case SHT_RELA:
6257 if (section->sh_info < 1
6258 || section->sh_info >= filedata->file_header.e_shnum
6259 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6260 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6261 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6262 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6263 /* FIXME: Are other section types valid ? */
6264 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6265 {
6266 if (section->sh_info == 0
6267 && (filedata->file_header.e_type == ET_EXEC
6268 || filedata->file_header.e_type == ET_DYN
6269 /* These next two tests may be redundant, but
6270 they have been left in for paranoia's sake. */
6271 || streq (SECTION_NAME (section), ".rel.dyn")
6272 || streq (SECTION_NAME (section), ".rela.dyn")))
6273 /* Dynamic relocations apply to segments, not sections, so
6274 they do not need an sh_info value. */
6275 ;
6276 else
6277 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6278 i, section->sh_info);
6279 }
6280 break;
6281
6282 case SHT_DYNAMIC:
6283 case SHT_HASH:
6284 case SHT_SYMTAB_SHNDX:
6285 case SHT_INIT_ARRAY:
6286 case SHT_FINI_ARRAY:
6287 case SHT_PREINIT_ARRAY:
6288 if (section->sh_info != 0)
6289 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6290 i, section->sh_info);
6291 break;
6292
6293 case SHT_GROUP:
6294 case SHT_SYMTAB:
6295 case SHT_DYNSYM:
6296 /* A symbol index - we assume that it is valid. */
6297 break;
6298
6299 default:
6300 /* FIXME: Add support for target specific section types. */
6301 if (section->sh_type == SHT_NOBITS)
6302 /* NOBITS section headers with non-zero sh_info fields can be
6303 created when a binary is stripped of everything but its debug
6304 information. The stripped sections have their headers
6305 preserved but their types set to SHT_NOBITS. So do not check
6306 this type of section. */
6307 ;
6308 else if (section->sh_flags & SHF_INFO_LINK)
6309 {
6310 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6311 warn (_("[%2u]: Expected link to another section in info field"), i);
6312 }
6313 else if (section->sh_type < SHT_LOOS
6314 && (section->sh_flags & SHF_GNU_MBIND) == 0
6315 && section->sh_info != 0)
6316 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6317 i, section->sh_info);
6318 break;
6319 }
6320
6321 /* Check the sh_size field. */
6322 if (section->sh_size > filedata->file_size
6323 && section->sh_type != SHT_NOBITS
6324 && section->sh_type != SHT_NULL
6325 && section->sh_type < SHT_LOOS)
6326 warn (_("Size of section %u is larger than the entire file!\n"), i);
6327
6328 printf (" [%2u] ", i);
6329 if (do_section_details)
6330 printf ("%s\n ", printable_section_name (filedata, section));
6331 else
6332 print_symbol (-17, SECTION_NAME (section));
6333
6334 printf (do_wide ? " %-15s " : " %-15.15s ",
6335 get_section_type_name (filedata, section->sh_type));
6336
6337 if (is_32bit_elf)
6338 {
6339 const char * link_too_big = NULL;
6340
6341 print_vma (section->sh_addr, LONG_HEX);
6342
6343 printf ( " %6.6lx %6.6lx %2.2lx",
6344 (unsigned long) section->sh_offset,
6345 (unsigned long) section->sh_size,
6346 (unsigned long) section->sh_entsize);
6347
6348 if (do_section_details)
6349 fputs (" ", stdout);
6350 else
6351 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6352
6353 if (section->sh_link >= filedata->file_header.e_shnum)
6354 {
6355 link_too_big = "";
6356 /* The sh_link value is out of range. Normally this indicates
6357 an error but it can have special values in Solaris binaries. */
6358 switch (filedata->file_header.e_machine)
6359 {
6360 case EM_386:
6361 case EM_IAMCU:
6362 case EM_X86_64:
6363 case EM_L1OM:
6364 case EM_K1OM:
6365 case EM_OLD_SPARCV9:
6366 case EM_SPARC32PLUS:
6367 case EM_SPARCV9:
6368 case EM_SPARC:
6369 if (section->sh_link == (SHN_BEFORE & 0xffff))
6370 link_too_big = "BEFORE";
6371 else if (section->sh_link == (SHN_AFTER & 0xffff))
6372 link_too_big = "AFTER";
6373 break;
6374 default:
6375 break;
6376 }
6377 }
6378
6379 if (do_section_details)
6380 {
6381 if (link_too_big != NULL && * link_too_big)
6382 printf ("<%s> ", link_too_big);
6383 else
6384 printf ("%2u ", section->sh_link);
6385 printf ("%3u %2lu\n", section->sh_info,
6386 (unsigned long) section->sh_addralign);
6387 }
6388 else
6389 printf ("%2u %3u %2lu\n",
6390 section->sh_link,
6391 section->sh_info,
6392 (unsigned long) section->sh_addralign);
6393
6394 if (link_too_big && ! * link_too_big)
6395 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6396 i, section->sh_link);
6397 }
6398 else if (do_wide)
6399 {
6400 print_vma (section->sh_addr, LONG_HEX);
6401
6402 if ((long) section->sh_offset == section->sh_offset)
6403 printf (" %6.6lx", (unsigned long) section->sh_offset);
6404 else
6405 {
6406 putchar (' ');
6407 print_vma (section->sh_offset, LONG_HEX);
6408 }
6409
6410 if ((unsigned long) section->sh_size == section->sh_size)
6411 printf (" %6.6lx", (unsigned long) section->sh_size);
6412 else
6413 {
6414 putchar (' ');
6415 print_vma (section->sh_size, LONG_HEX);
6416 }
6417
6418 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6419 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6420 else
6421 {
6422 putchar (' ');
6423 print_vma (section->sh_entsize, LONG_HEX);
6424 }
6425
6426 if (do_section_details)
6427 fputs (" ", stdout);
6428 else
6429 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6430
6431 printf ("%2u %3u ", section->sh_link, section->sh_info);
6432
6433 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6434 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6435 else
6436 {
6437 print_vma (section->sh_addralign, DEC);
6438 putchar ('\n');
6439 }
6440 }
6441 else if (do_section_details)
6442 {
6443 printf (" %-15.15s ",
6444 get_section_type_name (filedata, section->sh_type));
6445 print_vma (section->sh_addr, LONG_HEX);
6446 if ((long) section->sh_offset == section->sh_offset)
6447 printf (" %16.16lx", (unsigned long) section->sh_offset);
6448 else
6449 {
6450 printf (" ");
6451 print_vma (section->sh_offset, LONG_HEX);
6452 }
6453 printf (" %u\n ", section->sh_link);
6454 print_vma (section->sh_size, LONG_HEX);
6455 putchar (' ');
6456 print_vma (section->sh_entsize, LONG_HEX);
6457
6458 printf (" %-16u %lu\n",
6459 section->sh_info,
6460 (unsigned long) section->sh_addralign);
6461 }
6462 else
6463 {
6464 putchar (' ');
6465 print_vma (section->sh_addr, LONG_HEX);
6466 if ((long) section->sh_offset == section->sh_offset)
6467 printf (" %8.8lx", (unsigned long) section->sh_offset);
6468 else
6469 {
6470 printf (" ");
6471 print_vma (section->sh_offset, LONG_HEX);
6472 }
6473 printf ("\n ");
6474 print_vma (section->sh_size, LONG_HEX);
6475 printf (" ");
6476 print_vma (section->sh_entsize, LONG_HEX);
6477
6478 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6479
6480 printf (" %2u %3u %lu\n",
6481 section->sh_link,
6482 section->sh_info,
6483 (unsigned long) section->sh_addralign);
6484 }
6485
6486 if (do_section_details)
6487 {
6488 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6489 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6490 {
6491 /* Minimum section size is 12 bytes for 32-bit compression
6492 header + 12 bytes for compressed data header. */
6493 unsigned char buf[24];
6494
6495 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6496 if (get_data (&buf, filedata, section->sh_offset, 1,
6497 sizeof (buf), _("compression header")))
6498 {
6499 Elf_Internal_Chdr chdr;
6500
6501 (void) get_compression_header (&chdr, buf, sizeof (buf));
6502
6503 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6504 printf (" ZLIB, ");
6505 else
6506 printf (_(" [<unknown>: 0x%x], "),
6507 chdr.ch_type);
6508 print_vma (chdr.ch_size, LONG_HEX);
6509 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6510 }
6511 }
6512 }
6513 }
6514
6515 if (!do_section_details)
6516 {
6517 /* The ordering of the letters shown here matches the ordering of the
6518 corresponding SHF_xxx values, and hence the order in which these
6519 letters will be displayed to the user. */
6520 printf (_("Key to Flags:\n\
6521 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6522 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6523 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6524 if (filedata->file_header.e_machine == EM_X86_64
6525 || filedata->file_header.e_machine == EM_L1OM
6526 || filedata->file_header.e_machine == EM_K1OM)
6527 printf (_("l (large), "));
6528 else if (filedata->file_header.e_machine == EM_ARM)
6529 printf (_("y (purecode), "));
6530 else if (filedata->file_header.e_machine == EM_PPC)
6531 printf (_("v (VLE), "));
6532 printf ("p (processor specific)\n");
6533 }
6534
6535 return TRUE;
6536 }
6537
6538 static const char *
6539 get_group_flags (unsigned int flags)
6540 {
6541 static char buff[128];
6542
6543 if (flags == 0)
6544 return "";
6545 else if (flags == GRP_COMDAT)
6546 return "COMDAT ";
6547
6548 snprintf (buff, 14, _("[0x%x: "), flags);
6549
6550 flags &= ~ GRP_COMDAT;
6551 if (flags & GRP_MASKOS)
6552 {
6553 strcat (buff, "<OS specific>");
6554 flags &= ~ GRP_MASKOS;
6555 }
6556
6557 if (flags & GRP_MASKPROC)
6558 {
6559 strcat (buff, "<PROC specific>");
6560 flags &= ~ GRP_MASKPROC;
6561 }
6562
6563 if (flags)
6564 strcat (buff, "<unknown>");
6565
6566 strcat (buff, "]");
6567 return buff;
6568 }
6569
6570 static bfd_boolean
6571 process_section_groups (Filedata * filedata)
6572 {
6573 Elf_Internal_Shdr * section;
6574 unsigned int i;
6575 struct group * group;
6576 Elf_Internal_Shdr * symtab_sec;
6577 Elf_Internal_Shdr * strtab_sec;
6578 Elf_Internal_Sym * symtab;
6579 unsigned long num_syms;
6580 char * strtab;
6581 size_t strtab_size;
6582
6583 /* Don't process section groups unless needed. */
6584 if (!do_unwind && !do_section_groups)
6585 return TRUE;
6586
6587 if (filedata->file_header.e_shnum == 0)
6588 {
6589 if (do_section_groups)
6590 printf (_("\nThere are no sections to group in this file.\n"));
6591
6592 return TRUE;
6593 }
6594
6595 if (filedata->section_headers == NULL)
6596 {
6597 error (_("Section headers are not available!\n"));
6598 /* PR 13622: This can happen with a corrupt ELF header. */
6599 return FALSE;
6600 }
6601
6602 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6603 sizeof (struct group *));
6604
6605 if (section_headers_groups == NULL)
6606 {
6607 error (_("Out of memory reading %u section group headers\n"),
6608 filedata->file_header.e_shnum);
6609 return FALSE;
6610 }
6611
6612 /* Scan the sections for the group section. */
6613 group_count = 0;
6614 for (i = 0, section = filedata->section_headers;
6615 i < filedata->file_header.e_shnum;
6616 i++, section++)
6617 if (section->sh_type == SHT_GROUP)
6618 group_count++;
6619
6620 if (group_count == 0)
6621 {
6622 if (do_section_groups)
6623 printf (_("\nThere are no section groups in this file.\n"));
6624
6625 return TRUE;
6626 }
6627
6628 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6629
6630 if (section_groups == NULL)
6631 {
6632 error (_("Out of memory reading %lu groups\n"),
6633 (unsigned long) group_count);
6634 return FALSE;
6635 }
6636
6637 symtab_sec = NULL;
6638 strtab_sec = NULL;
6639 symtab = NULL;
6640 num_syms = 0;
6641 strtab = NULL;
6642 strtab_size = 0;
6643 for (i = 0, section = filedata->section_headers, group = section_groups;
6644 i < filedata->file_header.e_shnum;
6645 i++, section++)
6646 {
6647 if (section->sh_type == SHT_GROUP)
6648 {
6649 const char * name = printable_section_name (filedata, section);
6650 const char * group_name;
6651 unsigned char * start;
6652 unsigned char * indices;
6653 unsigned int entry, j, size;
6654 Elf_Internal_Shdr * sec;
6655 Elf_Internal_Sym * sym;
6656
6657 /* Get the symbol table. */
6658 if (section->sh_link >= filedata->file_header.e_shnum
6659 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6660 != SHT_SYMTAB))
6661 {
6662 error (_("Bad sh_link in group section `%s'\n"), name);
6663 continue;
6664 }
6665
6666 if (symtab_sec != sec)
6667 {
6668 symtab_sec = sec;
6669 if (symtab)
6670 free (symtab);
6671 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6672 }
6673
6674 if (symtab == NULL)
6675 {
6676 error (_("Corrupt header in group section `%s'\n"), name);
6677 continue;
6678 }
6679
6680 if (section->sh_info >= num_syms)
6681 {
6682 error (_("Bad sh_info in group section `%s'\n"), name);
6683 continue;
6684 }
6685
6686 sym = symtab + section->sh_info;
6687
6688 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6689 {
6690 if (sym->st_shndx == 0
6691 || sym->st_shndx >= filedata->file_header.e_shnum)
6692 {
6693 error (_("Bad sh_info in group section `%s'\n"), name);
6694 continue;
6695 }
6696
6697 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6698 strtab_sec = NULL;
6699 if (strtab)
6700 free (strtab);
6701 strtab = NULL;
6702 strtab_size = 0;
6703 }
6704 else
6705 {
6706 /* Get the string table. */
6707 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6708 {
6709 strtab_sec = NULL;
6710 if (strtab)
6711 free (strtab);
6712 strtab = NULL;
6713 strtab_size = 0;
6714 }
6715 else if (strtab_sec
6716 != (sec = filedata->section_headers + symtab_sec->sh_link))
6717 {
6718 strtab_sec = sec;
6719 if (strtab)
6720 free (strtab);
6721
6722 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6723 1, strtab_sec->sh_size,
6724 _("string table"));
6725 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6726 }
6727 group_name = sym->st_name < strtab_size
6728 ? strtab + sym->st_name : _("<corrupt>");
6729 }
6730
6731 /* PR 17531: file: loop. */
6732 if (section->sh_entsize > section->sh_size)
6733 {
6734 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6735 printable_section_name (filedata, section),
6736 (unsigned long) section->sh_entsize,
6737 (unsigned long) section->sh_size);
6738 break;
6739 }
6740
6741 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6742 1, section->sh_size,
6743 _("section data"));
6744 if (start == NULL)
6745 continue;
6746
6747 indices = start;
6748 size = (section->sh_size / section->sh_entsize) - 1;
6749 entry = byte_get (indices, 4);
6750 indices += 4;
6751
6752 if (do_section_groups)
6753 {
6754 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6755 get_group_flags (entry), i, name, group_name, size);
6756
6757 printf (_(" [Index] Name\n"));
6758 }
6759
6760 group->group_index = i;
6761
6762 for (j = 0; j < size; j++)
6763 {
6764 struct group_list * g;
6765
6766 entry = byte_get (indices, 4);
6767 indices += 4;
6768
6769 if (entry >= filedata->file_header.e_shnum)
6770 {
6771 static unsigned num_group_errors = 0;
6772
6773 if (num_group_errors ++ < 10)
6774 {
6775 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6776 entry, i, filedata->file_header.e_shnum - 1);
6777 if (num_group_errors == 10)
6778 warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6779 }
6780 continue;
6781 }
6782
6783 if (section_headers_groups [entry] != NULL)
6784 {
6785 if (entry)
6786 {
6787 static unsigned num_errs = 0;
6788
6789 if (num_errs ++ < 10)
6790 {
6791 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6792 entry, i,
6793 section_headers_groups [entry]->group_index);
6794 if (num_errs == 10)
6795 warn (_("Further error messages about already contained group sections suppressed\n"));
6796 }
6797 continue;
6798 }
6799 else
6800 {
6801 /* Intel C/C++ compiler may put section 0 in a
6802 section group. We just warn it the first time
6803 and ignore it afterwards. */
6804 static bfd_boolean warned = FALSE;
6805 if (!warned)
6806 {
6807 error (_("section 0 in group section [%5u]\n"),
6808 section_headers_groups [entry]->group_index);
6809 warned = TRUE;
6810 }
6811 }
6812 }
6813
6814 section_headers_groups [entry] = group;
6815
6816 if (do_section_groups)
6817 {
6818 sec = filedata->section_headers + entry;
6819 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6820 }
6821
6822 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6823 g->section_index = entry;
6824 g->next = group->root;
6825 group->root = g;
6826 }
6827
6828 if (start)
6829 free (start);
6830
6831 group++;
6832 }
6833 }
6834
6835 if (symtab)
6836 free (symtab);
6837 if (strtab)
6838 free (strtab);
6839 return TRUE;
6840 }
6841
6842 /* Data used to display dynamic fixups. */
6843
6844 struct ia64_vms_dynfixup
6845 {
6846 bfd_vma needed_ident; /* Library ident number. */
6847 bfd_vma needed; /* Index in the dstrtab of the library name. */
6848 bfd_vma fixup_needed; /* Index of the library. */
6849 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6850 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6851 };
6852
6853 /* Data used to display dynamic relocations. */
6854
6855 struct ia64_vms_dynimgrela
6856 {
6857 bfd_vma img_rela_cnt; /* Number of relocations. */
6858 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6859 };
6860
6861 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6862 library). */
6863
6864 static bfd_boolean
6865 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6866 struct ia64_vms_dynfixup * fixup,
6867 const char * strtab,
6868 unsigned int strtab_sz)
6869 {
6870 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6871 long i;
6872 const char * lib_name;
6873
6874 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6875 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6876 _("dynamic section image fixups"));
6877 if (!imfs)
6878 return FALSE;
6879
6880 if (fixup->needed < strtab_sz)
6881 lib_name = strtab + fixup->needed;
6882 else
6883 {
6884 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6885 (unsigned long) fixup->needed);
6886 lib_name = "???";
6887 }
6888 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6889 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6890 printf
6891 (_("Seg Offset Type SymVec DataType\n"));
6892
6893 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6894 {
6895 unsigned int type;
6896 const char *rtype;
6897
6898 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6899 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6900 type = BYTE_GET (imfs [i].type);
6901 rtype = elf_ia64_reloc_type (type);
6902 if (rtype == NULL)
6903 printf (" 0x%08x ", type);
6904 else
6905 printf (" %-32s ", rtype);
6906 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6907 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6908 }
6909
6910 free (imfs);
6911 return TRUE;
6912 }
6913
6914 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6915
6916 static bfd_boolean
6917 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6918 {
6919 Elf64_External_VMS_IMAGE_RELA *imrs;
6920 long i;
6921
6922 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6923 1, imgrela->img_rela_cnt * sizeof (*imrs),
6924 _("dynamic section image relocations"));
6925 if (!imrs)
6926 return FALSE;
6927
6928 printf (_("\nImage relocs\n"));
6929 printf
6930 (_("Seg Offset Type Addend Seg Sym Off\n"));
6931
6932 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6933 {
6934 unsigned int type;
6935 const char *rtype;
6936
6937 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6938 printf ("%08" BFD_VMA_FMT "x ",
6939 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6940 type = BYTE_GET (imrs [i].type);
6941 rtype = elf_ia64_reloc_type (type);
6942 if (rtype == NULL)
6943 printf ("0x%08x ", type);
6944 else
6945 printf ("%-31s ", rtype);
6946 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6947 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6948 printf ("%08" BFD_VMA_FMT "x\n",
6949 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6950 }
6951
6952 free (imrs);
6953 return TRUE;
6954 }
6955
6956 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6957
6958 static bfd_boolean
6959 process_ia64_vms_dynamic_relocs (Filedata * filedata)
6960 {
6961 struct ia64_vms_dynfixup fixup;
6962 struct ia64_vms_dynimgrela imgrela;
6963 Elf_Internal_Dyn *entry;
6964 bfd_vma strtab_off = 0;
6965 bfd_vma strtab_sz = 0;
6966 char *strtab = NULL;
6967 bfd_boolean res = TRUE;
6968
6969 memset (&fixup, 0, sizeof (fixup));
6970 memset (&imgrela, 0, sizeof (imgrela));
6971
6972 /* Note: the order of the entries is specified by the OpenVMS specs. */
6973 for (entry = dynamic_section;
6974 entry < dynamic_section + dynamic_nent;
6975 entry++)
6976 {
6977 switch (entry->d_tag)
6978 {
6979 case DT_IA_64_VMS_STRTAB_OFFSET:
6980 strtab_off = entry->d_un.d_val;
6981 break;
6982 case DT_STRSZ:
6983 strtab_sz = entry->d_un.d_val;
6984 if (strtab == NULL)
6985 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
6986 1, strtab_sz, _("dynamic string section"));
6987 break;
6988
6989 case DT_IA_64_VMS_NEEDED_IDENT:
6990 fixup.needed_ident = entry->d_un.d_val;
6991 break;
6992 case DT_NEEDED:
6993 fixup.needed = entry->d_un.d_val;
6994 break;
6995 case DT_IA_64_VMS_FIXUP_NEEDED:
6996 fixup.fixup_needed = entry->d_un.d_val;
6997 break;
6998 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6999 fixup.fixup_rela_cnt = entry->d_un.d_val;
7000 break;
7001 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7002 fixup.fixup_rela_off = entry->d_un.d_val;
7003 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7004 res = FALSE;
7005 break;
7006 case DT_IA_64_VMS_IMG_RELA_CNT:
7007 imgrela.img_rela_cnt = entry->d_un.d_val;
7008 break;
7009 case DT_IA_64_VMS_IMG_RELA_OFF:
7010 imgrela.img_rela_off = entry->d_un.d_val;
7011 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7012 res = FALSE;
7013 break;
7014
7015 default:
7016 break;
7017 }
7018 }
7019
7020 if (strtab != NULL)
7021 free (strtab);
7022
7023 return res;
7024 }
7025
7026 static struct
7027 {
7028 const char * name;
7029 int reloc;
7030 int size;
7031 int rela;
7032 }
7033 dynamic_relocations [] =
7034 {
7035 { "REL", DT_REL, DT_RELSZ, FALSE },
7036 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7037 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7038 };
7039
7040 /* Process the reloc section. */
7041
7042 static bfd_boolean
7043 process_relocs (Filedata * filedata)
7044 {
7045 unsigned long rel_size;
7046 unsigned long rel_offset;
7047
7048 if (!do_reloc)
7049 return TRUE;
7050
7051 if (do_using_dynamic)
7052 {
7053 int is_rela;
7054 const char * name;
7055 bfd_boolean has_dynamic_reloc;
7056 unsigned int i;
7057
7058 has_dynamic_reloc = FALSE;
7059
7060 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7061 {
7062 is_rela = dynamic_relocations [i].rela;
7063 name = dynamic_relocations [i].name;
7064 rel_size = dynamic_info [dynamic_relocations [i].size];
7065 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7066
7067 if (rel_size)
7068 has_dynamic_reloc = TRUE;
7069
7070 if (is_rela == UNKNOWN)
7071 {
7072 if (dynamic_relocations [i].reloc == DT_JMPREL)
7073 switch (dynamic_info[DT_PLTREL])
7074 {
7075 case DT_REL:
7076 is_rela = FALSE;
7077 break;
7078 case DT_RELA:
7079 is_rela = TRUE;
7080 break;
7081 }
7082 }
7083
7084 if (rel_size)
7085 {
7086 printf
7087 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7088 name, rel_offset, rel_size);
7089
7090 dump_relocations (filedata,
7091 offset_from_vma (filedata, rel_offset, rel_size),
7092 rel_size,
7093 dynamic_symbols, num_dynamic_syms,
7094 dynamic_strings, dynamic_strings_length,
7095 is_rela, TRUE /* is_dynamic */);
7096 }
7097 }
7098
7099 if (is_ia64_vms (filedata))
7100 if (process_ia64_vms_dynamic_relocs (filedata))
7101 has_dynamic_reloc = TRUE;
7102
7103 if (! has_dynamic_reloc)
7104 printf (_("\nThere are no dynamic relocations in this file.\n"));
7105 }
7106 else
7107 {
7108 Elf_Internal_Shdr * section;
7109 unsigned long i;
7110 bfd_boolean found = FALSE;
7111
7112 for (i = 0, section = filedata->section_headers;
7113 i < filedata->file_header.e_shnum;
7114 i++, section++)
7115 {
7116 if ( section->sh_type != SHT_RELA
7117 && section->sh_type != SHT_REL)
7118 continue;
7119
7120 rel_offset = section->sh_offset;
7121 rel_size = section->sh_size;
7122
7123 if (rel_size)
7124 {
7125 Elf_Internal_Shdr * strsec;
7126 int is_rela;
7127 unsigned long num_rela;
7128
7129 printf (_("\nRelocation section "));
7130
7131 if (filedata->string_table == NULL)
7132 printf ("%d", section->sh_name);
7133 else
7134 printf ("'%s'", printable_section_name (filedata, section));
7135
7136 num_rela = rel_size / section->sh_entsize;
7137 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7138 " at offset 0x%lx contains %lu entries:\n",
7139 num_rela),
7140 rel_offset, num_rela);
7141
7142 is_rela = section->sh_type == SHT_RELA;
7143
7144 if (section->sh_link != 0
7145 && section->sh_link < filedata->file_header.e_shnum)
7146 {
7147 Elf_Internal_Shdr * symsec;
7148 Elf_Internal_Sym * symtab;
7149 unsigned long nsyms;
7150 unsigned long strtablen = 0;
7151 char * strtab = NULL;
7152
7153 symsec = filedata->section_headers + section->sh_link;
7154 if (symsec->sh_type != SHT_SYMTAB
7155 && symsec->sh_type != SHT_DYNSYM)
7156 continue;
7157
7158 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7159
7160 if (symtab == NULL)
7161 continue;
7162
7163 if (symsec->sh_link != 0
7164 && symsec->sh_link < filedata->file_header.e_shnum)
7165 {
7166 strsec = filedata->section_headers + symsec->sh_link;
7167
7168 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7169 1, strsec->sh_size,
7170 _("string table"));
7171 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7172 }
7173
7174 dump_relocations (filedata, rel_offset, rel_size,
7175 symtab, nsyms, strtab, strtablen,
7176 is_rela,
7177 symsec->sh_type == SHT_DYNSYM);
7178 if (strtab)
7179 free (strtab);
7180 free (symtab);
7181 }
7182 else
7183 dump_relocations (filedata, rel_offset, rel_size,
7184 NULL, 0, NULL, 0, is_rela,
7185 FALSE /* is_dynamic */);
7186
7187 found = TRUE;
7188 }
7189 }
7190
7191 if (! found)
7192 {
7193 /* Users sometimes forget the -D option, so try to be helpful. */
7194 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7195 {
7196 if (dynamic_info [dynamic_relocations [i].size])
7197 {
7198 printf (_("\nThere are no static relocations in this file."));
7199 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7200
7201 break;
7202 }
7203 }
7204 if (i == ARRAY_SIZE (dynamic_relocations))
7205 printf (_("\nThere are no relocations in this file.\n"));
7206 }
7207 }
7208
7209 return TRUE;
7210 }
7211
7212 /* An absolute address consists of a section and an offset. If the
7213 section is NULL, the offset itself is the address, otherwise, the
7214 address equals to LOAD_ADDRESS(section) + offset. */
7215
7216 struct absaddr
7217 {
7218 unsigned short section;
7219 bfd_vma offset;
7220 };
7221
7222 #define ABSADDR(a) \
7223 ((a).section \
7224 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7225 : (a).offset)
7226
7227 /* Find the nearest symbol at or below ADDR. Returns the symbol
7228 name, if found, and the offset from the symbol to ADDR. */
7229
7230 static void
7231 find_symbol_for_address (Filedata * filedata,
7232 Elf_Internal_Sym * symtab,
7233 unsigned long nsyms,
7234 const char * strtab,
7235 unsigned long strtab_size,
7236 struct absaddr addr,
7237 const char ** symname,
7238 bfd_vma * offset)
7239 {
7240 bfd_vma dist = 0x100000;
7241 Elf_Internal_Sym * sym;
7242 Elf_Internal_Sym * beg;
7243 Elf_Internal_Sym * end;
7244 Elf_Internal_Sym * best = NULL;
7245
7246 REMOVE_ARCH_BITS (addr.offset);
7247 beg = symtab;
7248 end = symtab + nsyms;
7249
7250 while (beg < end)
7251 {
7252 bfd_vma value;
7253
7254 sym = beg + (end - beg) / 2;
7255
7256 value = sym->st_value;
7257 REMOVE_ARCH_BITS (value);
7258
7259 if (sym->st_name != 0
7260 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7261 && addr.offset >= value
7262 && addr.offset - value < dist)
7263 {
7264 best = sym;
7265 dist = addr.offset - value;
7266 if (!dist)
7267 break;
7268 }
7269
7270 if (addr.offset < value)
7271 end = sym;
7272 else
7273 beg = sym + 1;
7274 }
7275
7276 if (best)
7277 {
7278 *symname = (best->st_name >= strtab_size
7279 ? _("<corrupt>") : strtab + best->st_name);
7280 *offset = dist;
7281 return;
7282 }
7283
7284 *symname = NULL;
7285 *offset = addr.offset;
7286 }
7287
7288 static /* signed */ int
7289 symcmp (const void *p, const void *q)
7290 {
7291 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7292 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7293
7294 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7295 }
7296
7297 /* Process the unwind section. */
7298
7299 #include "unwind-ia64.h"
7300
7301 struct ia64_unw_table_entry
7302 {
7303 struct absaddr start;
7304 struct absaddr end;
7305 struct absaddr info;
7306 };
7307
7308 struct ia64_unw_aux_info
7309 {
7310 struct ia64_unw_table_entry * table; /* Unwind table. */
7311 unsigned long table_len; /* Length of unwind table. */
7312 unsigned char * info; /* Unwind info. */
7313 unsigned long info_size; /* Size of unwind info. */
7314 bfd_vma info_addr; /* Starting address of unwind info. */
7315 bfd_vma seg_base; /* Starting address of segment. */
7316 Elf_Internal_Sym * symtab; /* The symbol table. */
7317 unsigned long nsyms; /* Number of symbols. */
7318 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7319 unsigned long nfuns; /* Number of entries in funtab. */
7320 char * strtab; /* The string table. */
7321 unsigned long strtab_size; /* Size of string table. */
7322 };
7323
7324 static bfd_boolean
7325 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7326 {
7327 struct ia64_unw_table_entry * tp;
7328 unsigned long j, nfuns;
7329 int in_body;
7330 bfd_boolean res = TRUE;
7331
7332 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7333 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7334 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7335 aux->funtab[nfuns++] = aux->symtab[j];
7336 aux->nfuns = nfuns;
7337 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7338
7339 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7340 {
7341 bfd_vma stamp;
7342 bfd_vma offset;
7343 const unsigned char * dp;
7344 const unsigned char * head;
7345 const unsigned char * end;
7346 const char * procname;
7347
7348 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7349 aux->strtab_size, tp->start, &procname, &offset);
7350
7351 fputs ("\n<", stdout);
7352
7353 if (procname)
7354 {
7355 fputs (procname, stdout);
7356
7357 if (offset)
7358 printf ("+%lx", (unsigned long) offset);
7359 }
7360
7361 fputs (">: [", stdout);
7362 print_vma (tp->start.offset, PREFIX_HEX);
7363 fputc ('-', stdout);
7364 print_vma (tp->end.offset, PREFIX_HEX);
7365 printf ("], info at +0x%lx\n",
7366 (unsigned long) (tp->info.offset - aux->seg_base));
7367
7368 /* PR 17531: file: 86232b32. */
7369 if (aux->info == NULL)
7370 continue;
7371
7372 /* PR 17531: file: 0997b4d1. */
7373 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7374 {
7375 warn (_("Invalid offset %lx in table entry %ld\n"),
7376 (long) tp->info.offset, (long) (tp - aux->table));
7377 res = FALSE;
7378 continue;
7379 }
7380
7381 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7382 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7383
7384 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7385 (unsigned) UNW_VER (stamp),
7386 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7387 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7388 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7389 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7390
7391 if (UNW_VER (stamp) != 1)
7392 {
7393 printf (_("\tUnknown version.\n"));
7394 continue;
7395 }
7396
7397 in_body = 0;
7398 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7399 /* PR 17531: file: 16ceda89. */
7400 if (end > aux->info + aux->info_size)
7401 end = aux->info + aux->info_size;
7402 for (dp = head + 8; dp < end;)
7403 dp = unw_decode (dp, in_body, & in_body, end);
7404 }
7405
7406 free (aux->funtab);
7407
7408 return res;
7409 }
7410
7411 static bfd_boolean
7412 slurp_ia64_unwind_table (Filedata * filedata,
7413 struct ia64_unw_aux_info * aux,
7414 Elf_Internal_Shdr * sec)
7415 {
7416 unsigned long size, nrelas, i;
7417 Elf_Internal_Phdr * seg;
7418 struct ia64_unw_table_entry * tep;
7419 Elf_Internal_Shdr * relsec;
7420 Elf_Internal_Rela * rela;
7421 Elf_Internal_Rela * rp;
7422 unsigned char * table;
7423 unsigned char * tp;
7424 Elf_Internal_Sym * sym;
7425 const char * relname;
7426
7427 aux->table_len = 0;
7428
7429 /* First, find the starting address of the segment that includes
7430 this section: */
7431
7432 if (filedata->file_header.e_phnum)
7433 {
7434 if (! get_program_headers (filedata))
7435 return FALSE;
7436
7437 for (seg = filedata->program_headers;
7438 seg < filedata->program_headers + filedata->file_header.e_phnum;
7439 ++seg)
7440 {
7441 if (seg->p_type != PT_LOAD)
7442 continue;
7443
7444 if (sec->sh_addr >= seg->p_vaddr
7445 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7446 {
7447 aux->seg_base = seg->p_vaddr;
7448 break;
7449 }
7450 }
7451 }
7452
7453 /* Second, build the unwind table from the contents of the unwind section: */
7454 size = sec->sh_size;
7455 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7456 _("unwind table"));
7457 if (!table)
7458 return FALSE;
7459
7460 aux->table_len = size / (3 * eh_addr_size);
7461 aux->table = (struct ia64_unw_table_entry *)
7462 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7463 tep = aux->table;
7464
7465 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7466 {
7467 tep->start.section = SHN_UNDEF;
7468 tep->end.section = SHN_UNDEF;
7469 tep->info.section = SHN_UNDEF;
7470 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7471 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7472 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7473 tep->start.offset += aux->seg_base;
7474 tep->end.offset += aux->seg_base;
7475 tep->info.offset += aux->seg_base;
7476 }
7477 free (table);
7478
7479 /* Third, apply any relocations to the unwind table: */
7480 for (relsec = filedata->section_headers;
7481 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7482 ++relsec)
7483 {
7484 if (relsec->sh_type != SHT_RELA
7485 || relsec->sh_info >= filedata->file_header.e_shnum
7486 || filedata->section_headers + relsec->sh_info != sec)
7487 continue;
7488
7489 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7490 & rela, & nrelas))
7491 {
7492 free (aux->table);
7493 aux->table = NULL;
7494 aux->table_len = 0;
7495 return FALSE;
7496 }
7497
7498 for (rp = rela; rp < rela + nrelas; ++rp)
7499 {
7500 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7501 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7502
7503 /* PR 17531: file: 9fa67536. */
7504 if (relname == NULL)
7505 {
7506 warn (_("Skipping unknown relocation type: %u\n"),
7507 get_reloc_type (filedata, rp->r_info));
7508 continue;
7509 }
7510
7511 if (! const_strneq (relname, "R_IA64_SEGREL"))
7512 {
7513 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7514 continue;
7515 }
7516
7517 i = rp->r_offset / (3 * eh_addr_size);
7518
7519 /* PR 17531: file: 5bc8d9bf. */
7520 if (i >= aux->table_len)
7521 {
7522 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7523 continue;
7524 }
7525
7526 switch (rp->r_offset / eh_addr_size % 3)
7527 {
7528 case 0:
7529 aux->table[i].start.section = sym->st_shndx;
7530 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7531 break;
7532 case 1:
7533 aux->table[i].end.section = sym->st_shndx;
7534 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7535 break;
7536 case 2:
7537 aux->table[i].info.section = sym->st_shndx;
7538 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7539 break;
7540 default:
7541 break;
7542 }
7543 }
7544
7545 free (rela);
7546 }
7547
7548 return TRUE;
7549 }
7550
7551 static bfd_boolean
7552 ia64_process_unwind (Filedata * filedata)
7553 {
7554 Elf_Internal_Shdr * sec;
7555 Elf_Internal_Shdr * unwsec = NULL;
7556 Elf_Internal_Shdr * strsec;
7557 unsigned long i, unwcount = 0, unwstart = 0;
7558 struct ia64_unw_aux_info aux;
7559 bfd_boolean res = TRUE;
7560
7561 memset (& aux, 0, sizeof (aux));
7562
7563 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7564 {
7565 if (sec->sh_type == SHT_SYMTAB
7566 && sec->sh_link < filedata->file_header.e_shnum)
7567 {
7568 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7569
7570 strsec = filedata->section_headers + sec->sh_link;
7571 if (aux.strtab != NULL)
7572 {
7573 error (_("Multiple auxillary string tables encountered\n"));
7574 free (aux.strtab);
7575 res = FALSE;
7576 }
7577 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7578 1, strsec->sh_size,
7579 _("string table"));
7580 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7581 }
7582 else if (sec->sh_type == SHT_IA_64_UNWIND)
7583 unwcount++;
7584 }
7585
7586 if (!unwcount)
7587 printf (_("\nThere are no unwind sections in this file.\n"));
7588
7589 while (unwcount-- > 0)
7590 {
7591 char * suffix;
7592 size_t len, len2;
7593
7594 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7595 i < filedata->file_header.e_shnum; ++i, ++sec)
7596 if (sec->sh_type == SHT_IA_64_UNWIND)
7597 {
7598 unwsec = sec;
7599 break;
7600 }
7601 /* We have already counted the number of SHT_IA64_UNWIND
7602 sections so the loop above should never fail. */
7603 assert (unwsec != NULL);
7604
7605 unwstart = i + 1;
7606 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7607
7608 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7609 {
7610 /* We need to find which section group it is in. */
7611 struct group_list * g;
7612
7613 if (section_headers_groups == NULL
7614 || section_headers_groups [i] == NULL)
7615 i = filedata->file_header.e_shnum;
7616 else
7617 {
7618 g = section_headers_groups [i]->root;
7619
7620 for (; g != NULL; g = g->next)
7621 {
7622 sec = filedata->section_headers + g->section_index;
7623
7624 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7625 break;
7626 }
7627
7628 if (g == NULL)
7629 i = filedata->file_header.e_shnum;
7630 }
7631 }
7632 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7633 {
7634 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7635 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7636 suffix = SECTION_NAME (unwsec) + len;
7637 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7638 ++i, ++sec)
7639 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7640 && streq (SECTION_NAME (sec) + len2, suffix))
7641 break;
7642 }
7643 else
7644 {
7645 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7646 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7647 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7648 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7649 suffix = "";
7650 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7651 suffix = SECTION_NAME (unwsec) + len;
7652 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7653 ++i, ++sec)
7654 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7655 && streq (SECTION_NAME (sec) + len2, suffix))
7656 break;
7657 }
7658
7659 if (i == filedata->file_header.e_shnum)
7660 {
7661 printf (_("\nCould not find unwind info section for "));
7662
7663 if (filedata->string_table == NULL)
7664 printf ("%d", unwsec->sh_name);
7665 else
7666 printf ("'%s'", printable_section_name (filedata, unwsec));
7667 }
7668 else
7669 {
7670 aux.info_addr = sec->sh_addr;
7671 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7672 sec->sh_size,
7673 _("unwind info"));
7674 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7675
7676 printf (_("\nUnwind section "));
7677
7678 if (filedata->string_table == NULL)
7679 printf ("%d", unwsec->sh_name);
7680 else
7681 printf ("'%s'", printable_section_name (filedata, unwsec));
7682
7683 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7684 (unsigned long) unwsec->sh_offset,
7685 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7686
7687 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7688 && aux.table_len > 0)
7689 dump_ia64_unwind (filedata, & aux);
7690
7691 if (aux.table)
7692 free ((char *) aux.table);
7693 if (aux.info)
7694 free ((char *) aux.info);
7695 aux.table = NULL;
7696 aux.info = NULL;
7697 }
7698 }
7699
7700 if (aux.symtab)
7701 free (aux.symtab);
7702 if (aux.strtab)
7703 free ((char *) aux.strtab);
7704
7705 return res;
7706 }
7707
7708 struct hppa_unw_table_entry
7709 {
7710 struct absaddr start;
7711 struct absaddr end;
7712 unsigned int Cannot_unwind:1; /* 0 */
7713 unsigned int Millicode:1; /* 1 */
7714 unsigned int Millicode_save_sr0:1; /* 2 */
7715 unsigned int Region_description:2; /* 3..4 */
7716 unsigned int reserved1:1; /* 5 */
7717 unsigned int Entry_SR:1; /* 6 */
7718 unsigned int Entry_FR:4; /* Number saved 7..10 */
7719 unsigned int Entry_GR:5; /* Number saved 11..15 */
7720 unsigned int Args_stored:1; /* 16 */
7721 unsigned int Variable_Frame:1; /* 17 */
7722 unsigned int Separate_Package_Body:1; /* 18 */
7723 unsigned int Frame_Extension_Millicode:1; /* 19 */
7724 unsigned int Stack_Overflow_Check:1; /* 20 */
7725 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7726 unsigned int Ada_Region:1; /* 22 */
7727 unsigned int cxx_info:1; /* 23 */
7728 unsigned int cxx_try_catch:1; /* 24 */
7729 unsigned int sched_entry_seq:1; /* 25 */
7730 unsigned int reserved2:1; /* 26 */
7731 unsigned int Save_SP:1; /* 27 */
7732 unsigned int Save_RP:1; /* 28 */
7733 unsigned int Save_MRP_in_frame:1; /* 29 */
7734 unsigned int extn_ptr_defined:1; /* 30 */
7735 unsigned int Cleanup_defined:1; /* 31 */
7736
7737 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7738 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7739 unsigned int Large_frame:1; /* 2 */
7740 unsigned int Pseudo_SP_Set:1; /* 3 */
7741 unsigned int reserved4:1; /* 4 */
7742 unsigned int Total_frame_size:27; /* 5..31 */
7743 };
7744
7745 struct hppa_unw_aux_info
7746 {
7747 struct hppa_unw_table_entry * table; /* Unwind table. */
7748 unsigned long table_len; /* Length of unwind table. */
7749 bfd_vma seg_base; /* Starting address of segment. */
7750 Elf_Internal_Sym * symtab; /* The symbol table. */
7751 unsigned long nsyms; /* Number of symbols. */
7752 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7753 unsigned long nfuns; /* Number of entries in funtab. */
7754 char * strtab; /* The string table. */
7755 unsigned long strtab_size; /* Size of string table. */
7756 };
7757
7758 static bfd_boolean
7759 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7760 {
7761 struct hppa_unw_table_entry * tp;
7762 unsigned long j, nfuns;
7763 bfd_boolean res = TRUE;
7764
7765 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7766 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7767 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7768 aux->funtab[nfuns++] = aux->symtab[j];
7769 aux->nfuns = nfuns;
7770 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7771
7772 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7773 {
7774 bfd_vma offset;
7775 const char * procname;
7776
7777 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7778 aux->strtab_size, tp->start, &procname,
7779 &offset);
7780
7781 fputs ("\n<", stdout);
7782
7783 if (procname)
7784 {
7785 fputs (procname, stdout);
7786
7787 if (offset)
7788 printf ("+%lx", (unsigned long) offset);
7789 }
7790
7791 fputs (">: [", stdout);
7792 print_vma (tp->start.offset, PREFIX_HEX);
7793 fputc ('-', stdout);
7794 print_vma (tp->end.offset, PREFIX_HEX);
7795 printf ("]\n\t");
7796
7797 #define PF(_m) if (tp->_m) printf (#_m " ");
7798 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7799 PF(Cannot_unwind);
7800 PF(Millicode);
7801 PF(Millicode_save_sr0);
7802 /* PV(Region_description); */
7803 PF(Entry_SR);
7804 PV(Entry_FR);
7805 PV(Entry_GR);
7806 PF(Args_stored);
7807 PF(Variable_Frame);
7808 PF(Separate_Package_Body);
7809 PF(Frame_Extension_Millicode);
7810 PF(Stack_Overflow_Check);
7811 PF(Two_Instruction_SP_Increment);
7812 PF(Ada_Region);
7813 PF(cxx_info);
7814 PF(cxx_try_catch);
7815 PF(sched_entry_seq);
7816 PF(Save_SP);
7817 PF(Save_RP);
7818 PF(Save_MRP_in_frame);
7819 PF(extn_ptr_defined);
7820 PF(Cleanup_defined);
7821 PF(MPE_XL_interrupt_marker);
7822 PF(HP_UX_interrupt_marker);
7823 PF(Large_frame);
7824 PF(Pseudo_SP_Set);
7825 PV(Total_frame_size);
7826 #undef PF
7827 #undef PV
7828 }
7829
7830 printf ("\n");
7831
7832 free (aux->funtab);
7833
7834 return res;
7835 }
7836
7837 static bfd_boolean
7838 slurp_hppa_unwind_table (Filedata * filedata,
7839 struct hppa_unw_aux_info * aux,
7840 Elf_Internal_Shdr * sec)
7841 {
7842 unsigned long size, unw_ent_size, nentries, nrelas, i;
7843 Elf_Internal_Phdr * seg;
7844 struct hppa_unw_table_entry * tep;
7845 Elf_Internal_Shdr * relsec;
7846 Elf_Internal_Rela * rela;
7847 Elf_Internal_Rela * rp;
7848 unsigned char * table;
7849 unsigned char * tp;
7850 Elf_Internal_Sym * sym;
7851 const char * relname;
7852
7853 /* First, find the starting address of the segment that includes
7854 this section. */
7855 if (filedata->file_header.e_phnum)
7856 {
7857 if (! get_program_headers (filedata))
7858 return FALSE;
7859
7860 for (seg = filedata->program_headers;
7861 seg < filedata->program_headers + filedata->file_header.e_phnum;
7862 ++seg)
7863 {
7864 if (seg->p_type != PT_LOAD)
7865 continue;
7866
7867 if (sec->sh_addr >= seg->p_vaddr
7868 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7869 {
7870 aux->seg_base = seg->p_vaddr;
7871 break;
7872 }
7873 }
7874 }
7875
7876 /* Second, build the unwind table from the contents of the unwind
7877 section. */
7878 size = sec->sh_size;
7879 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7880 _("unwind table"));
7881 if (!table)
7882 return FALSE;
7883
7884 unw_ent_size = 16;
7885 nentries = size / unw_ent_size;
7886 size = unw_ent_size * nentries;
7887
7888 tep = aux->table = (struct hppa_unw_table_entry *)
7889 xcmalloc (nentries, sizeof (aux->table[0]));
7890
7891 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7892 {
7893 unsigned int tmp1, tmp2;
7894
7895 tep->start.section = SHN_UNDEF;
7896 tep->end.section = SHN_UNDEF;
7897
7898 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7899 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7900 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7901 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7902
7903 tep->start.offset += aux->seg_base;
7904 tep->end.offset += aux->seg_base;
7905
7906 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7907 tep->Millicode = (tmp1 >> 30) & 0x1;
7908 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7909 tep->Region_description = (tmp1 >> 27) & 0x3;
7910 tep->reserved1 = (tmp1 >> 26) & 0x1;
7911 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7912 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7913 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7914 tep->Args_stored = (tmp1 >> 15) & 0x1;
7915 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7916 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7917 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7918 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7919 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7920 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7921 tep->cxx_info = (tmp1 >> 8) & 0x1;
7922 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7923 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7924 tep->reserved2 = (tmp1 >> 5) & 0x1;
7925 tep->Save_SP = (tmp1 >> 4) & 0x1;
7926 tep->Save_RP = (tmp1 >> 3) & 0x1;
7927 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7928 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7929 tep->Cleanup_defined = tmp1 & 0x1;
7930
7931 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7932 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7933 tep->Large_frame = (tmp2 >> 29) & 0x1;
7934 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7935 tep->reserved4 = (tmp2 >> 27) & 0x1;
7936 tep->Total_frame_size = tmp2 & 0x7ffffff;
7937 }
7938 free (table);
7939
7940 /* Third, apply any relocations to the unwind table. */
7941 for (relsec = filedata->section_headers;
7942 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7943 ++relsec)
7944 {
7945 if (relsec->sh_type != SHT_RELA
7946 || relsec->sh_info >= filedata->file_header.e_shnum
7947 || filedata->section_headers + relsec->sh_info != sec)
7948 continue;
7949
7950 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7951 & rela, & nrelas))
7952 return FALSE;
7953
7954 for (rp = rela; rp < rela + nrelas; ++rp)
7955 {
7956 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
7957 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7958
7959 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7960 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7961 {
7962 warn (_("Skipping unexpected relocation type %s\n"), relname);
7963 continue;
7964 }
7965
7966 i = rp->r_offset / unw_ent_size;
7967
7968 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7969 {
7970 case 0:
7971 aux->table[i].start.section = sym->st_shndx;
7972 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7973 break;
7974 case 1:
7975 aux->table[i].end.section = sym->st_shndx;
7976 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7977 break;
7978 default:
7979 break;
7980 }
7981 }
7982
7983 free (rela);
7984 }
7985
7986 aux->table_len = nentries;
7987
7988 return TRUE;
7989 }
7990
7991 static bfd_boolean
7992 hppa_process_unwind (Filedata * filedata)
7993 {
7994 struct hppa_unw_aux_info aux;
7995 Elf_Internal_Shdr * unwsec = NULL;
7996 Elf_Internal_Shdr * strsec;
7997 Elf_Internal_Shdr * sec;
7998 unsigned long i;
7999 bfd_boolean res = TRUE;
8000
8001 if (filedata->string_table == NULL)
8002 return FALSE;
8003
8004 memset (& aux, 0, sizeof (aux));
8005
8006 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8007 {
8008 if (sec->sh_type == SHT_SYMTAB
8009 && sec->sh_link < filedata->file_header.e_shnum)
8010 {
8011 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8012
8013 strsec = filedata->section_headers + sec->sh_link;
8014 if (aux.strtab != NULL)
8015 {
8016 error (_("Multiple auxillary string tables encountered\n"));
8017 free (aux.strtab);
8018 res = FALSE;
8019 }
8020 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8021 1, strsec->sh_size,
8022 _("string table"));
8023 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8024 }
8025 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8026 unwsec = sec;
8027 }
8028
8029 if (!unwsec)
8030 printf (_("\nThere are no unwind sections in this file.\n"));
8031
8032 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8033 {
8034 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8035 {
8036 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8037
8038 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8039 "contains %lu entry:\n",
8040 "\nUnwind section '%s' at offset 0x%lx "
8041 "contains %lu entries:\n",
8042 num_unwind),
8043 printable_section_name (filedata, sec),
8044 (unsigned long) sec->sh_offset,
8045 num_unwind);
8046
8047 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8048 res = FALSE;
8049
8050 if (aux.table_len > 0)
8051 {
8052 if (! dump_hppa_unwind (filedata, &aux))
8053 res = FALSE;
8054 }
8055
8056 if (aux.table)
8057 free ((char *) aux.table);
8058 aux.table = NULL;
8059 }
8060 }
8061
8062 if (aux.symtab)
8063 free (aux.symtab);
8064 if (aux.strtab)
8065 free ((char *) aux.strtab);
8066
8067 return res;
8068 }
8069
8070 struct arm_section
8071 {
8072 unsigned char * data; /* The unwind data. */
8073 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8074 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8075 unsigned long nrelas; /* The number of relocations. */
8076 unsigned int rel_type; /* REL or RELA ? */
8077 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8078 };
8079
8080 struct arm_unw_aux_info
8081 {
8082 Filedata * filedata; /* The file containing the unwind sections. */
8083 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8084 unsigned long nsyms; /* Number of symbols. */
8085 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8086 unsigned long nfuns; /* Number of these symbols. */
8087 char * strtab; /* The file's string table. */
8088 unsigned long strtab_size; /* Size of string table. */
8089 };
8090
8091 static const char *
8092 arm_print_vma_and_name (Filedata * filedata,
8093 struct arm_unw_aux_info * aux,
8094 bfd_vma fn,
8095 struct absaddr addr)
8096 {
8097 const char *procname;
8098 bfd_vma sym_offset;
8099
8100 if (addr.section == SHN_UNDEF)
8101 addr.offset = fn;
8102
8103 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8104 aux->strtab_size, addr, &procname,
8105 &sym_offset);
8106
8107 print_vma (fn, PREFIX_HEX);
8108
8109 if (procname)
8110 {
8111 fputs (" <", stdout);
8112 fputs (procname, stdout);
8113
8114 if (sym_offset)
8115 printf ("+0x%lx", (unsigned long) sym_offset);
8116 fputc ('>', stdout);
8117 }
8118
8119 return procname;
8120 }
8121
8122 static void
8123 arm_free_section (struct arm_section *arm_sec)
8124 {
8125 if (arm_sec->data != NULL)
8126 free (arm_sec->data);
8127
8128 if (arm_sec->rela != NULL)
8129 free (arm_sec->rela);
8130 }
8131
8132 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8133 cached section and install SEC instead.
8134 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8135 and return its valued in * WORDP, relocating if necessary.
8136 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8137 relocation's offset in ADDR.
8138 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8139 into the string table of the symbol associated with the reloc. If no
8140 reloc was applied store -1 there.
8141 5) Return TRUE upon success, FALSE otherwise. */
8142
8143 static bfd_boolean
8144 get_unwind_section_word (Filedata * filedata,
8145 struct arm_unw_aux_info * aux,
8146 struct arm_section * arm_sec,
8147 Elf_Internal_Shdr * sec,
8148 bfd_vma word_offset,
8149 unsigned int * wordp,
8150 struct absaddr * addr,
8151 bfd_vma * sym_name)
8152 {
8153 Elf_Internal_Rela *rp;
8154 Elf_Internal_Sym *sym;
8155 const char * relname;
8156 unsigned int word;
8157 bfd_boolean wrapped;
8158
8159 if (sec == NULL || arm_sec == NULL)
8160 return FALSE;
8161
8162 addr->section = SHN_UNDEF;
8163 addr->offset = 0;
8164
8165 if (sym_name != NULL)
8166 *sym_name = (bfd_vma) -1;
8167
8168 /* If necessary, update the section cache. */
8169 if (sec != arm_sec->sec)
8170 {
8171 Elf_Internal_Shdr *relsec;
8172
8173 arm_free_section (arm_sec);
8174
8175 arm_sec->sec = sec;
8176 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8177 sec->sh_size, _("unwind data"));
8178 arm_sec->rela = NULL;
8179 arm_sec->nrelas = 0;
8180
8181 for (relsec = filedata->section_headers;
8182 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8183 ++relsec)
8184 {
8185 if (relsec->sh_info >= filedata->file_header.e_shnum
8186 || filedata->section_headers + relsec->sh_info != sec
8187 /* PR 15745: Check the section type as well. */
8188 || (relsec->sh_type != SHT_REL
8189 && relsec->sh_type != SHT_RELA))
8190 continue;
8191
8192 arm_sec->rel_type = relsec->sh_type;
8193 if (relsec->sh_type == SHT_REL)
8194 {
8195 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8196 relsec->sh_size,
8197 & arm_sec->rela, & arm_sec->nrelas))
8198 return FALSE;
8199 }
8200 else /* relsec->sh_type == SHT_RELA */
8201 {
8202 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8203 relsec->sh_size,
8204 & arm_sec->rela, & arm_sec->nrelas))
8205 return FALSE;
8206 }
8207 break;
8208 }
8209
8210 arm_sec->next_rela = arm_sec->rela;
8211 }
8212
8213 /* If there is no unwind data we can do nothing. */
8214 if (arm_sec->data == NULL)
8215 return FALSE;
8216
8217 /* If the offset is invalid then fail. */
8218 if (/* PR 21343 *//* PR 18879 */
8219 sec->sh_size < 4
8220 || word_offset > (sec->sh_size - 4)
8221 || ((bfd_signed_vma) word_offset) < 0)
8222 return FALSE;
8223
8224 /* Get the word at the required offset. */
8225 word = byte_get (arm_sec->data + word_offset, 4);
8226
8227 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8228 if (arm_sec->rela == NULL)
8229 {
8230 * wordp = word;
8231 return TRUE;
8232 }
8233
8234 /* Look through the relocs to find the one that applies to the provided offset. */
8235 wrapped = FALSE;
8236 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8237 {
8238 bfd_vma prelval, offset;
8239
8240 if (rp->r_offset > word_offset && !wrapped)
8241 {
8242 rp = arm_sec->rela;
8243 wrapped = TRUE;
8244 }
8245 if (rp->r_offset > word_offset)
8246 break;
8247
8248 if (rp->r_offset & 3)
8249 {
8250 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8251 (unsigned long) rp->r_offset);
8252 continue;
8253 }
8254
8255 if (rp->r_offset < word_offset)
8256 continue;
8257
8258 /* PR 17531: file: 027-161405-0.004 */
8259 if (aux->symtab == NULL)
8260 continue;
8261
8262 if (arm_sec->rel_type == SHT_REL)
8263 {
8264 offset = word & 0x7fffffff;
8265 if (offset & 0x40000000)
8266 offset |= ~ (bfd_vma) 0x7fffffff;
8267 }
8268 else if (arm_sec->rel_type == SHT_RELA)
8269 offset = rp->r_addend;
8270 else
8271 {
8272 error (_("Unknown section relocation type %d encountered\n"),
8273 arm_sec->rel_type);
8274 break;
8275 }
8276
8277 /* PR 17531 file: 027-1241568-0.004. */
8278 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8279 {
8280 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8281 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8282 break;
8283 }
8284
8285 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8286 offset += sym->st_value;
8287 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8288
8289 /* Check that we are processing the expected reloc type. */
8290 if (filedata->file_header.e_machine == EM_ARM)
8291 {
8292 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8293 if (relname == NULL)
8294 {
8295 warn (_("Skipping unknown ARM relocation type: %d\n"),
8296 (int) ELF32_R_TYPE (rp->r_info));
8297 continue;
8298 }
8299
8300 if (streq (relname, "R_ARM_NONE"))
8301 continue;
8302
8303 if (! streq (relname, "R_ARM_PREL31"))
8304 {
8305 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8306 continue;
8307 }
8308 }
8309 else if (filedata->file_header.e_machine == EM_TI_C6000)
8310 {
8311 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8312 if (relname == NULL)
8313 {
8314 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8315 (int) ELF32_R_TYPE (rp->r_info));
8316 continue;
8317 }
8318
8319 if (streq (relname, "R_C6000_NONE"))
8320 continue;
8321
8322 if (! streq (relname, "R_C6000_PREL31"))
8323 {
8324 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8325 continue;
8326 }
8327
8328 prelval >>= 1;
8329 }
8330 else
8331 {
8332 /* This function currently only supports ARM and TI unwinders. */
8333 warn (_("Only TI and ARM unwinders are currently supported\n"));
8334 break;
8335 }
8336
8337 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8338 addr->section = sym->st_shndx;
8339 addr->offset = offset;
8340
8341 if (sym_name)
8342 * sym_name = sym->st_name;
8343 break;
8344 }
8345
8346 *wordp = word;
8347 arm_sec->next_rela = rp;
8348
8349 return TRUE;
8350 }
8351
8352 static const char *tic6x_unwind_regnames[16] =
8353 {
8354 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8355 "A14", "A13", "A12", "A11", "A10",
8356 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8357 };
8358
8359 static void
8360 decode_tic6x_unwind_regmask (unsigned int mask)
8361 {
8362 int i;
8363
8364 for (i = 12; mask; mask >>= 1, i--)
8365 {
8366 if (mask & 1)
8367 {
8368 fputs (tic6x_unwind_regnames[i], stdout);
8369 if (mask > 1)
8370 fputs (", ", stdout);
8371 }
8372 }
8373 }
8374
8375 #define ADVANCE \
8376 if (remaining == 0 && more_words) \
8377 { \
8378 data_offset += 4; \
8379 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8380 data_offset, & word, & addr, NULL)) \
8381 return FALSE; \
8382 remaining = 4; \
8383 more_words--; \
8384 } \
8385
8386 #define GET_OP(OP) \
8387 ADVANCE; \
8388 if (remaining) \
8389 { \
8390 remaining--; \
8391 (OP) = word >> 24; \
8392 word <<= 8; \
8393 } \
8394 else \
8395 { \
8396 printf (_("[Truncated opcode]\n")); \
8397 return FALSE; \
8398 } \
8399 printf ("0x%02x ", OP)
8400
8401 static bfd_boolean
8402 decode_arm_unwind_bytecode (Filedata * filedata,
8403 struct arm_unw_aux_info * aux,
8404 unsigned int word,
8405 unsigned int remaining,
8406 unsigned int more_words,
8407 bfd_vma data_offset,
8408 Elf_Internal_Shdr * data_sec,
8409 struct arm_section * data_arm_sec)
8410 {
8411 struct absaddr addr;
8412 bfd_boolean res = TRUE;
8413
8414 /* Decode the unwinding instructions. */
8415 while (1)
8416 {
8417 unsigned int op, op2;
8418
8419 ADVANCE;
8420 if (remaining == 0)
8421 break;
8422 remaining--;
8423 op = word >> 24;
8424 word <<= 8;
8425
8426 printf (" 0x%02x ", op);
8427
8428 if ((op & 0xc0) == 0x00)
8429 {
8430 int offset = ((op & 0x3f) << 2) + 4;
8431
8432 printf (" vsp = vsp + %d", offset);
8433 }
8434 else if ((op & 0xc0) == 0x40)
8435 {
8436 int offset = ((op & 0x3f) << 2) + 4;
8437
8438 printf (" vsp = vsp - %d", offset);
8439 }
8440 else if ((op & 0xf0) == 0x80)
8441 {
8442 GET_OP (op2);
8443 if (op == 0x80 && op2 == 0)
8444 printf (_("Refuse to unwind"));
8445 else
8446 {
8447 unsigned int mask = ((op & 0x0f) << 8) | op2;
8448 bfd_boolean first = TRUE;
8449 int i;
8450
8451 printf ("pop {");
8452 for (i = 0; i < 12; i++)
8453 if (mask & (1 << i))
8454 {
8455 if (first)
8456 first = FALSE;
8457 else
8458 printf (", ");
8459 printf ("r%d", 4 + i);
8460 }
8461 printf ("}");
8462 }
8463 }
8464 else if ((op & 0xf0) == 0x90)
8465 {
8466 if (op == 0x9d || op == 0x9f)
8467 printf (_(" [Reserved]"));
8468 else
8469 printf (" vsp = r%d", op & 0x0f);
8470 }
8471 else if ((op & 0xf0) == 0xa0)
8472 {
8473 int end = 4 + (op & 0x07);
8474 bfd_boolean first = TRUE;
8475 int i;
8476
8477 printf (" pop {");
8478 for (i = 4; i <= end; i++)
8479 {
8480 if (first)
8481 first = FALSE;
8482 else
8483 printf (", ");
8484 printf ("r%d", i);
8485 }
8486 if (op & 0x08)
8487 {
8488 if (!first)
8489 printf (", ");
8490 printf ("r14");
8491 }
8492 printf ("}");
8493 }
8494 else if (op == 0xb0)
8495 printf (_(" finish"));
8496 else if (op == 0xb1)
8497 {
8498 GET_OP (op2);
8499 if (op2 == 0 || (op2 & 0xf0) != 0)
8500 printf (_("[Spare]"));
8501 else
8502 {
8503 unsigned int mask = op2 & 0x0f;
8504 bfd_boolean first = TRUE;
8505 int i;
8506
8507 printf ("pop {");
8508 for (i = 0; i < 12; i++)
8509 if (mask & (1 << i))
8510 {
8511 if (first)
8512 first = FALSE;
8513 else
8514 printf (", ");
8515 printf ("r%d", i);
8516 }
8517 printf ("}");
8518 }
8519 }
8520 else if (op == 0xb2)
8521 {
8522 unsigned char buf[9];
8523 unsigned int i, len;
8524 unsigned long offset;
8525
8526 for (i = 0; i < sizeof (buf); i++)
8527 {
8528 GET_OP (buf[i]);
8529 if ((buf[i] & 0x80) == 0)
8530 break;
8531 }
8532 if (i == sizeof (buf))
8533 {
8534 error (_("corrupt change to vsp"));
8535 res = FALSE;
8536 }
8537 else
8538 {
8539 offset = read_uleb128 (buf, &len, buf + i + 1);
8540 assert (len == i + 1);
8541 offset = offset * 4 + 0x204;
8542 printf ("vsp = vsp + %ld", offset);
8543 }
8544 }
8545 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8546 {
8547 unsigned int first, last;
8548
8549 GET_OP (op2);
8550 first = op2 >> 4;
8551 last = op2 & 0x0f;
8552 if (op == 0xc8)
8553 first = first + 16;
8554 printf ("pop {D%d", first);
8555 if (last)
8556 printf ("-D%d", first + last);
8557 printf ("}");
8558 }
8559 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8560 {
8561 unsigned int count = op & 0x07;
8562
8563 printf ("pop {D8");
8564 if (count)
8565 printf ("-D%d", 8 + count);
8566 printf ("}");
8567 }
8568 else if (op >= 0xc0 && op <= 0xc5)
8569 {
8570 unsigned int count = op & 0x07;
8571
8572 printf (" pop {wR10");
8573 if (count)
8574 printf ("-wR%d", 10 + count);
8575 printf ("}");
8576 }
8577 else if (op == 0xc6)
8578 {
8579 unsigned int first, last;
8580
8581 GET_OP (op2);
8582 first = op2 >> 4;
8583 last = op2 & 0x0f;
8584 printf ("pop {wR%d", first);
8585 if (last)
8586 printf ("-wR%d", first + last);
8587 printf ("}");
8588 }
8589 else if (op == 0xc7)
8590 {
8591 GET_OP (op2);
8592 if (op2 == 0 || (op2 & 0xf0) != 0)
8593 printf (_("[Spare]"));
8594 else
8595 {
8596 unsigned int mask = op2 & 0x0f;
8597 bfd_boolean first = TRUE;
8598 int i;
8599
8600 printf ("pop {");
8601 for (i = 0; i < 4; i++)
8602 if (mask & (1 << i))
8603 {
8604 if (first)
8605 first = FALSE;
8606 else
8607 printf (", ");
8608 printf ("wCGR%d", i);
8609 }
8610 printf ("}");
8611 }
8612 }
8613 else
8614 {
8615 printf (_(" [unsupported opcode]"));
8616 res = FALSE;
8617 }
8618
8619 printf ("\n");
8620 }
8621
8622 return res;
8623 }
8624
8625 static bfd_boolean
8626 decode_tic6x_unwind_bytecode (Filedata * filedata,
8627 struct arm_unw_aux_info * aux,
8628 unsigned int word,
8629 unsigned int remaining,
8630 unsigned int more_words,
8631 bfd_vma data_offset,
8632 Elf_Internal_Shdr * data_sec,
8633 struct arm_section * data_arm_sec)
8634 {
8635 struct absaddr addr;
8636
8637 /* Decode the unwinding instructions. */
8638 while (1)
8639 {
8640 unsigned int op, op2;
8641
8642 ADVANCE;
8643 if (remaining == 0)
8644 break;
8645 remaining--;
8646 op = word >> 24;
8647 word <<= 8;
8648
8649 printf (" 0x%02x ", op);
8650
8651 if ((op & 0xc0) == 0x00)
8652 {
8653 int offset = ((op & 0x3f) << 3) + 8;
8654 printf (" sp = sp + %d", offset);
8655 }
8656 else if ((op & 0xc0) == 0x80)
8657 {
8658 GET_OP (op2);
8659 if (op == 0x80 && op2 == 0)
8660 printf (_("Refuse to unwind"));
8661 else
8662 {
8663 unsigned int mask = ((op & 0x1f) << 8) | op2;
8664 if (op & 0x20)
8665 printf ("pop compact {");
8666 else
8667 printf ("pop {");
8668
8669 decode_tic6x_unwind_regmask (mask);
8670 printf("}");
8671 }
8672 }
8673 else if ((op & 0xf0) == 0xc0)
8674 {
8675 unsigned int reg;
8676 unsigned int nregs;
8677 unsigned int i;
8678 const char *name;
8679 struct
8680 {
8681 unsigned int offset;
8682 unsigned int reg;
8683 } regpos[16];
8684
8685 /* Scan entire instruction first so that GET_OP output is not
8686 interleaved with disassembly. */
8687 nregs = 0;
8688 for (i = 0; nregs < (op & 0xf); i++)
8689 {
8690 GET_OP (op2);
8691 reg = op2 >> 4;
8692 if (reg != 0xf)
8693 {
8694 regpos[nregs].offset = i * 2;
8695 regpos[nregs].reg = reg;
8696 nregs++;
8697 }
8698
8699 reg = op2 & 0xf;
8700 if (reg != 0xf)
8701 {
8702 regpos[nregs].offset = i * 2 + 1;
8703 regpos[nregs].reg = reg;
8704 nregs++;
8705 }
8706 }
8707
8708 printf (_("pop frame {"));
8709 reg = nregs - 1;
8710 for (i = i * 2; i > 0; i--)
8711 {
8712 if (regpos[reg].offset == i - 1)
8713 {
8714 name = tic6x_unwind_regnames[regpos[reg].reg];
8715 if (reg > 0)
8716 reg--;
8717 }
8718 else
8719 name = _("[pad]");
8720
8721 fputs (name, stdout);
8722 if (i > 1)
8723 printf (", ");
8724 }
8725
8726 printf ("}");
8727 }
8728 else if (op == 0xd0)
8729 printf (" MOV FP, SP");
8730 else if (op == 0xd1)
8731 printf (" __c6xabi_pop_rts");
8732 else if (op == 0xd2)
8733 {
8734 unsigned char buf[9];
8735 unsigned int i, len;
8736 unsigned long offset;
8737
8738 for (i = 0; i < sizeof (buf); i++)
8739 {
8740 GET_OP (buf[i]);
8741 if ((buf[i] & 0x80) == 0)
8742 break;
8743 }
8744 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8745 if (i == sizeof (buf))
8746 {
8747 warn (_("Corrupt stack pointer adjustment detected\n"));
8748 return FALSE;
8749 }
8750
8751 offset = read_uleb128 (buf, &len, buf + i + 1);
8752 assert (len == i + 1);
8753 offset = offset * 8 + 0x408;
8754 printf (_("sp = sp + %ld"), offset);
8755 }
8756 else if ((op & 0xf0) == 0xe0)
8757 {
8758 if ((op & 0x0f) == 7)
8759 printf (" RETURN");
8760 else
8761 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8762 }
8763 else
8764 {
8765 printf (_(" [unsupported opcode]"));
8766 }
8767 putchar ('\n');
8768 }
8769
8770 return TRUE;
8771 }
8772
8773 static bfd_vma
8774 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8775 {
8776 bfd_vma offset;
8777
8778 offset = word & 0x7fffffff;
8779 if (offset & 0x40000000)
8780 offset |= ~ (bfd_vma) 0x7fffffff;
8781
8782 if (filedata->file_header.e_machine == EM_TI_C6000)
8783 offset <<= 1;
8784
8785 return offset + where;
8786 }
8787
8788 static bfd_boolean
8789 decode_arm_unwind (Filedata * filedata,
8790 struct arm_unw_aux_info * aux,
8791 unsigned int word,
8792 unsigned int remaining,
8793 bfd_vma data_offset,
8794 Elf_Internal_Shdr * data_sec,
8795 struct arm_section * data_arm_sec)
8796 {
8797 int per_index;
8798 unsigned int more_words = 0;
8799 struct absaddr addr;
8800 bfd_vma sym_name = (bfd_vma) -1;
8801 bfd_boolean res = TRUE;
8802
8803 if (remaining == 0)
8804 {
8805 /* Fetch the first word.
8806 Note - when decoding an object file the address extracted
8807 here will always be 0. So we also pass in the sym_name
8808 parameter so that we can find the symbol associated with
8809 the personality routine. */
8810 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8811 & word, & addr, & sym_name))
8812 return FALSE;
8813
8814 remaining = 4;
8815 }
8816
8817 if ((word & 0x80000000) == 0)
8818 {
8819 /* Expand prel31 for personality routine. */
8820 bfd_vma fn;
8821 const char *procname;
8822
8823 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8824 printf (_(" Personality routine: "));
8825 if (fn == 0
8826 && addr.section == SHN_UNDEF && addr.offset == 0
8827 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8828 {
8829 procname = aux->strtab + sym_name;
8830 print_vma (fn, PREFIX_HEX);
8831 if (procname)
8832 {
8833 fputs (" <", stdout);
8834 fputs (procname, stdout);
8835 fputc ('>', stdout);
8836 }
8837 }
8838 else
8839 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8840 fputc ('\n', stdout);
8841
8842 /* The GCC personality routines use the standard compact
8843 encoding, starting with one byte giving the number of
8844 words. */
8845 if (procname != NULL
8846 && (const_strneq (procname, "__gcc_personality_v0")
8847 || const_strneq (procname, "__gxx_personality_v0")
8848 || const_strneq (procname, "__gcj_personality_v0")
8849 || const_strneq (procname, "__gnu_objc_personality_v0")))
8850 {
8851 remaining = 0;
8852 more_words = 1;
8853 ADVANCE;
8854 if (!remaining)
8855 {
8856 printf (_(" [Truncated data]\n"));
8857 return FALSE;
8858 }
8859 more_words = word >> 24;
8860 word <<= 8;
8861 remaining--;
8862 per_index = -1;
8863 }
8864 else
8865 return TRUE;
8866 }
8867 else
8868 {
8869 /* ARM EHABI Section 6.3:
8870
8871 An exception-handling table entry for the compact model looks like:
8872
8873 31 30-28 27-24 23-0
8874 -- ----- ----- ----
8875 1 0 index Data for personalityRoutine[index] */
8876
8877 if (filedata->file_header.e_machine == EM_ARM
8878 && (word & 0x70000000))
8879 {
8880 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8881 res = FALSE;
8882 }
8883
8884 per_index = (word >> 24) & 0x7f;
8885 printf (_(" Compact model index: %d\n"), per_index);
8886 if (per_index == 0)
8887 {
8888 more_words = 0;
8889 word <<= 8;
8890 remaining--;
8891 }
8892 else if (per_index < 3)
8893 {
8894 more_words = (word >> 16) & 0xff;
8895 word <<= 16;
8896 remaining -= 2;
8897 }
8898 }
8899
8900 switch (filedata->file_header.e_machine)
8901 {
8902 case EM_ARM:
8903 if (per_index < 3)
8904 {
8905 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8906 data_offset, data_sec, data_arm_sec))
8907 res = FALSE;
8908 }
8909 else
8910 {
8911 warn (_("Unknown ARM compact model index encountered\n"));
8912 printf (_(" [reserved]\n"));
8913 res = FALSE;
8914 }
8915 break;
8916
8917 case EM_TI_C6000:
8918 if (per_index < 3)
8919 {
8920 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8921 data_offset, data_sec, data_arm_sec))
8922 res = FALSE;
8923 }
8924 else if (per_index < 5)
8925 {
8926 if (((word >> 17) & 0x7f) == 0x7f)
8927 printf (_(" Restore stack from frame pointer\n"));
8928 else
8929 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8930 printf (_(" Registers restored: "));
8931 if (per_index == 4)
8932 printf (" (compact) ");
8933 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8934 putchar ('\n');
8935 printf (_(" Return register: %s\n"),
8936 tic6x_unwind_regnames[word & 0xf]);
8937 }
8938 else
8939 printf (_(" [reserved (%d)]\n"), per_index);
8940 break;
8941
8942 default:
8943 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8944 filedata->file_header.e_machine);
8945 res = FALSE;
8946 }
8947
8948 /* Decode the descriptors. Not implemented. */
8949
8950 return res;
8951 }
8952
8953 static bfd_boolean
8954 dump_arm_unwind (Filedata * filedata,
8955 struct arm_unw_aux_info * aux,
8956 Elf_Internal_Shdr * exidx_sec)
8957 {
8958 struct arm_section exidx_arm_sec, extab_arm_sec;
8959 unsigned int i, exidx_len;
8960 unsigned long j, nfuns;
8961 bfd_boolean res = TRUE;
8962
8963 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8964 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8965 exidx_len = exidx_sec->sh_size / 8;
8966
8967 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8968 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8969 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8970 aux->funtab[nfuns++] = aux->symtab[j];
8971 aux->nfuns = nfuns;
8972 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8973
8974 for (i = 0; i < exidx_len; i++)
8975 {
8976 unsigned int exidx_fn, exidx_entry;
8977 struct absaddr fn_addr, entry_addr;
8978 bfd_vma fn;
8979
8980 fputc ('\n', stdout);
8981
8982 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8983 8 * i, & exidx_fn, & fn_addr, NULL)
8984 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8985 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8986 {
8987 free (aux->funtab);
8988 arm_free_section (& exidx_arm_sec);
8989 arm_free_section (& extab_arm_sec);
8990 return FALSE;
8991 }
8992
8993 /* ARM EHABI, Section 5:
8994 An index table entry consists of 2 words.
8995 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8996 if (exidx_fn & 0x80000000)
8997 {
8998 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8999 res = FALSE;
9000 }
9001
9002 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9003
9004 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9005 fputs (": ", stdout);
9006
9007 if (exidx_entry == 1)
9008 {
9009 print_vma (exidx_entry, PREFIX_HEX);
9010 fputs (" [cantunwind]\n", stdout);
9011 }
9012 else if (exidx_entry & 0x80000000)
9013 {
9014 print_vma (exidx_entry, PREFIX_HEX);
9015 fputc ('\n', stdout);
9016 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9017 }
9018 else
9019 {
9020 bfd_vma table, table_offset = 0;
9021 Elf_Internal_Shdr *table_sec;
9022
9023 fputs ("@", stdout);
9024 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9025 print_vma (table, PREFIX_HEX);
9026 printf ("\n");
9027
9028 /* Locate the matching .ARM.extab. */
9029 if (entry_addr.section != SHN_UNDEF
9030 && entry_addr.section < filedata->file_header.e_shnum)
9031 {
9032 table_sec = filedata->section_headers + entry_addr.section;
9033 table_offset = entry_addr.offset;
9034 /* PR 18879 */
9035 if (table_offset > table_sec->sh_size
9036 || ((bfd_signed_vma) table_offset) < 0)
9037 {
9038 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9039 (unsigned long) table_offset,
9040 printable_section_name (filedata, table_sec));
9041 res = FALSE;
9042 continue;
9043 }
9044 }
9045 else
9046 {
9047 table_sec = find_section_by_address (filedata, table);
9048 if (table_sec != NULL)
9049 table_offset = table - table_sec->sh_addr;
9050 }
9051
9052 if (table_sec == NULL)
9053 {
9054 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9055 (unsigned long) table);
9056 res = FALSE;
9057 continue;
9058 }
9059
9060 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9061 &extab_arm_sec))
9062 res = FALSE;
9063 }
9064 }
9065
9066 printf ("\n");
9067
9068 free (aux->funtab);
9069 arm_free_section (&exidx_arm_sec);
9070 arm_free_section (&extab_arm_sec);
9071
9072 return res;
9073 }
9074
9075 /* Used for both ARM and C6X unwinding tables. */
9076
9077 static bfd_boolean
9078 arm_process_unwind (Filedata * filedata)
9079 {
9080 struct arm_unw_aux_info aux;
9081 Elf_Internal_Shdr *unwsec = NULL;
9082 Elf_Internal_Shdr *strsec;
9083 Elf_Internal_Shdr *sec;
9084 unsigned long i;
9085 unsigned int sec_type;
9086 bfd_boolean res = TRUE;
9087
9088 switch (filedata->file_header.e_machine)
9089 {
9090 case EM_ARM:
9091 sec_type = SHT_ARM_EXIDX;
9092 break;
9093
9094 case EM_TI_C6000:
9095 sec_type = SHT_C6000_UNWIND;
9096 break;
9097
9098 default:
9099 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9100 filedata->file_header.e_machine);
9101 return FALSE;
9102 }
9103
9104 if (filedata->string_table == NULL)
9105 return FALSE;
9106
9107 memset (& aux, 0, sizeof (aux));
9108 aux.filedata = filedata;
9109
9110 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9111 {
9112 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9113 {
9114 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9115
9116 strsec = filedata->section_headers + sec->sh_link;
9117
9118 /* PR binutils/17531 file: 011-12666-0.004. */
9119 if (aux.strtab != NULL)
9120 {
9121 error (_("Multiple string tables found in file.\n"));
9122 free (aux.strtab);
9123 res = FALSE;
9124 }
9125 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9126 1, strsec->sh_size, _("string table"));
9127 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9128 }
9129 else if (sec->sh_type == sec_type)
9130 unwsec = sec;
9131 }
9132
9133 if (unwsec == NULL)
9134 printf (_("\nThere are no unwind sections in this file.\n"));
9135 else
9136 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9137 {
9138 if (sec->sh_type == sec_type)
9139 {
9140 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9141 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9142 "contains %lu entry:\n",
9143 "\nUnwind section '%s' at offset 0x%lx "
9144 "contains %lu entries:\n",
9145 num_unwind),
9146 printable_section_name (filedata, sec),
9147 (unsigned long) sec->sh_offset,
9148 num_unwind);
9149
9150 if (! dump_arm_unwind (filedata, &aux, sec))
9151 res = FALSE;
9152 }
9153 }
9154
9155 if (aux.symtab)
9156 free (aux.symtab);
9157 if (aux.strtab)
9158 free ((char *) aux.strtab);
9159
9160 return res;
9161 }
9162
9163 static bfd_boolean
9164 process_unwind (Filedata * filedata)
9165 {
9166 struct unwind_handler
9167 {
9168 unsigned int machtype;
9169 bfd_boolean (* handler)(Filedata *);
9170 } handlers[] =
9171 {
9172 { EM_ARM, arm_process_unwind },
9173 { EM_IA_64, ia64_process_unwind },
9174 { EM_PARISC, hppa_process_unwind },
9175 { EM_TI_C6000, arm_process_unwind },
9176 { 0, NULL }
9177 };
9178 int i;
9179
9180 if (!do_unwind)
9181 return TRUE;
9182
9183 for (i = 0; handlers[i].handler != NULL; i++)
9184 if (filedata->file_header.e_machine == handlers[i].machtype)
9185 return handlers[i].handler (filedata);
9186
9187 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9188 get_machine_name (filedata->file_header.e_machine));
9189 return TRUE;
9190 }
9191
9192 static void
9193 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9194 {
9195 switch (entry->d_tag)
9196 {
9197 case DT_MIPS_FLAGS:
9198 if (entry->d_un.d_val == 0)
9199 printf (_("NONE"));
9200 else
9201 {
9202 static const char * opts[] =
9203 {
9204 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9205 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9206 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9207 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9208 "RLD_ORDER_SAFE"
9209 };
9210 unsigned int cnt;
9211 bfd_boolean first = TRUE;
9212
9213 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9214 if (entry->d_un.d_val & (1 << cnt))
9215 {
9216 printf ("%s%s", first ? "" : " ", opts[cnt]);
9217 first = FALSE;
9218 }
9219 }
9220 break;
9221
9222 case DT_MIPS_IVERSION:
9223 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9224 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9225 else
9226 {
9227 char buf[40];
9228 sprintf_vma (buf, entry->d_un.d_ptr);
9229 /* Note: coded this way so that there is a single string for translation. */
9230 printf (_("<corrupt: %s>"), buf);
9231 }
9232 break;
9233
9234 case DT_MIPS_TIME_STAMP:
9235 {
9236 char timebuf[128];
9237 struct tm * tmp;
9238 time_t atime = entry->d_un.d_val;
9239
9240 tmp = gmtime (&atime);
9241 /* PR 17531: file: 6accc532. */
9242 if (tmp == NULL)
9243 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9244 else
9245 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9246 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9247 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9248 printf (_("Time Stamp: %s"), timebuf);
9249 }
9250 break;
9251
9252 case DT_MIPS_RLD_VERSION:
9253 case DT_MIPS_LOCAL_GOTNO:
9254 case DT_MIPS_CONFLICTNO:
9255 case DT_MIPS_LIBLISTNO:
9256 case DT_MIPS_SYMTABNO:
9257 case DT_MIPS_UNREFEXTNO:
9258 case DT_MIPS_HIPAGENO:
9259 case DT_MIPS_DELTA_CLASS_NO:
9260 case DT_MIPS_DELTA_INSTANCE_NO:
9261 case DT_MIPS_DELTA_RELOC_NO:
9262 case DT_MIPS_DELTA_SYM_NO:
9263 case DT_MIPS_DELTA_CLASSSYM_NO:
9264 case DT_MIPS_COMPACT_SIZE:
9265 print_vma (entry->d_un.d_val, DEC);
9266 break;
9267
9268 default:
9269 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9270 }
9271 putchar ('\n');
9272 }
9273
9274 static void
9275 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9276 {
9277 switch (entry->d_tag)
9278 {
9279 case DT_HP_DLD_FLAGS:
9280 {
9281 static struct
9282 {
9283 long int bit;
9284 const char * str;
9285 }
9286 flags[] =
9287 {
9288 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9289 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9290 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9291 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9292 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9293 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9294 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9295 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9296 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9297 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9298 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9299 { DT_HP_GST, "HP_GST" },
9300 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9301 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9302 { DT_HP_NODELETE, "HP_NODELETE" },
9303 { DT_HP_GROUP, "HP_GROUP" },
9304 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9305 };
9306 bfd_boolean first = TRUE;
9307 size_t cnt;
9308 bfd_vma val = entry->d_un.d_val;
9309
9310 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9311 if (val & flags[cnt].bit)
9312 {
9313 if (! first)
9314 putchar (' ');
9315 fputs (flags[cnt].str, stdout);
9316 first = FALSE;
9317 val ^= flags[cnt].bit;
9318 }
9319
9320 if (val != 0 || first)
9321 {
9322 if (! first)
9323 putchar (' ');
9324 print_vma (val, HEX);
9325 }
9326 }
9327 break;
9328
9329 default:
9330 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9331 break;
9332 }
9333 putchar ('\n');
9334 }
9335
9336 #ifdef BFD64
9337
9338 /* VMS vs Unix time offset and factor. */
9339
9340 #define VMS_EPOCH_OFFSET 35067168000000000LL
9341 #define VMS_GRANULARITY_FACTOR 10000000
9342
9343 /* Display a VMS time in a human readable format. */
9344
9345 static void
9346 print_vms_time (bfd_int64_t vmstime)
9347 {
9348 struct tm *tm;
9349 time_t unxtime;
9350
9351 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9352 tm = gmtime (&unxtime);
9353 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9354 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9355 tm->tm_hour, tm->tm_min, tm->tm_sec);
9356 }
9357 #endif /* BFD64 */
9358
9359 static void
9360 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9361 {
9362 switch (entry->d_tag)
9363 {
9364 case DT_IA_64_PLT_RESERVE:
9365 /* First 3 slots reserved. */
9366 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9367 printf (" -- ");
9368 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9369 break;
9370
9371 case DT_IA_64_VMS_LINKTIME:
9372 #ifdef BFD64
9373 print_vms_time (entry->d_un.d_val);
9374 #endif
9375 break;
9376
9377 case DT_IA_64_VMS_LNKFLAGS:
9378 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9379 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9380 printf (" CALL_DEBUG");
9381 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9382 printf (" NOP0BUFS");
9383 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9384 printf (" P0IMAGE");
9385 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9386 printf (" MKTHREADS");
9387 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9388 printf (" UPCALLS");
9389 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9390 printf (" IMGSTA");
9391 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9392 printf (" INITIALIZE");
9393 if (entry->d_un.d_val & VMS_LF_MAIN)
9394 printf (" MAIN");
9395 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9396 printf (" EXE_INIT");
9397 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9398 printf (" TBK_IN_IMG");
9399 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9400 printf (" DBG_IN_IMG");
9401 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9402 printf (" TBK_IN_DSF");
9403 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9404 printf (" DBG_IN_DSF");
9405 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9406 printf (" SIGNATURES");
9407 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9408 printf (" REL_SEG_OFF");
9409 break;
9410
9411 default:
9412 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9413 break;
9414 }
9415 putchar ('\n');
9416 }
9417
9418 static bfd_boolean
9419 get_32bit_dynamic_section (Filedata * filedata)
9420 {
9421 Elf32_External_Dyn * edyn;
9422 Elf32_External_Dyn * ext;
9423 Elf_Internal_Dyn * entry;
9424
9425 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9426 dynamic_size, _("dynamic section"));
9427 if (!edyn)
9428 return FALSE;
9429
9430 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9431 might not have the luxury of section headers. Look for the DT_NULL
9432 terminator to determine the number of entries. */
9433 for (ext = edyn, dynamic_nent = 0;
9434 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9435 ext++)
9436 {
9437 dynamic_nent++;
9438 if (BYTE_GET (ext->d_tag) == DT_NULL)
9439 break;
9440 }
9441
9442 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9443 sizeof (* entry));
9444 if (dynamic_section == NULL)
9445 {
9446 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9447 (unsigned long) dynamic_nent);
9448 free (edyn);
9449 return FALSE;
9450 }
9451
9452 for (ext = edyn, entry = dynamic_section;
9453 entry < dynamic_section + dynamic_nent;
9454 ext++, entry++)
9455 {
9456 entry->d_tag = BYTE_GET (ext->d_tag);
9457 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9458 }
9459
9460 free (edyn);
9461
9462 return TRUE;
9463 }
9464
9465 static bfd_boolean
9466 get_64bit_dynamic_section (Filedata * filedata)
9467 {
9468 Elf64_External_Dyn * edyn;
9469 Elf64_External_Dyn * ext;
9470 Elf_Internal_Dyn * entry;
9471
9472 /* Read in the data. */
9473 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9474 dynamic_size, _("dynamic section"));
9475 if (!edyn)
9476 return FALSE;
9477
9478 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9479 might not have the luxury of section headers. Look for the DT_NULL
9480 terminator to determine the number of entries. */
9481 for (ext = edyn, dynamic_nent = 0;
9482 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9483 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9484 ext++)
9485 {
9486 dynamic_nent++;
9487 if (BYTE_GET (ext->d_tag) == DT_NULL)
9488 break;
9489 }
9490
9491 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9492 sizeof (* entry));
9493 if (dynamic_section == NULL)
9494 {
9495 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9496 (unsigned long) dynamic_nent);
9497 free (edyn);
9498 return FALSE;
9499 }
9500
9501 /* Convert from external to internal formats. */
9502 for (ext = edyn, entry = dynamic_section;
9503 entry < dynamic_section + dynamic_nent;
9504 ext++, entry++)
9505 {
9506 entry->d_tag = BYTE_GET (ext->d_tag);
9507 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9508 }
9509
9510 free (edyn);
9511
9512 return TRUE;
9513 }
9514
9515 static void
9516 print_dynamic_flags (bfd_vma flags)
9517 {
9518 bfd_boolean first = TRUE;
9519
9520 while (flags)
9521 {
9522 bfd_vma flag;
9523
9524 flag = flags & - flags;
9525 flags &= ~ flag;
9526
9527 if (first)
9528 first = FALSE;
9529 else
9530 putc (' ', stdout);
9531
9532 switch (flag)
9533 {
9534 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9535 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9536 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9537 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9538 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9539 default: fputs (_("unknown"), stdout); break;
9540 }
9541 }
9542 puts ("");
9543 }
9544
9545 /* Parse and display the contents of the dynamic section. */
9546
9547 static bfd_boolean
9548 process_dynamic_section (Filedata * filedata)
9549 {
9550 Elf_Internal_Dyn * entry;
9551
9552 if (dynamic_size == 0)
9553 {
9554 if (do_dynamic)
9555 printf (_("\nThere is no dynamic section in this file.\n"));
9556
9557 return TRUE;
9558 }
9559
9560 if (is_32bit_elf)
9561 {
9562 if (! get_32bit_dynamic_section (filedata))
9563 return FALSE;
9564 }
9565 else
9566 {
9567 if (! get_64bit_dynamic_section (filedata))
9568 return FALSE;
9569 }
9570
9571 /* Find the appropriate symbol table. */
9572 if (dynamic_symbols == NULL)
9573 {
9574 for (entry = dynamic_section;
9575 entry < dynamic_section + dynamic_nent;
9576 ++entry)
9577 {
9578 Elf_Internal_Shdr section;
9579
9580 if (entry->d_tag != DT_SYMTAB)
9581 continue;
9582
9583 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9584
9585 /* Since we do not know how big the symbol table is,
9586 we default to reading in the entire file (!) and
9587 processing that. This is overkill, I know, but it
9588 should work. */
9589 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9590 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9591 {
9592 /* See PR 21379 for a reproducer. */
9593 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9594 return FALSE;
9595 }
9596
9597 if (archive_file_offset != 0)
9598 section.sh_size = archive_file_size - section.sh_offset;
9599 else
9600 section.sh_size = filedata->file_size - section.sh_offset;
9601
9602 if (is_32bit_elf)
9603 section.sh_entsize = sizeof (Elf32_External_Sym);
9604 else
9605 section.sh_entsize = sizeof (Elf64_External_Sym);
9606 section.sh_name = filedata->string_table_length;
9607
9608 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9609 if (num_dynamic_syms < 1)
9610 {
9611 error (_("Unable to determine the number of symbols to load\n"));
9612 continue;
9613 }
9614 }
9615 }
9616
9617 /* Similarly find a string table. */
9618 if (dynamic_strings == NULL)
9619 {
9620 for (entry = dynamic_section;
9621 entry < dynamic_section + dynamic_nent;
9622 ++entry)
9623 {
9624 unsigned long offset;
9625 long str_tab_len;
9626
9627 if (entry->d_tag != DT_STRTAB)
9628 continue;
9629
9630 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9631
9632 /* Since we do not know how big the string table is,
9633 we default to reading in the entire file (!) and
9634 processing that. This is overkill, I know, but it
9635 should work. */
9636
9637 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9638
9639 if (archive_file_offset != 0)
9640 str_tab_len = archive_file_size - offset;
9641 else
9642 str_tab_len = filedata->file_size - offset;
9643
9644 if (str_tab_len < 1)
9645 {
9646 error
9647 (_("Unable to determine the length of the dynamic string table\n"));
9648 continue;
9649 }
9650
9651 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9652 str_tab_len,
9653 _("dynamic string table"));
9654 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9655 break;
9656 }
9657 }
9658
9659 /* And find the syminfo section if available. */
9660 if (dynamic_syminfo == NULL)
9661 {
9662 unsigned long syminsz = 0;
9663
9664 for (entry = dynamic_section;
9665 entry < dynamic_section + dynamic_nent;
9666 ++entry)
9667 {
9668 if (entry->d_tag == DT_SYMINENT)
9669 {
9670 /* Note: these braces are necessary to avoid a syntax
9671 error from the SunOS4 C compiler. */
9672 /* PR binutils/17531: A corrupt file can trigger this test.
9673 So do not use an assert, instead generate an error message. */
9674 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9675 error (_("Bad value (%d) for SYMINENT entry\n"),
9676 (int) entry->d_un.d_val);
9677 }
9678 else if (entry->d_tag == DT_SYMINSZ)
9679 syminsz = entry->d_un.d_val;
9680 else if (entry->d_tag == DT_SYMINFO)
9681 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9682 syminsz);
9683 }
9684
9685 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9686 {
9687 Elf_External_Syminfo * extsyminfo;
9688 Elf_External_Syminfo * extsym;
9689 Elf_Internal_Syminfo * syminfo;
9690
9691 /* There is a syminfo section. Read the data. */
9692 extsyminfo = (Elf_External_Syminfo *)
9693 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9694 _("symbol information"));
9695 if (!extsyminfo)
9696 return FALSE;
9697
9698 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9699 if (dynamic_syminfo == NULL)
9700 {
9701 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9702 (unsigned long) syminsz);
9703 return FALSE;
9704 }
9705
9706 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9707 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9708 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9709 ++syminfo, ++extsym)
9710 {
9711 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9712 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9713 }
9714
9715 free (extsyminfo);
9716 }
9717 }
9718
9719 if (do_dynamic && dynamic_addr)
9720 printf (ngettext ("\nDynamic section at offset 0x%lx "
9721 "contains %lu entry:\n",
9722 "\nDynamic section at offset 0x%lx "
9723 "contains %lu entries:\n",
9724 dynamic_nent),
9725 dynamic_addr, (unsigned long) dynamic_nent);
9726 if (do_dynamic)
9727 printf (_(" Tag Type Name/Value\n"));
9728
9729 for (entry = dynamic_section;
9730 entry < dynamic_section + dynamic_nent;
9731 entry++)
9732 {
9733 if (do_dynamic)
9734 {
9735 const char * dtype;
9736
9737 putchar (' ');
9738 print_vma (entry->d_tag, FULL_HEX);
9739 dtype = get_dynamic_type (filedata, entry->d_tag);
9740 printf (" (%s)%*s", dtype,
9741 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9742 }
9743
9744 switch (entry->d_tag)
9745 {
9746 case DT_FLAGS:
9747 if (do_dynamic)
9748 print_dynamic_flags (entry->d_un.d_val);
9749 break;
9750
9751 case DT_AUXILIARY:
9752 case DT_FILTER:
9753 case DT_CONFIG:
9754 case DT_DEPAUDIT:
9755 case DT_AUDIT:
9756 if (do_dynamic)
9757 {
9758 switch (entry->d_tag)
9759 {
9760 case DT_AUXILIARY:
9761 printf (_("Auxiliary library"));
9762 break;
9763
9764 case DT_FILTER:
9765 printf (_("Filter library"));
9766 break;
9767
9768 case DT_CONFIG:
9769 printf (_("Configuration file"));
9770 break;
9771
9772 case DT_DEPAUDIT:
9773 printf (_("Dependency audit library"));
9774 break;
9775
9776 case DT_AUDIT:
9777 printf (_("Audit library"));
9778 break;
9779 }
9780
9781 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9782 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9783 else
9784 {
9785 printf (": ");
9786 print_vma (entry->d_un.d_val, PREFIX_HEX);
9787 putchar ('\n');
9788 }
9789 }
9790 break;
9791
9792 case DT_FEATURE:
9793 if (do_dynamic)
9794 {
9795 printf (_("Flags:"));
9796
9797 if (entry->d_un.d_val == 0)
9798 printf (_(" None\n"));
9799 else
9800 {
9801 unsigned long int val = entry->d_un.d_val;
9802
9803 if (val & DTF_1_PARINIT)
9804 {
9805 printf (" PARINIT");
9806 val ^= DTF_1_PARINIT;
9807 }
9808 if (val & DTF_1_CONFEXP)
9809 {
9810 printf (" CONFEXP");
9811 val ^= DTF_1_CONFEXP;
9812 }
9813 if (val != 0)
9814 printf (" %lx", val);
9815 puts ("");
9816 }
9817 }
9818 break;
9819
9820 case DT_POSFLAG_1:
9821 if (do_dynamic)
9822 {
9823 printf (_("Flags:"));
9824
9825 if (entry->d_un.d_val == 0)
9826 printf (_(" None\n"));
9827 else
9828 {
9829 unsigned long int val = entry->d_un.d_val;
9830
9831 if (val & DF_P1_LAZYLOAD)
9832 {
9833 printf (" LAZYLOAD");
9834 val ^= DF_P1_LAZYLOAD;
9835 }
9836 if (val & DF_P1_GROUPPERM)
9837 {
9838 printf (" GROUPPERM");
9839 val ^= DF_P1_GROUPPERM;
9840 }
9841 if (val != 0)
9842 printf (" %lx", val);
9843 puts ("");
9844 }
9845 }
9846 break;
9847
9848 case DT_FLAGS_1:
9849 if (do_dynamic)
9850 {
9851 printf (_("Flags:"));
9852 if (entry->d_un.d_val == 0)
9853 printf (_(" None\n"));
9854 else
9855 {
9856 unsigned long int val = entry->d_un.d_val;
9857
9858 if (val & DF_1_NOW)
9859 {
9860 printf (" NOW");
9861 val ^= DF_1_NOW;
9862 }
9863 if (val & DF_1_GLOBAL)
9864 {
9865 printf (" GLOBAL");
9866 val ^= DF_1_GLOBAL;
9867 }
9868 if (val & DF_1_GROUP)
9869 {
9870 printf (" GROUP");
9871 val ^= DF_1_GROUP;
9872 }
9873 if (val & DF_1_NODELETE)
9874 {
9875 printf (" NODELETE");
9876 val ^= DF_1_NODELETE;
9877 }
9878 if (val & DF_1_LOADFLTR)
9879 {
9880 printf (" LOADFLTR");
9881 val ^= DF_1_LOADFLTR;
9882 }
9883 if (val & DF_1_INITFIRST)
9884 {
9885 printf (" INITFIRST");
9886 val ^= DF_1_INITFIRST;
9887 }
9888 if (val & DF_1_NOOPEN)
9889 {
9890 printf (" NOOPEN");
9891 val ^= DF_1_NOOPEN;
9892 }
9893 if (val & DF_1_ORIGIN)
9894 {
9895 printf (" ORIGIN");
9896 val ^= DF_1_ORIGIN;
9897 }
9898 if (val & DF_1_DIRECT)
9899 {
9900 printf (" DIRECT");
9901 val ^= DF_1_DIRECT;
9902 }
9903 if (val & DF_1_TRANS)
9904 {
9905 printf (" TRANS");
9906 val ^= DF_1_TRANS;
9907 }
9908 if (val & DF_1_INTERPOSE)
9909 {
9910 printf (" INTERPOSE");
9911 val ^= DF_1_INTERPOSE;
9912 }
9913 if (val & DF_1_NODEFLIB)
9914 {
9915 printf (" NODEFLIB");
9916 val ^= DF_1_NODEFLIB;
9917 }
9918 if (val & DF_1_NODUMP)
9919 {
9920 printf (" NODUMP");
9921 val ^= DF_1_NODUMP;
9922 }
9923 if (val & DF_1_CONFALT)
9924 {
9925 printf (" CONFALT");
9926 val ^= DF_1_CONFALT;
9927 }
9928 if (val & DF_1_ENDFILTEE)
9929 {
9930 printf (" ENDFILTEE");
9931 val ^= DF_1_ENDFILTEE;
9932 }
9933 if (val & DF_1_DISPRELDNE)
9934 {
9935 printf (" DISPRELDNE");
9936 val ^= DF_1_DISPRELDNE;
9937 }
9938 if (val & DF_1_DISPRELPND)
9939 {
9940 printf (" DISPRELPND");
9941 val ^= DF_1_DISPRELPND;
9942 }
9943 if (val & DF_1_NODIRECT)
9944 {
9945 printf (" NODIRECT");
9946 val ^= DF_1_NODIRECT;
9947 }
9948 if (val & DF_1_IGNMULDEF)
9949 {
9950 printf (" IGNMULDEF");
9951 val ^= DF_1_IGNMULDEF;
9952 }
9953 if (val & DF_1_NOKSYMS)
9954 {
9955 printf (" NOKSYMS");
9956 val ^= DF_1_NOKSYMS;
9957 }
9958 if (val & DF_1_NOHDR)
9959 {
9960 printf (" NOHDR");
9961 val ^= DF_1_NOHDR;
9962 }
9963 if (val & DF_1_EDITED)
9964 {
9965 printf (" EDITED");
9966 val ^= DF_1_EDITED;
9967 }
9968 if (val & DF_1_NORELOC)
9969 {
9970 printf (" NORELOC");
9971 val ^= DF_1_NORELOC;
9972 }
9973 if (val & DF_1_SYMINTPOSE)
9974 {
9975 printf (" SYMINTPOSE");
9976 val ^= DF_1_SYMINTPOSE;
9977 }
9978 if (val & DF_1_GLOBAUDIT)
9979 {
9980 printf (" GLOBAUDIT");
9981 val ^= DF_1_GLOBAUDIT;
9982 }
9983 if (val & DF_1_SINGLETON)
9984 {
9985 printf (" SINGLETON");
9986 val ^= DF_1_SINGLETON;
9987 }
9988 if (val & DF_1_STUB)
9989 {
9990 printf (" STUB");
9991 val ^= DF_1_STUB;
9992 }
9993 if (val & DF_1_PIE)
9994 {
9995 printf (" PIE");
9996 val ^= DF_1_PIE;
9997 }
9998 if (val & DF_1_KMOD)
9999 {
10000 printf (" KMOD");
10001 val ^= DF_1_KMOD;
10002 }
10003 if (val & DF_1_WEAKFILTER)
10004 {
10005 printf (" WEAKFILTER");
10006 val ^= DF_1_WEAKFILTER;
10007 }
10008 if (val & DF_1_NOCOMMON)
10009 {
10010 printf (" NOCOMMON");
10011 val ^= DF_1_NOCOMMON;
10012 }
10013 if (val != 0)
10014 printf (" %lx", val);
10015 puts ("");
10016 }
10017 }
10018 break;
10019
10020 case DT_PLTREL:
10021 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10022 if (do_dynamic)
10023 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10024 break;
10025
10026 case DT_NULL :
10027 case DT_NEEDED :
10028 case DT_PLTGOT :
10029 case DT_HASH :
10030 case DT_STRTAB :
10031 case DT_SYMTAB :
10032 case DT_RELA :
10033 case DT_INIT :
10034 case DT_FINI :
10035 case DT_SONAME :
10036 case DT_RPATH :
10037 case DT_SYMBOLIC:
10038 case DT_REL :
10039 case DT_DEBUG :
10040 case DT_TEXTREL :
10041 case DT_JMPREL :
10042 case DT_RUNPATH :
10043 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10044
10045 if (do_dynamic)
10046 {
10047 char * name;
10048
10049 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10050 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10051 else
10052 name = NULL;
10053
10054 if (name)
10055 {
10056 switch (entry->d_tag)
10057 {
10058 case DT_NEEDED:
10059 printf (_("Shared library: [%s]"), name);
10060
10061 if (streq (name, program_interpreter))
10062 printf (_(" program interpreter"));
10063 break;
10064
10065 case DT_SONAME:
10066 printf (_("Library soname: [%s]"), name);
10067 break;
10068
10069 case DT_RPATH:
10070 printf (_("Library rpath: [%s]"), name);
10071 break;
10072
10073 case DT_RUNPATH:
10074 printf (_("Library runpath: [%s]"), name);
10075 break;
10076
10077 default:
10078 print_vma (entry->d_un.d_val, PREFIX_HEX);
10079 break;
10080 }
10081 }
10082 else
10083 print_vma (entry->d_un.d_val, PREFIX_HEX);
10084
10085 putchar ('\n');
10086 }
10087 break;
10088
10089 case DT_PLTRELSZ:
10090 case DT_RELASZ :
10091 case DT_STRSZ :
10092 case DT_RELSZ :
10093 case DT_RELAENT :
10094 case DT_SYMENT :
10095 case DT_RELENT :
10096 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10097 /* Fall through. */
10098 case DT_PLTPADSZ:
10099 case DT_MOVEENT :
10100 case DT_MOVESZ :
10101 case DT_INIT_ARRAYSZ:
10102 case DT_FINI_ARRAYSZ:
10103 case DT_GNU_CONFLICTSZ:
10104 case DT_GNU_LIBLISTSZ:
10105 if (do_dynamic)
10106 {
10107 print_vma (entry->d_un.d_val, UNSIGNED);
10108 printf (_(" (bytes)\n"));
10109 }
10110 break;
10111
10112 case DT_VERDEFNUM:
10113 case DT_VERNEEDNUM:
10114 case DT_RELACOUNT:
10115 case DT_RELCOUNT:
10116 if (do_dynamic)
10117 {
10118 print_vma (entry->d_un.d_val, UNSIGNED);
10119 putchar ('\n');
10120 }
10121 break;
10122
10123 case DT_SYMINSZ:
10124 case DT_SYMINENT:
10125 case DT_SYMINFO:
10126 case DT_USED:
10127 case DT_INIT_ARRAY:
10128 case DT_FINI_ARRAY:
10129 if (do_dynamic)
10130 {
10131 if (entry->d_tag == DT_USED
10132 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10133 {
10134 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10135
10136 if (*name)
10137 {
10138 printf (_("Not needed object: [%s]\n"), name);
10139 break;
10140 }
10141 }
10142
10143 print_vma (entry->d_un.d_val, PREFIX_HEX);
10144 putchar ('\n');
10145 }
10146 break;
10147
10148 case DT_BIND_NOW:
10149 /* The value of this entry is ignored. */
10150 if (do_dynamic)
10151 putchar ('\n');
10152 break;
10153
10154 case DT_GNU_PRELINKED:
10155 if (do_dynamic)
10156 {
10157 struct tm * tmp;
10158 time_t atime = entry->d_un.d_val;
10159
10160 tmp = gmtime (&atime);
10161 /* PR 17533 file: 041-1244816-0.004. */
10162 if (tmp == NULL)
10163 printf (_("<corrupt time val: %lx"),
10164 (unsigned long) atime);
10165 else
10166 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10167 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10168 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10169
10170 }
10171 break;
10172
10173 case DT_GNU_HASH:
10174 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10175 if (do_dynamic)
10176 {
10177 print_vma (entry->d_un.d_val, PREFIX_HEX);
10178 putchar ('\n');
10179 }
10180 break;
10181
10182 default:
10183 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10184 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10185 entry->d_un.d_val;
10186
10187 if (do_dynamic)
10188 {
10189 switch (filedata->file_header.e_machine)
10190 {
10191 case EM_MIPS:
10192 case EM_MIPS_RS3_LE:
10193 dynamic_section_mips_val (entry);
10194 break;
10195 case EM_PARISC:
10196 dynamic_section_parisc_val (entry);
10197 break;
10198 case EM_IA_64:
10199 dynamic_section_ia64_val (entry);
10200 break;
10201 default:
10202 print_vma (entry->d_un.d_val, PREFIX_HEX);
10203 putchar ('\n');
10204 }
10205 }
10206 break;
10207 }
10208 }
10209
10210 return TRUE;
10211 }
10212
10213 static char *
10214 get_ver_flags (unsigned int flags)
10215 {
10216 static char buff[128];
10217
10218 buff[0] = 0;
10219
10220 if (flags == 0)
10221 return _("none");
10222
10223 if (flags & VER_FLG_BASE)
10224 strcat (buff, "BASE");
10225
10226 if (flags & VER_FLG_WEAK)
10227 {
10228 if (flags & VER_FLG_BASE)
10229 strcat (buff, " | ");
10230
10231 strcat (buff, "WEAK");
10232 }
10233
10234 if (flags & VER_FLG_INFO)
10235 {
10236 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10237 strcat (buff, " | ");
10238
10239 strcat (buff, "INFO");
10240 }
10241
10242 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10243 {
10244 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10245 strcat (buff, " | ");
10246
10247 strcat (buff, _("<unknown>"));
10248 }
10249
10250 return buff;
10251 }
10252
10253 /* Display the contents of the version sections. */
10254
10255 static bfd_boolean
10256 process_version_sections (Filedata * filedata)
10257 {
10258 Elf_Internal_Shdr * section;
10259 unsigned i;
10260 bfd_boolean found = FALSE;
10261
10262 if (! do_version)
10263 return TRUE;
10264
10265 for (i = 0, section = filedata->section_headers;
10266 i < filedata->file_header.e_shnum;
10267 i++, section++)
10268 {
10269 switch (section->sh_type)
10270 {
10271 case SHT_GNU_verdef:
10272 {
10273 Elf_External_Verdef * edefs;
10274 unsigned long idx;
10275 unsigned long cnt;
10276 char * endbuf;
10277
10278 found = TRUE;
10279
10280 printf (ngettext ("\nVersion definition section '%s' "
10281 "contains %u entry:\n",
10282 "\nVersion definition section '%s' "
10283 "contains %u entries:\n",
10284 section->sh_info),
10285 printable_section_name (filedata, section),
10286 section->sh_info);
10287
10288 printf (_(" Addr: 0x"));
10289 printf_vma (section->sh_addr);
10290 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10291 (unsigned long) section->sh_offset, section->sh_link,
10292 printable_section_name_from_index (filedata, section->sh_link));
10293
10294 edefs = (Elf_External_Verdef *)
10295 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10296 _("version definition section"));
10297 if (!edefs)
10298 break;
10299 endbuf = (char *) edefs + section->sh_size;
10300
10301 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10302 {
10303 char * vstart;
10304 Elf_External_Verdef * edef;
10305 Elf_Internal_Verdef ent;
10306 Elf_External_Verdaux * eaux;
10307 Elf_Internal_Verdaux aux;
10308 unsigned long isum;
10309 int j;
10310
10311 vstart = ((char *) edefs) + idx;
10312 if (vstart + sizeof (*edef) > endbuf)
10313 break;
10314
10315 edef = (Elf_External_Verdef *) vstart;
10316
10317 ent.vd_version = BYTE_GET (edef->vd_version);
10318 ent.vd_flags = BYTE_GET (edef->vd_flags);
10319 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10320 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10321 ent.vd_hash = BYTE_GET (edef->vd_hash);
10322 ent.vd_aux = BYTE_GET (edef->vd_aux);
10323 ent.vd_next = BYTE_GET (edef->vd_next);
10324
10325 printf (_(" %#06lx: Rev: %d Flags: %s"),
10326 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10327
10328 printf (_(" Index: %d Cnt: %d "),
10329 ent.vd_ndx, ent.vd_cnt);
10330
10331 /* Check for overflow. */
10332 if (ent.vd_aux > (size_t) (endbuf - vstart))
10333 break;
10334
10335 vstart += ent.vd_aux;
10336
10337 if (vstart + sizeof (*eaux) > endbuf)
10338 break;
10339 eaux = (Elf_External_Verdaux *) vstart;
10340
10341 aux.vda_name = BYTE_GET (eaux->vda_name);
10342 aux.vda_next = BYTE_GET (eaux->vda_next);
10343
10344 if (VALID_DYNAMIC_NAME (aux.vda_name))
10345 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10346 else
10347 printf (_("Name index: %ld\n"), aux.vda_name);
10348
10349 isum = idx + ent.vd_aux;
10350
10351 for (j = 1; j < ent.vd_cnt; j++)
10352 {
10353 if (aux.vda_next < sizeof (*eaux)
10354 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10355 {
10356 warn (_("Invalid vda_next field of %lx\n"),
10357 aux.vda_next);
10358 j = ent.vd_cnt;
10359 break;
10360 }
10361 /* Check for overflow. */
10362 if (aux.vda_next > (size_t) (endbuf - vstart))
10363 break;
10364
10365 isum += aux.vda_next;
10366 vstart += aux.vda_next;
10367
10368 if (vstart + sizeof (*eaux) > endbuf)
10369 break;
10370 eaux = (Elf_External_Verdaux *) vstart;
10371
10372 aux.vda_name = BYTE_GET (eaux->vda_name);
10373 aux.vda_next = BYTE_GET (eaux->vda_next);
10374
10375 if (VALID_DYNAMIC_NAME (aux.vda_name))
10376 printf (_(" %#06lx: Parent %d: %s\n"),
10377 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10378 else
10379 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10380 isum, j, aux.vda_name);
10381 }
10382
10383 if (j < ent.vd_cnt)
10384 printf (_(" Version def aux past end of section\n"));
10385
10386 /* PR 17531:
10387 file: id:000001,src:000172+005151,op:splice,rep:2. */
10388 if (ent.vd_next < sizeof (*edef)
10389 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10390 {
10391 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10392 cnt = section->sh_info;
10393 break;
10394 }
10395 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10396 break;
10397
10398 idx += ent.vd_next;
10399 }
10400
10401 if (cnt < section->sh_info)
10402 printf (_(" Version definition past end of section\n"));
10403
10404 free (edefs);
10405 }
10406 break;
10407
10408 case SHT_GNU_verneed:
10409 {
10410 Elf_External_Verneed * eneed;
10411 unsigned long idx;
10412 unsigned long cnt;
10413 char * endbuf;
10414
10415 found = TRUE;
10416
10417 printf (ngettext ("\nVersion needs section '%s' "
10418 "contains %u entry:\n",
10419 "\nVersion needs section '%s' "
10420 "contains %u entries:\n",
10421 section->sh_info),
10422 printable_section_name (filedata, section), section->sh_info);
10423
10424 printf (_(" Addr: 0x"));
10425 printf_vma (section->sh_addr);
10426 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10427 (unsigned long) section->sh_offset, section->sh_link,
10428 printable_section_name_from_index (filedata, section->sh_link));
10429
10430 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10431 section->sh_offset, 1,
10432 section->sh_size,
10433 _("Version Needs section"));
10434 if (!eneed)
10435 break;
10436 endbuf = (char *) eneed + section->sh_size;
10437
10438 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10439 {
10440 Elf_External_Verneed * entry;
10441 Elf_Internal_Verneed ent;
10442 unsigned long isum;
10443 int j;
10444 char * vstart;
10445
10446 vstart = ((char *) eneed) + idx;
10447 if (vstart + sizeof (*entry) > endbuf)
10448 break;
10449
10450 entry = (Elf_External_Verneed *) vstart;
10451
10452 ent.vn_version = BYTE_GET (entry->vn_version);
10453 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10454 ent.vn_file = BYTE_GET (entry->vn_file);
10455 ent.vn_aux = BYTE_GET (entry->vn_aux);
10456 ent.vn_next = BYTE_GET (entry->vn_next);
10457
10458 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10459
10460 if (VALID_DYNAMIC_NAME (ent.vn_file))
10461 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10462 else
10463 printf (_(" File: %lx"), ent.vn_file);
10464
10465 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10466
10467 /* Check for overflow. */
10468 if (ent.vn_aux > (size_t) (endbuf - vstart))
10469 break;
10470 vstart += ent.vn_aux;
10471
10472 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10473 {
10474 Elf_External_Vernaux * eaux;
10475 Elf_Internal_Vernaux aux;
10476
10477 if (vstart + sizeof (*eaux) > endbuf)
10478 break;
10479 eaux = (Elf_External_Vernaux *) vstart;
10480
10481 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10482 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10483 aux.vna_other = BYTE_GET (eaux->vna_other);
10484 aux.vna_name = BYTE_GET (eaux->vna_name);
10485 aux.vna_next = BYTE_GET (eaux->vna_next);
10486
10487 if (VALID_DYNAMIC_NAME (aux.vna_name))
10488 printf (_(" %#06lx: Name: %s"),
10489 isum, GET_DYNAMIC_NAME (aux.vna_name));
10490 else
10491 printf (_(" %#06lx: Name index: %lx"),
10492 isum, aux.vna_name);
10493
10494 printf (_(" Flags: %s Version: %d\n"),
10495 get_ver_flags (aux.vna_flags), aux.vna_other);
10496
10497 if (aux.vna_next < sizeof (*eaux)
10498 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10499 {
10500 warn (_("Invalid vna_next field of %lx\n"),
10501 aux.vna_next);
10502 j = ent.vn_cnt;
10503 break;
10504 }
10505 /* Check for overflow. */
10506 if (aux.vna_next > (size_t) (endbuf - vstart))
10507 break;
10508 isum += aux.vna_next;
10509 vstart += aux.vna_next;
10510 }
10511
10512 if (j < ent.vn_cnt)
10513 warn (_("Missing Version Needs auxillary information\n"));
10514
10515 if (ent.vn_next < sizeof (*entry)
10516 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10517 {
10518 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10519 cnt = section->sh_info;
10520 break;
10521 }
10522 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10523 break;
10524 idx += ent.vn_next;
10525 }
10526
10527 if (cnt < section->sh_info)
10528 warn (_("Missing Version Needs information\n"));
10529
10530 free (eneed);
10531 }
10532 break;
10533
10534 case SHT_GNU_versym:
10535 {
10536 Elf_Internal_Shdr * link_section;
10537 size_t total;
10538 unsigned int cnt;
10539 unsigned char * edata;
10540 unsigned short * data;
10541 char * strtab;
10542 Elf_Internal_Sym * symbols;
10543 Elf_Internal_Shdr * string_sec;
10544 unsigned long num_syms;
10545 long off;
10546
10547 if (section->sh_link >= filedata->file_header.e_shnum)
10548 break;
10549
10550 link_section = filedata->section_headers + section->sh_link;
10551 total = section->sh_size / sizeof (Elf_External_Versym);
10552
10553 if (link_section->sh_link >= filedata->file_header.e_shnum)
10554 break;
10555
10556 found = TRUE;
10557
10558 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10559 if (symbols == NULL)
10560 break;
10561
10562 string_sec = filedata->section_headers + link_section->sh_link;
10563
10564 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10565 string_sec->sh_size,
10566 _("version string table"));
10567 if (!strtab)
10568 {
10569 free (symbols);
10570 break;
10571 }
10572
10573 printf (ngettext ("\nVersion symbols section '%s' "
10574 "contains %lu entry:\n",
10575 "\nVersion symbols section '%s' "
10576 "contains %lu entries:\n",
10577 total),
10578 printable_section_name (filedata, section), (unsigned long) total);
10579
10580 printf (_(" Addr: "));
10581 printf_vma (section->sh_addr);
10582 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10583 (unsigned long) section->sh_offset, section->sh_link,
10584 printable_section_name (filedata, link_section));
10585
10586 off = offset_from_vma (filedata,
10587 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10588 total * sizeof (short));
10589 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10590 sizeof (short),
10591 _("version symbol data"));
10592 if (!edata)
10593 {
10594 free (strtab);
10595 free (symbols);
10596 break;
10597 }
10598
10599 data = (short unsigned int *) cmalloc (total, sizeof (short));
10600
10601 for (cnt = total; cnt --;)
10602 data[cnt] = byte_get (edata + cnt * sizeof (short),
10603 sizeof (short));
10604
10605 free (edata);
10606
10607 for (cnt = 0; cnt < total; cnt += 4)
10608 {
10609 int j, nn;
10610 char *name;
10611 char *invalid = _("*invalid*");
10612
10613 printf (" %03x:", cnt);
10614
10615 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10616 switch (data[cnt + j])
10617 {
10618 case 0:
10619 fputs (_(" 0 (*local*) "), stdout);
10620 break;
10621
10622 case 1:
10623 fputs (_(" 1 (*global*) "), stdout);
10624 break;
10625
10626 default:
10627 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10628 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10629
10630 /* If this index value is greater than the size of the symbols
10631 array, break to avoid an out-of-bounds read. */
10632 if ((unsigned long)(cnt + j) >= num_syms)
10633 {
10634 warn (_("invalid index into symbol array\n"));
10635 break;
10636 }
10637
10638 name = NULL;
10639 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10640 {
10641 Elf_Internal_Verneed ivn;
10642 unsigned long offset;
10643
10644 offset = offset_from_vma
10645 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10646 sizeof (Elf_External_Verneed));
10647
10648 do
10649 {
10650 Elf_Internal_Vernaux ivna;
10651 Elf_External_Verneed evn;
10652 Elf_External_Vernaux evna;
10653 unsigned long a_off;
10654
10655 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10656 _("version need")) == NULL)
10657 break;
10658
10659 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10660 ivn.vn_next = BYTE_GET (evn.vn_next);
10661
10662 a_off = offset + ivn.vn_aux;
10663
10664 do
10665 {
10666 if (get_data (&evna, filedata, a_off, sizeof (evna),
10667 1, _("version need aux (2)")) == NULL)
10668 {
10669 ivna.vna_next = 0;
10670 ivna.vna_other = 0;
10671 }
10672 else
10673 {
10674 ivna.vna_next = BYTE_GET (evna.vna_next);
10675 ivna.vna_other = BYTE_GET (evna.vna_other);
10676 }
10677
10678 a_off += ivna.vna_next;
10679 }
10680 while (ivna.vna_other != data[cnt + j]
10681 && ivna.vna_next != 0);
10682
10683 if (ivna.vna_other == data[cnt + j])
10684 {
10685 ivna.vna_name = BYTE_GET (evna.vna_name);
10686
10687 if (ivna.vna_name >= string_sec->sh_size)
10688 name = invalid;
10689 else
10690 name = strtab + ivna.vna_name;
10691 break;
10692 }
10693
10694 offset += ivn.vn_next;
10695 }
10696 while (ivn.vn_next);
10697 }
10698
10699 if (data[cnt + j] != 0x8001
10700 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10701 {
10702 Elf_Internal_Verdef ivd;
10703 Elf_External_Verdef evd;
10704 unsigned long offset;
10705
10706 offset = offset_from_vma
10707 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10708 sizeof evd);
10709
10710 do
10711 {
10712 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10713 _("version def")) == NULL)
10714 {
10715 ivd.vd_next = 0;
10716 /* PR 17531: file: 046-1082287-0.004. */
10717 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10718 break;
10719 }
10720 else
10721 {
10722 ivd.vd_next = BYTE_GET (evd.vd_next);
10723 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10724 }
10725
10726 offset += ivd.vd_next;
10727 }
10728 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10729 && ivd.vd_next != 0);
10730
10731 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10732 {
10733 Elf_External_Verdaux evda;
10734 Elf_Internal_Verdaux ivda;
10735
10736 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10737
10738 if (get_data (&evda, filedata,
10739 offset - ivd.vd_next + ivd.vd_aux,
10740 sizeof (evda), 1,
10741 _("version def aux")) == NULL)
10742 break;
10743
10744 ivda.vda_name = BYTE_GET (evda.vda_name);
10745
10746 if (ivda.vda_name >= string_sec->sh_size)
10747 name = invalid;
10748 else if (name != NULL && name != invalid)
10749 name = _("*both*");
10750 else
10751 name = strtab + ivda.vda_name;
10752 }
10753 }
10754 if (name != NULL)
10755 nn += printf ("(%s%-*s",
10756 name,
10757 12 - (int) strlen (name),
10758 ")");
10759
10760 if (nn < 18)
10761 printf ("%*c", 18 - nn, ' ');
10762 }
10763
10764 putchar ('\n');
10765 }
10766
10767 free (data);
10768 free (strtab);
10769 free (symbols);
10770 }
10771 break;
10772
10773 default:
10774 break;
10775 }
10776 }
10777
10778 if (! found)
10779 printf (_("\nNo version information found in this file.\n"));
10780
10781 return TRUE;
10782 }
10783
10784 static const char *
10785 get_symbol_binding (Filedata * filedata, unsigned int binding)
10786 {
10787 static char buff[32];
10788
10789 switch (binding)
10790 {
10791 case STB_LOCAL: return "LOCAL";
10792 case STB_GLOBAL: return "GLOBAL";
10793 case STB_WEAK: return "WEAK";
10794 default:
10795 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10796 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10797 binding);
10798 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10799 {
10800 if (binding == STB_GNU_UNIQUE
10801 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10802 /* GNU is still using the default value 0. */
10803 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10804 return "UNIQUE";
10805 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10806 }
10807 else
10808 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10809 return buff;
10810 }
10811 }
10812
10813 static const char *
10814 get_symbol_type (Filedata * filedata, unsigned int type)
10815 {
10816 static char buff[32];
10817
10818 switch (type)
10819 {
10820 case STT_NOTYPE: return "NOTYPE";
10821 case STT_OBJECT: return "OBJECT";
10822 case STT_FUNC: return "FUNC";
10823 case STT_SECTION: return "SECTION";
10824 case STT_FILE: return "FILE";
10825 case STT_COMMON: return "COMMON";
10826 case STT_TLS: return "TLS";
10827 case STT_RELC: return "RELC";
10828 case STT_SRELC: return "SRELC";
10829 default:
10830 if (type >= STT_LOPROC && type <= STT_HIPROC)
10831 {
10832 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10833 return "THUMB_FUNC";
10834
10835 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10836 return "REGISTER";
10837
10838 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10839 return "PARISC_MILLI";
10840
10841 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10842 }
10843 else if (type >= STT_LOOS && type <= STT_HIOS)
10844 {
10845 if (filedata->file_header.e_machine == EM_PARISC)
10846 {
10847 if (type == STT_HP_OPAQUE)
10848 return "HP_OPAQUE";
10849 if (type == STT_HP_STUB)
10850 return "HP_STUB";
10851 }
10852
10853 if (type == STT_GNU_IFUNC
10854 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10855 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10856 /* GNU is still using the default value 0. */
10857 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10858 return "IFUNC";
10859
10860 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10861 }
10862 else
10863 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10864 return buff;
10865 }
10866 }
10867
10868 static const char *
10869 get_symbol_visibility (unsigned int visibility)
10870 {
10871 switch (visibility)
10872 {
10873 case STV_DEFAULT: return "DEFAULT";
10874 case STV_INTERNAL: return "INTERNAL";
10875 case STV_HIDDEN: return "HIDDEN";
10876 case STV_PROTECTED: return "PROTECTED";
10877 default:
10878 error (_("Unrecognized visibility value: %u"), visibility);
10879 return _("<unknown>");
10880 }
10881 }
10882
10883 static const char *
10884 get_solaris_symbol_visibility (unsigned int visibility)
10885 {
10886 switch (visibility)
10887 {
10888 case 4: return "EXPORTED";
10889 case 5: return "SINGLETON";
10890 case 6: return "ELIMINATE";
10891 default: return get_symbol_visibility (visibility);
10892 }
10893 }
10894
10895 static const char *
10896 get_mips_symbol_other (unsigned int other)
10897 {
10898 switch (other)
10899 {
10900 case STO_OPTIONAL: return "OPTIONAL";
10901 case STO_MIPS_PLT: return "MIPS PLT";
10902 case STO_MIPS_PIC: return "MIPS PIC";
10903 case STO_MICROMIPS: return "MICROMIPS";
10904 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10905 case STO_MIPS16: return "MIPS16";
10906 default: return NULL;
10907 }
10908 }
10909
10910 static const char *
10911 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10912 {
10913 if (is_ia64_vms (filedata))
10914 {
10915 static char res[32];
10916
10917 res[0] = 0;
10918
10919 /* Function types is for images and .STB files only. */
10920 switch (filedata->file_header.e_type)
10921 {
10922 case ET_DYN:
10923 case ET_EXEC:
10924 switch (VMS_ST_FUNC_TYPE (other))
10925 {
10926 case VMS_SFT_CODE_ADDR:
10927 strcat (res, " CA");
10928 break;
10929 case VMS_SFT_SYMV_IDX:
10930 strcat (res, " VEC");
10931 break;
10932 case VMS_SFT_FD:
10933 strcat (res, " FD");
10934 break;
10935 case VMS_SFT_RESERVE:
10936 strcat (res, " RSV");
10937 break;
10938 default:
10939 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10940 VMS_ST_FUNC_TYPE (other));
10941 strcat (res, " <unknown>");
10942 break;
10943 }
10944 break;
10945 default:
10946 break;
10947 }
10948 switch (VMS_ST_LINKAGE (other))
10949 {
10950 case VMS_STL_IGNORE:
10951 strcat (res, " IGN");
10952 break;
10953 case VMS_STL_RESERVE:
10954 strcat (res, " RSV");
10955 break;
10956 case VMS_STL_STD:
10957 strcat (res, " STD");
10958 break;
10959 case VMS_STL_LNK:
10960 strcat (res, " LNK");
10961 break;
10962 default:
10963 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10964 VMS_ST_LINKAGE (other));
10965 strcat (res, " <unknown>");
10966 break;
10967 }
10968
10969 if (res[0] != 0)
10970 return res + 1;
10971 else
10972 return res;
10973 }
10974 return NULL;
10975 }
10976
10977 static const char *
10978 get_ppc64_symbol_other (unsigned int other)
10979 {
10980 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10981 {
10982 static char buf[32];
10983 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10984 PPC64_LOCAL_ENTRY_OFFSET (other));
10985 return buf;
10986 }
10987 return NULL;
10988 }
10989
10990 static const char *
10991 get_symbol_other (Filedata * filedata, unsigned int other)
10992 {
10993 const char * result = NULL;
10994 static char buff [32];
10995
10996 if (other == 0)
10997 return "";
10998
10999 switch (filedata->file_header.e_machine)
11000 {
11001 case EM_MIPS:
11002 result = get_mips_symbol_other (other);
11003 break;
11004 case EM_IA_64:
11005 result = get_ia64_symbol_other (filedata, other);
11006 break;
11007 case EM_PPC64:
11008 result = get_ppc64_symbol_other (other);
11009 break;
11010 default:
11011 result = NULL;
11012 break;
11013 }
11014
11015 if (result)
11016 return result;
11017
11018 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11019 return buff;
11020 }
11021
11022 static const char *
11023 get_symbol_index_type (Filedata * filedata, unsigned int type)
11024 {
11025 static char buff[32];
11026
11027 switch (type)
11028 {
11029 case SHN_UNDEF: return "UND";
11030 case SHN_ABS: return "ABS";
11031 case SHN_COMMON: return "COM";
11032 default:
11033 if (type == SHN_IA_64_ANSI_COMMON
11034 && filedata->file_header.e_machine == EM_IA_64
11035 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11036 return "ANSI_COM";
11037 else if ((filedata->file_header.e_machine == EM_X86_64
11038 || filedata->file_header.e_machine == EM_L1OM
11039 || filedata->file_header.e_machine == EM_K1OM)
11040 && type == SHN_X86_64_LCOMMON)
11041 return "LARGE_COM";
11042 else if ((type == SHN_MIPS_SCOMMON
11043 && filedata->file_header.e_machine == EM_MIPS)
11044 || (type == SHN_TIC6X_SCOMMON
11045 && filedata->file_header.e_machine == EM_TI_C6000))
11046 return "SCOM";
11047 else if (type == SHN_MIPS_SUNDEFINED
11048 && filedata->file_header.e_machine == EM_MIPS)
11049 return "SUND";
11050 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11051 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11052 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11053 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11054 else if (type >= SHN_LORESERVE)
11055 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11056 else if (type >= filedata->file_header.e_shnum)
11057 sprintf (buff, _("bad section index[%3d]"), type);
11058 else
11059 sprintf (buff, "%3d", type);
11060 break;
11061 }
11062
11063 return buff;
11064 }
11065
11066 static bfd_vma *
11067 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11068 {
11069 unsigned char * e_data;
11070 bfd_vma * i_data;
11071
11072 /* If the size_t type is smaller than the bfd_size_type, eg because
11073 you are building a 32-bit tool on a 64-bit host, then make sure
11074 that when (number) is cast to (size_t) no information is lost. */
11075 if (sizeof (size_t) < sizeof (bfd_size_type)
11076 && (bfd_size_type) ((size_t) number) != number)
11077 {
11078 error (_("Size truncation prevents reading %s elements of size %u\n"),
11079 bfd_vmatoa ("u", number), ent_size);
11080 return NULL;
11081 }
11082
11083 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11084 attempting to allocate memory when the read is bound to fail. */
11085 if (ent_size * number > filedata->file_size)
11086 {
11087 error (_("Invalid number of dynamic entries: %s\n"),
11088 bfd_vmatoa ("u", number));
11089 return NULL;
11090 }
11091
11092 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11093 if (e_data == NULL)
11094 {
11095 error (_("Out of memory reading %s dynamic entries\n"),
11096 bfd_vmatoa ("u", number));
11097 return NULL;
11098 }
11099
11100 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11101 {
11102 error (_("Unable to read in %s bytes of dynamic data\n"),
11103 bfd_vmatoa ("u", number * ent_size));
11104 free (e_data);
11105 return NULL;
11106 }
11107
11108 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11109 if (i_data == NULL)
11110 {
11111 error (_("Out of memory allocating space for %s dynamic entries\n"),
11112 bfd_vmatoa ("u", number));
11113 free (e_data);
11114 return NULL;
11115 }
11116
11117 while (number--)
11118 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11119
11120 free (e_data);
11121
11122 return i_data;
11123 }
11124
11125 static void
11126 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11127 {
11128 Elf_Internal_Sym * psym;
11129 int n;
11130
11131 n = print_vma (si, DEC_5);
11132 if (n < 5)
11133 fputs (&" "[n], stdout);
11134 printf (" %3lu: ", hn);
11135
11136 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11137 {
11138 printf (_("<No info available for dynamic symbol number %lu>\n"),
11139 (unsigned long) si);
11140 return;
11141 }
11142
11143 psym = dynamic_symbols + si;
11144 print_vma (psym->st_value, LONG_HEX);
11145 putchar (' ');
11146 print_vma (psym->st_size, DEC_5);
11147
11148 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11149 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11150
11151 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11152 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11153 else
11154 {
11155 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11156
11157 printf (" %-7s", get_symbol_visibility (vis));
11158 /* Check to see if any other bits in the st_other field are set.
11159 Note - displaying this information disrupts the layout of the
11160 table being generated, but for the moment this case is very
11161 rare. */
11162 if (psym->st_other ^ vis)
11163 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11164 }
11165
11166 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11167 if (VALID_DYNAMIC_NAME (psym->st_name))
11168 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11169 else
11170 printf (_(" <corrupt: %14ld>"), psym->st_name);
11171 putchar ('\n');
11172 }
11173
11174 static const char *
11175 get_symbol_version_string (Filedata * filedata,
11176 bfd_boolean is_dynsym,
11177 const char * strtab,
11178 unsigned long int strtab_size,
11179 unsigned int si,
11180 Elf_Internal_Sym * psym,
11181 enum versioned_symbol_info * sym_info,
11182 unsigned short * vna_other)
11183 {
11184 unsigned char data[2];
11185 unsigned short vers_data;
11186 unsigned long offset;
11187
11188 if (!is_dynsym
11189 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11190 return NULL;
11191
11192 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11193 sizeof data + si * sizeof (vers_data));
11194
11195 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11196 sizeof (data), 1, _("version data")) == NULL)
11197 return NULL;
11198
11199 vers_data = byte_get (data, 2);
11200
11201 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11202 return NULL;
11203
11204 /* Usually we'd only see verdef for defined symbols, and verneed for
11205 undefined symbols. However, symbols defined by the linker in
11206 .dynbss for variables copied from a shared library in order to
11207 avoid text relocations are defined yet have verneed. We could
11208 use a heuristic to detect the special case, for example, check
11209 for verneed first on symbols defined in SHT_NOBITS sections, but
11210 it is simpler and more reliable to just look for both verdef and
11211 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11212
11213 if (psym->st_shndx != SHN_UNDEF
11214 && vers_data != 0x8001
11215 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11216 {
11217 Elf_Internal_Verdef ivd;
11218 Elf_Internal_Verdaux ivda;
11219 Elf_External_Verdaux evda;
11220 unsigned long off;
11221
11222 off = offset_from_vma (filedata,
11223 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11224 sizeof (Elf_External_Verdef));
11225
11226 do
11227 {
11228 Elf_External_Verdef evd;
11229
11230 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11231 _("version def")) == NULL)
11232 {
11233 ivd.vd_ndx = 0;
11234 ivd.vd_aux = 0;
11235 ivd.vd_next = 0;
11236 }
11237 else
11238 {
11239 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11240 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11241 ivd.vd_next = BYTE_GET (evd.vd_next);
11242 }
11243
11244 off += ivd.vd_next;
11245 }
11246 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11247
11248 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11249 {
11250 off -= ivd.vd_next;
11251 off += ivd.vd_aux;
11252
11253 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11254 _("version def aux")) != NULL)
11255 {
11256 ivda.vda_name = BYTE_GET (evda.vda_name);
11257
11258 if (psym->st_name != ivda.vda_name)
11259 {
11260 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11261 ? symbol_hidden : symbol_public);
11262 return (ivda.vda_name < strtab_size
11263 ? strtab + ivda.vda_name : _("<corrupt>"));
11264 }
11265 }
11266 }
11267 }
11268
11269 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11270 {
11271 Elf_External_Verneed evn;
11272 Elf_Internal_Verneed ivn;
11273 Elf_Internal_Vernaux ivna;
11274
11275 offset = offset_from_vma (filedata,
11276 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11277 sizeof evn);
11278 do
11279 {
11280 unsigned long vna_off;
11281
11282 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11283 _("version need")) == NULL)
11284 {
11285 ivna.vna_next = 0;
11286 ivna.vna_other = 0;
11287 ivna.vna_name = 0;
11288 break;
11289 }
11290
11291 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11292 ivn.vn_next = BYTE_GET (evn.vn_next);
11293
11294 vna_off = offset + ivn.vn_aux;
11295
11296 do
11297 {
11298 Elf_External_Vernaux evna;
11299
11300 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11301 _("version need aux (3)")) == NULL)
11302 {
11303 ivna.vna_next = 0;
11304 ivna.vna_other = 0;
11305 ivna.vna_name = 0;
11306 }
11307 else
11308 {
11309 ivna.vna_other = BYTE_GET (evna.vna_other);
11310 ivna.vna_next = BYTE_GET (evna.vna_next);
11311 ivna.vna_name = BYTE_GET (evna.vna_name);
11312 }
11313
11314 vna_off += ivna.vna_next;
11315 }
11316 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11317
11318 if (ivna.vna_other == vers_data)
11319 break;
11320
11321 offset += ivn.vn_next;
11322 }
11323 while (ivn.vn_next != 0);
11324
11325 if (ivna.vna_other == vers_data)
11326 {
11327 *sym_info = symbol_undefined;
11328 *vna_other = ivna.vna_other;
11329 return (ivna.vna_name < strtab_size
11330 ? strtab + ivna.vna_name : _("<corrupt>"));
11331 }
11332 }
11333 return NULL;
11334 }
11335
11336 /* Dump the symbol table. */
11337 static bfd_boolean
11338 process_symbol_table (Filedata * filedata)
11339 {
11340 Elf_Internal_Shdr * section;
11341 bfd_size_type nbuckets = 0;
11342 bfd_size_type nchains = 0;
11343 bfd_vma * buckets = NULL;
11344 bfd_vma * chains = NULL;
11345 bfd_vma ngnubuckets = 0;
11346 bfd_vma * gnubuckets = NULL;
11347 bfd_vma * gnuchains = NULL;
11348 bfd_vma gnusymidx = 0;
11349 bfd_size_type ngnuchains = 0;
11350
11351 if (!do_syms && !do_dyn_syms && !do_histogram)
11352 return TRUE;
11353
11354 if (dynamic_info[DT_HASH]
11355 && (do_histogram
11356 || (do_using_dynamic
11357 && !do_dyn_syms
11358 && dynamic_strings != NULL)))
11359 {
11360 unsigned char nb[8];
11361 unsigned char nc[8];
11362 unsigned int hash_ent_size = 4;
11363
11364 if ((filedata->file_header.e_machine == EM_ALPHA
11365 || filedata->file_header.e_machine == EM_S390
11366 || filedata->file_header.e_machine == EM_S390_OLD)
11367 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11368 hash_ent_size = 8;
11369
11370 if (fseek (filedata->handle,
11371 (archive_file_offset
11372 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11373 sizeof nb + sizeof nc)),
11374 SEEK_SET))
11375 {
11376 error (_("Unable to seek to start of dynamic information\n"));
11377 goto no_hash;
11378 }
11379
11380 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11381 {
11382 error (_("Failed to read in number of buckets\n"));
11383 goto no_hash;
11384 }
11385
11386 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11387 {
11388 error (_("Failed to read in number of chains\n"));
11389 goto no_hash;
11390 }
11391
11392 nbuckets = byte_get (nb, hash_ent_size);
11393 nchains = byte_get (nc, hash_ent_size);
11394
11395 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11396 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11397
11398 no_hash:
11399 if (buckets == NULL || chains == NULL)
11400 {
11401 if (do_using_dynamic)
11402 return FALSE;
11403 free (buckets);
11404 free (chains);
11405 buckets = NULL;
11406 chains = NULL;
11407 nbuckets = 0;
11408 nchains = 0;
11409 }
11410 }
11411
11412 if (dynamic_info_DT_GNU_HASH
11413 && (do_histogram
11414 || (do_using_dynamic
11415 && !do_dyn_syms
11416 && dynamic_strings != NULL)))
11417 {
11418 unsigned char nb[16];
11419 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11420 bfd_vma buckets_vma;
11421
11422 if (fseek (filedata->handle,
11423 (archive_file_offset
11424 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11425 sizeof nb)),
11426 SEEK_SET))
11427 {
11428 error (_("Unable to seek to start of dynamic information\n"));
11429 goto no_gnu_hash;
11430 }
11431
11432 if (fread (nb, 16, 1, filedata->handle) != 1)
11433 {
11434 error (_("Failed to read in number of buckets\n"));
11435 goto no_gnu_hash;
11436 }
11437
11438 ngnubuckets = byte_get (nb, 4);
11439 gnusymidx = byte_get (nb + 4, 4);
11440 bitmaskwords = byte_get (nb + 8, 4);
11441 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11442 if (is_32bit_elf)
11443 buckets_vma += bitmaskwords * 4;
11444 else
11445 buckets_vma += bitmaskwords * 8;
11446
11447 if (fseek (filedata->handle,
11448 (archive_file_offset
11449 + offset_from_vma (filedata, buckets_vma, 4)),
11450 SEEK_SET))
11451 {
11452 error (_("Unable to seek to start of dynamic information\n"));
11453 goto no_gnu_hash;
11454 }
11455
11456 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11457
11458 if (gnubuckets == NULL)
11459 goto no_gnu_hash;
11460
11461 for (i = 0; i < ngnubuckets; i++)
11462 if (gnubuckets[i] != 0)
11463 {
11464 if (gnubuckets[i] < gnusymidx)
11465 return FALSE;
11466
11467 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11468 maxchain = gnubuckets[i];
11469 }
11470
11471 if (maxchain == 0xffffffff)
11472 goto no_gnu_hash;
11473
11474 maxchain -= gnusymidx;
11475
11476 if (fseek (filedata->handle,
11477 (archive_file_offset
11478 + offset_from_vma (filedata, buckets_vma
11479 + 4 * (ngnubuckets + maxchain), 4)),
11480 SEEK_SET))
11481 {
11482 error (_("Unable to seek to start of dynamic information\n"));
11483 goto no_gnu_hash;
11484 }
11485
11486 do
11487 {
11488 if (fread (nb, 4, 1, filedata->handle) != 1)
11489 {
11490 error (_("Failed to determine last chain length\n"));
11491 goto no_gnu_hash;
11492 }
11493
11494 if (maxchain + 1 == 0)
11495 goto no_gnu_hash;
11496
11497 ++maxchain;
11498 }
11499 while ((byte_get (nb, 4) & 1) == 0);
11500
11501 if (fseek (filedata->handle,
11502 (archive_file_offset
11503 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11504 SEEK_SET))
11505 {
11506 error (_("Unable to seek to start of dynamic information\n"));
11507 goto no_gnu_hash;
11508 }
11509
11510 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11511 ngnuchains = maxchain;
11512
11513 no_gnu_hash:
11514 if (gnuchains == NULL)
11515 {
11516 free (gnubuckets);
11517 gnubuckets = NULL;
11518 ngnubuckets = 0;
11519 if (do_using_dynamic)
11520 return FALSE;
11521 }
11522 }
11523
11524 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11525 && do_syms
11526 && do_using_dynamic
11527 && dynamic_strings != NULL
11528 && dynamic_symbols != NULL)
11529 {
11530 unsigned long hn;
11531
11532 if (dynamic_info[DT_HASH])
11533 {
11534 bfd_vma si;
11535 char *visited;
11536
11537 printf (_("\nSymbol table for image:\n"));
11538 if (is_32bit_elf)
11539 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11540 else
11541 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11542
11543 visited = xcmalloc (nchains, 1);
11544 memset (visited, 0, nchains);
11545 for (hn = 0; hn < nbuckets; hn++)
11546 {
11547 for (si = buckets[hn]; si > 0; si = chains[si])
11548 {
11549 print_dynamic_symbol (filedata, si, hn);
11550 if (si >= nchains || visited[si])
11551 {
11552 error (_("histogram chain is corrupt\n"));
11553 break;
11554 }
11555 visited[si] = 1;
11556 }
11557 }
11558 free (visited);
11559 }
11560
11561 if (dynamic_info_DT_GNU_HASH)
11562 {
11563 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11564 if (is_32bit_elf)
11565 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11566 else
11567 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11568
11569 for (hn = 0; hn < ngnubuckets; ++hn)
11570 if (gnubuckets[hn] != 0)
11571 {
11572 bfd_vma si = gnubuckets[hn];
11573 bfd_vma off = si - gnusymidx;
11574
11575 do
11576 {
11577 print_dynamic_symbol (filedata, si, hn);
11578 si++;
11579 }
11580 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11581 }
11582 }
11583 }
11584 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11585 && filedata->section_headers != NULL)
11586 {
11587 unsigned int i;
11588
11589 for (i = 0, section = filedata->section_headers;
11590 i < filedata->file_header.e_shnum;
11591 i++, section++)
11592 {
11593 unsigned int si;
11594 char * strtab = NULL;
11595 unsigned long int strtab_size = 0;
11596 Elf_Internal_Sym * symtab;
11597 Elf_Internal_Sym * psym;
11598 unsigned long num_syms;
11599
11600 if ((section->sh_type != SHT_SYMTAB
11601 && section->sh_type != SHT_DYNSYM)
11602 || (!do_syms
11603 && section->sh_type == SHT_SYMTAB))
11604 continue;
11605
11606 if (section->sh_entsize == 0)
11607 {
11608 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11609 printable_section_name (filedata, section));
11610 continue;
11611 }
11612
11613 num_syms = section->sh_size / section->sh_entsize;
11614 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11615 "\nSymbol table '%s' contains %lu entries:\n",
11616 num_syms),
11617 printable_section_name (filedata, section),
11618 num_syms);
11619
11620 if (is_32bit_elf)
11621 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11622 else
11623 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11624
11625 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11626 if (symtab == NULL)
11627 continue;
11628
11629 if (section->sh_link == filedata->file_header.e_shstrndx)
11630 {
11631 strtab = filedata->string_table;
11632 strtab_size = filedata->string_table_length;
11633 }
11634 else if (section->sh_link < filedata->file_header.e_shnum)
11635 {
11636 Elf_Internal_Shdr * string_sec;
11637
11638 string_sec = filedata->section_headers + section->sh_link;
11639
11640 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11641 1, string_sec->sh_size,
11642 _("string table"));
11643 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11644 }
11645
11646 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11647 {
11648 const char *version_string;
11649 enum versioned_symbol_info sym_info;
11650 unsigned short vna_other;
11651
11652 printf ("%6d: ", si);
11653 print_vma (psym->st_value, LONG_HEX);
11654 putchar (' ');
11655 print_vma (psym->st_size, DEC_5);
11656 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11657 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11658 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11659 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11660 else
11661 {
11662 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11663
11664 printf (" %-7s", get_symbol_visibility (vis));
11665 /* Check to see if any other bits in the st_other field are set.
11666 Note - displaying this information disrupts the layout of the
11667 table being generated, but for the moment this case is very rare. */
11668 if (psym->st_other ^ vis)
11669 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11670 }
11671 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11672 print_symbol (25, psym->st_name < strtab_size
11673 ? strtab + psym->st_name : _("<corrupt>"));
11674
11675 version_string
11676 = get_symbol_version_string (filedata,
11677 section->sh_type == SHT_DYNSYM,
11678 strtab, strtab_size, si,
11679 psym, &sym_info, &vna_other);
11680 if (version_string)
11681 {
11682 if (sym_info == symbol_undefined)
11683 printf ("@%s (%d)", version_string, vna_other);
11684 else
11685 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11686 version_string);
11687 }
11688
11689 putchar ('\n');
11690
11691 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11692 && si >= section->sh_info
11693 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11694 && filedata->file_header.e_machine != EM_MIPS
11695 /* Solaris binaries have been found to violate this requirement as
11696 well. Not sure if this is a bug or an ABI requirement. */
11697 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11698 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11699 si, printable_section_name (filedata, section), section->sh_info);
11700 }
11701
11702 free (symtab);
11703 if (strtab != filedata->string_table)
11704 free (strtab);
11705 }
11706 }
11707 else if (do_syms)
11708 printf
11709 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11710
11711 if (do_histogram && buckets != NULL)
11712 {
11713 unsigned long * lengths;
11714 unsigned long * counts;
11715 unsigned long hn;
11716 bfd_vma si;
11717 unsigned long maxlength = 0;
11718 unsigned long nzero_counts = 0;
11719 unsigned long nsyms = 0;
11720 char *visited;
11721
11722 printf (ngettext ("\nHistogram for bucket list length "
11723 "(total of %lu bucket):\n",
11724 "\nHistogram for bucket list length "
11725 "(total of %lu buckets):\n",
11726 (unsigned long) nbuckets),
11727 (unsigned long) nbuckets);
11728
11729 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11730 if (lengths == NULL)
11731 {
11732 error (_("Out of memory allocating space for histogram buckets\n"));
11733 return FALSE;
11734 }
11735 visited = xcmalloc (nchains, 1);
11736 memset (visited, 0, nchains);
11737
11738 printf (_(" Length Number %% of total Coverage\n"));
11739 for (hn = 0; hn < nbuckets; ++hn)
11740 {
11741 for (si = buckets[hn]; si > 0; si = chains[si])
11742 {
11743 ++nsyms;
11744 if (maxlength < ++lengths[hn])
11745 ++maxlength;
11746 if (si >= nchains || visited[si])
11747 {
11748 error (_("histogram chain is corrupt\n"));
11749 break;
11750 }
11751 visited[si] = 1;
11752 }
11753 }
11754 free (visited);
11755
11756 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11757 if (counts == NULL)
11758 {
11759 free (lengths);
11760 error (_("Out of memory allocating space for histogram counts\n"));
11761 return FALSE;
11762 }
11763
11764 for (hn = 0; hn < nbuckets; ++hn)
11765 ++counts[lengths[hn]];
11766
11767 if (nbuckets > 0)
11768 {
11769 unsigned long i;
11770 printf (" 0 %-10lu (%5.1f%%)\n",
11771 counts[0], (counts[0] * 100.0) / nbuckets);
11772 for (i = 1; i <= maxlength; ++i)
11773 {
11774 nzero_counts += counts[i] * i;
11775 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11776 i, counts[i], (counts[i] * 100.0) / nbuckets,
11777 (nzero_counts * 100.0) / nsyms);
11778 }
11779 }
11780
11781 free (counts);
11782 free (lengths);
11783 }
11784
11785 if (buckets != NULL)
11786 {
11787 free (buckets);
11788 free (chains);
11789 }
11790
11791 if (do_histogram && gnubuckets != NULL)
11792 {
11793 unsigned long * lengths;
11794 unsigned long * counts;
11795 unsigned long hn;
11796 unsigned long maxlength = 0;
11797 unsigned long nzero_counts = 0;
11798 unsigned long nsyms = 0;
11799
11800 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11801 "(total of %lu bucket):\n",
11802 "\nHistogram for `.gnu.hash' bucket list length "
11803 "(total of %lu buckets):\n",
11804 (unsigned long) ngnubuckets),
11805 (unsigned long) ngnubuckets);
11806
11807 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11808 if (lengths == NULL)
11809 {
11810 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11811 return FALSE;
11812 }
11813
11814 printf (_(" Length Number %% of total Coverage\n"));
11815
11816 for (hn = 0; hn < ngnubuckets; ++hn)
11817 if (gnubuckets[hn] != 0)
11818 {
11819 bfd_vma off, length = 1;
11820
11821 for (off = gnubuckets[hn] - gnusymidx;
11822 /* PR 17531 file: 010-77222-0.004. */
11823 off < ngnuchains && (gnuchains[off] & 1) == 0;
11824 ++off)
11825 ++length;
11826 lengths[hn] = length;
11827 if (length > maxlength)
11828 maxlength = length;
11829 nsyms += length;
11830 }
11831
11832 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11833 if (counts == NULL)
11834 {
11835 free (lengths);
11836 error (_("Out of memory allocating space for gnu histogram counts\n"));
11837 return FALSE;
11838 }
11839
11840 for (hn = 0; hn < ngnubuckets; ++hn)
11841 ++counts[lengths[hn]];
11842
11843 if (ngnubuckets > 0)
11844 {
11845 unsigned long j;
11846 printf (" 0 %-10lu (%5.1f%%)\n",
11847 counts[0], (counts[0] * 100.0) / ngnubuckets);
11848 for (j = 1; j <= maxlength; ++j)
11849 {
11850 nzero_counts += counts[j] * j;
11851 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11852 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11853 (nzero_counts * 100.0) / nsyms);
11854 }
11855 }
11856
11857 free (counts);
11858 free (lengths);
11859 free (gnubuckets);
11860 free (gnuchains);
11861 }
11862
11863 return TRUE;
11864 }
11865
11866 static bfd_boolean
11867 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11868 {
11869 unsigned int i;
11870
11871 if (dynamic_syminfo == NULL
11872 || !do_dynamic)
11873 /* No syminfo, this is ok. */
11874 return TRUE;
11875
11876 /* There better should be a dynamic symbol section. */
11877 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11878 return FALSE;
11879
11880 if (dynamic_addr)
11881 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11882 "contains %d entry:\n",
11883 "\nDynamic info segment at offset 0x%lx "
11884 "contains %d entries:\n",
11885 dynamic_syminfo_nent),
11886 dynamic_syminfo_offset, dynamic_syminfo_nent);
11887
11888 printf (_(" Num: Name BoundTo Flags\n"));
11889 for (i = 0; i < dynamic_syminfo_nent; ++i)
11890 {
11891 unsigned short int flags = dynamic_syminfo[i].si_flags;
11892
11893 printf ("%4d: ", i);
11894 if (i >= num_dynamic_syms)
11895 printf (_("<corrupt index>"));
11896 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11897 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11898 else
11899 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11900 putchar (' ');
11901
11902 switch (dynamic_syminfo[i].si_boundto)
11903 {
11904 case SYMINFO_BT_SELF:
11905 fputs ("SELF ", stdout);
11906 break;
11907 case SYMINFO_BT_PARENT:
11908 fputs ("PARENT ", stdout);
11909 break;
11910 default:
11911 if (dynamic_syminfo[i].si_boundto > 0
11912 && dynamic_syminfo[i].si_boundto < dynamic_nent
11913 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11914 {
11915 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11916 putchar (' ' );
11917 }
11918 else
11919 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11920 break;
11921 }
11922
11923 if (flags & SYMINFO_FLG_DIRECT)
11924 printf (" DIRECT");
11925 if (flags & SYMINFO_FLG_PASSTHRU)
11926 printf (" PASSTHRU");
11927 if (flags & SYMINFO_FLG_COPY)
11928 printf (" COPY");
11929 if (flags & SYMINFO_FLG_LAZYLOAD)
11930 printf (" LAZYLOAD");
11931
11932 puts ("");
11933 }
11934
11935 return TRUE;
11936 }
11937
11938 #define IN_RANGE(START,END,ADDR,OFF) \
11939 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11940
11941 /* Check to see if the given reloc needs to be handled in a target specific
11942 manner. If so then process the reloc and return TRUE otherwise return
11943 FALSE.
11944
11945 If called with reloc == NULL, then this is a signal that reloc processing
11946 for the current section has finished, and any saved state should be
11947 discarded. */
11948
11949 static bfd_boolean
11950 target_specific_reloc_handling (Filedata * filedata,
11951 Elf_Internal_Rela * reloc,
11952 unsigned char * start,
11953 unsigned char * end,
11954 Elf_Internal_Sym * symtab,
11955 unsigned long num_syms)
11956 {
11957 unsigned int reloc_type = 0;
11958 unsigned long sym_index = 0;
11959
11960 if (reloc)
11961 {
11962 reloc_type = get_reloc_type (filedata, reloc->r_info);
11963 sym_index = get_reloc_symindex (reloc->r_info);
11964 }
11965
11966 switch (filedata->file_header.e_machine)
11967 {
11968 case EM_MSP430:
11969 case EM_MSP430_OLD:
11970 {
11971 static Elf_Internal_Sym * saved_sym = NULL;
11972
11973 if (reloc == NULL)
11974 {
11975 saved_sym = NULL;
11976 return TRUE;
11977 }
11978
11979 switch (reloc_type)
11980 {
11981 case 10: /* R_MSP430_SYM_DIFF */
11982 if (uses_msp430x_relocs (filedata))
11983 break;
11984 /* Fall through. */
11985 case 21: /* R_MSP430X_SYM_DIFF */
11986 /* PR 21139. */
11987 if (sym_index >= num_syms)
11988 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11989 sym_index);
11990 else
11991 saved_sym = symtab + sym_index;
11992 return TRUE;
11993
11994 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11995 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11996 goto handle_sym_diff;
11997
11998 case 5: /* R_MSP430_16_BYTE */
11999 case 9: /* R_MSP430_8 */
12000 if (uses_msp430x_relocs (filedata))
12001 break;
12002 goto handle_sym_diff;
12003
12004 case 2: /* R_MSP430_ABS16 */
12005 case 15: /* R_MSP430X_ABS16 */
12006 if (! uses_msp430x_relocs (filedata))
12007 break;
12008 goto handle_sym_diff;
12009
12010 handle_sym_diff:
12011 if (saved_sym != NULL)
12012 {
12013 int reloc_size = reloc_type == 1 ? 4 : 2;
12014 bfd_vma value;
12015
12016 if (sym_index >= num_syms)
12017 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12018 sym_index);
12019 else
12020 {
12021 value = reloc->r_addend + (symtab[sym_index].st_value
12022 - saved_sym->st_value);
12023
12024 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12025 byte_put (start + reloc->r_offset, value, reloc_size);
12026 else
12027 /* PR 21137 */
12028 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12029 (long) reloc->r_offset);
12030 }
12031
12032 saved_sym = NULL;
12033 return TRUE;
12034 }
12035 break;
12036
12037 default:
12038 if (saved_sym != NULL)
12039 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12040 break;
12041 }
12042 break;
12043 }
12044
12045 case EM_MN10300:
12046 case EM_CYGNUS_MN10300:
12047 {
12048 static Elf_Internal_Sym * saved_sym = NULL;
12049
12050 if (reloc == NULL)
12051 {
12052 saved_sym = NULL;
12053 return TRUE;
12054 }
12055
12056 switch (reloc_type)
12057 {
12058 case 34: /* R_MN10300_ALIGN */
12059 return TRUE;
12060 case 33: /* R_MN10300_SYM_DIFF */
12061 if (sym_index >= num_syms)
12062 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12063 sym_index);
12064 else
12065 saved_sym = symtab + sym_index;
12066 return TRUE;
12067
12068 case 1: /* R_MN10300_32 */
12069 case 2: /* R_MN10300_16 */
12070 if (saved_sym != NULL)
12071 {
12072 int reloc_size = reloc_type == 1 ? 4 : 2;
12073 bfd_vma value;
12074
12075 if (sym_index >= num_syms)
12076 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12077 sym_index);
12078 else
12079 {
12080 value = reloc->r_addend + (symtab[sym_index].st_value
12081 - saved_sym->st_value);
12082
12083 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12084 byte_put (start + reloc->r_offset, value, reloc_size);
12085 else
12086 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12087 (long) reloc->r_offset);
12088 }
12089
12090 saved_sym = NULL;
12091 return TRUE;
12092 }
12093 break;
12094 default:
12095 if (saved_sym != NULL)
12096 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12097 break;
12098 }
12099 break;
12100 }
12101
12102 case EM_RL78:
12103 {
12104 static bfd_vma saved_sym1 = 0;
12105 static bfd_vma saved_sym2 = 0;
12106 static bfd_vma value;
12107
12108 if (reloc == NULL)
12109 {
12110 saved_sym1 = saved_sym2 = 0;
12111 return TRUE;
12112 }
12113
12114 switch (reloc_type)
12115 {
12116 case 0x80: /* R_RL78_SYM. */
12117 saved_sym1 = saved_sym2;
12118 if (sym_index >= num_syms)
12119 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12120 sym_index);
12121 else
12122 {
12123 saved_sym2 = symtab[sym_index].st_value;
12124 saved_sym2 += reloc->r_addend;
12125 }
12126 return TRUE;
12127
12128 case 0x83: /* R_RL78_OPsub. */
12129 value = saved_sym1 - saved_sym2;
12130 saved_sym2 = saved_sym1 = 0;
12131 return TRUE;
12132 break;
12133
12134 case 0x41: /* R_RL78_ABS32. */
12135 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12136 byte_put (start + reloc->r_offset, value, 4);
12137 else
12138 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12139 (long) reloc->r_offset);
12140 value = 0;
12141 return TRUE;
12142
12143 case 0x43: /* R_RL78_ABS16. */
12144 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12145 byte_put (start + reloc->r_offset, value, 2);
12146 else
12147 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12148 (long) reloc->r_offset);
12149 value = 0;
12150 return TRUE;
12151
12152 default:
12153 break;
12154 }
12155 break;
12156 }
12157 }
12158
12159 return FALSE;
12160 }
12161
12162 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12163 DWARF debug sections. This is a target specific test. Note - we do not
12164 go through the whole including-target-headers-multiple-times route, (as
12165 we have already done with <elf/h8.h>) because this would become very
12166 messy and even then this function would have to contain target specific
12167 information (the names of the relocs instead of their numeric values).
12168 FIXME: This is not the correct way to solve this problem. The proper way
12169 is to have target specific reloc sizing and typing functions created by
12170 the reloc-macros.h header, in the same way that it already creates the
12171 reloc naming functions. */
12172
12173 static bfd_boolean
12174 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12175 {
12176 /* Please keep this table alpha-sorted for ease of visual lookup. */
12177 switch (filedata->file_header.e_machine)
12178 {
12179 case EM_386:
12180 case EM_IAMCU:
12181 return reloc_type == 1; /* R_386_32. */
12182 case EM_68K:
12183 return reloc_type == 1; /* R_68K_32. */
12184 case EM_AARCH64:
12185 return (reloc_type == 258
12186 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12187 case EM_ADAPTEVA_EPIPHANY:
12188 return reloc_type == 3;
12189 case EM_ALPHA:
12190 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12191 case EM_ARC:
12192 return reloc_type == 1; /* R_ARC_32. */
12193 case EM_ARC_COMPACT:
12194 case EM_ARC_COMPACT2:
12195 return reloc_type == 4; /* R_ARC_32. */
12196 case EM_ARM:
12197 return reloc_type == 2; /* R_ARM_ABS32 */
12198 case EM_AVR_OLD:
12199 case EM_AVR:
12200 return reloc_type == 1;
12201 case EM_BLACKFIN:
12202 return reloc_type == 0x12; /* R_byte4_data. */
12203 case EM_CRIS:
12204 return reloc_type == 3; /* R_CRIS_32. */
12205 case EM_CR16:
12206 return reloc_type == 3; /* R_CR16_NUM32. */
12207 case EM_CRX:
12208 return reloc_type == 15; /* R_CRX_NUM32. */
12209 case EM_CYGNUS_FRV:
12210 return reloc_type == 1;
12211 case EM_CYGNUS_D10V:
12212 case EM_D10V:
12213 return reloc_type == 6; /* R_D10V_32. */
12214 case EM_CYGNUS_D30V:
12215 case EM_D30V:
12216 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12217 case EM_DLX:
12218 return reloc_type == 3; /* R_DLX_RELOC_32. */
12219 case EM_CYGNUS_FR30:
12220 case EM_FR30:
12221 return reloc_type == 3; /* R_FR30_32. */
12222 case EM_FT32:
12223 return reloc_type == 1; /* R_FT32_32. */
12224 case EM_H8S:
12225 case EM_H8_300:
12226 case EM_H8_300H:
12227 return reloc_type == 1; /* R_H8_DIR32. */
12228 case EM_IA_64:
12229 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12230 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12231 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12232 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12233 case EM_IP2K_OLD:
12234 case EM_IP2K:
12235 return reloc_type == 2; /* R_IP2K_32. */
12236 case EM_IQ2000:
12237 return reloc_type == 2; /* R_IQ2000_32. */
12238 case EM_LATTICEMICO32:
12239 return reloc_type == 3; /* R_LM32_32. */
12240 case EM_M32C_OLD:
12241 case EM_M32C:
12242 return reloc_type == 3; /* R_M32C_32. */
12243 case EM_M32R:
12244 return reloc_type == 34; /* R_M32R_32_RELA. */
12245 case EM_68HC11:
12246 case EM_68HC12:
12247 return reloc_type == 6; /* R_M68HC11_32. */
12248 case EM_MCORE:
12249 return reloc_type == 1; /* R_MCORE_ADDR32. */
12250 case EM_CYGNUS_MEP:
12251 return reloc_type == 4; /* R_MEP_32. */
12252 case EM_METAG:
12253 return reloc_type == 2; /* R_METAG_ADDR32. */
12254 case EM_MICROBLAZE:
12255 return reloc_type == 1; /* R_MICROBLAZE_32. */
12256 case EM_MIPS:
12257 return reloc_type == 2; /* R_MIPS_32. */
12258 case EM_MMIX:
12259 return reloc_type == 4; /* R_MMIX_32. */
12260 case EM_CYGNUS_MN10200:
12261 case EM_MN10200:
12262 return reloc_type == 1; /* R_MN10200_32. */
12263 case EM_CYGNUS_MN10300:
12264 case EM_MN10300:
12265 return reloc_type == 1; /* R_MN10300_32. */
12266 case EM_MOXIE:
12267 return reloc_type == 1; /* R_MOXIE_32. */
12268 case EM_MSP430_OLD:
12269 case EM_MSP430:
12270 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12271 case EM_MT:
12272 return reloc_type == 2; /* R_MT_32. */
12273 case EM_NDS32:
12274 return reloc_type == 20; /* R_NDS32_RELA. */
12275 case EM_ALTERA_NIOS2:
12276 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12277 case EM_NIOS32:
12278 return reloc_type == 1; /* R_NIOS_32. */
12279 case EM_OR1K:
12280 return reloc_type == 1; /* R_OR1K_32. */
12281 case EM_PARISC:
12282 return (reloc_type == 1 /* R_PARISC_DIR32. */
12283 || reloc_type == 41); /* R_PARISC_SECREL32. */
12284 case EM_PJ:
12285 case EM_PJ_OLD:
12286 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12287 case EM_PPC64:
12288 return reloc_type == 1; /* R_PPC64_ADDR32. */
12289 case EM_PPC:
12290 return reloc_type == 1; /* R_PPC_ADDR32. */
12291 case EM_TI_PRU:
12292 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12293 case EM_RISCV:
12294 return reloc_type == 1; /* R_RISCV_32. */
12295 case EM_RL78:
12296 return reloc_type == 1; /* R_RL78_DIR32. */
12297 case EM_RX:
12298 return reloc_type == 1; /* R_RX_DIR32. */
12299 case EM_S370:
12300 return reloc_type == 1; /* R_I370_ADDR31. */
12301 case EM_S390_OLD:
12302 case EM_S390:
12303 return reloc_type == 4; /* R_S390_32. */
12304 case EM_SCORE:
12305 return reloc_type == 8; /* R_SCORE_ABS32. */
12306 case EM_SH:
12307 return reloc_type == 1; /* R_SH_DIR32. */
12308 case EM_SPARC32PLUS:
12309 case EM_SPARCV9:
12310 case EM_SPARC:
12311 return reloc_type == 3 /* R_SPARC_32. */
12312 || reloc_type == 23; /* R_SPARC_UA32. */
12313 case EM_SPU:
12314 return reloc_type == 6; /* R_SPU_ADDR32 */
12315 case EM_TI_C6000:
12316 return reloc_type == 1; /* R_C6000_ABS32. */
12317 case EM_TILEGX:
12318 return reloc_type == 2; /* R_TILEGX_32. */
12319 case EM_TILEPRO:
12320 return reloc_type == 1; /* R_TILEPRO_32. */
12321 case EM_CYGNUS_V850:
12322 case EM_V850:
12323 return reloc_type == 6; /* R_V850_ABS32. */
12324 case EM_V800:
12325 return reloc_type == 0x33; /* R_V810_WORD. */
12326 case EM_VAX:
12327 return reloc_type == 1; /* R_VAX_32. */
12328 case EM_VISIUM:
12329 return reloc_type == 3; /* R_VISIUM_32. */
12330 case EM_WEBASSEMBLY:
12331 return reloc_type == 1; /* R_WASM32_32. */
12332 case EM_X86_64:
12333 case EM_L1OM:
12334 case EM_K1OM:
12335 return reloc_type == 10; /* R_X86_64_32. */
12336 case EM_XC16X:
12337 case EM_C166:
12338 return reloc_type == 3; /* R_XC16C_ABS_32. */
12339 case EM_XGATE:
12340 return reloc_type == 4; /* R_XGATE_32. */
12341 case EM_XSTORMY16:
12342 return reloc_type == 1; /* R_XSTROMY16_32. */
12343 case EM_XTENSA_OLD:
12344 case EM_XTENSA:
12345 return reloc_type == 1; /* R_XTENSA_32. */
12346 default:
12347 {
12348 static unsigned int prev_warn = 0;
12349
12350 /* Avoid repeating the same warning multiple times. */
12351 if (prev_warn != filedata->file_header.e_machine)
12352 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12353 filedata->file_header.e_machine);
12354 prev_warn = filedata->file_header.e_machine;
12355 return FALSE;
12356 }
12357 }
12358 }
12359
12360 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12361 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12362
12363 static bfd_boolean
12364 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12365 {
12366 switch (filedata->file_header.e_machine)
12367 /* Please keep this table alpha-sorted for ease of visual lookup. */
12368 {
12369 case EM_386:
12370 case EM_IAMCU:
12371 return reloc_type == 2; /* R_386_PC32. */
12372 case EM_68K:
12373 return reloc_type == 4; /* R_68K_PC32. */
12374 case EM_AARCH64:
12375 return reloc_type == 261; /* R_AARCH64_PREL32 */
12376 case EM_ADAPTEVA_EPIPHANY:
12377 return reloc_type == 6;
12378 case EM_ALPHA:
12379 return reloc_type == 10; /* R_ALPHA_SREL32. */
12380 case EM_ARC_COMPACT:
12381 case EM_ARC_COMPACT2:
12382 return reloc_type == 49; /* R_ARC_32_PCREL. */
12383 case EM_ARM:
12384 return reloc_type == 3; /* R_ARM_REL32 */
12385 case EM_AVR_OLD:
12386 case EM_AVR:
12387 return reloc_type == 36; /* R_AVR_32_PCREL. */
12388 case EM_MICROBLAZE:
12389 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12390 case EM_OR1K:
12391 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12392 case EM_PARISC:
12393 return reloc_type == 9; /* R_PARISC_PCREL32. */
12394 case EM_PPC:
12395 return reloc_type == 26; /* R_PPC_REL32. */
12396 case EM_PPC64:
12397 return reloc_type == 26; /* R_PPC64_REL32. */
12398 case EM_S390_OLD:
12399 case EM_S390:
12400 return reloc_type == 5; /* R_390_PC32. */
12401 case EM_SH:
12402 return reloc_type == 2; /* R_SH_REL32. */
12403 case EM_SPARC32PLUS:
12404 case EM_SPARCV9:
12405 case EM_SPARC:
12406 return reloc_type == 6; /* R_SPARC_DISP32. */
12407 case EM_SPU:
12408 return reloc_type == 13; /* R_SPU_REL32. */
12409 case EM_TILEGX:
12410 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12411 case EM_TILEPRO:
12412 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12413 case EM_VISIUM:
12414 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12415 case EM_X86_64:
12416 case EM_L1OM:
12417 case EM_K1OM:
12418 return reloc_type == 2; /* R_X86_64_PC32. */
12419 case EM_XTENSA_OLD:
12420 case EM_XTENSA:
12421 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12422 default:
12423 /* Do not abort or issue an error message here. Not all targets use
12424 pc-relative 32-bit relocs in their DWARF debug information and we
12425 have already tested for target coverage in is_32bit_abs_reloc. A
12426 more helpful warning message will be generated by apply_relocations
12427 anyway, so just return. */
12428 return FALSE;
12429 }
12430 }
12431
12432 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12433 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12434
12435 static bfd_boolean
12436 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12437 {
12438 switch (filedata->file_header.e_machine)
12439 {
12440 case EM_AARCH64:
12441 return reloc_type == 257; /* R_AARCH64_ABS64. */
12442 case EM_ALPHA:
12443 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12444 case EM_IA_64:
12445 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12446 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12447 case EM_PARISC:
12448 return reloc_type == 80; /* R_PARISC_DIR64. */
12449 case EM_PPC64:
12450 return reloc_type == 38; /* R_PPC64_ADDR64. */
12451 case EM_RISCV:
12452 return reloc_type == 2; /* R_RISCV_64. */
12453 case EM_SPARC32PLUS:
12454 case EM_SPARCV9:
12455 case EM_SPARC:
12456 return reloc_type == 32 /* R_SPARC_64. */
12457 || reloc_type == 54; /* R_SPARC_UA64. */
12458 case EM_X86_64:
12459 case EM_L1OM:
12460 case EM_K1OM:
12461 return reloc_type == 1; /* R_X86_64_64. */
12462 case EM_S390_OLD:
12463 case EM_S390:
12464 return reloc_type == 22; /* R_S390_64. */
12465 case EM_TILEGX:
12466 return reloc_type == 1; /* R_TILEGX_64. */
12467 case EM_MIPS:
12468 return reloc_type == 18; /* R_MIPS_64. */
12469 default:
12470 return FALSE;
12471 }
12472 }
12473
12474 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12475 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12476
12477 static bfd_boolean
12478 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12479 {
12480 switch (filedata->file_header.e_machine)
12481 {
12482 case EM_AARCH64:
12483 return reloc_type == 260; /* R_AARCH64_PREL64. */
12484 case EM_ALPHA:
12485 return reloc_type == 11; /* R_ALPHA_SREL64. */
12486 case EM_IA_64:
12487 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12488 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12489 case EM_PARISC:
12490 return reloc_type == 72; /* R_PARISC_PCREL64. */
12491 case EM_PPC64:
12492 return reloc_type == 44; /* R_PPC64_REL64. */
12493 case EM_SPARC32PLUS:
12494 case EM_SPARCV9:
12495 case EM_SPARC:
12496 return reloc_type == 46; /* R_SPARC_DISP64. */
12497 case EM_X86_64:
12498 case EM_L1OM:
12499 case EM_K1OM:
12500 return reloc_type == 24; /* R_X86_64_PC64. */
12501 case EM_S390_OLD:
12502 case EM_S390:
12503 return reloc_type == 23; /* R_S390_PC64. */
12504 case EM_TILEGX:
12505 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12506 default:
12507 return FALSE;
12508 }
12509 }
12510
12511 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12512 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12513
12514 static bfd_boolean
12515 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12516 {
12517 switch (filedata->file_header.e_machine)
12518 {
12519 case EM_CYGNUS_MN10200:
12520 case EM_MN10200:
12521 return reloc_type == 4; /* R_MN10200_24. */
12522 case EM_FT32:
12523 return reloc_type == 5; /* R_FT32_20. */
12524 default:
12525 return FALSE;
12526 }
12527 }
12528
12529 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12530 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12531
12532 static bfd_boolean
12533 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12534 {
12535 /* Please keep this table alpha-sorted for ease of visual lookup. */
12536 switch (filedata->file_header.e_machine)
12537 {
12538 case EM_ARC:
12539 case EM_ARC_COMPACT:
12540 case EM_ARC_COMPACT2:
12541 return reloc_type == 2; /* R_ARC_16. */
12542 case EM_ADAPTEVA_EPIPHANY:
12543 return reloc_type == 5;
12544 case EM_AVR_OLD:
12545 case EM_AVR:
12546 return reloc_type == 4; /* R_AVR_16. */
12547 case EM_CYGNUS_D10V:
12548 case EM_D10V:
12549 return reloc_type == 3; /* R_D10V_16. */
12550 case EM_FT32:
12551 return reloc_type == 2; /* R_FT32_16. */
12552 case EM_H8S:
12553 case EM_H8_300:
12554 case EM_H8_300H:
12555 return reloc_type == R_H8_DIR16;
12556 case EM_IP2K_OLD:
12557 case EM_IP2K:
12558 return reloc_type == 1; /* R_IP2K_16. */
12559 case EM_M32C_OLD:
12560 case EM_M32C:
12561 return reloc_type == 1; /* R_M32C_16 */
12562 case EM_CYGNUS_MN10200:
12563 case EM_MN10200:
12564 return reloc_type == 2; /* R_MN10200_16. */
12565 case EM_CYGNUS_MN10300:
12566 case EM_MN10300:
12567 return reloc_type == 2; /* R_MN10300_16. */
12568 case EM_MSP430:
12569 if (uses_msp430x_relocs (filedata))
12570 return reloc_type == 2; /* R_MSP430_ABS16. */
12571 /* Fall through. */
12572 case EM_MSP430_OLD:
12573 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12574 case EM_NDS32:
12575 return reloc_type == 19; /* R_NDS32_RELA. */
12576 case EM_ALTERA_NIOS2:
12577 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12578 case EM_NIOS32:
12579 return reloc_type == 9; /* R_NIOS_16. */
12580 case EM_OR1K:
12581 return reloc_type == 2; /* R_OR1K_16. */
12582 case EM_TI_PRU:
12583 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12584 case EM_TI_C6000:
12585 return reloc_type == 2; /* R_C6000_ABS16. */
12586 case EM_VISIUM:
12587 return reloc_type == 2; /* R_VISIUM_16. */
12588 case EM_XC16X:
12589 case EM_C166:
12590 return reloc_type == 2; /* R_XC16C_ABS_16. */
12591 case EM_XGATE:
12592 return reloc_type == 3; /* R_XGATE_16. */
12593 default:
12594 return FALSE;
12595 }
12596 }
12597
12598 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12599 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12600
12601 static bfd_boolean
12602 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12603 {
12604 /* Please keep this table alpha-sorted for ease of visual lookup. */
12605 switch (filedata->file_header.e_machine)
12606 {
12607 case EM_RISCV:
12608 return reloc_type == 35; /* R_RISCV_ADD32. */
12609 default:
12610 return FALSE;
12611 }
12612 }
12613
12614 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12615 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12616
12617 static bfd_boolean
12618 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12619 {
12620 /* Please keep this table alpha-sorted for ease of visual lookup. */
12621 switch (filedata->file_header.e_machine)
12622 {
12623 case EM_RISCV:
12624 return reloc_type == 39; /* R_RISCV_SUB32. */
12625 default:
12626 return FALSE;
12627 }
12628 }
12629
12630 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12631 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12632
12633 static bfd_boolean
12634 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12635 {
12636 /* Please keep this table alpha-sorted for ease of visual lookup. */
12637 switch (filedata->file_header.e_machine)
12638 {
12639 case EM_RISCV:
12640 return reloc_type == 36; /* R_RISCV_ADD64. */
12641 default:
12642 return FALSE;
12643 }
12644 }
12645
12646 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12647 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12648
12649 static bfd_boolean
12650 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12651 {
12652 /* Please keep this table alpha-sorted for ease of visual lookup. */
12653 switch (filedata->file_header.e_machine)
12654 {
12655 case EM_RISCV:
12656 return reloc_type == 40; /* R_RISCV_SUB64. */
12657 default:
12658 return FALSE;
12659 }
12660 }
12661
12662 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12663 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12664
12665 static bfd_boolean
12666 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12667 {
12668 /* Please keep this table alpha-sorted for ease of visual lookup. */
12669 switch (filedata->file_header.e_machine)
12670 {
12671 case EM_RISCV:
12672 return reloc_type == 34; /* R_RISCV_ADD16. */
12673 default:
12674 return FALSE;
12675 }
12676 }
12677
12678 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12679 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12680
12681 static bfd_boolean
12682 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12683 {
12684 /* Please keep this table alpha-sorted for ease of visual lookup. */
12685 switch (filedata->file_header.e_machine)
12686 {
12687 case EM_RISCV:
12688 return reloc_type == 38; /* R_RISCV_SUB16. */
12689 default:
12690 return FALSE;
12691 }
12692 }
12693
12694 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12695 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12696
12697 static bfd_boolean
12698 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12699 {
12700 /* Please keep this table alpha-sorted for ease of visual lookup. */
12701 switch (filedata->file_header.e_machine)
12702 {
12703 case EM_RISCV:
12704 return reloc_type == 33; /* R_RISCV_ADD8. */
12705 default:
12706 return FALSE;
12707 }
12708 }
12709
12710 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12711 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12712
12713 static bfd_boolean
12714 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12715 {
12716 /* Please keep this table alpha-sorted for ease of visual lookup. */
12717 switch (filedata->file_header.e_machine)
12718 {
12719 case EM_RISCV:
12720 return reloc_type == 37; /* R_RISCV_SUB8. */
12721 default:
12722 return FALSE;
12723 }
12724 }
12725
12726 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12727 relocation entries (possibly formerly used for SHT_GROUP sections). */
12728
12729 static bfd_boolean
12730 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12731 {
12732 switch (filedata->file_header.e_machine)
12733 {
12734 case EM_386: /* R_386_NONE. */
12735 case EM_68K: /* R_68K_NONE. */
12736 case EM_ADAPTEVA_EPIPHANY:
12737 case EM_ALPHA: /* R_ALPHA_NONE. */
12738 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12739 case EM_ARC: /* R_ARC_NONE. */
12740 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12741 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12742 case EM_ARM: /* R_ARM_NONE. */
12743 case EM_C166: /* R_XC16X_NONE. */
12744 case EM_CRIS: /* R_CRIS_NONE. */
12745 case EM_FT32: /* R_FT32_NONE. */
12746 case EM_IA_64: /* R_IA64_NONE. */
12747 case EM_K1OM: /* R_X86_64_NONE. */
12748 case EM_L1OM: /* R_X86_64_NONE. */
12749 case EM_M32R: /* R_M32R_NONE. */
12750 case EM_MIPS: /* R_MIPS_NONE. */
12751 case EM_MN10300: /* R_MN10300_NONE. */
12752 case EM_MOXIE: /* R_MOXIE_NONE. */
12753 case EM_NIOS32: /* R_NIOS_NONE. */
12754 case EM_OR1K: /* R_OR1K_NONE. */
12755 case EM_PARISC: /* R_PARISC_NONE. */
12756 case EM_PPC64: /* R_PPC64_NONE. */
12757 case EM_PPC: /* R_PPC_NONE. */
12758 case EM_RISCV: /* R_RISCV_NONE. */
12759 case EM_S390: /* R_390_NONE. */
12760 case EM_S390_OLD:
12761 case EM_SH: /* R_SH_NONE. */
12762 case EM_SPARC32PLUS:
12763 case EM_SPARC: /* R_SPARC_NONE. */
12764 case EM_SPARCV9:
12765 case EM_TILEGX: /* R_TILEGX_NONE. */
12766 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12767 case EM_TI_C6000:/* R_C6000_NONE. */
12768 case EM_X86_64: /* R_X86_64_NONE. */
12769 case EM_XC16X:
12770 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
12771 return reloc_type == 0;
12772
12773 case EM_AARCH64:
12774 return reloc_type == 0 || reloc_type == 256;
12775 case EM_AVR_OLD:
12776 case EM_AVR:
12777 return (reloc_type == 0 /* R_AVR_NONE. */
12778 || reloc_type == 30 /* R_AVR_DIFF8. */
12779 || reloc_type == 31 /* R_AVR_DIFF16. */
12780 || reloc_type == 32 /* R_AVR_DIFF32. */);
12781 case EM_METAG:
12782 return reloc_type == 3; /* R_METAG_NONE. */
12783 case EM_NDS32:
12784 return (reloc_type == 0 /* R_XTENSA_NONE. */
12785 || reloc_type == 204 /* R_NDS32_DIFF8. */
12786 || reloc_type == 205 /* R_NDS32_DIFF16. */
12787 || reloc_type == 206 /* R_NDS32_DIFF32. */
12788 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12789 case EM_TI_PRU:
12790 return (reloc_type == 0 /* R_PRU_NONE. */
12791 || reloc_type == 65 /* R_PRU_DIFF8. */
12792 || reloc_type == 66 /* R_PRU_DIFF16. */
12793 || reloc_type == 67 /* R_PRU_DIFF32. */);
12794 case EM_XTENSA_OLD:
12795 case EM_XTENSA:
12796 return (reloc_type == 0 /* R_XTENSA_NONE. */
12797 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12798 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12799 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12800 }
12801 return FALSE;
12802 }
12803
12804 /* Returns TRUE if there is a relocation against
12805 section NAME at OFFSET bytes. */
12806
12807 bfd_boolean
12808 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12809 {
12810 Elf_Internal_Rela * relocs;
12811 Elf_Internal_Rela * rp;
12812
12813 if (dsec == NULL || dsec->reloc_info == NULL)
12814 return FALSE;
12815
12816 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12817
12818 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12819 if (rp->r_offset == offset)
12820 return TRUE;
12821
12822 return FALSE;
12823 }
12824
12825 /* Apply relocations to a section.
12826 Returns TRUE upon success, FALSE otherwise.
12827 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12828 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12829 will be set to the number of relocs loaded.
12830
12831 Note: So far support has been added only for those relocations
12832 which can be found in debug sections. FIXME: Add support for
12833 more relocations ? */
12834
12835 static bfd_boolean
12836 apply_relocations (Filedata * filedata,
12837 const Elf_Internal_Shdr * section,
12838 unsigned char * start,
12839 bfd_size_type size,
12840 void ** relocs_return,
12841 unsigned long * num_relocs_return)
12842 {
12843 Elf_Internal_Shdr * relsec;
12844 unsigned char * end = start + size;
12845 bfd_boolean res = TRUE;
12846
12847 if (relocs_return != NULL)
12848 {
12849 * (Elf_Internal_Rela **) relocs_return = NULL;
12850 * num_relocs_return = 0;
12851 }
12852
12853 if (filedata->file_header.e_type != ET_REL)
12854 /* No relocs to apply. */
12855 return TRUE;
12856
12857 /* Find the reloc section associated with the section. */
12858 for (relsec = filedata->section_headers;
12859 relsec < filedata->section_headers + filedata->file_header.e_shnum;
12860 ++relsec)
12861 {
12862 bfd_boolean is_rela;
12863 unsigned long num_relocs;
12864 Elf_Internal_Rela * relocs;
12865 Elf_Internal_Rela * rp;
12866 Elf_Internal_Shdr * symsec;
12867 Elf_Internal_Sym * symtab;
12868 unsigned long num_syms;
12869 Elf_Internal_Sym * sym;
12870
12871 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12872 || relsec->sh_info >= filedata->file_header.e_shnum
12873 || filedata->section_headers + relsec->sh_info != section
12874 || relsec->sh_size == 0
12875 || relsec->sh_link >= filedata->file_header.e_shnum)
12876 continue;
12877
12878 is_rela = relsec->sh_type == SHT_RELA;
12879
12880 if (is_rela)
12881 {
12882 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
12883 relsec->sh_size, & relocs, & num_relocs))
12884 return FALSE;
12885 }
12886 else
12887 {
12888 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
12889 relsec->sh_size, & relocs, & num_relocs))
12890 return FALSE;
12891 }
12892
12893 /* SH uses RELA but uses in place value instead of the addend field. */
12894 if (filedata->file_header.e_machine == EM_SH)
12895 is_rela = FALSE;
12896
12897 symsec = filedata->section_headers + relsec->sh_link;
12898 if (symsec->sh_type != SHT_SYMTAB
12899 && symsec->sh_type != SHT_DYNSYM)
12900 return FALSE;
12901 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
12902
12903 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12904 {
12905 bfd_vma addend;
12906 unsigned int reloc_type;
12907 unsigned int reloc_size;
12908 bfd_boolean reloc_inplace = FALSE;
12909 bfd_boolean reloc_subtract = FALSE;
12910 unsigned char * rloc;
12911 unsigned long sym_index;
12912
12913 reloc_type = get_reloc_type (filedata, rp->r_info);
12914
12915 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
12916 continue;
12917 else if (is_none_reloc (filedata, reloc_type))
12918 continue;
12919 else if (is_32bit_abs_reloc (filedata, reloc_type)
12920 || is_32bit_pcrel_reloc (filedata, reloc_type))
12921 reloc_size = 4;
12922 else if (is_64bit_abs_reloc (filedata, reloc_type)
12923 || is_64bit_pcrel_reloc (filedata, reloc_type))
12924 reloc_size = 8;
12925 else if (is_24bit_abs_reloc (filedata, reloc_type))
12926 reloc_size = 3;
12927 else if (is_16bit_abs_reloc (filedata, reloc_type))
12928 reloc_size = 2;
12929 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
12930 reloc_type))
12931 || is_32bit_inplace_add_reloc (filedata, reloc_type))
12932 {
12933 reloc_size = 4;
12934 reloc_inplace = TRUE;
12935 }
12936 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
12937 reloc_type))
12938 || is_64bit_inplace_add_reloc (filedata, reloc_type))
12939 {
12940 reloc_size = 8;
12941 reloc_inplace = TRUE;
12942 }
12943 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
12944 reloc_type))
12945 || is_16bit_inplace_add_reloc (filedata, reloc_type))
12946 {
12947 reloc_size = 2;
12948 reloc_inplace = TRUE;
12949 }
12950 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
12951 reloc_type))
12952 || is_8bit_inplace_add_reloc (filedata, reloc_type))
12953 {
12954 reloc_size = 1;
12955 reloc_inplace = TRUE;
12956 }
12957 else
12958 {
12959 static unsigned int prev_reloc = 0;
12960
12961 if (reloc_type != prev_reloc)
12962 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12963 reloc_type, printable_section_name (filedata, section));
12964 prev_reloc = reloc_type;
12965 res = FALSE;
12966 continue;
12967 }
12968
12969 rloc = start + rp->r_offset;
12970 if ((rloc + reloc_size) > end || (rloc < start))
12971 {
12972 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12973 (unsigned long) rp->r_offset,
12974 printable_section_name (filedata, section));
12975 res = FALSE;
12976 continue;
12977 }
12978
12979 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12980 if (sym_index >= num_syms)
12981 {
12982 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12983 sym_index, printable_section_name (filedata, section));
12984 res = FALSE;
12985 continue;
12986 }
12987 sym = symtab + sym_index;
12988
12989 /* If the reloc has a symbol associated with it,
12990 make sure that it is of an appropriate type.
12991
12992 Relocations against symbols without type can happen.
12993 Gcc -feliminate-dwarf2-dups may generate symbols
12994 without type for debug info.
12995
12996 Icc generates relocations against function symbols
12997 instead of local labels.
12998
12999 Relocations against object symbols can happen, eg when
13000 referencing a global array. For an example of this see
13001 the _clz.o binary in libgcc.a. */
13002 if (sym != symtab
13003 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13004 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13005 {
13006 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13007 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13008 printable_section_name (filedata, relsec),
13009 (long int)(rp - relocs));
13010 res = FALSE;
13011 continue;
13012 }
13013
13014 addend = 0;
13015 if (is_rela)
13016 addend += rp->r_addend;
13017 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13018 partial_inplace. */
13019 if (!is_rela
13020 || (filedata->file_header.e_machine == EM_XTENSA
13021 && reloc_type == 1)
13022 || ((filedata->file_header.e_machine == EM_PJ
13023 || filedata->file_header.e_machine == EM_PJ_OLD)
13024 && reloc_type == 1)
13025 || ((filedata->file_header.e_machine == EM_D30V
13026 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13027 && reloc_type == 12)
13028 || reloc_inplace)
13029 addend += byte_get (rloc, reloc_size);
13030
13031 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13032 || is_64bit_pcrel_reloc (filedata, reloc_type))
13033 {
13034 /* On HPPA, all pc-relative relocations are biased by 8. */
13035 if (filedata->file_header.e_machine == EM_PARISC)
13036 addend -= 8;
13037 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13038 reloc_size);
13039 }
13040 else if (reloc_subtract)
13041 byte_put (rloc, addend - sym->st_value, reloc_size);
13042 else
13043 byte_put (rloc, addend + sym->st_value, reloc_size);
13044 }
13045
13046 free (symtab);
13047 /* Let the target specific reloc processing code know that
13048 we have finished with these relocs. */
13049 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13050
13051 if (relocs_return)
13052 {
13053 * (Elf_Internal_Rela **) relocs_return = relocs;
13054 * num_relocs_return = num_relocs;
13055 }
13056 else
13057 free (relocs);
13058
13059 break;
13060 }
13061
13062 return res;
13063 }
13064
13065 #ifdef SUPPORT_DISASSEMBLY
13066 static bfd_boolean
13067 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13068 {
13069 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13070
13071 /* FIXME: XXX -- to be done --- XXX */
13072
13073 return TRUE;
13074 }
13075 #endif
13076
13077 /* Reads in the contents of SECTION from FILE, returning a pointer
13078 to a malloc'ed buffer or NULL if something went wrong. */
13079
13080 static char *
13081 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13082 {
13083 bfd_size_type num_bytes = section->sh_size;
13084
13085 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13086 {
13087 printf (_("Section '%s' has no data to dump.\n"),
13088 printable_section_name (filedata, section));
13089 return NULL;
13090 }
13091
13092 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13093 _("section contents"));
13094 }
13095
13096 /* Uncompresses a section that was compressed using zlib, in place. */
13097
13098 static bfd_boolean
13099 uncompress_section_contents (unsigned char ** buffer,
13100 dwarf_size_type uncompressed_size,
13101 dwarf_size_type * size)
13102 {
13103 dwarf_size_type compressed_size = *size;
13104 unsigned char * compressed_buffer = *buffer;
13105 unsigned char * uncompressed_buffer;
13106 z_stream strm;
13107 int rc;
13108
13109 /* It is possible the section consists of several compressed
13110 buffers concatenated together, so we uncompress in a loop. */
13111 /* PR 18313: The state field in the z_stream structure is supposed
13112 to be invisible to the user (ie us), but some compilers will
13113 still complain about it being used without initialisation. So
13114 we first zero the entire z_stream structure and then set the fields
13115 that we need. */
13116 memset (& strm, 0, sizeof strm);
13117 strm.avail_in = compressed_size;
13118 strm.next_in = (Bytef *) compressed_buffer;
13119 strm.avail_out = uncompressed_size;
13120 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13121
13122 rc = inflateInit (& strm);
13123 while (strm.avail_in > 0)
13124 {
13125 if (rc != Z_OK)
13126 goto fail;
13127 strm.next_out = ((Bytef *) uncompressed_buffer
13128 + (uncompressed_size - strm.avail_out));
13129 rc = inflate (&strm, Z_FINISH);
13130 if (rc != Z_STREAM_END)
13131 goto fail;
13132 rc = inflateReset (& strm);
13133 }
13134 rc = inflateEnd (& strm);
13135 if (rc != Z_OK
13136 || strm.avail_out != 0)
13137 goto fail;
13138
13139 *buffer = uncompressed_buffer;
13140 *size = uncompressed_size;
13141 return TRUE;
13142
13143 fail:
13144 free (uncompressed_buffer);
13145 /* Indicate decompression failure. */
13146 *buffer = NULL;
13147 return FALSE;
13148 }
13149
13150 static bfd_boolean
13151 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13152 {
13153 Elf_Internal_Shdr * relsec;
13154 bfd_size_type num_bytes;
13155 unsigned char * data;
13156 unsigned char * end;
13157 unsigned char * real_start;
13158 unsigned char * start;
13159 bfd_boolean some_strings_shown;
13160
13161 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13162 if (start == NULL)
13163 /* PR 21820: Do not fail if the section was empty. */
13164 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13165
13166 num_bytes = section->sh_size;
13167
13168 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13169
13170 if (decompress_dumps)
13171 {
13172 dwarf_size_type new_size = num_bytes;
13173 dwarf_size_type uncompressed_size = 0;
13174
13175 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13176 {
13177 Elf_Internal_Chdr chdr;
13178 unsigned int compression_header_size
13179 = get_compression_header (& chdr, (unsigned char *) start,
13180 num_bytes);
13181
13182 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13183 {
13184 warn (_("section '%s' has unsupported compress type: %d\n"),
13185 printable_section_name (filedata, section), chdr.ch_type);
13186 return FALSE;
13187 }
13188 else if (chdr.ch_addralign != section->sh_addralign)
13189 {
13190 warn (_("compressed section '%s' is corrupted\n"),
13191 printable_section_name (filedata, section));
13192 return FALSE;
13193 }
13194 uncompressed_size = chdr.ch_size;
13195 start += compression_header_size;
13196 new_size -= compression_header_size;
13197 }
13198 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13199 {
13200 /* Read the zlib header. In this case, it should be "ZLIB"
13201 followed by the uncompressed section size, 8 bytes in
13202 big-endian order. */
13203 uncompressed_size = start[4]; uncompressed_size <<= 8;
13204 uncompressed_size += start[5]; uncompressed_size <<= 8;
13205 uncompressed_size += start[6]; uncompressed_size <<= 8;
13206 uncompressed_size += start[7]; uncompressed_size <<= 8;
13207 uncompressed_size += start[8]; uncompressed_size <<= 8;
13208 uncompressed_size += start[9]; uncompressed_size <<= 8;
13209 uncompressed_size += start[10]; uncompressed_size <<= 8;
13210 uncompressed_size += start[11];
13211 start += 12;
13212 new_size -= 12;
13213 }
13214
13215 if (uncompressed_size)
13216 {
13217 if (uncompress_section_contents (& start,
13218 uncompressed_size, & new_size))
13219 num_bytes = new_size;
13220 else
13221 {
13222 error (_("Unable to decompress section %s\n"),
13223 printable_section_name (filedata, section));
13224 return FALSE;
13225 }
13226 }
13227 else
13228 start = real_start;
13229 }
13230
13231 /* If the section being dumped has relocations against it the user might
13232 be expecting these relocations to have been applied. Check for this
13233 case and issue a warning message in order to avoid confusion.
13234 FIXME: Maybe we ought to have an option that dumps a section with
13235 relocs applied ? */
13236 for (relsec = filedata->section_headers;
13237 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13238 ++relsec)
13239 {
13240 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13241 || relsec->sh_info >= filedata->file_header.e_shnum
13242 || filedata->section_headers + relsec->sh_info != section
13243 || relsec->sh_size == 0
13244 || relsec->sh_link >= filedata->file_header.e_shnum)
13245 continue;
13246
13247 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13248 break;
13249 }
13250
13251 data = start;
13252 end = start + num_bytes;
13253 some_strings_shown = FALSE;
13254
13255 while (data < end)
13256 {
13257 while (!ISPRINT (* data))
13258 if (++ data >= end)
13259 break;
13260
13261 if (data < end)
13262 {
13263 size_t maxlen = end - data;
13264
13265 #ifndef __MSVCRT__
13266 /* PR 11128: Use two separate invocations in order to work
13267 around bugs in the Solaris 8 implementation of printf. */
13268 printf (" [%6tx] ", data - start);
13269 #else
13270 printf (" [%6Ix] ", (size_t) (data - start));
13271 #endif
13272 if (maxlen > 0)
13273 {
13274 print_symbol ((int) maxlen, (const char *) data);
13275 putchar ('\n');
13276 data += strnlen ((const char *) data, maxlen);
13277 }
13278 else
13279 {
13280 printf (_("<corrupt>\n"));
13281 data = end;
13282 }
13283 some_strings_shown = TRUE;
13284 }
13285 }
13286
13287 if (! some_strings_shown)
13288 printf (_(" No strings found in this section."));
13289
13290 free (real_start);
13291
13292 putchar ('\n');
13293 return TRUE;
13294 }
13295
13296 static bfd_boolean
13297 dump_section_as_bytes (Elf_Internal_Shdr * section,
13298 Filedata * filedata,
13299 bfd_boolean relocate)
13300 {
13301 Elf_Internal_Shdr * relsec;
13302 bfd_size_type bytes;
13303 bfd_size_type section_size;
13304 bfd_vma addr;
13305 unsigned char * data;
13306 unsigned char * real_start;
13307 unsigned char * start;
13308
13309 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13310 if (start == NULL)
13311 /* PR 21820: Do not fail if the section was empty. */
13312 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13313
13314 section_size = section->sh_size;
13315
13316 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13317
13318 if (decompress_dumps)
13319 {
13320 dwarf_size_type new_size = section_size;
13321 dwarf_size_type uncompressed_size = 0;
13322
13323 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13324 {
13325 Elf_Internal_Chdr chdr;
13326 unsigned int compression_header_size
13327 = get_compression_header (& chdr, start, section_size);
13328
13329 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13330 {
13331 warn (_("section '%s' has unsupported compress type: %d\n"),
13332 printable_section_name (filedata, section), chdr.ch_type);
13333 return FALSE;
13334 }
13335 else if (chdr.ch_addralign != section->sh_addralign)
13336 {
13337 warn (_("compressed section '%s' is corrupted\n"),
13338 printable_section_name (filedata, section));
13339 return FALSE;
13340 }
13341 uncompressed_size = chdr.ch_size;
13342 start += compression_header_size;
13343 new_size -= compression_header_size;
13344 }
13345 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13346 {
13347 /* Read the zlib header. In this case, it should be "ZLIB"
13348 followed by the uncompressed section size, 8 bytes in
13349 big-endian order. */
13350 uncompressed_size = start[4]; uncompressed_size <<= 8;
13351 uncompressed_size += start[5]; uncompressed_size <<= 8;
13352 uncompressed_size += start[6]; uncompressed_size <<= 8;
13353 uncompressed_size += start[7]; uncompressed_size <<= 8;
13354 uncompressed_size += start[8]; uncompressed_size <<= 8;
13355 uncompressed_size += start[9]; uncompressed_size <<= 8;
13356 uncompressed_size += start[10]; uncompressed_size <<= 8;
13357 uncompressed_size += start[11];
13358 start += 12;
13359 new_size -= 12;
13360 }
13361
13362 if (uncompressed_size)
13363 {
13364 if (uncompress_section_contents (& start, uncompressed_size,
13365 & new_size))
13366 {
13367 section_size = new_size;
13368 }
13369 else
13370 {
13371 error (_("Unable to decompress section %s\n"),
13372 printable_section_name (filedata, section));
13373 /* FIXME: Print the section anyway ? */
13374 return FALSE;
13375 }
13376 }
13377 else
13378 start = real_start;
13379 }
13380
13381 if (relocate)
13382 {
13383 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13384 return FALSE;
13385 }
13386 else
13387 {
13388 /* If the section being dumped has relocations against it the user might
13389 be expecting these relocations to have been applied. Check for this
13390 case and issue a warning message in order to avoid confusion.
13391 FIXME: Maybe we ought to have an option that dumps a section with
13392 relocs applied ? */
13393 for (relsec = filedata->section_headers;
13394 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13395 ++relsec)
13396 {
13397 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13398 || relsec->sh_info >= filedata->file_header.e_shnum
13399 || filedata->section_headers + relsec->sh_info != section
13400 || relsec->sh_size == 0
13401 || relsec->sh_link >= filedata->file_header.e_shnum)
13402 continue;
13403
13404 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13405 break;
13406 }
13407 }
13408
13409 addr = section->sh_addr;
13410 bytes = section_size;
13411 data = start;
13412
13413 while (bytes)
13414 {
13415 int j;
13416 int k;
13417 int lbytes;
13418
13419 lbytes = (bytes > 16 ? 16 : bytes);
13420
13421 printf (" 0x%8.8lx ", (unsigned long) addr);
13422
13423 for (j = 0; j < 16; j++)
13424 {
13425 if (j < lbytes)
13426 printf ("%2.2x", data[j]);
13427 else
13428 printf (" ");
13429
13430 if ((j & 3) == 3)
13431 printf (" ");
13432 }
13433
13434 for (j = 0; j < lbytes; j++)
13435 {
13436 k = data[j];
13437 if (k >= ' ' && k < 0x7f)
13438 printf ("%c", k);
13439 else
13440 printf (".");
13441 }
13442
13443 putchar ('\n');
13444
13445 data += lbytes;
13446 addr += lbytes;
13447 bytes -= lbytes;
13448 }
13449
13450 free (real_start);
13451
13452 putchar ('\n');
13453 return TRUE;
13454 }
13455
13456 static bfd_boolean
13457 load_specific_debug_section (enum dwarf_section_display_enum debug,
13458 const Elf_Internal_Shdr * sec,
13459 void * data)
13460 {
13461 struct dwarf_section * section = &debug_displays [debug].section;
13462 char buf [64];
13463 Filedata * filedata = (Filedata *) data;
13464
13465 if (section->start != NULL)
13466 {
13467 /* If it is already loaded, do nothing. */
13468 if (streq (section->filename, filedata->file_name))
13469 return TRUE;
13470 free (section->start);
13471 }
13472
13473 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13474 section->address = sec->sh_addr;
13475 section->user_data = NULL;
13476 section->filename = filedata->file_name;
13477 section->start = (unsigned char *) get_data (NULL, filedata,
13478 sec->sh_offset, 1,
13479 sec->sh_size, buf);
13480 if (section->start == NULL)
13481 section->size = 0;
13482 else
13483 {
13484 unsigned char *start = section->start;
13485 dwarf_size_type size = sec->sh_size;
13486 dwarf_size_type uncompressed_size = 0;
13487
13488 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13489 {
13490 Elf_Internal_Chdr chdr;
13491 unsigned int compression_header_size;
13492
13493 if (size < (is_32bit_elf
13494 ? sizeof (Elf32_External_Chdr)
13495 : sizeof (Elf64_External_Chdr)))
13496 {
13497 warn (_("compressed section %s is too small to contain a compression header"),
13498 section->name);
13499 return FALSE;
13500 }
13501
13502 compression_header_size = get_compression_header (&chdr, start, size);
13503
13504 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13505 {
13506 warn (_("section '%s' has unsupported compress type: %d\n"),
13507 section->name, chdr.ch_type);
13508 return FALSE;
13509 }
13510 else if (chdr.ch_addralign != sec->sh_addralign)
13511 {
13512 warn (_("compressed section '%s' is corrupted\n"),
13513 section->name);
13514 return FALSE;
13515 }
13516 uncompressed_size = chdr.ch_size;
13517 start += compression_header_size;
13518 size -= compression_header_size;
13519 }
13520 else if (size > 12 && streq ((char *) start, "ZLIB"))
13521 {
13522 /* Read the zlib header. In this case, it should be "ZLIB"
13523 followed by the uncompressed section size, 8 bytes in
13524 big-endian order. */
13525 uncompressed_size = start[4]; uncompressed_size <<= 8;
13526 uncompressed_size += start[5]; uncompressed_size <<= 8;
13527 uncompressed_size += start[6]; uncompressed_size <<= 8;
13528 uncompressed_size += start[7]; uncompressed_size <<= 8;
13529 uncompressed_size += start[8]; uncompressed_size <<= 8;
13530 uncompressed_size += start[9]; uncompressed_size <<= 8;
13531 uncompressed_size += start[10]; uncompressed_size <<= 8;
13532 uncompressed_size += start[11];
13533 start += 12;
13534 size -= 12;
13535 }
13536
13537 if (uncompressed_size)
13538 {
13539 if (uncompress_section_contents (&start, uncompressed_size,
13540 &size))
13541 {
13542 /* Free the compressed buffer, update the section buffer
13543 and the section size if uncompress is successful. */
13544 free (section->start);
13545 section->start = start;
13546 }
13547 else
13548 {
13549 error (_("Unable to decompress section %s\n"),
13550 printable_section_name (filedata, sec));
13551 return FALSE;
13552 }
13553 }
13554
13555 section->size = size;
13556 }
13557
13558 if (section->start == NULL)
13559 return FALSE;
13560
13561 if (debug_displays [debug].relocate)
13562 {
13563 if (! apply_relocations (filedata, sec, section->start, section->size,
13564 & section->reloc_info, & section->num_relocs))
13565 return FALSE;
13566 }
13567 else
13568 {
13569 section->reloc_info = NULL;
13570 section->num_relocs = 0;
13571 }
13572
13573 return TRUE;
13574 }
13575
13576 /* If this is not NULL, load_debug_section will only look for sections
13577 within the list of sections given here. */
13578 static unsigned int * section_subset = NULL;
13579
13580 bfd_boolean
13581 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13582 {
13583 struct dwarf_section * section = &debug_displays [debug].section;
13584 Elf_Internal_Shdr * sec;
13585 Filedata * filedata = (Filedata *) data;
13586
13587 /* Without section headers we cannot find any sections. */
13588 if (filedata->section_headers == NULL)
13589 return FALSE;
13590
13591 if (filedata->string_table == NULL
13592 && filedata->file_header.e_shstrndx != SHN_UNDEF
13593 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13594 {
13595 Elf_Internal_Shdr * strs;
13596
13597 /* Read in the string table, so that we have section names to scan. */
13598 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13599
13600 if (strs != NULL && strs->sh_size != 0)
13601 {
13602 filedata->string_table
13603 = (char *) get_data (NULL, filedata, strs->sh_offset,
13604 1, strs->sh_size, _("string table"));
13605
13606 filedata->string_table_length
13607 = filedata->string_table != NULL ? strs->sh_size : 0;
13608 }
13609 }
13610
13611 /* Locate the debug section. */
13612 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13613 if (sec != NULL)
13614 section->name = section->uncompressed_name;
13615 else
13616 {
13617 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13618 if (sec != NULL)
13619 section->name = section->compressed_name;
13620 }
13621 if (sec == NULL)
13622 return FALSE;
13623
13624 /* If we're loading from a subset of sections, and we've loaded
13625 a section matching this name before, it's likely that it's a
13626 different one. */
13627 if (section_subset != NULL)
13628 free_debug_section (debug);
13629
13630 return load_specific_debug_section (debug, sec, data);
13631 }
13632
13633 void
13634 free_debug_section (enum dwarf_section_display_enum debug)
13635 {
13636 struct dwarf_section * section = &debug_displays [debug].section;
13637
13638 if (section->start == NULL)
13639 return;
13640
13641 free ((char *) section->start);
13642 section->start = NULL;
13643 section->address = 0;
13644 section->size = 0;
13645 }
13646
13647 static bfd_boolean
13648 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13649 {
13650 char * name = SECTION_NAME (section);
13651 const char * print_name = printable_section_name (filedata, section);
13652 bfd_size_type length;
13653 bfd_boolean result = TRUE;
13654 int i;
13655
13656 length = section->sh_size;
13657 if (length == 0)
13658 {
13659 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13660 return TRUE;
13661 }
13662 if (section->sh_type == SHT_NOBITS)
13663 {
13664 /* There is no point in dumping the contents of a debugging section
13665 which has the NOBITS type - the bits in the file will be random.
13666 This can happen when a file containing a .eh_frame section is
13667 stripped with the --only-keep-debug command line option. */
13668 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13669 print_name);
13670 return FALSE;
13671 }
13672
13673 if (const_strneq (name, ".gnu.linkonce.wi."))
13674 name = ".debug_info";
13675
13676 /* See if we know how to display the contents of this section. */
13677 for (i = 0; i < max; i++)
13678 {
13679 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13680 struct dwarf_section_display * display = debug_displays + i;
13681 struct dwarf_section * sec = & display->section;
13682
13683 if (streq (sec->uncompressed_name, name)
13684 || (id == line && const_strneq (name, ".debug_line."))
13685 || streq (sec->compressed_name, name))
13686 {
13687 bfd_boolean secondary = (section != find_section (filedata, name));
13688
13689 if (secondary)
13690 free_debug_section (id);
13691
13692 if (i == line && const_strneq (name, ".debug_line."))
13693 sec->name = name;
13694 else if (streq (sec->uncompressed_name, name))
13695 sec->name = sec->uncompressed_name;
13696 else
13697 sec->name = sec->compressed_name;
13698
13699 if (load_specific_debug_section (id, section, filedata))
13700 {
13701 /* If this debug section is part of a CU/TU set in a .dwp file,
13702 restrict load_debug_section to the sections in that set. */
13703 section_subset = find_cu_tu_set (filedata, shndx);
13704
13705 result &= display->display (sec, filedata);
13706
13707 section_subset = NULL;
13708
13709 if (secondary || (id != info && id != abbrev))
13710 free_debug_section (id);
13711 }
13712 break;
13713 }
13714 }
13715
13716 if (i == max)
13717 {
13718 printf (_("Unrecognized debug section: %s\n"), print_name);
13719 result = FALSE;
13720 }
13721
13722 return result;
13723 }
13724
13725 /* Set DUMP_SECTS for all sections where dumps were requested
13726 based on section name. */
13727
13728 static void
13729 initialise_dumps_byname (Filedata * filedata)
13730 {
13731 struct dump_list_entry * cur;
13732
13733 for (cur = dump_sects_byname; cur; cur = cur->next)
13734 {
13735 unsigned int i;
13736 bfd_boolean any = FALSE;
13737
13738 for (i = 0; i < filedata->file_header.e_shnum; i++)
13739 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13740 {
13741 request_dump_bynumber (filedata, i, cur->type);
13742 any = TRUE;
13743 }
13744
13745 if (!any)
13746 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13747 cur->name);
13748 }
13749 }
13750
13751 static bfd_boolean
13752 process_section_contents (Filedata * filedata)
13753 {
13754 Elf_Internal_Shdr * section;
13755 unsigned int i;
13756 bfd_boolean res = TRUE;
13757
13758 if (! do_dump)
13759 return TRUE;
13760
13761 initialise_dumps_byname (filedata);
13762
13763 for (i = 0, section = filedata->section_headers;
13764 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13765 i++, section++)
13766 {
13767 dump_type dump = filedata->dump_sects[i];
13768
13769 #ifdef SUPPORT_DISASSEMBLY
13770 if (dump & DISASS_DUMP)
13771 {
13772 if (! disassemble_section (section, filedata))
13773 res = FALSE;
13774 }
13775 #endif
13776 if (dump & HEX_DUMP)
13777 {
13778 if (! dump_section_as_bytes (section, filedata, FALSE))
13779 res = FALSE;
13780 }
13781
13782 if (dump & RELOC_DUMP)
13783 {
13784 if (! dump_section_as_bytes (section, filedata, TRUE))
13785 res = FALSE;
13786 }
13787
13788 if (dump & STRING_DUMP)
13789 {
13790 if (! dump_section_as_strings (section, filedata))
13791 res = FALSE;
13792 }
13793
13794 if (dump & DEBUG_DUMP)
13795 {
13796 if (! display_debug_section (i, section, filedata))
13797 res = FALSE;
13798 }
13799 }
13800
13801 /* Check to see if the user requested a
13802 dump of a section that does not exist. */
13803 while (i < filedata->num_dump_sects)
13804 {
13805 if (filedata->dump_sects[i])
13806 {
13807 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13808 res = FALSE;
13809 }
13810 i++;
13811 }
13812
13813 return res;
13814 }
13815
13816 static void
13817 process_mips_fpe_exception (int mask)
13818 {
13819 if (mask)
13820 {
13821 bfd_boolean first = TRUE;
13822
13823 if (mask & OEX_FPU_INEX)
13824 fputs ("INEX", stdout), first = FALSE;
13825 if (mask & OEX_FPU_UFLO)
13826 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13827 if (mask & OEX_FPU_OFLO)
13828 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13829 if (mask & OEX_FPU_DIV0)
13830 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13831 if (mask & OEX_FPU_INVAL)
13832 printf ("%sINVAL", first ? "" : "|");
13833 }
13834 else
13835 fputs ("0", stdout);
13836 }
13837
13838 /* Display's the value of TAG at location P. If TAG is
13839 greater than 0 it is assumed to be an unknown tag, and
13840 a message is printed to this effect. Otherwise it is
13841 assumed that a message has already been printed.
13842
13843 If the bottom bit of TAG is set it assumed to have a
13844 string value, otherwise it is assumed to have an integer
13845 value.
13846
13847 Returns an updated P pointing to the first unread byte
13848 beyond the end of TAG's value.
13849
13850 Reads at or beyond END will not be made. */
13851
13852 static unsigned char *
13853 display_tag_value (signed int tag,
13854 unsigned char * p,
13855 const unsigned char * const end)
13856 {
13857 unsigned long val;
13858
13859 if (tag > 0)
13860 printf (" Tag_unknown_%d: ", tag);
13861
13862 if (p >= end)
13863 {
13864 warn (_("<corrupt tag>\n"));
13865 }
13866 else if (tag & 1)
13867 {
13868 /* PR 17531 file: 027-19978-0.004. */
13869 size_t maxlen = (end - p) - 1;
13870
13871 putchar ('"');
13872 if (maxlen > 0)
13873 {
13874 print_symbol ((int) maxlen, (const char *) p);
13875 p += strnlen ((char *) p, maxlen) + 1;
13876 }
13877 else
13878 {
13879 printf (_("<corrupt string tag>"));
13880 p = (unsigned char *) end;
13881 }
13882 printf ("\"\n");
13883 }
13884 else
13885 {
13886 unsigned int len;
13887
13888 val = read_uleb128 (p, &len, end);
13889 p += len;
13890 printf ("%ld (0x%lx)\n", val, val);
13891 }
13892
13893 assert (p <= end);
13894 return p;
13895 }
13896
13897 /* ARC ABI attributes section. */
13898
13899 static unsigned char *
13900 display_arc_attribute (unsigned char * p,
13901 const unsigned char * const end)
13902 {
13903 unsigned int tag;
13904 unsigned int len;
13905 unsigned int val;
13906
13907 tag = read_uleb128 (p, &len, end);
13908 p += len;
13909
13910 switch (tag)
13911 {
13912 case Tag_ARC_PCS_config:
13913 val = read_uleb128 (p, &len, end);
13914 p += len;
13915 printf (" Tag_ARC_PCS_config: ");
13916 switch (val)
13917 {
13918 case 0:
13919 printf (_("Absent/Non standard\n"));
13920 break;
13921 case 1:
13922 printf (_("Bare metal/mwdt\n"));
13923 break;
13924 case 2:
13925 printf (_("Bare metal/newlib\n"));
13926 break;
13927 case 3:
13928 printf (_("Linux/uclibc\n"));
13929 break;
13930 case 4:
13931 printf (_("Linux/glibc\n"));
13932 break;
13933 default:
13934 printf (_("Unknown\n"));
13935 break;
13936 }
13937 break;
13938
13939 case Tag_ARC_CPU_base:
13940 val = read_uleb128 (p, &len, end);
13941 p += len;
13942 printf (" Tag_ARC_CPU_base: ");
13943 switch (val)
13944 {
13945 default:
13946 case TAG_CPU_NONE:
13947 printf (_("Absent\n"));
13948 break;
13949 case TAG_CPU_ARC6xx:
13950 printf ("ARC6xx\n");
13951 break;
13952 case TAG_CPU_ARC7xx:
13953 printf ("ARC7xx\n");
13954 break;
13955 case TAG_CPU_ARCEM:
13956 printf ("ARCEM\n");
13957 break;
13958 case TAG_CPU_ARCHS:
13959 printf ("ARCHS\n");
13960 break;
13961 }
13962 break;
13963
13964 case Tag_ARC_CPU_variation:
13965 val = read_uleb128 (p, &len, end);
13966 p += len;
13967 printf (" Tag_ARC_CPU_variation: ");
13968 switch (val)
13969 {
13970 default:
13971 if (val > 0 && val < 16)
13972 printf ("Core%d\n", val);
13973 else
13974 printf ("Unknown\n");
13975 break;
13976
13977 case 0:
13978 printf (_("Absent\n"));
13979 break;
13980 }
13981 break;
13982
13983 case Tag_ARC_CPU_name:
13984 printf (" Tag_ARC_CPU_name: ");
13985 p = display_tag_value (-1, p, end);
13986 break;
13987
13988 case Tag_ARC_ABI_rf16:
13989 val = read_uleb128 (p, &len, end);
13990 p += len;
13991 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
13992 break;
13993
13994 case Tag_ARC_ABI_osver:
13995 val = read_uleb128 (p, &len, end);
13996 p += len;
13997 printf (" Tag_ARC_ABI_osver: v%d\n", val);
13998 break;
13999
14000 case Tag_ARC_ABI_pic:
14001 case Tag_ARC_ABI_sda:
14002 val = read_uleb128 (p, &len, end);
14003 p += len;
14004 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14005 : " Tag_ARC_ABI_pic: ");
14006 switch (val)
14007 {
14008 case 0:
14009 printf (_("Absent\n"));
14010 break;
14011 case 1:
14012 printf ("MWDT\n");
14013 break;
14014 case 2:
14015 printf ("GNU\n");
14016 break;
14017 default:
14018 printf (_("Unknown\n"));
14019 break;
14020 }
14021 break;
14022
14023 case Tag_ARC_ABI_tls:
14024 val = read_uleb128 (p, &len, end);
14025 p += len;
14026 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14027 break;
14028
14029 case Tag_ARC_ABI_enumsize:
14030 val = read_uleb128 (p, &len, end);
14031 p += len;
14032 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14033 _("smallest"));
14034 break;
14035
14036 case Tag_ARC_ABI_exceptions:
14037 val = read_uleb128 (p, &len, end);
14038 p += len;
14039 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14040 : _("default"));
14041 break;
14042
14043 case Tag_ARC_ABI_double_size:
14044 val = read_uleb128 (p, &len, end);
14045 p += len;
14046 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14047 break;
14048
14049 case Tag_ARC_ISA_config:
14050 printf (" Tag_ARC_ISA_config: ");
14051 p = display_tag_value (-1, p, end);
14052 break;
14053
14054 case Tag_ARC_ISA_apex:
14055 printf (" Tag_ARC_ISA_apex: ");
14056 p = display_tag_value (-1, p, end);
14057 break;
14058
14059 case Tag_ARC_ISA_mpy_option:
14060 val = read_uleb128 (p, &len, end);
14061 p += len;
14062 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14063 break;
14064
14065 default:
14066 return display_tag_value (tag & 1, p, end);
14067 }
14068
14069 return p;
14070 }
14071
14072 /* ARM EABI attributes section. */
14073 typedef struct
14074 {
14075 unsigned int tag;
14076 const char * name;
14077 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14078 unsigned int type;
14079 const char ** table;
14080 } arm_attr_public_tag;
14081
14082 static const char * arm_attr_tag_CPU_arch[] =
14083 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14084 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14085 "v8-M.mainline"};
14086 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14087 static const char * arm_attr_tag_THUMB_ISA_use[] =
14088 {"No", "Thumb-1", "Thumb-2", "Yes"};
14089 static const char * arm_attr_tag_FP_arch[] =
14090 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14091 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14092 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14093 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14094 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14095 "NEON for ARMv8.1"};
14096 static const char * arm_attr_tag_PCS_config[] =
14097 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14098 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14099 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14100 {"V6", "SB", "TLS", "Unused"};
14101 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14102 {"Absolute", "PC-relative", "SB-relative", "None"};
14103 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14104 {"Absolute", "PC-relative", "None"};
14105 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14106 {"None", "direct", "GOT-indirect"};
14107 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14108 {"None", "??? 1", "2", "??? 3", "4"};
14109 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14110 static const char * arm_attr_tag_ABI_FP_denormal[] =
14111 {"Unused", "Needed", "Sign only"};
14112 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14113 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14114 static const char * arm_attr_tag_ABI_FP_number_model[] =
14115 {"Unused", "Finite", "RTABI", "IEEE 754"};
14116 static const char * arm_attr_tag_ABI_enum_size[] =
14117 {"Unused", "small", "int", "forced to int"};
14118 static const char * arm_attr_tag_ABI_HardFP_use[] =
14119 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14120 static const char * arm_attr_tag_ABI_VFP_args[] =
14121 {"AAPCS", "VFP registers", "custom", "compatible"};
14122 static const char * arm_attr_tag_ABI_WMMX_args[] =
14123 {"AAPCS", "WMMX registers", "custom"};
14124 static const char * arm_attr_tag_ABI_optimization_goals[] =
14125 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14126 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14127 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14128 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14129 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14130 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14131 static const char * arm_attr_tag_FP_HP_extension[] =
14132 {"Not Allowed", "Allowed"};
14133 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14134 {"None", "IEEE 754", "Alternative Format"};
14135 static const char * arm_attr_tag_DSP_extension[] =
14136 {"Follow architecture", "Allowed"};
14137 static const char * arm_attr_tag_MPextension_use[] =
14138 {"Not Allowed", "Allowed"};
14139 static const char * arm_attr_tag_DIV_use[] =
14140 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14141 "Allowed in v7-A with integer division extension"};
14142 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14143 static const char * arm_attr_tag_Virtualization_use[] =
14144 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14145 "TrustZone and Virtualization Extensions"};
14146 static const char * arm_attr_tag_MPextension_use_legacy[] =
14147 {"Not Allowed", "Allowed"};
14148
14149 #define LOOKUP(id, name) \
14150 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14151 static arm_attr_public_tag arm_attr_public_tags[] =
14152 {
14153 {4, "CPU_raw_name", 1, NULL},
14154 {5, "CPU_name", 1, NULL},
14155 LOOKUP(6, CPU_arch),
14156 {7, "CPU_arch_profile", 0, NULL},
14157 LOOKUP(8, ARM_ISA_use),
14158 LOOKUP(9, THUMB_ISA_use),
14159 LOOKUP(10, FP_arch),
14160 LOOKUP(11, WMMX_arch),
14161 LOOKUP(12, Advanced_SIMD_arch),
14162 LOOKUP(13, PCS_config),
14163 LOOKUP(14, ABI_PCS_R9_use),
14164 LOOKUP(15, ABI_PCS_RW_data),
14165 LOOKUP(16, ABI_PCS_RO_data),
14166 LOOKUP(17, ABI_PCS_GOT_use),
14167 LOOKUP(18, ABI_PCS_wchar_t),
14168 LOOKUP(19, ABI_FP_rounding),
14169 LOOKUP(20, ABI_FP_denormal),
14170 LOOKUP(21, ABI_FP_exceptions),
14171 LOOKUP(22, ABI_FP_user_exceptions),
14172 LOOKUP(23, ABI_FP_number_model),
14173 {24, "ABI_align_needed", 0, NULL},
14174 {25, "ABI_align_preserved", 0, NULL},
14175 LOOKUP(26, ABI_enum_size),
14176 LOOKUP(27, ABI_HardFP_use),
14177 LOOKUP(28, ABI_VFP_args),
14178 LOOKUP(29, ABI_WMMX_args),
14179 LOOKUP(30, ABI_optimization_goals),
14180 LOOKUP(31, ABI_FP_optimization_goals),
14181 {32, "compatibility", 0, NULL},
14182 LOOKUP(34, CPU_unaligned_access),
14183 LOOKUP(36, FP_HP_extension),
14184 LOOKUP(38, ABI_FP_16bit_format),
14185 LOOKUP(42, MPextension_use),
14186 LOOKUP(44, DIV_use),
14187 LOOKUP(46, DSP_extension),
14188 {64, "nodefaults", 0, NULL},
14189 {65, "also_compatible_with", 0, NULL},
14190 LOOKUP(66, T2EE_use),
14191 {67, "conformance", 1, NULL},
14192 LOOKUP(68, Virtualization_use),
14193 LOOKUP(70, MPextension_use_legacy)
14194 };
14195 #undef LOOKUP
14196
14197 static unsigned char *
14198 display_arm_attribute (unsigned char * p,
14199 const unsigned char * const end)
14200 {
14201 unsigned int tag;
14202 unsigned int len;
14203 unsigned int val;
14204 arm_attr_public_tag * attr;
14205 unsigned i;
14206 unsigned int type;
14207
14208 tag = read_uleb128 (p, &len, end);
14209 p += len;
14210 attr = NULL;
14211 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14212 {
14213 if (arm_attr_public_tags[i].tag == tag)
14214 {
14215 attr = &arm_attr_public_tags[i];
14216 break;
14217 }
14218 }
14219
14220 if (attr)
14221 {
14222 printf (" Tag_%s: ", attr->name);
14223 switch (attr->type)
14224 {
14225 case 0:
14226 switch (tag)
14227 {
14228 case 7: /* Tag_CPU_arch_profile. */
14229 val = read_uleb128 (p, &len, end);
14230 p += len;
14231 switch (val)
14232 {
14233 case 0: printf (_("None\n")); break;
14234 case 'A': printf (_("Application\n")); break;
14235 case 'R': printf (_("Realtime\n")); break;
14236 case 'M': printf (_("Microcontroller\n")); break;
14237 case 'S': printf (_("Application or Realtime\n")); break;
14238 default: printf ("??? (%d)\n", val); break;
14239 }
14240 break;
14241
14242 case 24: /* Tag_align_needed. */
14243 val = read_uleb128 (p, &len, end);
14244 p += len;
14245 switch (val)
14246 {
14247 case 0: printf (_("None\n")); break;
14248 case 1: printf (_("8-byte\n")); break;
14249 case 2: printf (_("4-byte\n")); break;
14250 case 3: printf ("??? 3\n"); break;
14251 default:
14252 if (val <= 12)
14253 printf (_("8-byte and up to %d-byte extended\n"),
14254 1 << val);
14255 else
14256 printf ("??? (%d)\n", val);
14257 break;
14258 }
14259 break;
14260
14261 case 25: /* Tag_align_preserved. */
14262 val = read_uleb128 (p, &len, end);
14263 p += len;
14264 switch (val)
14265 {
14266 case 0: printf (_("None\n")); break;
14267 case 1: printf (_("8-byte, except leaf SP\n")); break;
14268 case 2: printf (_("8-byte\n")); break;
14269 case 3: printf ("??? 3\n"); break;
14270 default:
14271 if (val <= 12)
14272 printf (_("8-byte and up to %d-byte extended\n"),
14273 1 << val);
14274 else
14275 printf ("??? (%d)\n", val);
14276 break;
14277 }
14278 break;
14279
14280 case 32: /* Tag_compatibility. */
14281 {
14282 val = read_uleb128 (p, &len, end);
14283 p += len;
14284 printf (_("flag = %d, vendor = "), val);
14285 if (p < end - 1)
14286 {
14287 size_t maxlen = (end - p) - 1;
14288
14289 print_symbol ((int) maxlen, (const char *) p);
14290 p += strnlen ((char *) p, maxlen) + 1;
14291 }
14292 else
14293 {
14294 printf (_("<corrupt>"));
14295 p = (unsigned char *) end;
14296 }
14297 putchar ('\n');
14298 }
14299 break;
14300
14301 case 64: /* Tag_nodefaults. */
14302 /* PR 17531: file: 001-505008-0.01. */
14303 if (p < end)
14304 p++;
14305 printf (_("True\n"));
14306 break;
14307
14308 case 65: /* Tag_also_compatible_with. */
14309 val = read_uleb128 (p, &len, end);
14310 p += len;
14311 if (val == 6 /* Tag_CPU_arch. */)
14312 {
14313 val = read_uleb128 (p, &len, end);
14314 p += len;
14315 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14316 printf ("??? (%d)\n", val);
14317 else
14318 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14319 }
14320 else
14321 printf ("???\n");
14322 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14323 ;
14324 break;
14325
14326 default:
14327 printf (_("<unknown: %d>\n"), tag);
14328 break;
14329 }
14330 return p;
14331
14332 case 1:
14333 return display_tag_value (-1, p, end);
14334 case 2:
14335 return display_tag_value (0, p, end);
14336
14337 default:
14338 assert (attr->type & 0x80);
14339 val = read_uleb128 (p, &len, end);
14340 p += len;
14341 type = attr->type & 0x7f;
14342 if (val >= type)
14343 printf ("??? (%d)\n", val);
14344 else
14345 printf ("%s\n", attr->table[val]);
14346 return p;
14347 }
14348 }
14349
14350 return display_tag_value (tag, p, end);
14351 }
14352
14353 static unsigned char *
14354 display_gnu_attribute (unsigned char * p,
14355 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14356 const unsigned char * const end)
14357 {
14358 int tag;
14359 unsigned int len;
14360 unsigned int val;
14361
14362 tag = read_uleb128 (p, &len, end);
14363 p += len;
14364
14365 /* Tag_compatibility is the only generic GNU attribute defined at
14366 present. */
14367 if (tag == 32)
14368 {
14369 val = read_uleb128 (p, &len, end);
14370 p += len;
14371
14372 printf (_("flag = %d, vendor = "), val);
14373 if (p == end)
14374 {
14375 printf (_("<corrupt>\n"));
14376 warn (_("corrupt vendor attribute\n"));
14377 }
14378 else
14379 {
14380 if (p < end - 1)
14381 {
14382 size_t maxlen = (end - p) - 1;
14383
14384 print_symbol ((int) maxlen, (const char *) p);
14385 p += strnlen ((char *) p, maxlen) + 1;
14386 }
14387 else
14388 {
14389 printf (_("<corrupt>"));
14390 p = (unsigned char *) end;
14391 }
14392 putchar ('\n');
14393 }
14394 return p;
14395 }
14396
14397 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14398 return display_proc_gnu_attribute (p, tag, end);
14399
14400 return display_tag_value (tag, p, end);
14401 }
14402
14403 static unsigned char *
14404 display_power_gnu_attribute (unsigned char * p,
14405 unsigned int tag,
14406 const unsigned char * const end)
14407 {
14408 unsigned int len;
14409 unsigned int val;
14410
14411 if (tag == Tag_GNU_Power_ABI_FP)
14412 {
14413 val = read_uleb128 (p, &len, end);
14414 p += len;
14415 printf (" Tag_GNU_Power_ABI_FP: ");
14416 if (len == 0)
14417 {
14418 printf (_("<corrupt>\n"));
14419 return p;
14420 }
14421
14422 if (val > 15)
14423 printf ("(%#x), ", val);
14424
14425 switch (val & 3)
14426 {
14427 case 0:
14428 printf (_("unspecified hard/soft float, "));
14429 break;
14430 case 1:
14431 printf (_("hard float, "));
14432 break;
14433 case 2:
14434 printf (_("soft float, "));
14435 break;
14436 case 3:
14437 printf (_("single-precision hard float, "));
14438 break;
14439 }
14440
14441 switch (val & 0xC)
14442 {
14443 case 0:
14444 printf (_("unspecified long double\n"));
14445 break;
14446 case 4:
14447 printf (_("128-bit IBM long double\n"));
14448 break;
14449 case 8:
14450 printf (_("64-bit long double\n"));
14451 break;
14452 case 12:
14453 printf (_("128-bit IEEE long double\n"));
14454 break;
14455 }
14456 return p;
14457 }
14458
14459 if (tag == Tag_GNU_Power_ABI_Vector)
14460 {
14461 val = read_uleb128 (p, &len, end);
14462 p += len;
14463 printf (" Tag_GNU_Power_ABI_Vector: ");
14464 if (len == 0)
14465 {
14466 printf (_("<corrupt>\n"));
14467 return p;
14468 }
14469
14470 if (val > 3)
14471 printf ("(%#x), ", val);
14472
14473 switch (val & 3)
14474 {
14475 case 0:
14476 printf (_("unspecified\n"));
14477 break;
14478 case 1:
14479 printf (_("generic\n"));
14480 break;
14481 case 2:
14482 printf ("AltiVec\n");
14483 break;
14484 case 3:
14485 printf ("SPE\n");
14486 break;
14487 }
14488 return p;
14489 }
14490
14491 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14492 {
14493 val = read_uleb128 (p, &len, end);
14494 p += len;
14495 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14496 if (len == 0)
14497 {
14498 printf (_("<corrupt>\n"));
14499 return p;
14500 }
14501
14502 if (val > 2)
14503 printf ("(%#x), ", val);
14504
14505 switch (val & 3)
14506 {
14507 case 0:
14508 printf (_("unspecified\n"));
14509 break;
14510 case 1:
14511 printf ("r3/r4\n");
14512 break;
14513 case 2:
14514 printf (_("memory\n"));
14515 break;
14516 case 3:
14517 printf ("???\n");
14518 break;
14519 }
14520 return p;
14521 }
14522
14523 return display_tag_value (tag & 1, p, end);
14524 }
14525
14526 static unsigned char *
14527 display_s390_gnu_attribute (unsigned char * p,
14528 unsigned int tag,
14529 const unsigned char * const end)
14530 {
14531 unsigned int len;
14532 int val;
14533
14534 if (tag == Tag_GNU_S390_ABI_Vector)
14535 {
14536 val = read_uleb128 (p, &len, end);
14537 p += len;
14538 printf (" Tag_GNU_S390_ABI_Vector: ");
14539
14540 switch (val)
14541 {
14542 case 0:
14543 printf (_("any\n"));
14544 break;
14545 case 1:
14546 printf (_("software\n"));
14547 break;
14548 case 2:
14549 printf (_("hardware\n"));
14550 break;
14551 default:
14552 printf ("??? (%d)\n", val);
14553 break;
14554 }
14555 return p;
14556 }
14557
14558 return display_tag_value (tag & 1, p, end);
14559 }
14560
14561 static void
14562 display_sparc_hwcaps (unsigned int mask)
14563 {
14564 if (mask)
14565 {
14566 bfd_boolean first = TRUE;
14567
14568 if (mask & ELF_SPARC_HWCAP_MUL32)
14569 fputs ("mul32", stdout), first = FALSE;
14570 if (mask & ELF_SPARC_HWCAP_DIV32)
14571 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14572 if (mask & ELF_SPARC_HWCAP_FSMULD)
14573 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14574 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14575 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14576 if (mask & ELF_SPARC_HWCAP_POPC)
14577 printf ("%spopc", first ? "" : "|"), first = FALSE;
14578 if (mask & ELF_SPARC_HWCAP_VIS)
14579 printf ("%svis", first ? "" : "|"), first = FALSE;
14580 if (mask & ELF_SPARC_HWCAP_VIS2)
14581 printf ("%svis2", first ? "" : "|"), first = FALSE;
14582 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14583 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14584 if (mask & ELF_SPARC_HWCAP_FMAF)
14585 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14586 if (mask & ELF_SPARC_HWCAP_VIS3)
14587 printf ("%svis3", first ? "" : "|"), first = FALSE;
14588 if (mask & ELF_SPARC_HWCAP_HPC)
14589 printf ("%shpc", first ? "" : "|"), first = FALSE;
14590 if (mask & ELF_SPARC_HWCAP_RANDOM)
14591 printf ("%srandom", first ? "" : "|"), first = FALSE;
14592 if (mask & ELF_SPARC_HWCAP_TRANS)
14593 printf ("%strans", first ? "" : "|"), first = FALSE;
14594 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14595 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14596 if (mask & ELF_SPARC_HWCAP_IMA)
14597 printf ("%sima", first ? "" : "|"), first = FALSE;
14598 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14599 printf ("%scspare", first ? "" : "|"), first = FALSE;
14600 }
14601 else
14602 fputc ('0', stdout);
14603 fputc ('\n', stdout);
14604 }
14605
14606 static void
14607 display_sparc_hwcaps2 (unsigned int mask)
14608 {
14609 if (mask)
14610 {
14611 bfd_boolean first = TRUE;
14612
14613 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14614 fputs ("fjathplus", stdout), first = FALSE;
14615 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14616 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14617 if (mask & ELF_SPARC_HWCAP2_ADP)
14618 printf ("%sadp", first ? "" : "|"), first = FALSE;
14619 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14620 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14621 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14622 printf ("%smwait", first ? "" : "|"), first = FALSE;
14623 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14624 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14625 if (mask & ELF_SPARC_HWCAP2_XMONT)
14626 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14627 if (mask & ELF_SPARC_HWCAP2_NSEC)
14628 printf ("%snsec", first ? "" : "|"), first = FALSE;
14629 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14630 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14631 if (mask & ELF_SPARC_HWCAP2_FJDES)
14632 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14633 if (mask & ELF_SPARC_HWCAP2_FJAES)
14634 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14635 }
14636 else
14637 fputc ('0', stdout);
14638 fputc ('\n', stdout);
14639 }
14640
14641 static unsigned char *
14642 display_sparc_gnu_attribute (unsigned char * p,
14643 unsigned int tag,
14644 const unsigned char * const end)
14645 {
14646 unsigned int len;
14647 int val;
14648
14649 if (tag == Tag_GNU_Sparc_HWCAPS)
14650 {
14651 val = read_uleb128 (p, &len, end);
14652 p += len;
14653 printf (" Tag_GNU_Sparc_HWCAPS: ");
14654 display_sparc_hwcaps (val);
14655 return p;
14656 }
14657 if (tag == Tag_GNU_Sparc_HWCAPS2)
14658 {
14659 val = read_uleb128 (p, &len, end);
14660 p += len;
14661 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14662 display_sparc_hwcaps2 (val);
14663 return p;
14664 }
14665
14666 return display_tag_value (tag, p, end);
14667 }
14668
14669 static void
14670 print_mips_fp_abi_value (unsigned int val)
14671 {
14672 switch (val)
14673 {
14674 case Val_GNU_MIPS_ABI_FP_ANY:
14675 printf (_("Hard or soft float\n"));
14676 break;
14677 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14678 printf (_("Hard float (double precision)\n"));
14679 break;
14680 case Val_GNU_MIPS_ABI_FP_SINGLE:
14681 printf (_("Hard float (single precision)\n"));
14682 break;
14683 case Val_GNU_MIPS_ABI_FP_SOFT:
14684 printf (_("Soft float\n"));
14685 break;
14686 case Val_GNU_MIPS_ABI_FP_OLD_64:
14687 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14688 break;
14689 case Val_GNU_MIPS_ABI_FP_XX:
14690 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14691 break;
14692 case Val_GNU_MIPS_ABI_FP_64:
14693 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14694 break;
14695 case Val_GNU_MIPS_ABI_FP_64A:
14696 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14697 break;
14698 case Val_GNU_MIPS_ABI_FP_NAN2008:
14699 printf (_("NaN 2008 compatibility\n"));
14700 break;
14701 default:
14702 printf ("??? (%d)\n", val);
14703 break;
14704 }
14705 }
14706
14707 static unsigned char *
14708 display_mips_gnu_attribute (unsigned char * p,
14709 unsigned int tag,
14710 const unsigned char * const end)
14711 {
14712 if (tag == Tag_GNU_MIPS_ABI_FP)
14713 {
14714 unsigned int len;
14715 unsigned int val;
14716
14717 val = read_uleb128 (p, &len, end);
14718 p += len;
14719 printf (" Tag_GNU_MIPS_ABI_FP: ");
14720
14721 print_mips_fp_abi_value (val);
14722
14723 return p;
14724 }
14725
14726 if (tag == Tag_GNU_MIPS_ABI_MSA)
14727 {
14728 unsigned int len;
14729 unsigned int val;
14730
14731 val = read_uleb128 (p, &len, end);
14732 p += len;
14733 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14734
14735 switch (val)
14736 {
14737 case Val_GNU_MIPS_ABI_MSA_ANY:
14738 printf (_("Any MSA or not\n"));
14739 break;
14740 case Val_GNU_MIPS_ABI_MSA_128:
14741 printf (_("128-bit MSA\n"));
14742 break;
14743 default:
14744 printf ("??? (%d)\n", val);
14745 break;
14746 }
14747 return p;
14748 }
14749
14750 return display_tag_value (tag & 1, p, end);
14751 }
14752
14753 static unsigned char *
14754 display_tic6x_attribute (unsigned char * p,
14755 const unsigned char * const end)
14756 {
14757 unsigned int tag;
14758 unsigned int len;
14759 int val;
14760
14761 tag = read_uleb128 (p, &len, end);
14762 p += len;
14763
14764 switch (tag)
14765 {
14766 case Tag_ISA:
14767 val = read_uleb128 (p, &len, end);
14768 p += len;
14769 printf (" Tag_ISA: ");
14770
14771 switch (val)
14772 {
14773 case C6XABI_Tag_ISA_none:
14774 printf (_("None\n"));
14775 break;
14776 case C6XABI_Tag_ISA_C62X:
14777 printf ("C62x\n");
14778 break;
14779 case C6XABI_Tag_ISA_C67X:
14780 printf ("C67x\n");
14781 break;
14782 case C6XABI_Tag_ISA_C67XP:
14783 printf ("C67x+\n");
14784 break;
14785 case C6XABI_Tag_ISA_C64X:
14786 printf ("C64x\n");
14787 break;
14788 case C6XABI_Tag_ISA_C64XP:
14789 printf ("C64x+\n");
14790 break;
14791 case C6XABI_Tag_ISA_C674X:
14792 printf ("C674x\n");
14793 break;
14794 default:
14795 printf ("??? (%d)\n", val);
14796 break;
14797 }
14798 return p;
14799
14800 case Tag_ABI_wchar_t:
14801 val = read_uleb128 (p, &len, end);
14802 p += len;
14803 printf (" Tag_ABI_wchar_t: ");
14804 switch (val)
14805 {
14806 case 0:
14807 printf (_("Not used\n"));
14808 break;
14809 case 1:
14810 printf (_("2 bytes\n"));
14811 break;
14812 case 2:
14813 printf (_("4 bytes\n"));
14814 break;
14815 default:
14816 printf ("??? (%d)\n", val);
14817 break;
14818 }
14819 return p;
14820
14821 case Tag_ABI_stack_align_needed:
14822 val = read_uleb128 (p, &len, end);
14823 p += len;
14824 printf (" Tag_ABI_stack_align_needed: ");
14825 switch (val)
14826 {
14827 case 0:
14828 printf (_("8-byte\n"));
14829 break;
14830 case 1:
14831 printf (_("16-byte\n"));
14832 break;
14833 default:
14834 printf ("??? (%d)\n", val);
14835 break;
14836 }
14837 return p;
14838
14839 case Tag_ABI_stack_align_preserved:
14840 val = read_uleb128 (p, &len, end);
14841 p += len;
14842 printf (" Tag_ABI_stack_align_preserved: ");
14843 switch (val)
14844 {
14845 case 0:
14846 printf (_("8-byte\n"));
14847 break;
14848 case 1:
14849 printf (_("16-byte\n"));
14850 break;
14851 default:
14852 printf ("??? (%d)\n", val);
14853 break;
14854 }
14855 return p;
14856
14857 case Tag_ABI_DSBT:
14858 val = read_uleb128 (p, &len, end);
14859 p += len;
14860 printf (" Tag_ABI_DSBT: ");
14861 switch (val)
14862 {
14863 case 0:
14864 printf (_("DSBT addressing not used\n"));
14865 break;
14866 case 1:
14867 printf (_("DSBT addressing used\n"));
14868 break;
14869 default:
14870 printf ("??? (%d)\n", val);
14871 break;
14872 }
14873 return p;
14874
14875 case Tag_ABI_PID:
14876 val = read_uleb128 (p, &len, end);
14877 p += len;
14878 printf (" Tag_ABI_PID: ");
14879 switch (val)
14880 {
14881 case 0:
14882 printf (_("Data addressing position-dependent\n"));
14883 break;
14884 case 1:
14885 printf (_("Data addressing position-independent, GOT near DP\n"));
14886 break;
14887 case 2:
14888 printf (_("Data addressing position-independent, GOT far from DP\n"));
14889 break;
14890 default:
14891 printf ("??? (%d)\n", val);
14892 break;
14893 }
14894 return p;
14895
14896 case Tag_ABI_PIC:
14897 val = read_uleb128 (p, &len, end);
14898 p += len;
14899 printf (" Tag_ABI_PIC: ");
14900 switch (val)
14901 {
14902 case 0:
14903 printf (_("Code addressing position-dependent\n"));
14904 break;
14905 case 1:
14906 printf (_("Code addressing position-independent\n"));
14907 break;
14908 default:
14909 printf ("??? (%d)\n", val);
14910 break;
14911 }
14912 return p;
14913
14914 case Tag_ABI_array_object_alignment:
14915 val = read_uleb128 (p, &len, end);
14916 p += len;
14917 printf (" Tag_ABI_array_object_alignment: ");
14918 switch (val)
14919 {
14920 case 0:
14921 printf (_("8-byte\n"));
14922 break;
14923 case 1:
14924 printf (_("4-byte\n"));
14925 break;
14926 case 2:
14927 printf (_("16-byte\n"));
14928 break;
14929 default:
14930 printf ("??? (%d)\n", val);
14931 break;
14932 }
14933 return p;
14934
14935 case Tag_ABI_array_object_align_expected:
14936 val = read_uleb128 (p, &len, end);
14937 p += len;
14938 printf (" Tag_ABI_array_object_align_expected: ");
14939 switch (val)
14940 {
14941 case 0:
14942 printf (_("8-byte\n"));
14943 break;
14944 case 1:
14945 printf (_("4-byte\n"));
14946 break;
14947 case 2:
14948 printf (_("16-byte\n"));
14949 break;
14950 default:
14951 printf ("??? (%d)\n", val);
14952 break;
14953 }
14954 return p;
14955
14956 case Tag_ABI_compatibility:
14957 {
14958 val = read_uleb128 (p, &len, end);
14959 p += len;
14960 printf (" Tag_ABI_compatibility: ");
14961 printf (_("flag = %d, vendor = "), val);
14962 if (p < end - 1)
14963 {
14964 size_t maxlen = (end - p) - 1;
14965
14966 print_symbol ((int) maxlen, (const char *) p);
14967 p += strnlen ((char *) p, maxlen) + 1;
14968 }
14969 else
14970 {
14971 printf (_("<corrupt>"));
14972 p = (unsigned char *) end;
14973 }
14974 putchar ('\n');
14975 return p;
14976 }
14977
14978 case Tag_ABI_conformance:
14979 {
14980 printf (" Tag_ABI_conformance: \"");
14981 if (p < end - 1)
14982 {
14983 size_t maxlen = (end - p) - 1;
14984
14985 print_symbol ((int) maxlen, (const char *) p);
14986 p += strnlen ((char *) p, maxlen) + 1;
14987 }
14988 else
14989 {
14990 printf (_("<corrupt>"));
14991 p = (unsigned char *) end;
14992 }
14993 printf ("\"\n");
14994 return p;
14995 }
14996 }
14997
14998 return display_tag_value (tag, p, end);
14999 }
15000
15001 static void
15002 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15003 {
15004 unsigned long addr = 0;
15005 size_t bytes = end - p;
15006
15007 assert (end > p);
15008 while (bytes)
15009 {
15010 int j;
15011 int k;
15012 int lbytes = (bytes > 16 ? 16 : bytes);
15013
15014 printf (" 0x%8.8lx ", addr);
15015
15016 for (j = 0; j < 16; j++)
15017 {
15018 if (j < lbytes)
15019 printf ("%2.2x", p[j]);
15020 else
15021 printf (" ");
15022
15023 if ((j & 3) == 3)
15024 printf (" ");
15025 }
15026
15027 for (j = 0; j < lbytes; j++)
15028 {
15029 k = p[j];
15030 if (k >= ' ' && k < 0x7f)
15031 printf ("%c", k);
15032 else
15033 printf (".");
15034 }
15035
15036 putchar ('\n');
15037
15038 p += lbytes;
15039 bytes -= lbytes;
15040 addr += lbytes;
15041 }
15042
15043 putchar ('\n');
15044 }
15045
15046 static unsigned char *
15047 display_msp430x_attribute (unsigned char * p,
15048 const unsigned char * const end)
15049 {
15050 unsigned int len;
15051 unsigned int val;
15052 unsigned int tag;
15053
15054 tag = read_uleb128 (p, & len, end);
15055 p += len;
15056
15057 switch (tag)
15058 {
15059 case OFBA_MSPABI_Tag_ISA:
15060 val = read_uleb128 (p, &len, end);
15061 p += len;
15062 printf (" Tag_ISA: ");
15063 switch (val)
15064 {
15065 case 0: printf (_("None\n")); break;
15066 case 1: printf (_("MSP430\n")); break;
15067 case 2: printf (_("MSP430X\n")); break;
15068 default: printf ("??? (%d)\n", val); break;
15069 }
15070 break;
15071
15072 case OFBA_MSPABI_Tag_Code_Model:
15073 val = read_uleb128 (p, &len, end);
15074 p += len;
15075 printf (" Tag_Code_Model: ");
15076 switch (val)
15077 {
15078 case 0: printf (_("None\n")); break;
15079 case 1: printf (_("Small\n")); break;
15080 case 2: printf (_("Large\n")); break;
15081 default: printf ("??? (%d)\n", val); break;
15082 }
15083 break;
15084
15085 case OFBA_MSPABI_Tag_Data_Model:
15086 val = read_uleb128 (p, &len, end);
15087 p += len;
15088 printf (" Tag_Data_Model: ");
15089 switch (val)
15090 {
15091 case 0: printf (_("None\n")); break;
15092 case 1: printf (_("Small\n")); break;
15093 case 2: printf (_("Large\n")); break;
15094 case 3: printf (_("Restricted Large\n")); break;
15095 default: printf ("??? (%d)\n", val); break;
15096 }
15097 break;
15098
15099 default:
15100 printf (_(" <unknown tag %d>: "), tag);
15101
15102 if (tag & 1)
15103 {
15104 putchar ('"');
15105 if (p < end - 1)
15106 {
15107 size_t maxlen = (end - p) - 1;
15108
15109 print_symbol ((int) maxlen, (const char *) p);
15110 p += strnlen ((char *) p, maxlen) + 1;
15111 }
15112 else
15113 {
15114 printf (_("<corrupt>"));
15115 p = (unsigned char *) end;
15116 }
15117 printf ("\"\n");
15118 }
15119 else
15120 {
15121 val = read_uleb128 (p, &len, end);
15122 p += len;
15123 printf ("%d (0x%x)\n", val, val);
15124 }
15125 break;
15126 }
15127
15128 assert (p <= end);
15129 return p;
15130 }
15131
15132 static bfd_boolean
15133 process_attributes (Filedata * filedata,
15134 const char * public_name,
15135 unsigned int proc_type,
15136 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15137 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15138 {
15139 Elf_Internal_Shdr * sect;
15140 unsigned i;
15141 bfd_boolean res = TRUE;
15142
15143 /* Find the section header so that we get the size. */
15144 for (i = 0, sect = filedata->section_headers;
15145 i < filedata->file_header.e_shnum;
15146 i++, sect++)
15147 {
15148 unsigned char * contents;
15149 unsigned char * p;
15150
15151 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15152 continue;
15153
15154 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15155 sect->sh_size, _("attributes"));
15156 if (contents == NULL)
15157 {
15158 res = FALSE;
15159 continue;
15160 }
15161
15162 p = contents;
15163 /* The first character is the version of the attributes.
15164 Currently only version 1, (aka 'A') is recognised here. */
15165 if (*p != 'A')
15166 {
15167 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15168 res = FALSE;
15169 }
15170 else
15171 {
15172 bfd_vma section_len;
15173
15174 section_len = sect->sh_size - 1;
15175 p++;
15176
15177 while (section_len > 0)
15178 {
15179 bfd_vma attr_len;
15180 unsigned int namelen;
15181 bfd_boolean public_section;
15182 bfd_boolean gnu_section;
15183
15184 if (section_len <= 4)
15185 {
15186 error (_("Tag section ends prematurely\n"));
15187 res = FALSE;
15188 break;
15189 }
15190 attr_len = byte_get (p, 4);
15191 p += 4;
15192
15193 if (attr_len > section_len)
15194 {
15195 error (_("Bad attribute length (%u > %u)\n"),
15196 (unsigned) attr_len, (unsigned) section_len);
15197 attr_len = section_len;
15198 res = FALSE;
15199 }
15200 /* PR 17531: file: 001-101425-0.004 */
15201 else if (attr_len < 5)
15202 {
15203 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15204 res = FALSE;
15205 break;
15206 }
15207
15208 section_len -= attr_len;
15209 attr_len -= 4;
15210
15211 namelen = strnlen ((char *) p, attr_len) + 1;
15212 if (namelen == 0 || namelen >= attr_len)
15213 {
15214 error (_("Corrupt attribute section name\n"));
15215 res = FALSE;
15216 break;
15217 }
15218
15219 printf (_("Attribute Section: "));
15220 print_symbol (INT_MAX, (const char *) p);
15221 putchar ('\n');
15222
15223 if (public_name && streq ((char *) p, public_name))
15224 public_section = TRUE;
15225 else
15226 public_section = FALSE;
15227
15228 if (streq ((char *) p, "gnu"))
15229 gnu_section = TRUE;
15230 else
15231 gnu_section = FALSE;
15232
15233 p += namelen;
15234 attr_len -= namelen;
15235
15236 while (attr_len > 0 && p < contents + sect->sh_size)
15237 {
15238 int tag;
15239 int val;
15240 bfd_vma size;
15241 unsigned char * end;
15242
15243 /* PR binutils/17531: Safe handling of corrupt files. */
15244 if (attr_len < 6)
15245 {
15246 error (_("Unused bytes at end of section\n"));
15247 res = FALSE;
15248 section_len = 0;
15249 break;
15250 }
15251
15252 tag = *(p++);
15253 size = byte_get (p, 4);
15254 if (size > attr_len)
15255 {
15256 error (_("Bad subsection length (%u > %u)\n"),
15257 (unsigned) size, (unsigned) attr_len);
15258 res = FALSE;
15259 size = attr_len;
15260 }
15261 /* PR binutils/17531: Safe handling of corrupt files. */
15262 if (size < 6)
15263 {
15264 error (_("Bad subsection length (%u < 6)\n"),
15265 (unsigned) size);
15266 res = FALSE;
15267 section_len = 0;
15268 break;
15269 }
15270
15271 attr_len -= size;
15272 end = p + size - 1;
15273 assert (end <= contents + sect->sh_size);
15274 p += 4;
15275
15276 switch (tag)
15277 {
15278 case 1:
15279 printf (_("File Attributes\n"));
15280 break;
15281 case 2:
15282 printf (_("Section Attributes:"));
15283 goto do_numlist;
15284 case 3:
15285 printf (_("Symbol Attributes:"));
15286 /* Fall through. */
15287 do_numlist:
15288 for (;;)
15289 {
15290 unsigned int j;
15291
15292 val = read_uleb128 (p, &j, end);
15293 p += j;
15294 if (val == 0)
15295 break;
15296 printf (" %d", val);
15297 }
15298 printf ("\n");
15299 break;
15300 default:
15301 printf (_("Unknown tag: %d\n"), tag);
15302 public_section = FALSE;
15303 break;
15304 }
15305
15306 if (public_section && display_pub_attribute != NULL)
15307 {
15308 while (p < end)
15309 p = display_pub_attribute (p, end);
15310 assert (p == end);
15311 }
15312 else if (gnu_section && display_proc_gnu_attribute != NULL)
15313 {
15314 while (p < end)
15315 p = display_gnu_attribute (p,
15316 display_proc_gnu_attribute,
15317 end);
15318 assert (p == end);
15319 }
15320 else if (p < end)
15321 {
15322 printf (_(" Unknown attribute:\n"));
15323 display_raw_attribute (p, end);
15324 p = end;
15325 }
15326 else
15327 attr_len = 0;
15328 }
15329 }
15330 }
15331
15332 free (contents);
15333 }
15334
15335 return res;
15336 }
15337
15338 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15339 Print the Address, Access and Initial fields of an entry at VMA ADDR
15340 and return the VMA of the next entry, or -1 if there was a problem.
15341 Does not read from DATA_END or beyond. */
15342
15343 static bfd_vma
15344 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15345 unsigned char * data_end)
15346 {
15347 printf (" ");
15348 print_vma (addr, LONG_HEX);
15349 printf (" ");
15350 if (addr < pltgot + 0xfff0)
15351 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15352 else
15353 printf ("%10s", "");
15354 printf (" ");
15355 if (data == NULL)
15356 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15357 else
15358 {
15359 bfd_vma entry;
15360 unsigned char * from = data + addr - pltgot;
15361
15362 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15363 {
15364 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15365 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15366 return (bfd_vma) -1;
15367 }
15368 else
15369 {
15370 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15371 print_vma (entry, LONG_HEX);
15372 }
15373 }
15374 return addr + (is_32bit_elf ? 4 : 8);
15375 }
15376
15377 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15378 PLTGOT. Print the Address and Initial fields of an entry at VMA
15379 ADDR and return the VMA of the next entry. */
15380
15381 static bfd_vma
15382 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15383 {
15384 printf (" ");
15385 print_vma (addr, LONG_HEX);
15386 printf (" ");
15387 if (data == NULL)
15388 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15389 else
15390 {
15391 bfd_vma entry;
15392
15393 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15394 print_vma (entry, LONG_HEX);
15395 }
15396 return addr + (is_32bit_elf ? 4 : 8);
15397 }
15398
15399 static void
15400 print_mips_ases (unsigned int mask)
15401 {
15402 if (mask & AFL_ASE_DSP)
15403 fputs ("\n\tDSP ASE", stdout);
15404 if (mask & AFL_ASE_DSPR2)
15405 fputs ("\n\tDSP R2 ASE", stdout);
15406 if (mask & AFL_ASE_DSPR3)
15407 fputs ("\n\tDSP R3 ASE", stdout);
15408 if (mask & AFL_ASE_EVA)
15409 fputs ("\n\tEnhanced VA Scheme", stdout);
15410 if (mask & AFL_ASE_MCU)
15411 fputs ("\n\tMCU (MicroController) ASE", stdout);
15412 if (mask & AFL_ASE_MDMX)
15413 fputs ("\n\tMDMX ASE", stdout);
15414 if (mask & AFL_ASE_MIPS3D)
15415 fputs ("\n\tMIPS-3D ASE", stdout);
15416 if (mask & AFL_ASE_MT)
15417 fputs ("\n\tMT ASE", stdout);
15418 if (mask & AFL_ASE_SMARTMIPS)
15419 fputs ("\n\tSmartMIPS ASE", stdout);
15420 if (mask & AFL_ASE_VIRT)
15421 fputs ("\n\tVZ ASE", stdout);
15422 if (mask & AFL_ASE_MSA)
15423 fputs ("\n\tMSA ASE", stdout);
15424 if (mask & AFL_ASE_MIPS16)
15425 fputs ("\n\tMIPS16 ASE", stdout);
15426 if (mask & AFL_ASE_MICROMIPS)
15427 fputs ("\n\tMICROMIPS ASE", stdout);
15428 if (mask & AFL_ASE_XPA)
15429 fputs ("\n\tXPA ASE", stdout);
15430 if (mask & AFL_ASE_MIPS16E2)
15431 fputs ("\n\tMIPS16e2 ASE", stdout);
15432 if (mask == 0)
15433 fprintf (stdout, "\n\t%s", _("None"));
15434 else if ((mask & ~AFL_ASE_MASK) != 0)
15435 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15436 }
15437
15438 static void
15439 print_mips_isa_ext (unsigned int isa_ext)
15440 {
15441 switch (isa_ext)
15442 {
15443 case 0:
15444 fputs (_("None"), stdout);
15445 break;
15446 case AFL_EXT_XLR:
15447 fputs ("RMI XLR", stdout);
15448 break;
15449 case AFL_EXT_OCTEON3:
15450 fputs ("Cavium Networks Octeon3", stdout);
15451 break;
15452 case AFL_EXT_OCTEON2:
15453 fputs ("Cavium Networks Octeon2", stdout);
15454 break;
15455 case AFL_EXT_OCTEONP:
15456 fputs ("Cavium Networks OcteonP", stdout);
15457 break;
15458 case AFL_EXT_LOONGSON_3A:
15459 fputs ("Loongson 3A", stdout);
15460 break;
15461 case AFL_EXT_OCTEON:
15462 fputs ("Cavium Networks Octeon", stdout);
15463 break;
15464 case AFL_EXT_5900:
15465 fputs ("Toshiba R5900", stdout);
15466 break;
15467 case AFL_EXT_4650:
15468 fputs ("MIPS R4650", stdout);
15469 break;
15470 case AFL_EXT_4010:
15471 fputs ("LSI R4010", stdout);
15472 break;
15473 case AFL_EXT_4100:
15474 fputs ("NEC VR4100", stdout);
15475 break;
15476 case AFL_EXT_3900:
15477 fputs ("Toshiba R3900", stdout);
15478 break;
15479 case AFL_EXT_10000:
15480 fputs ("MIPS R10000", stdout);
15481 break;
15482 case AFL_EXT_SB1:
15483 fputs ("Broadcom SB-1", stdout);
15484 break;
15485 case AFL_EXT_4111:
15486 fputs ("NEC VR4111/VR4181", stdout);
15487 break;
15488 case AFL_EXT_4120:
15489 fputs ("NEC VR4120", stdout);
15490 break;
15491 case AFL_EXT_5400:
15492 fputs ("NEC VR5400", stdout);
15493 break;
15494 case AFL_EXT_5500:
15495 fputs ("NEC VR5500", stdout);
15496 break;
15497 case AFL_EXT_LOONGSON_2E:
15498 fputs ("ST Microelectronics Loongson 2E", stdout);
15499 break;
15500 case AFL_EXT_LOONGSON_2F:
15501 fputs ("ST Microelectronics Loongson 2F", stdout);
15502 break;
15503 case AFL_EXT_INTERAPTIV_MR2:
15504 fputs ("Imagination interAptiv MR2", stdout);
15505 break;
15506 default:
15507 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15508 }
15509 }
15510
15511 static signed int
15512 get_mips_reg_size (int reg_size)
15513 {
15514 return (reg_size == AFL_REG_NONE) ? 0
15515 : (reg_size == AFL_REG_32) ? 32
15516 : (reg_size == AFL_REG_64) ? 64
15517 : (reg_size == AFL_REG_128) ? 128
15518 : -1;
15519 }
15520
15521 static bfd_boolean
15522 process_mips_specific (Filedata * filedata)
15523 {
15524 Elf_Internal_Dyn * entry;
15525 Elf_Internal_Shdr *sect = NULL;
15526 size_t liblist_offset = 0;
15527 size_t liblistno = 0;
15528 size_t conflictsno = 0;
15529 size_t options_offset = 0;
15530 size_t conflicts_offset = 0;
15531 size_t pltrelsz = 0;
15532 size_t pltrel = 0;
15533 bfd_vma pltgot = 0;
15534 bfd_vma mips_pltgot = 0;
15535 bfd_vma jmprel = 0;
15536 bfd_vma local_gotno = 0;
15537 bfd_vma gotsym = 0;
15538 bfd_vma symtabno = 0;
15539 bfd_boolean res = TRUE;
15540
15541 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15542 display_mips_gnu_attribute))
15543 res = FALSE;
15544
15545 sect = find_section (filedata, ".MIPS.abiflags");
15546
15547 if (sect != NULL)
15548 {
15549 Elf_External_ABIFlags_v0 *abiflags_ext;
15550 Elf_Internal_ABIFlags_v0 abiflags_in;
15551
15552 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15553 {
15554 error (_("Corrupt MIPS ABI Flags section.\n"));
15555 res = FALSE;
15556 }
15557 else
15558 {
15559 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15560 sect->sh_size, _("MIPS ABI Flags section"));
15561 if (abiflags_ext)
15562 {
15563 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15564 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15565 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15566 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15567 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15568 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15569 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15570 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15571 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15572 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15573 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15574
15575 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15576 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15577 if (abiflags_in.isa_rev > 1)
15578 printf ("r%d", abiflags_in.isa_rev);
15579 printf ("\nGPR size: %d",
15580 get_mips_reg_size (abiflags_in.gpr_size));
15581 printf ("\nCPR1 size: %d",
15582 get_mips_reg_size (abiflags_in.cpr1_size));
15583 printf ("\nCPR2 size: %d",
15584 get_mips_reg_size (abiflags_in.cpr2_size));
15585 fputs ("\nFP ABI: ", stdout);
15586 print_mips_fp_abi_value (abiflags_in.fp_abi);
15587 fputs ("ISA Extension: ", stdout);
15588 print_mips_isa_ext (abiflags_in.isa_ext);
15589 fputs ("\nASEs:", stdout);
15590 print_mips_ases (abiflags_in.ases);
15591 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15592 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15593 fputc ('\n', stdout);
15594 free (abiflags_ext);
15595 }
15596 }
15597 }
15598
15599 /* We have a lot of special sections. Thanks SGI! */
15600 if (dynamic_section == NULL)
15601 {
15602 /* No dynamic information available. See if there is static GOT. */
15603 sect = find_section (filedata, ".got");
15604 if (sect != NULL)
15605 {
15606 unsigned char *data_end;
15607 unsigned char *data;
15608 bfd_vma ent, end;
15609 int addr_size;
15610
15611 pltgot = sect->sh_addr;
15612
15613 ent = pltgot;
15614 addr_size = (is_32bit_elf ? 4 : 8);
15615 end = pltgot + sect->sh_size;
15616
15617 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15618 end - pltgot, 1,
15619 _("Global Offset Table data"));
15620 /* PR 12855: Null data is handled gracefully throughout. */
15621 data_end = data + (end - pltgot);
15622
15623 printf (_("\nStatic GOT:\n"));
15624 printf (_(" Canonical gp value: "));
15625 print_vma (ent + 0x7ff0, LONG_HEX);
15626 printf ("\n\n");
15627
15628 /* In a dynamic binary GOT[0] is reserved for the dynamic
15629 loader to store the lazy resolver pointer, however in
15630 a static binary it may well have been omitted and GOT
15631 reduced to a table of addresses.
15632 PR 21344: Check for the entry being fully available
15633 before fetching it. */
15634 if (data
15635 && data + ent - pltgot + addr_size <= data_end
15636 && byte_get (data + ent - pltgot, addr_size) == 0)
15637 {
15638 printf (_(" Reserved entries:\n"));
15639 printf (_(" %*s %10s %*s\n"),
15640 addr_size * 2, _("Address"), _("Access"),
15641 addr_size * 2, _("Value"));
15642 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15643 printf ("\n");
15644 if (ent == (bfd_vma) -1)
15645 goto sgot_print_fail;
15646
15647 /* Check for the MSB of GOT[1] being set, identifying a
15648 GNU object. This entry will be used by some runtime
15649 loaders, to store the module pointer. Otherwise this
15650 is an ordinary local entry.
15651 PR 21344: Check for the entry being fully available
15652 before fetching it. */
15653 if (data
15654 && data + ent - pltgot + addr_size <= data_end
15655 && (byte_get (data + ent - pltgot, addr_size)
15656 >> (addr_size * 8 - 1)) != 0)
15657 {
15658 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15659 printf ("\n");
15660 if (ent == (bfd_vma) -1)
15661 goto sgot_print_fail;
15662 }
15663 printf ("\n");
15664 }
15665
15666 if (data != NULL && ent < end)
15667 {
15668 printf (_(" Local entries:\n"));
15669 printf (" %*s %10s %*s\n",
15670 addr_size * 2, _("Address"), _("Access"),
15671 addr_size * 2, _("Value"));
15672 while (ent < end)
15673 {
15674 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15675 printf ("\n");
15676 if (ent == (bfd_vma) -1)
15677 goto sgot_print_fail;
15678 }
15679 printf ("\n");
15680 }
15681
15682 sgot_print_fail:
15683 if (data)
15684 free (data);
15685 }
15686 return res;
15687 }
15688
15689 for (entry = dynamic_section;
15690 /* PR 17531 file: 012-50589-0.004. */
15691 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15692 ++entry)
15693 switch (entry->d_tag)
15694 {
15695 case DT_MIPS_LIBLIST:
15696 liblist_offset
15697 = offset_from_vma (filedata, entry->d_un.d_val,
15698 liblistno * sizeof (Elf32_External_Lib));
15699 break;
15700 case DT_MIPS_LIBLISTNO:
15701 liblistno = entry->d_un.d_val;
15702 break;
15703 case DT_MIPS_OPTIONS:
15704 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15705 break;
15706 case DT_MIPS_CONFLICT:
15707 conflicts_offset
15708 = offset_from_vma (filedata, entry->d_un.d_val,
15709 conflictsno * sizeof (Elf32_External_Conflict));
15710 break;
15711 case DT_MIPS_CONFLICTNO:
15712 conflictsno = entry->d_un.d_val;
15713 break;
15714 case DT_PLTGOT:
15715 pltgot = entry->d_un.d_ptr;
15716 break;
15717 case DT_MIPS_LOCAL_GOTNO:
15718 local_gotno = entry->d_un.d_val;
15719 break;
15720 case DT_MIPS_GOTSYM:
15721 gotsym = entry->d_un.d_val;
15722 break;
15723 case DT_MIPS_SYMTABNO:
15724 symtabno = entry->d_un.d_val;
15725 break;
15726 case DT_MIPS_PLTGOT:
15727 mips_pltgot = entry->d_un.d_ptr;
15728 break;
15729 case DT_PLTREL:
15730 pltrel = entry->d_un.d_val;
15731 break;
15732 case DT_PLTRELSZ:
15733 pltrelsz = entry->d_un.d_val;
15734 break;
15735 case DT_JMPREL:
15736 jmprel = entry->d_un.d_ptr;
15737 break;
15738 default:
15739 break;
15740 }
15741
15742 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15743 {
15744 Elf32_External_Lib * elib;
15745 size_t cnt;
15746
15747 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15748 liblistno,
15749 sizeof (Elf32_External_Lib),
15750 _("liblist section data"));
15751 if (elib)
15752 {
15753 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15754 "\nSection '.liblist' contains %lu entries:\n",
15755 (unsigned long) liblistno),
15756 (unsigned long) liblistno);
15757 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15758 stdout);
15759
15760 for (cnt = 0; cnt < liblistno; ++cnt)
15761 {
15762 Elf32_Lib liblist;
15763 time_t atime;
15764 char timebuf[128];
15765 struct tm * tmp;
15766
15767 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15768 atime = BYTE_GET (elib[cnt].l_time_stamp);
15769 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15770 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15771 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15772
15773 tmp = gmtime (&atime);
15774 snprintf (timebuf, sizeof (timebuf),
15775 "%04u-%02u-%02uT%02u:%02u:%02u",
15776 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15777 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15778
15779 printf ("%3lu: ", (unsigned long) cnt);
15780 if (VALID_DYNAMIC_NAME (liblist.l_name))
15781 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15782 else
15783 printf (_("<corrupt: %9ld>"), liblist.l_name);
15784 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15785 liblist.l_version);
15786
15787 if (liblist.l_flags == 0)
15788 puts (_(" NONE"));
15789 else
15790 {
15791 static const struct
15792 {
15793 const char * name;
15794 int bit;
15795 }
15796 l_flags_vals[] =
15797 {
15798 { " EXACT_MATCH", LL_EXACT_MATCH },
15799 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15800 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15801 { " EXPORTS", LL_EXPORTS },
15802 { " DELAY_LOAD", LL_DELAY_LOAD },
15803 { " DELTA", LL_DELTA }
15804 };
15805 int flags = liblist.l_flags;
15806 size_t fcnt;
15807
15808 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15809 if ((flags & l_flags_vals[fcnt].bit) != 0)
15810 {
15811 fputs (l_flags_vals[fcnt].name, stdout);
15812 flags ^= l_flags_vals[fcnt].bit;
15813 }
15814 if (flags != 0)
15815 printf (" %#x", (unsigned int) flags);
15816
15817 puts ("");
15818 }
15819 }
15820
15821 free (elib);
15822 }
15823 else
15824 res = FALSE;
15825 }
15826
15827 if (options_offset != 0)
15828 {
15829 Elf_External_Options * eopt;
15830 Elf_Internal_Options * iopt;
15831 Elf_Internal_Options * option;
15832 size_t offset;
15833 int cnt;
15834 sect = filedata->section_headers;
15835
15836 /* Find the section header so that we get the size. */
15837 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15838 /* PR 17533 file: 012-277276-0.004. */
15839 if (sect == NULL)
15840 {
15841 error (_("No MIPS_OPTIONS header found\n"));
15842 return FALSE;
15843 }
15844
15845 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
15846 sect->sh_size, _("options"));
15847 if (eopt)
15848 {
15849 iopt = (Elf_Internal_Options *)
15850 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15851 if (iopt == NULL)
15852 {
15853 error (_("Out of memory allocating space for MIPS options\n"));
15854 return FALSE;
15855 }
15856
15857 offset = cnt = 0;
15858 option = iopt;
15859
15860 while (offset <= sect->sh_size - sizeof (* eopt))
15861 {
15862 Elf_External_Options * eoption;
15863
15864 eoption = (Elf_External_Options *) ((char *) eopt + offset);
15865
15866 option->kind = BYTE_GET (eoption->kind);
15867 option->size = BYTE_GET (eoption->size);
15868 option->section = BYTE_GET (eoption->section);
15869 option->info = BYTE_GET (eoption->info);
15870
15871 /* PR 17531: file: ffa0fa3b. */
15872 if (option->size < sizeof (* eopt)
15873 || offset + option->size > sect->sh_size)
15874 {
15875 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15876 return FALSE;
15877 }
15878 offset += option->size;
15879
15880 ++option;
15881 ++cnt;
15882 }
15883
15884 printf (ngettext ("\nSection '%s' contains %d entry:\n",
15885 "\nSection '%s' contains %d entries:\n",
15886 cnt),
15887 printable_section_name (filedata, sect), cnt);
15888
15889 option = iopt;
15890 offset = 0;
15891
15892 while (cnt-- > 0)
15893 {
15894 size_t len;
15895
15896 switch (option->kind)
15897 {
15898 case ODK_NULL:
15899 /* This shouldn't happen. */
15900 printf (" NULL %d %lx", option->section, option->info);
15901 break;
15902 case ODK_REGINFO:
15903 printf (" REGINFO ");
15904 if (filedata->file_header.e_machine == EM_MIPS)
15905 {
15906 /* 32bit form. */
15907 Elf32_External_RegInfo * ereg;
15908 Elf32_RegInfo reginfo;
15909
15910 ereg = (Elf32_External_RegInfo *) (option + 1);
15911 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15912 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15913 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15914 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15915 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15916 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15917
15918 printf ("GPR %08lx GP 0x%lx\n",
15919 reginfo.ri_gprmask,
15920 (unsigned long) reginfo.ri_gp_value);
15921 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15922 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15923 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15924 }
15925 else
15926 {
15927 /* 64 bit form. */
15928 Elf64_External_RegInfo * ereg;
15929 Elf64_Internal_RegInfo reginfo;
15930
15931 ereg = (Elf64_External_RegInfo *) (option + 1);
15932 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15933 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15934 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15935 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15936 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15937 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15938
15939 printf ("GPR %08lx GP 0x",
15940 reginfo.ri_gprmask);
15941 printf_vma (reginfo.ri_gp_value);
15942 printf ("\n");
15943
15944 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15945 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15946 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15947 }
15948 ++option;
15949 continue;
15950 case ODK_EXCEPTIONS:
15951 fputs (" EXCEPTIONS fpe_min(", stdout);
15952 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15953 fputs (") fpe_max(", stdout);
15954 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15955 fputs (")", stdout);
15956
15957 if (option->info & OEX_PAGE0)
15958 fputs (" PAGE0", stdout);
15959 if (option->info & OEX_SMM)
15960 fputs (" SMM", stdout);
15961 if (option->info & OEX_FPDBUG)
15962 fputs (" FPDBUG", stdout);
15963 if (option->info & OEX_DISMISS)
15964 fputs (" DISMISS", stdout);
15965 break;
15966 case ODK_PAD:
15967 fputs (" PAD ", stdout);
15968 if (option->info & OPAD_PREFIX)
15969 fputs (" PREFIX", stdout);
15970 if (option->info & OPAD_POSTFIX)
15971 fputs (" POSTFIX", stdout);
15972 if (option->info & OPAD_SYMBOL)
15973 fputs (" SYMBOL", stdout);
15974 break;
15975 case ODK_HWPATCH:
15976 fputs (" HWPATCH ", stdout);
15977 if (option->info & OHW_R4KEOP)
15978 fputs (" R4KEOP", stdout);
15979 if (option->info & OHW_R8KPFETCH)
15980 fputs (" R8KPFETCH", stdout);
15981 if (option->info & OHW_R5KEOP)
15982 fputs (" R5KEOP", stdout);
15983 if (option->info & OHW_R5KCVTL)
15984 fputs (" R5KCVTL", stdout);
15985 break;
15986 case ODK_FILL:
15987 fputs (" FILL ", stdout);
15988 /* XXX Print content of info word? */
15989 break;
15990 case ODK_TAGS:
15991 fputs (" TAGS ", stdout);
15992 /* XXX Print content of info word? */
15993 break;
15994 case ODK_HWAND:
15995 fputs (" HWAND ", stdout);
15996 if (option->info & OHWA0_R4KEOP_CHECKED)
15997 fputs (" R4KEOP_CHECKED", stdout);
15998 if (option->info & OHWA0_R4KEOP_CLEAN)
15999 fputs (" R4KEOP_CLEAN", stdout);
16000 break;
16001 case ODK_HWOR:
16002 fputs (" HWOR ", stdout);
16003 if (option->info & OHWA0_R4KEOP_CHECKED)
16004 fputs (" R4KEOP_CHECKED", stdout);
16005 if (option->info & OHWA0_R4KEOP_CLEAN)
16006 fputs (" R4KEOP_CLEAN", stdout);
16007 break;
16008 case ODK_GP_GROUP:
16009 printf (" GP_GROUP %#06lx self-contained %#06lx",
16010 option->info & OGP_GROUP,
16011 (option->info & OGP_SELF) >> 16);
16012 break;
16013 case ODK_IDENT:
16014 printf (" IDENT %#06lx self-contained %#06lx",
16015 option->info & OGP_GROUP,
16016 (option->info & OGP_SELF) >> 16);
16017 break;
16018 default:
16019 /* This shouldn't happen. */
16020 printf (" %3d ??? %d %lx",
16021 option->kind, option->section, option->info);
16022 break;
16023 }
16024
16025 len = sizeof (* eopt);
16026 while (len < option->size)
16027 {
16028 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16029
16030 if (ISPRINT (datum))
16031 printf ("%c", datum);
16032 else
16033 printf ("\\%03o", datum);
16034 len ++;
16035 }
16036 fputs ("\n", stdout);
16037
16038 offset += option->size;
16039 ++option;
16040 }
16041
16042 free (eopt);
16043 }
16044 else
16045 res = FALSE;
16046 }
16047
16048 if (conflicts_offset != 0 && conflictsno != 0)
16049 {
16050 Elf32_Conflict * iconf;
16051 size_t cnt;
16052
16053 if (dynamic_symbols == NULL)
16054 {
16055 error (_("conflict list found without a dynamic symbol table\n"));
16056 return FALSE;
16057 }
16058
16059 /* PR 21345 - print a slightly more helpful error message
16060 if we are sure that the cmalloc will fail. */
16061 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16062 {
16063 error (_("Overlarge number of conflicts detected: %lx\n"),
16064 (long) conflictsno);
16065 return FALSE;
16066 }
16067
16068 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16069 if (iconf == NULL)
16070 {
16071 error (_("Out of memory allocating space for dynamic conflicts\n"));
16072 return FALSE;
16073 }
16074
16075 if (is_32bit_elf)
16076 {
16077 Elf32_External_Conflict * econf32;
16078
16079 econf32 = (Elf32_External_Conflict *)
16080 get_data (NULL, filedata, conflicts_offset, conflictsno,
16081 sizeof (* econf32), _("conflict"));
16082 if (!econf32)
16083 return FALSE;
16084
16085 for (cnt = 0; cnt < conflictsno; ++cnt)
16086 iconf[cnt] = BYTE_GET (econf32[cnt]);
16087
16088 free (econf32);
16089 }
16090 else
16091 {
16092 Elf64_External_Conflict * econf64;
16093
16094 econf64 = (Elf64_External_Conflict *)
16095 get_data (NULL, filedata, conflicts_offset, conflictsno,
16096 sizeof (* econf64), _("conflict"));
16097 if (!econf64)
16098 return FALSE;
16099
16100 for (cnt = 0; cnt < conflictsno; ++cnt)
16101 iconf[cnt] = BYTE_GET (econf64[cnt]);
16102
16103 free (econf64);
16104 }
16105
16106 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16107 "\nSection '.conflict' contains %lu entries:\n",
16108 (unsigned long) conflictsno),
16109 (unsigned long) conflictsno);
16110 puts (_(" Num: Index Value Name"));
16111
16112 for (cnt = 0; cnt < conflictsno; ++cnt)
16113 {
16114 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16115
16116 if (iconf[cnt] >= num_dynamic_syms)
16117 printf (_("<corrupt symbol index>"));
16118 else
16119 {
16120 Elf_Internal_Sym * psym;
16121
16122 psym = & dynamic_symbols[iconf[cnt]];
16123 print_vma (psym->st_value, FULL_HEX);
16124 putchar (' ');
16125 if (VALID_DYNAMIC_NAME (psym->st_name))
16126 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16127 else
16128 printf (_("<corrupt: %14ld>"), psym->st_name);
16129 }
16130 putchar ('\n');
16131 }
16132
16133 free (iconf);
16134 }
16135
16136 if (pltgot != 0 && local_gotno != 0)
16137 {
16138 bfd_vma ent, local_end, global_end;
16139 size_t i, offset;
16140 unsigned char * data;
16141 unsigned char * data_end;
16142 int addr_size;
16143
16144 ent = pltgot;
16145 addr_size = (is_32bit_elf ? 4 : 8);
16146 local_end = pltgot + local_gotno * addr_size;
16147
16148 /* PR binutils/17533 file: 012-111227-0.004 */
16149 if (symtabno < gotsym)
16150 {
16151 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16152 (unsigned long) gotsym, (unsigned long) symtabno);
16153 return FALSE;
16154 }
16155
16156 global_end = local_end + (symtabno - gotsym) * addr_size;
16157 /* PR 17531: file: 54c91a34. */
16158 if (global_end < local_end)
16159 {
16160 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16161 return FALSE;
16162 }
16163
16164 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16165 data = (unsigned char *) get_data (NULL, filedata, offset,
16166 global_end - pltgot, 1,
16167 _("Global Offset Table data"));
16168 /* PR 12855: Null data is handled gracefully throughout. */
16169 data_end = data + (global_end - pltgot);
16170
16171 printf (_("\nPrimary GOT:\n"));
16172 printf (_(" Canonical gp value: "));
16173 print_vma (pltgot + 0x7ff0, LONG_HEX);
16174 printf ("\n\n");
16175
16176 printf (_(" Reserved entries:\n"));
16177 printf (_(" %*s %10s %*s Purpose\n"),
16178 addr_size * 2, _("Address"), _("Access"),
16179 addr_size * 2, _("Initial"));
16180 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16181 printf (_(" Lazy resolver\n"));
16182 if (ent == (bfd_vma) -1)
16183 goto got_print_fail;
16184
16185 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16186 This entry will be used by some runtime loaders, to store the
16187 module pointer. Otherwise this is an ordinary local entry.
16188 PR 21344: Check for the entry being fully available before
16189 fetching it. */
16190 if (data
16191 && data + ent - pltgot + addr_size <= data_end
16192 && (byte_get (data + ent - pltgot, addr_size)
16193 >> (addr_size * 8 - 1)) != 0)
16194 {
16195 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16196 printf (_(" Module pointer (GNU extension)\n"));
16197 if (ent == (bfd_vma) -1)
16198 goto got_print_fail;
16199 }
16200 printf ("\n");
16201
16202 if (data != NULL && ent < local_end)
16203 {
16204 printf (_(" Local entries:\n"));
16205 printf (" %*s %10s %*s\n",
16206 addr_size * 2, _("Address"), _("Access"),
16207 addr_size * 2, _("Initial"));
16208 while (ent < local_end)
16209 {
16210 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16211 printf ("\n");
16212 if (ent == (bfd_vma) -1)
16213 goto got_print_fail;
16214 }
16215 printf ("\n");
16216 }
16217
16218 if (data != NULL && gotsym < symtabno)
16219 {
16220 int sym_width;
16221
16222 printf (_(" Global entries:\n"));
16223 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16224 addr_size * 2, _("Address"),
16225 _("Access"),
16226 addr_size * 2, _("Initial"),
16227 addr_size * 2, _("Sym.Val."),
16228 _("Type"),
16229 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16230 _("Ndx"), _("Name"));
16231
16232 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16233
16234 for (i = gotsym; i < symtabno; i++)
16235 {
16236 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16237 printf (" ");
16238
16239 if (dynamic_symbols == NULL)
16240 printf (_("<no dynamic symbols>"));
16241 else if (i < num_dynamic_syms)
16242 {
16243 Elf_Internal_Sym * psym = dynamic_symbols + i;
16244
16245 print_vma (psym->st_value, LONG_HEX);
16246 printf (" %-7s %3s ",
16247 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16248 get_symbol_index_type (filedata, psym->st_shndx));
16249
16250 if (VALID_DYNAMIC_NAME (psym->st_name))
16251 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16252 else
16253 printf (_("<corrupt: %14ld>"), psym->st_name);
16254 }
16255 else
16256 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16257 (unsigned long) i);
16258
16259 printf ("\n");
16260 if (ent == (bfd_vma) -1)
16261 break;
16262 }
16263 printf ("\n");
16264 }
16265
16266 got_print_fail:
16267 if (data)
16268 free (data);
16269 }
16270
16271 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16272 {
16273 bfd_vma ent, end;
16274 size_t offset, rel_offset;
16275 unsigned long count, i;
16276 unsigned char * data;
16277 int addr_size, sym_width;
16278 Elf_Internal_Rela * rels;
16279
16280 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16281 if (pltrel == DT_RELA)
16282 {
16283 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16284 return FALSE;
16285 }
16286 else
16287 {
16288 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16289 return FALSE;
16290 }
16291
16292 ent = mips_pltgot;
16293 addr_size = (is_32bit_elf ? 4 : 8);
16294 end = mips_pltgot + (2 + count) * addr_size;
16295
16296 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16297 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16298 1, _("Procedure Linkage Table data"));
16299 if (data == NULL)
16300 return FALSE;
16301
16302 printf ("\nPLT GOT:\n\n");
16303 printf (_(" Reserved entries:\n"));
16304 printf (_(" %*s %*s Purpose\n"),
16305 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16306 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16307 printf (_(" PLT lazy resolver\n"));
16308 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16309 printf (_(" Module pointer\n"));
16310 printf ("\n");
16311
16312 printf (_(" Entries:\n"));
16313 printf (" %*s %*s %*s %-7s %3s %s\n",
16314 addr_size * 2, _("Address"),
16315 addr_size * 2, _("Initial"),
16316 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16317 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16318 for (i = 0; i < count; i++)
16319 {
16320 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16321
16322 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16323 printf (" ");
16324
16325 if (idx >= num_dynamic_syms)
16326 printf (_("<corrupt symbol index: %lu>"), idx);
16327 else
16328 {
16329 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16330
16331 print_vma (psym->st_value, LONG_HEX);
16332 printf (" %-7s %3s ",
16333 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16334 get_symbol_index_type (filedata, psym->st_shndx));
16335 if (VALID_DYNAMIC_NAME (psym->st_name))
16336 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16337 else
16338 printf (_("<corrupt: %14ld>"), psym->st_name);
16339 }
16340 printf ("\n");
16341 }
16342 printf ("\n");
16343
16344 if (data)
16345 free (data);
16346 free (rels);
16347 }
16348
16349 return res;
16350 }
16351
16352 static bfd_boolean
16353 process_nds32_specific (Filedata * filedata)
16354 {
16355 Elf_Internal_Shdr *sect = NULL;
16356
16357 sect = find_section (filedata, ".nds32_e_flags");
16358 if (sect != NULL)
16359 {
16360 unsigned int *flag;
16361
16362 printf ("\nNDS32 elf flags section:\n");
16363 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16364 sect->sh_size, _("NDS32 elf flags section"));
16365
16366 if (! flag)
16367 return FALSE;
16368
16369 switch ((*flag) & 0x3)
16370 {
16371 case 0:
16372 printf ("(VEC_SIZE):\tNo entry.\n");
16373 break;
16374 case 1:
16375 printf ("(VEC_SIZE):\t4 bytes\n");
16376 break;
16377 case 2:
16378 printf ("(VEC_SIZE):\t16 bytes\n");
16379 break;
16380 case 3:
16381 printf ("(VEC_SIZE):\treserved\n");
16382 break;
16383 }
16384 }
16385
16386 return TRUE;
16387 }
16388
16389 static bfd_boolean
16390 process_gnu_liblist (Filedata * filedata)
16391 {
16392 Elf_Internal_Shdr * section;
16393 Elf_Internal_Shdr * string_sec;
16394 Elf32_External_Lib * elib;
16395 char * strtab;
16396 size_t strtab_size;
16397 size_t cnt;
16398 unsigned long num_liblist;
16399 unsigned i;
16400 bfd_boolean res = TRUE;
16401
16402 if (! do_arch)
16403 return TRUE;
16404
16405 for (i = 0, section = filedata->section_headers;
16406 i < filedata->file_header.e_shnum;
16407 i++, section++)
16408 {
16409 switch (section->sh_type)
16410 {
16411 case SHT_GNU_LIBLIST:
16412 if (section->sh_link >= filedata->file_header.e_shnum)
16413 break;
16414
16415 elib = (Elf32_External_Lib *)
16416 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16417 _("liblist section data"));
16418
16419 if (elib == NULL)
16420 {
16421 res = FALSE;
16422 break;
16423 }
16424
16425 string_sec = filedata->section_headers + section->sh_link;
16426 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16427 string_sec->sh_size,
16428 _("liblist string table"));
16429 if (strtab == NULL
16430 || section->sh_entsize != sizeof (Elf32_External_Lib))
16431 {
16432 free (elib);
16433 free (strtab);
16434 res = FALSE;
16435 break;
16436 }
16437 strtab_size = string_sec->sh_size;
16438
16439 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16440 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16441 "\nLibrary list section '%s' contains %lu entries:\n",
16442 num_liblist),
16443 printable_section_name (filedata, section),
16444 num_liblist);
16445
16446 puts (_(" Library Time Stamp Checksum Version Flags"));
16447
16448 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16449 ++cnt)
16450 {
16451 Elf32_Lib liblist;
16452 time_t atime;
16453 char timebuf[128];
16454 struct tm * tmp;
16455
16456 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16457 atime = BYTE_GET (elib[cnt].l_time_stamp);
16458 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16459 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16460 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16461
16462 tmp = gmtime (&atime);
16463 snprintf (timebuf, sizeof (timebuf),
16464 "%04u-%02u-%02uT%02u:%02u:%02u",
16465 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16466 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16467
16468 printf ("%3lu: ", (unsigned long) cnt);
16469 if (do_wide)
16470 printf ("%-20s", liblist.l_name < strtab_size
16471 ? strtab + liblist.l_name : _("<corrupt>"));
16472 else
16473 printf ("%-20.20s", liblist.l_name < strtab_size
16474 ? strtab + liblist.l_name : _("<corrupt>"));
16475 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16476 liblist.l_version, liblist.l_flags);
16477 }
16478
16479 free (elib);
16480 free (strtab);
16481 }
16482 }
16483
16484 return res;
16485 }
16486
16487 static const char *
16488 get_note_type (Filedata * filedata, unsigned e_type)
16489 {
16490 static char buff[64];
16491
16492 if (filedata->file_header.e_type == ET_CORE)
16493 switch (e_type)
16494 {
16495 case NT_AUXV:
16496 return _("NT_AUXV (auxiliary vector)");
16497 case NT_PRSTATUS:
16498 return _("NT_PRSTATUS (prstatus structure)");
16499 case NT_FPREGSET:
16500 return _("NT_FPREGSET (floating point registers)");
16501 case NT_PRPSINFO:
16502 return _("NT_PRPSINFO (prpsinfo structure)");
16503 case NT_TASKSTRUCT:
16504 return _("NT_TASKSTRUCT (task structure)");
16505 case NT_PRXFPREG:
16506 return _("NT_PRXFPREG (user_xfpregs structure)");
16507 case NT_PPC_VMX:
16508 return _("NT_PPC_VMX (ppc Altivec registers)");
16509 case NT_PPC_VSX:
16510 return _("NT_PPC_VSX (ppc VSX registers)");
16511 case NT_PPC_TAR:
16512 return _("NT_PPC_TAR (ppc TAR register)");
16513 case NT_PPC_PPR:
16514 return _("NT_PPC_PPR (ppc PPR register)");
16515 case NT_PPC_DSCR:
16516 return _("NT_PPC_DSCR (ppc DSCR register)");
16517 case NT_PPC_EBB:
16518 return _("NT_PPC_EBB (ppc EBB registers)");
16519 case NT_PPC_PMU:
16520 return _("NT_PPC_PMU (ppc PMU registers)");
16521 case NT_PPC_TM_CGPR:
16522 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16523 case NT_PPC_TM_CFPR:
16524 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16525 case NT_PPC_TM_CVMX:
16526 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16527 case NT_PPC_TM_CVSX:
16528 return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16529 case NT_PPC_TM_SPR:
16530 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16531 case NT_PPC_TM_CTAR:
16532 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16533 case NT_PPC_TM_CPPR:
16534 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16535 case NT_PPC_TM_CDSCR:
16536 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16537 case NT_386_TLS:
16538 return _("NT_386_TLS (x86 TLS information)");
16539 case NT_386_IOPERM:
16540 return _("NT_386_IOPERM (x86 I/O permissions)");
16541 case NT_X86_XSTATE:
16542 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16543 case NT_S390_HIGH_GPRS:
16544 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16545 case NT_S390_TIMER:
16546 return _("NT_S390_TIMER (s390 timer register)");
16547 case NT_S390_TODCMP:
16548 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16549 case NT_S390_TODPREG:
16550 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16551 case NT_S390_CTRS:
16552 return _("NT_S390_CTRS (s390 control registers)");
16553 case NT_S390_PREFIX:
16554 return _("NT_S390_PREFIX (s390 prefix register)");
16555 case NT_S390_LAST_BREAK:
16556 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16557 case NT_S390_SYSTEM_CALL:
16558 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16559 case NT_S390_TDB:
16560 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16561 case NT_S390_VXRS_LOW:
16562 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16563 case NT_S390_VXRS_HIGH:
16564 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16565 case NT_S390_GS_CB:
16566 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16567 case NT_S390_GS_BC:
16568 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16569 case NT_ARM_VFP:
16570 return _("NT_ARM_VFP (arm VFP registers)");
16571 case NT_ARM_TLS:
16572 return _("NT_ARM_TLS (AArch TLS registers)");
16573 case NT_ARM_HW_BREAK:
16574 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16575 case NT_ARM_HW_WATCH:
16576 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16577 case NT_PSTATUS:
16578 return _("NT_PSTATUS (pstatus structure)");
16579 case NT_FPREGS:
16580 return _("NT_FPREGS (floating point registers)");
16581 case NT_PSINFO:
16582 return _("NT_PSINFO (psinfo structure)");
16583 case NT_LWPSTATUS:
16584 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16585 case NT_LWPSINFO:
16586 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16587 case NT_WIN32PSTATUS:
16588 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16589 case NT_SIGINFO:
16590 return _("NT_SIGINFO (siginfo_t data)");
16591 case NT_FILE:
16592 return _("NT_FILE (mapped files)");
16593 default:
16594 break;
16595 }
16596 else
16597 switch (e_type)
16598 {
16599 case NT_VERSION:
16600 return _("NT_VERSION (version)");
16601 case NT_ARCH:
16602 return _("NT_ARCH (architecture)");
16603 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16604 return _("OPEN");
16605 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16606 return _("func");
16607 default:
16608 break;
16609 }
16610
16611 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16612 return buff;
16613 }
16614
16615 static bfd_boolean
16616 print_core_note (Elf_Internal_Note *pnote)
16617 {
16618 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16619 bfd_vma count, page_size;
16620 unsigned char *descdata, *filenames, *descend;
16621
16622 if (pnote->type != NT_FILE)
16623 {
16624 if (do_wide)
16625 printf ("\n");
16626 return TRUE;
16627 }
16628
16629 #ifndef BFD64
16630 if (!is_32bit_elf)
16631 {
16632 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16633 /* Still "successful". */
16634 return TRUE;
16635 }
16636 #endif
16637
16638 if (pnote->descsz < 2 * addr_size)
16639 {
16640 error (_(" Malformed note - too short for header\n"));
16641 return FALSE;
16642 }
16643
16644 descdata = (unsigned char *) pnote->descdata;
16645 descend = descdata + pnote->descsz;
16646
16647 if (descdata[pnote->descsz - 1] != '\0')
16648 {
16649 error (_(" Malformed note - does not end with \\0\n"));
16650 return FALSE;
16651 }
16652
16653 count = byte_get (descdata, addr_size);
16654 descdata += addr_size;
16655
16656 page_size = byte_get (descdata, addr_size);
16657 descdata += addr_size;
16658
16659 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16660 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16661 {
16662 error (_(" Malformed note - too short for supplied file count\n"));
16663 return FALSE;
16664 }
16665
16666 printf (_(" Page size: "));
16667 print_vma (page_size, DEC);
16668 printf ("\n");
16669
16670 printf (_(" %*s%*s%*s\n"),
16671 (int) (2 + 2 * addr_size), _("Start"),
16672 (int) (4 + 2 * addr_size), _("End"),
16673 (int) (4 + 2 * addr_size), _("Page Offset"));
16674 filenames = descdata + count * 3 * addr_size;
16675 while (count-- > 0)
16676 {
16677 bfd_vma start, end, file_ofs;
16678
16679 if (filenames == descend)
16680 {
16681 error (_(" Malformed note - filenames end too early\n"));
16682 return FALSE;
16683 }
16684
16685 start = byte_get (descdata, addr_size);
16686 descdata += addr_size;
16687 end = byte_get (descdata, addr_size);
16688 descdata += addr_size;
16689 file_ofs = byte_get (descdata, addr_size);
16690 descdata += addr_size;
16691
16692 printf (" ");
16693 print_vma (start, FULL_HEX);
16694 printf (" ");
16695 print_vma (end, FULL_HEX);
16696 printf (" ");
16697 print_vma (file_ofs, FULL_HEX);
16698 printf ("\n %s\n", filenames);
16699
16700 filenames += 1 + strlen ((char *) filenames);
16701 }
16702
16703 return TRUE;
16704 }
16705
16706 static const char *
16707 get_gnu_elf_note_type (unsigned e_type)
16708 {
16709 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
16710 switch (e_type)
16711 {
16712 case NT_GNU_ABI_TAG:
16713 return _("NT_GNU_ABI_TAG (ABI version tag)");
16714 case NT_GNU_HWCAP:
16715 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16716 case NT_GNU_BUILD_ID:
16717 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16718 case NT_GNU_GOLD_VERSION:
16719 return _("NT_GNU_GOLD_VERSION (gold version)");
16720 case NT_GNU_PROPERTY_TYPE_0:
16721 return _("NT_GNU_PROPERTY_TYPE_0");
16722 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16723 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16724 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16725 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16726 default:
16727 {
16728 static char buff[64];
16729
16730 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16731 return buff;
16732 }
16733 }
16734 }
16735
16736 static void
16737 decode_x86_isa (unsigned int bitmask)
16738 {
16739 while (bitmask)
16740 {
16741 unsigned int bit = bitmask & (- bitmask);
16742
16743 bitmask &= ~ bit;
16744 switch (bit)
16745 {
16746 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16747 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16748 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16749 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16750 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16751 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16752 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16753 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16754 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16755 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16756 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16757 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16758 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16759 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16760 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16761 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16762 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16763 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16764 default: printf (_("<unknown: %x>"), bit); break;
16765 }
16766 if (bitmask)
16767 printf (", ");
16768 }
16769 }
16770
16771 static void
16772 decode_x86_feature (unsigned int type, unsigned int bitmask)
16773 {
16774 while (bitmask)
16775 {
16776 unsigned int bit = bitmask & (- bitmask);
16777
16778 bitmask &= ~ bit;
16779 switch (bit)
16780 {
16781 case GNU_PROPERTY_X86_FEATURE_1_IBT:
16782 switch (type)
16783 {
16784 case GNU_PROPERTY_X86_FEATURE_1_AND:
16785 printf ("IBT");
16786 break;
16787 default:
16788 /* This should never happen. */
16789 abort ();
16790 }
16791 break;
16792 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16793 switch (type)
16794 {
16795 case GNU_PROPERTY_X86_FEATURE_1_AND:
16796 printf ("SHSTK");
16797 break;
16798 default:
16799 /* This should never happen. */
16800 abort ();
16801 }
16802 break;
16803 default:
16804 printf (_("<unknown: %x>"), bit);
16805 break;
16806 }
16807 if (bitmask)
16808 printf (", ");
16809 }
16810 }
16811
16812 static void
16813 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16814 {
16815 unsigned char * ptr = (unsigned char *) pnote->descdata;
16816 unsigned char * ptr_end = ptr + pnote->descsz;
16817 unsigned int size = is_32bit_elf ? 4 : 8;
16818
16819 printf (_(" Properties: "));
16820
16821 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16822 {
16823 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16824 return;
16825 }
16826
16827 while (ptr < ptr_end)
16828 {
16829 unsigned int j;
16830 unsigned int type;
16831 unsigned int datasz;
16832
16833 if ((size_t) (ptr_end - ptr) < 8)
16834 {
16835 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16836 break;
16837 }
16838
16839 type = byte_get (ptr, 4);
16840 datasz = byte_get (ptr + 4, 4);
16841
16842 ptr += 8;
16843
16844 if (datasz > (size_t) (ptr_end - ptr))
16845 {
16846 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16847 type, datasz);
16848 break;
16849 }
16850
16851 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16852 {
16853 if (filedata->file_header.e_machine == EM_X86_64
16854 || filedata->file_header.e_machine == EM_IAMCU
16855 || filedata->file_header.e_machine == EM_386)
16856 {
16857 switch (type)
16858 {
16859 case GNU_PROPERTY_X86_ISA_1_USED:
16860 printf ("x86 ISA used: ");
16861 if (datasz != 4)
16862 printf (_("<corrupt length: %#x> "), datasz);
16863 else
16864 decode_x86_isa (byte_get (ptr, 4));
16865 goto next;
16866
16867 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16868 printf ("x86 ISA needed: ");
16869 if (datasz != 4)
16870 printf (_("<corrupt length: %#x> "), datasz);
16871 else
16872 decode_x86_isa (byte_get (ptr, 4));
16873 goto next;
16874
16875 case GNU_PROPERTY_X86_FEATURE_1_AND:
16876 printf ("x86 feature: ");
16877 if (datasz != 4)
16878 printf (_("<corrupt length: %#x> "), datasz);
16879 else
16880 decode_x86_feature (type, byte_get (ptr, 4));
16881 goto next;
16882
16883 default:
16884 break;
16885 }
16886 }
16887 }
16888 else
16889 {
16890 switch (type)
16891 {
16892 case GNU_PROPERTY_STACK_SIZE:
16893 printf (_("stack size: "));
16894 if (datasz != size)
16895 printf (_("<corrupt length: %#x> "), datasz);
16896 else
16897 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16898 goto next;
16899
16900 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16901 printf ("no copy on protected ");
16902 if (datasz)
16903 printf (_("<corrupt length: %#x> "), datasz);
16904 goto next;
16905
16906 default:
16907 break;
16908 }
16909 }
16910
16911 if (type < GNU_PROPERTY_LOPROC)
16912 printf (_("<unknown type %#x data: "), type);
16913 else if (type < GNU_PROPERTY_LOUSER)
16914 printf (_("<procesor-specific type %#x data: "), type);
16915 else
16916 printf (_("<application-specific type %#x data: "), type);
16917 for (j = 0; j < datasz; ++j)
16918 printf ("%02x ", ptr[j] & 0xff);
16919 printf (">");
16920
16921 next:
16922 ptr += ((datasz + (size - 1)) & ~ (size - 1));
16923 if (ptr == ptr_end)
16924 break;
16925
16926 if (do_wide)
16927 printf (", ");
16928 else
16929 printf ("\n\t");
16930 }
16931
16932 printf ("\n");
16933 }
16934
16935 static bfd_boolean
16936 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
16937 {
16938 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
16939 switch (pnote->type)
16940 {
16941 case NT_GNU_BUILD_ID:
16942 {
16943 unsigned long i;
16944
16945 printf (_(" Build ID: "));
16946 for (i = 0; i < pnote->descsz; ++i)
16947 printf ("%02x", pnote->descdata[i] & 0xff);
16948 printf ("\n");
16949 }
16950 break;
16951
16952 case NT_GNU_ABI_TAG:
16953 {
16954 unsigned long os, major, minor, subminor;
16955 const char *osname;
16956
16957 /* PR 17531: file: 030-599401-0.004. */
16958 if (pnote->descsz < 16)
16959 {
16960 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16961 break;
16962 }
16963
16964 os = byte_get ((unsigned char *) pnote->descdata, 4);
16965 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16966 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16967 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16968
16969 switch (os)
16970 {
16971 case GNU_ABI_TAG_LINUX:
16972 osname = "Linux";
16973 break;
16974 case GNU_ABI_TAG_HURD:
16975 osname = "Hurd";
16976 break;
16977 case GNU_ABI_TAG_SOLARIS:
16978 osname = "Solaris";
16979 break;
16980 case GNU_ABI_TAG_FREEBSD:
16981 osname = "FreeBSD";
16982 break;
16983 case GNU_ABI_TAG_NETBSD:
16984 osname = "NetBSD";
16985 break;
16986 case GNU_ABI_TAG_SYLLABLE:
16987 osname = "Syllable";
16988 break;
16989 case GNU_ABI_TAG_NACL:
16990 osname = "NaCl";
16991 break;
16992 default:
16993 osname = "Unknown";
16994 break;
16995 }
16996
16997 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
16998 major, minor, subminor);
16999 }
17000 break;
17001
17002 case NT_GNU_GOLD_VERSION:
17003 {
17004 unsigned long i;
17005
17006 printf (_(" Version: "));
17007 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17008 printf ("%c", pnote->descdata[i]);
17009 printf ("\n");
17010 }
17011 break;
17012
17013 case NT_GNU_HWCAP:
17014 {
17015 unsigned long num_entries, mask;
17016
17017 /* Hardware capabilities information. Word 0 is the number of entries.
17018 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17019 is a series of entries, where each entry is a single byte followed
17020 by a nul terminated string. The byte gives the bit number to test
17021 if enabled in the bitmask. */
17022 printf (_(" Hardware Capabilities: "));
17023 if (pnote->descsz < 8)
17024 {
17025 error (_("<corrupt GNU_HWCAP>\n"));
17026 return FALSE;
17027 }
17028 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17029 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17030 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17031 /* FIXME: Add code to display the entries... */
17032 }
17033 break;
17034
17035 case NT_GNU_PROPERTY_TYPE_0:
17036 print_gnu_property_note (filedata, pnote);
17037 break;
17038
17039 default:
17040 /* Handle unrecognised types. An error message should have already been
17041 created by get_gnu_elf_note_type(), so all that we need to do is to
17042 display the data. */
17043 {
17044 unsigned long i;
17045
17046 printf (_(" Description data: "));
17047 for (i = 0; i < pnote->descsz; ++i)
17048 printf ("%02x ", pnote->descdata[i] & 0xff);
17049 printf ("\n");
17050 }
17051 break;
17052 }
17053
17054 return TRUE;
17055 }
17056
17057 static const char *
17058 get_v850_elf_note_type (enum v850_notes n_type)
17059 {
17060 static char buff[64];
17061
17062 switch (n_type)
17063 {
17064 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17065 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17066 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17067 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17068 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17069 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17070 default:
17071 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17072 return buff;
17073 }
17074 }
17075
17076 static bfd_boolean
17077 print_v850_note (Elf_Internal_Note * pnote)
17078 {
17079 unsigned int val;
17080
17081 if (pnote->descsz != 4)
17082 return FALSE;
17083
17084 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17085
17086 if (val == 0)
17087 {
17088 printf (_("not set\n"));
17089 return TRUE;
17090 }
17091
17092 switch (pnote->type)
17093 {
17094 case V850_NOTE_ALIGNMENT:
17095 switch (val)
17096 {
17097 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17098 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17099 }
17100 break;
17101
17102 case V850_NOTE_DATA_SIZE:
17103 switch (val)
17104 {
17105 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17106 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17107 }
17108 break;
17109
17110 case V850_NOTE_FPU_INFO:
17111 switch (val)
17112 {
17113 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17114 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17115 }
17116 break;
17117
17118 case V850_NOTE_MMU_INFO:
17119 case V850_NOTE_CACHE_INFO:
17120 case V850_NOTE_SIMD_INFO:
17121 if (val == EF_RH850_SIMD)
17122 {
17123 printf (_("yes\n"));
17124 return TRUE;
17125 }
17126 break;
17127
17128 default:
17129 /* An 'unknown note type' message will already have been displayed. */
17130 break;
17131 }
17132
17133 printf (_("unknown value: %x\n"), val);
17134 return FALSE;
17135 }
17136
17137 static bfd_boolean
17138 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17139 {
17140 unsigned int version;
17141
17142 switch (pnote->type)
17143 {
17144 case NT_NETBSD_IDENT:
17145 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17146 if ((version / 10000) % 100)
17147 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17148 version, version / 100000000, (version / 1000000) % 100,
17149 (version / 10000) % 100 > 26 ? "Z" : "",
17150 'A' + (version / 10000) % 26);
17151 else
17152 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17153 version, version / 100000000, (version / 1000000) % 100,
17154 (version / 100) % 100);
17155 return TRUE;
17156
17157 case NT_NETBSD_MARCH:
17158 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17159 pnote->descdata);
17160 return TRUE;
17161
17162 default:
17163 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17164 pnote->type);
17165 return FALSE;
17166 }
17167 }
17168
17169 static const char *
17170 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17171 {
17172 switch (e_type)
17173 {
17174 case NT_FREEBSD_THRMISC:
17175 return _("NT_THRMISC (thrmisc structure)");
17176 case NT_FREEBSD_PROCSTAT_PROC:
17177 return _("NT_PROCSTAT_PROC (proc data)");
17178 case NT_FREEBSD_PROCSTAT_FILES:
17179 return _("NT_PROCSTAT_FILES (files data)");
17180 case NT_FREEBSD_PROCSTAT_VMMAP:
17181 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17182 case NT_FREEBSD_PROCSTAT_GROUPS:
17183 return _("NT_PROCSTAT_GROUPS (groups data)");
17184 case NT_FREEBSD_PROCSTAT_UMASK:
17185 return _("NT_PROCSTAT_UMASK (umask data)");
17186 case NT_FREEBSD_PROCSTAT_RLIMIT:
17187 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17188 case NT_FREEBSD_PROCSTAT_OSREL:
17189 return _("NT_PROCSTAT_OSREL (osreldate data)");
17190 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17191 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17192 case NT_FREEBSD_PROCSTAT_AUXV:
17193 return _("NT_PROCSTAT_AUXV (auxv data)");
17194 case NT_FREEBSD_PTLWPINFO:
17195 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17196 }
17197 return get_note_type (filedata, e_type);
17198 }
17199
17200 static const char *
17201 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17202 {
17203 static char buff[64];
17204
17205 if (e_type == NT_NETBSDCORE_PROCINFO)
17206 return _("NetBSD procinfo structure");
17207
17208 /* As of Jan 2002 there are no other machine-independent notes
17209 defined for NetBSD core files. If the note type is less
17210 than the start of the machine-dependent note types, we don't
17211 understand it. */
17212
17213 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17214 {
17215 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17216 return buff;
17217 }
17218
17219 switch (filedata->file_header.e_machine)
17220 {
17221 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17222 and PT_GETFPREGS == mach+2. */
17223
17224 case EM_OLD_ALPHA:
17225 case EM_ALPHA:
17226 case EM_SPARC:
17227 case EM_SPARC32PLUS:
17228 case EM_SPARCV9:
17229 switch (e_type)
17230 {
17231 case NT_NETBSDCORE_FIRSTMACH + 0:
17232 return _("PT_GETREGS (reg structure)");
17233 case NT_NETBSDCORE_FIRSTMACH + 2:
17234 return _("PT_GETFPREGS (fpreg structure)");
17235 default:
17236 break;
17237 }
17238 break;
17239
17240 /* On all other arch's, PT_GETREGS == mach+1 and
17241 PT_GETFPREGS == mach+3. */
17242 default:
17243 switch (e_type)
17244 {
17245 case NT_NETBSDCORE_FIRSTMACH + 1:
17246 return _("PT_GETREGS (reg structure)");
17247 case NT_NETBSDCORE_FIRSTMACH + 3:
17248 return _("PT_GETFPREGS (fpreg structure)");
17249 default:
17250 break;
17251 }
17252 }
17253
17254 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17255 e_type - NT_NETBSDCORE_FIRSTMACH);
17256 return buff;
17257 }
17258
17259 static const char *
17260 get_stapsdt_note_type (unsigned e_type)
17261 {
17262 static char buff[64];
17263
17264 switch (e_type)
17265 {
17266 case NT_STAPSDT:
17267 return _("NT_STAPSDT (SystemTap probe descriptors)");
17268
17269 default:
17270 break;
17271 }
17272
17273 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17274 return buff;
17275 }
17276
17277 static bfd_boolean
17278 print_stapsdt_note (Elf_Internal_Note *pnote)
17279 {
17280 int addr_size = is_32bit_elf ? 4 : 8;
17281 char *data = pnote->descdata;
17282 char *data_end = pnote->descdata + pnote->descsz;
17283 bfd_vma pc, base_addr, semaphore;
17284 char *provider, *probe, *arg_fmt;
17285
17286 pc = byte_get ((unsigned char *) data, addr_size);
17287 data += addr_size;
17288 base_addr = byte_get ((unsigned char *) data, addr_size);
17289 data += addr_size;
17290 semaphore = byte_get ((unsigned char *) data, addr_size);
17291 data += addr_size;
17292
17293 provider = data;
17294 data += strlen (data) + 1;
17295 probe = data;
17296 data += strlen (data) + 1;
17297 arg_fmt = data;
17298 data += strlen (data) + 1;
17299
17300 printf (_(" Provider: %s\n"), provider);
17301 printf (_(" Name: %s\n"), probe);
17302 printf (_(" Location: "));
17303 print_vma (pc, FULL_HEX);
17304 printf (_(", Base: "));
17305 print_vma (base_addr, FULL_HEX);
17306 printf (_(", Semaphore: "));
17307 print_vma (semaphore, FULL_HEX);
17308 printf ("\n");
17309 printf (_(" Arguments: %s\n"), arg_fmt);
17310
17311 return data == data_end;
17312 }
17313
17314 static const char *
17315 get_ia64_vms_note_type (unsigned e_type)
17316 {
17317 static char buff[64];
17318
17319 switch (e_type)
17320 {
17321 case NT_VMS_MHD:
17322 return _("NT_VMS_MHD (module header)");
17323 case NT_VMS_LNM:
17324 return _("NT_VMS_LNM (language name)");
17325 case NT_VMS_SRC:
17326 return _("NT_VMS_SRC (source files)");
17327 case NT_VMS_TITLE:
17328 return "NT_VMS_TITLE";
17329 case NT_VMS_EIDC:
17330 return _("NT_VMS_EIDC (consistency check)");
17331 case NT_VMS_FPMODE:
17332 return _("NT_VMS_FPMODE (FP mode)");
17333 case NT_VMS_LINKTIME:
17334 return "NT_VMS_LINKTIME";
17335 case NT_VMS_IMGNAM:
17336 return _("NT_VMS_IMGNAM (image name)");
17337 case NT_VMS_IMGID:
17338 return _("NT_VMS_IMGID (image id)");
17339 case NT_VMS_LINKID:
17340 return _("NT_VMS_LINKID (link id)");
17341 case NT_VMS_IMGBID:
17342 return _("NT_VMS_IMGBID (build id)");
17343 case NT_VMS_GSTNAM:
17344 return _("NT_VMS_GSTNAM (sym table name)");
17345 case NT_VMS_ORIG_DYN:
17346 return "NT_VMS_ORIG_DYN";
17347 case NT_VMS_PATCHTIME:
17348 return "NT_VMS_PATCHTIME";
17349 default:
17350 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17351 return buff;
17352 }
17353 }
17354
17355 static bfd_boolean
17356 print_ia64_vms_note (Elf_Internal_Note * pnote)
17357 {
17358 switch (pnote->type)
17359 {
17360 case NT_VMS_MHD:
17361 if (pnote->descsz > 36)
17362 {
17363 size_t l = strlen (pnote->descdata + 34);
17364 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17365 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17366 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17367 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17368 }
17369 else
17370 printf (_(" Invalid size\n"));
17371 break;
17372 case NT_VMS_LNM:
17373 printf (_(" Language: %s\n"), pnote->descdata);
17374 break;
17375 #ifdef BFD64
17376 case NT_VMS_FPMODE:
17377 printf (_(" Floating Point mode: "));
17378 printf ("0x%016" BFD_VMA_FMT "x\n",
17379 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17380 break;
17381 case NT_VMS_LINKTIME:
17382 printf (_(" Link time: "));
17383 print_vms_time
17384 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17385 printf ("\n");
17386 break;
17387 case NT_VMS_PATCHTIME:
17388 printf (_(" Patch time: "));
17389 print_vms_time
17390 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17391 printf ("\n");
17392 break;
17393 case NT_VMS_ORIG_DYN:
17394 printf (_(" Major id: %u, minor id: %u\n"),
17395 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17396 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17397 printf (_(" Last modified : "));
17398 print_vms_time
17399 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17400 printf (_("\n Link flags : "));
17401 printf ("0x%016" BFD_VMA_FMT "x\n",
17402 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17403 printf (_(" Header flags: 0x%08x\n"),
17404 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17405 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17406 break;
17407 #endif
17408 case NT_VMS_IMGNAM:
17409 printf (_(" Image name: %s\n"), pnote->descdata);
17410 break;
17411 case NT_VMS_GSTNAM:
17412 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17413 break;
17414 case NT_VMS_IMGID:
17415 printf (_(" Image id: %s\n"), pnote->descdata);
17416 break;
17417 case NT_VMS_LINKID:
17418 printf (_(" Linker id: %s\n"), pnote->descdata);
17419 break;
17420 default:
17421 return FALSE;
17422 }
17423 return TRUE;
17424 }
17425
17426 /* Find the symbol associated with a build attribute that is attached
17427 to address OFFSET. If PNAME is non-NULL then store the name of
17428 the symbol (if found) in the provided pointer, Returns NULL if a
17429 symbol could not be found. */
17430
17431 static Elf_Internal_Sym *
17432 get_symbol_for_build_attribute (Filedata * filedata,
17433 unsigned long offset,
17434 bfd_boolean is_open_attr,
17435 const char ** pname)
17436 {
17437 static Filedata * saved_filedata = NULL;
17438 static char * strtab;
17439 static unsigned long strtablen;
17440 static Elf_Internal_Sym * symtab;
17441 static unsigned long nsyms;
17442 Elf_Internal_Sym * saved_sym = NULL;
17443 Elf_Internal_Sym * sym;
17444
17445 if (filedata->section_headers != NULL
17446 && (saved_filedata == NULL || filedata != saved_filedata))
17447 {
17448 Elf_Internal_Shdr * symsec;
17449
17450 /* Load the symbol and string sections. */
17451 for (symsec = filedata->section_headers;
17452 symsec < filedata->section_headers + filedata->file_header.e_shnum;
17453 symsec ++)
17454 {
17455 if (symsec->sh_type == SHT_SYMTAB)
17456 {
17457 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17458
17459 if (symsec->sh_link < filedata->file_header.e_shnum)
17460 {
17461 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17462
17463 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17464 1, strtab_sec->sh_size,
17465 _("string table"));
17466 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17467 }
17468 }
17469 }
17470 saved_filedata = filedata;
17471 }
17472
17473 if (symtab == NULL || strtab == NULL)
17474 return NULL;
17475
17476 /* Find a symbol whose value matches offset. */
17477 for (sym = symtab; sym < symtab + nsyms; sym ++)
17478 if (sym->st_value == offset)
17479 {
17480 if (sym->st_name >= strtablen)
17481 /* Huh ? This should not happen. */
17482 continue;
17483
17484 if (strtab[sym->st_name] == 0)
17485 continue;
17486
17487 /* The AArch64 and ARM architectures define mapping symbols
17488 (eg $d, $x, $t) which we want to ignore. */
17489 if (strtab[sym->st_name] == '$'
17490 && strtab[sym->st_name + 1] != 0
17491 && strtab[sym->st_name + 2] == 0)
17492 continue;
17493
17494 if (is_open_attr)
17495 {
17496 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17497 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17498 FUNC symbols entirely. */
17499 switch (ELF_ST_TYPE (sym->st_info))
17500 {
17501 case STT_OBJECT:
17502 case STT_FILE:
17503 saved_sym = sym;
17504 if (sym->st_size)
17505 {
17506 /* If the symbol has a size associated
17507 with it then we can stop searching. */
17508 sym = symtab + nsyms;
17509 }
17510 continue;
17511
17512 case STT_FUNC:
17513 /* Ignore function symbols. */
17514 continue;
17515
17516 default:
17517 break;
17518 }
17519
17520 switch (ELF_ST_BIND (sym->st_info))
17521 {
17522 case STB_GLOBAL:
17523 if (saved_sym == NULL
17524 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17525 saved_sym = sym;
17526 break;
17527
17528 case STB_LOCAL:
17529 if (saved_sym == NULL)
17530 saved_sym = sym;
17531 break;
17532
17533 default:
17534 break;
17535 }
17536 }
17537 else
17538 {
17539 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17540 continue;
17541
17542 saved_sym = sym;
17543 break;
17544 }
17545 }
17546
17547 if (saved_sym && pname)
17548 * pname = strtab + saved_sym->st_name;
17549
17550 return saved_sym;
17551 }
17552
17553 static bfd_boolean
17554 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
17555 Filedata * filedata)
17556 {
17557 static unsigned long global_offset = 0;
17558 static unsigned long global_end = 0;
17559 static unsigned long func_offset = 0;
17560 static unsigned long func_end = 0;
17561
17562 Elf_Internal_Sym * sym;
17563 const char * name;
17564 unsigned long start;
17565 unsigned long end;
17566 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17567
17568 switch (pnote->descsz)
17569 {
17570 case 0:
17571 /* A zero-length description means that the range of
17572 the previous note of the same type should be used. */
17573 if (is_open_attr)
17574 {
17575 if (global_end > global_offset)
17576 printf (_(" Applies to region from %#lx to %#lx\n"),
17577 global_offset, global_end);
17578 else
17579 printf (_(" Applies to region from %#lx\n"), global_offset);
17580 }
17581 else
17582 {
17583 if (func_end > func_offset)
17584 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17585 else
17586 printf (_(" Applies to region from %#lx\n"), func_offset);
17587 }
17588 return TRUE;
17589
17590 case 4:
17591 start = byte_get ((unsigned char *) pnote->descdata, 4);
17592 end = 0;
17593 break;
17594
17595 case 8:
17596 if (is_32bit_elf)
17597 {
17598 /* FIXME: We should check that version 3+ notes are being used here... */
17599 start = byte_get ((unsigned char *) pnote->descdata, 4);
17600 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17601 }
17602 else
17603 {
17604 start = byte_get ((unsigned char *) pnote->descdata, 8);
17605 end = 0;
17606 }
17607 break;
17608
17609 case 16:
17610 start = byte_get ((unsigned char *) pnote->descdata, 8);
17611 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17612 break;
17613
17614 default:
17615 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
17616 printf (_(" <invalid descsz>"));
17617 return FALSE;
17618 }
17619
17620 name = NULL;
17621 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17622 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
17623 in order to avoid them being confused with the start address of the
17624 first function in the file... */
17625 if (sym == NULL && is_open_attr)
17626 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
17627 & name);
17628
17629 if (end == 0 && sym != NULL && sym->st_size > 0)
17630 end = start + sym->st_size;
17631
17632 if (is_open_attr)
17633 {
17634 /* FIXME: Need to properly allow for section alignment. 16 is just the alignment used on x86_64. */
17635 if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17636 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17637 global_end + 1, start - 1);
17638
17639 printf (_(" Applies to region from %#lx"), start);
17640 global_offset = start;
17641
17642 if (end)
17643 {
17644 printf (_(" to %#lx"), end);
17645 global_end = end;
17646 }
17647 }
17648 else
17649 {
17650 printf (_(" Applies to region from %#lx"), start);
17651 func_offset = start;
17652
17653 if (end)
17654 {
17655 printf (_(" to %#lx"), end);
17656 func_end = end;
17657 }
17658 }
17659
17660 if (sym && name)
17661 printf (_(" (%s)"), name);
17662
17663 printf ("\n");
17664 return TRUE;
17665 }
17666
17667 static bfd_boolean
17668 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17669 {
17670 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17671 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17672 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17673 char name_type;
17674 char name_attribute;
17675 const char * expected_types;
17676 const char * name = pnote->namedata;
17677 const char * text;
17678 signed int left;
17679
17680 if (name == NULL || pnote->namesz < 2)
17681 {
17682 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17683 print_symbol (-20, _(" <corrupt name>"));
17684 return FALSE;
17685 }
17686
17687 if (do_wide)
17688 left = 28;
17689 else
17690 left = 20;
17691
17692 /* Version 2 of the spec adds a "GA" prefix to the name field. */
17693 if (name[0] == 'G' && name[1] == 'A')
17694 {
17695 if (pnote->namesz < 4)
17696 {
17697 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17698 print_symbol (-20, _(" <corrupt name>"));
17699 return FALSE;
17700 }
17701
17702 printf ("GA");
17703 name += 2;
17704 left -= 2;
17705 }
17706
17707 switch ((name_type = * name))
17708 {
17709 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17710 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17711 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17712 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17713 printf ("%c", * name);
17714 left --;
17715 break;
17716 default:
17717 error (_("unrecognised attribute type in name field: %d\n"), name_type);
17718 print_symbol (-20, _("<unknown name type>"));
17719 return FALSE;
17720 }
17721
17722 ++ name;
17723 text = NULL;
17724
17725 switch ((name_attribute = * name))
17726 {
17727 case GNU_BUILD_ATTRIBUTE_VERSION:
17728 text = _("<version>");
17729 expected_types = string_expected;
17730 ++ name;
17731 break;
17732 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17733 text = _("<stack prot>");
17734 expected_types = "!+*";
17735 ++ name;
17736 break;
17737 case GNU_BUILD_ATTRIBUTE_RELRO:
17738 text = _("<relro>");
17739 expected_types = bool_expected;
17740 ++ name;
17741 break;
17742 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17743 text = _("<stack size>");
17744 expected_types = number_expected;
17745 ++ name;
17746 break;
17747 case GNU_BUILD_ATTRIBUTE_TOOL:
17748 text = _("<tool>");
17749 expected_types = string_expected;
17750 ++ name;
17751 break;
17752 case GNU_BUILD_ATTRIBUTE_ABI:
17753 text = _("<ABI>");
17754 expected_types = "$*";
17755 ++ name;
17756 break;
17757 case GNU_BUILD_ATTRIBUTE_PIC:
17758 text = _("<PIC>");
17759 expected_types = number_expected;
17760 ++ name;
17761 break;
17762 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17763 text = _("<short enum>");
17764 expected_types = bool_expected;
17765 ++ name;
17766 break;
17767 default:
17768 if (ISPRINT (* name))
17769 {
17770 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17771
17772 if (len > left && ! do_wide)
17773 len = left;
17774 printf ("%.*s:", len, name);
17775 left -= len;
17776 name += len;
17777 }
17778 else
17779 {
17780 static char tmpbuf [128];
17781
17782 error (_("unrecognised byte in name field: %d\n"), * name);
17783 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17784 text = tmpbuf;
17785 name ++;
17786 }
17787 expected_types = "*$!+";
17788 break;
17789 }
17790
17791 if (text)
17792 left -= printf ("%s", text);
17793
17794 if (strchr (expected_types, name_type) == NULL)
17795 warn (_("attribute does not have an expected type (%c)\n"), name_type);
17796
17797 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17798 {
17799 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17800 (unsigned long) pnote->namesz,
17801 (long) (name - pnote->namedata));
17802 return FALSE;
17803 }
17804
17805 if (left < 1 && ! do_wide)
17806 return TRUE;
17807
17808 switch (name_type)
17809 {
17810 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17811 {
17812 unsigned int bytes;
17813 unsigned long long val = 0;
17814 unsigned int shift = 0;
17815 char * decoded = NULL;
17816
17817 bytes = pnote->namesz - (name - pnote->namedata);
17818 if (bytes > 0)
17819 /* The -1 is because the name field is always 0 terminated, and we
17820 want to be able to ensure that the shift in the while loop below
17821 will not overflow. */
17822 -- bytes;
17823
17824 if (bytes > sizeof (val))
17825 {
17826 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17827 bytes);
17828 bytes = sizeof (val);
17829 }
17830 /* We do not bother to warn if bytes == 0 as this can
17831 happen with some early versions of the gcc plugin. */
17832
17833 while (bytes --)
17834 {
17835 unsigned long byte = (* name ++) & 0xff;
17836
17837 val |= byte << shift;
17838 shift += 8;
17839 }
17840
17841 switch (name_attribute)
17842 {
17843 case GNU_BUILD_ATTRIBUTE_PIC:
17844 switch (val)
17845 {
17846 case 0: decoded = "static"; break;
17847 case 1: decoded = "pic"; break;
17848 case 2: decoded = "PIC"; break;
17849 case 3: decoded = "pie"; break;
17850 case 4: decoded = "PIE"; break;
17851 default: break;
17852 }
17853 break;
17854 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17855 switch (val)
17856 {
17857 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
17858 case 0: decoded = "off"; break;
17859 case 1: decoded = "on"; break;
17860 case 2: decoded = "all"; break;
17861 case 3: decoded = "strong"; break;
17862 case 4: decoded = "explicit"; break;
17863 default: break;
17864 }
17865 break;
17866 default:
17867 break;
17868 }
17869
17870 if (decoded != NULL)
17871 {
17872 print_symbol (-left, decoded);
17873 left = 0;
17874 }
17875 else if (val == 0)
17876 {
17877 printf ("0x0");
17878 left -= 3;
17879 }
17880 else
17881 {
17882 if (do_wide)
17883 left -= printf ("0x%llx", val);
17884 else
17885 left -= printf ("0x%-.*llx", left, val);
17886 }
17887 }
17888 break;
17889 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17890 left -= print_symbol (- left, name);
17891 break;
17892 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17893 left -= print_symbol (- left, "true");
17894 break;
17895 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17896 left -= print_symbol (- left, "false");
17897 break;
17898 }
17899
17900 if (do_wide && left > 0)
17901 printf ("%-*s", left, " ");
17902
17903 return TRUE;
17904 }
17905
17906 /* Note that by the ELF standard, the name field is already null byte
17907 terminated, and namesz includes the terminating null byte.
17908 I.E. the value of namesz for the name "FSF" is 4.
17909
17910 If the value of namesz is zero, there is no name present. */
17911
17912 static bfd_boolean
17913 process_note (Elf_Internal_Note * pnote,
17914 Filedata * filedata)
17915 {
17916 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17917 const char * nt;
17918
17919 if (pnote->namesz == 0)
17920 /* If there is no note name, then use the default set of
17921 note type strings. */
17922 nt = get_note_type (filedata, pnote->type);
17923
17924 else if (const_strneq (pnote->namedata, "GNU"))
17925 /* GNU-specific object file notes. */
17926 nt = get_gnu_elf_note_type (pnote->type);
17927
17928 else if (const_strneq (pnote->namedata, "FreeBSD"))
17929 /* FreeBSD-specific core file notes. */
17930 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
17931
17932 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
17933 /* NetBSD-specific core file notes. */
17934 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
17935
17936 else if (const_strneq (pnote->namedata, "NetBSD"))
17937 /* NetBSD-specific core file notes. */
17938 return process_netbsd_elf_note (pnote);
17939
17940 else if (strneq (pnote->namedata, "SPU/", 4))
17941 {
17942 /* SPU-specific core file notes. */
17943 nt = pnote->namedata + 4;
17944 name = "SPU";
17945 }
17946
17947 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17948 /* VMS/ia64-specific file notes. */
17949 nt = get_ia64_vms_note_type (pnote->type);
17950
17951 else if (const_strneq (pnote->namedata, "stapsdt"))
17952 nt = get_stapsdt_note_type (pnote->type);
17953
17954 else
17955 /* Don't recognize this note name; just use the default set of
17956 note type strings. */
17957 nt = get_note_type (filedata, pnote->type);
17958
17959 printf (" ");
17960
17961 if (((const_strneq (pnote->namedata, "GA")
17962 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17963 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17964 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17965 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17966 print_gnu_build_attribute_name (pnote);
17967 else
17968 print_symbol (-20, name);
17969
17970 if (do_wide)
17971 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17972 else
17973 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
17974
17975 if (const_strneq (pnote->namedata, "IPF/VMS"))
17976 return print_ia64_vms_note (pnote);
17977 else if (const_strneq (pnote->namedata, "GNU"))
17978 return print_gnu_note (filedata, pnote);
17979 else if (const_strneq (pnote->namedata, "stapsdt"))
17980 return print_stapsdt_note (pnote);
17981 else if (const_strneq (pnote->namedata, "CORE"))
17982 return print_core_note (pnote);
17983 else if (((const_strneq (pnote->namedata, "GA")
17984 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17985 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17986 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17987 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17988 return print_gnu_build_attribute_description (pnote, filedata);
17989
17990 if (pnote->descsz)
17991 {
17992 unsigned long i;
17993
17994 printf (_(" description data: "));
17995 for (i = 0; i < pnote->descsz; i++)
17996 printf ("%02x ", pnote->descdata[i]);
17997 if (!do_wide)
17998 printf ("\n");
17999 }
18000
18001 if (do_wide)
18002 printf ("\n");
18003
18004 return TRUE;
18005 }
18006
18007 static bfd_boolean
18008 process_notes_at (Filedata * filedata,
18009 Elf_Internal_Shdr * section,
18010 bfd_vma offset,
18011 bfd_vma length,
18012 bfd_vma align)
18013 {
18014 Elf_External_Note * pnotes;
18015 Elf_External_Note * external;
18016 char * end;
18017 bfd_boolean res = TRUE;
18018
18019 if (length <= 0)
18020 return FALSE;
18021
18022 if (section)
18023 {
18024 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18025 if (pnotes)
18026 {
18027 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18028 return FALSE;
18029 }
18030 }
18031 else
18032 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18033 _("notes"));
18034
18035 if (pnotes == NULL)
18036 return FALSE;
18037
18038 external = pnotes;
18039
18040 if (section)
18041 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18042 else
18043 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18044 (unsigned long) offset, (unsigned long) length);
18045
18046 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18047 specifies that notes should be aligned to 4 bytes in 32-bit
18048 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18049 we also support 4 byte alignment in 64-bit objects. If section
18050 alignment is less than 4, we treate alignment as 4 bytes. */
18051 if (align < 4)
18052 align = 4;
18053 else if (align != 4 && align != 8)
18054 {
18055 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18056 (long) align);
18057 return FALSE;
18058 }
18059
18060 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18061
18062 end = (char *) pnotes + length;
18063 while ((char *) external < end)
18064 {
18065 Elf_Internal_Note inote;
18066 size_t min_notesz;
18067 char * next;
18068 char * temp = NULL;
18069 size_t data_remaining = end - (char *) external;
18070
18071 if (!is_ia64_vms (filedata))
18072 {
18073 /* PR binutils/15191
18074 Make sure that there is enough data to read. */
18075 min_notesz = offsetof (Elf_External_Note, name);
18076 if (data_remaining < min_notesz)
18077 {
18078 warn (ngettext ("Corrupt note: only %ld byte remains, "
18079 "not enough for a full note\n",
18080 "Corrupt note: only %ld bytes remain, "
18081 "not enough for a full note\n",
18082 data_remaining),
18083 (long) data_remaining);
18084 break;
18085 }
18086 data_remaining -= min_notesz;
18087
18088 inote.type = BYTE_GET (external->type);
18089 inote.namesz = BYTE_GET (external->namesz);
18090 inote.namedata = external->name;
18091 inote.descsz = BYTE_GET (external->descsz);
18092 inote.descdata = ((char *) external
18093 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18094 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18095 next = ((char *) external
18096 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18097 }
18098 else
18099 {
18100 Elf64_External_VMS_Note *vms_external;
18101
18102 /* PR binutils/15191
18103 Make sure that there is enough data to read. */
18104 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18105 if (data_remaining < min_notesz)
18106 {
18107 warn (ngettext ("Corrupt note: only %ld byte remains, "
18108 "not enough for a full note\n",
18109 "Corrupt note: only %ld bytes remain, "
18110 "not enough for a full note\n",
18111 data_remaining),
18112 (long) data_remaining);
18113 break;
18114 }
18115 data_remaining -= min_notesz;
18116
18117 vms_external = (Elf64_External_VMS_Note *) external;
18118 inote.type = BYTE_GET (vms_external->type);
18119 inote.namesz = BYTE_GET (vms_external->namesz);
18120 inote.namedata = vms_external->name;
18121 inote.descsz = BYTE_GET (vms_external->descsz);
18122 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18123 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18124 next = inote.descdata + align_power (inote.descsz, 3);
18125 }
18126
18127 /* PR 17531: file: 3443835e. */
18128 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18129 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18130 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18131 || (size_t) (next - inote.descdata) < inote.descsz
18132 || ((size_t) (next - inote.descdata)
18133 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18134 {
18135 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18136 (unsigned long) ((char *) external - (char *) pnotes));
18137 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18138 inote.type, inote.namesz, inote.descsz, (int) align);
18139 break;
18140 }
18141
18142 external = (Elf_External_Note *) next;
18143
18144 /* Verify that name is null terminated. It appears that at least
18145 one version of Linux (RedHat 6.0) generates corefiles that don't
18146 comply with the ELF spec by failing to include the null byte in
18147 namesz. */
18148 if (inote.namedata[inote.namesz - 1] != '\0')
18149 {
18150 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18151 {
18152 temp = (char *) malloc (inote.namesz + 1);
18153 if (temp == NULL)
18154 {
18155 error (_("Out of memory allocating space for inote name\n"));
18156 res = FALSE;
18157 break;
18158 }
18159
18160 memcpy (temp, inote.namedata, inote.namesz);
18161 inote.namedata = temp;
18162 }
18163 inote.namedata[inote.namesz] = 0;
18164 }
18165
18166 if (! process_note (& inote, filedata))
18167 res = FALSE;
18168
18169 if (temp != NULL)
18170 {
18171 free (temp);
18172 temp = NULL;
18173 }
18174 }
18175
18176 free (pnotes);
18177
18178 return res;
18179 }
18180
18181 static bfd_boolean
18182 process_corefile_note_segments (Filedata * filedata)
18183 {
18184 Elf_Internal_Phdr * segment;
18185 unsigned int i;
18186 bfd_boolean res = TRUE;
18187
18188 if (! get_program_headers (filedata))
18189 return TRUE;
18190
18191 for (i = 0, segment = filedata->program_headers;
18192 i < filedata->file_header.e_phnum;
18193 i++, segment++)
18194 {
18195 if (segment->p_type == PT_NOTE)
18196 if (! process_notes_at (filedata, NULL,
18197 (bfd_vma) segment->p_offset,
18198 (bfd_vma) segment->p_filesz,
18199 (bfd_vma) segment->p_align))
18200 res = FALSE;
18201 }
18202
18203 return res;
18204 }
18205
18206 static bfd_boolean
18207 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18208 {
18209 Elf_External_Note * pnotes;
18210 Elf_External_Note * external;
18211 char * end;
18212 bfd_boolean res = TRUE;
18213
18214 if (length <= 0)
18215 return FALSE;
18216
18217 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18218 _("v850 notes"));
18219 if (pnotes == NULL)
18220 return FALSE;
18221
18222 external = pnotes;
18223 end = (char*) pnotes + length;
18224
18225 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18226 (unsigned long) offset, (unsigned long) length);
18227
18228 while ((char *) external + sizeof (Elf_External_Note) < end)
18229 {
18230 Elf_External_Note * next;
18231 Elf_Internal_Note inote;
18232
18233 inote.type = BYTE_GET (external->type);
18234 inote.namesz = BYTE_GET (external->namesz);
18235 inote.namedata = external->name;
18236 inote.descsz = BYTE_GET (external->descsz);
18237 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18238 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18239
18240 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18241 {
18242 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18243 inote.descdata = inote.namedata;
18244 inote.namesz = 0;
18245 }
18246
18247 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18248
18249 if ( ((char *) next > end)
18250 || ((char *) next < (char *) pnotes))
18251 {
18252 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18253 (unsigned long) ((char *) external - (char *) pnotes));
18254 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18255 inote.type, inote.namesz, inote.descsz);
18256 break;
18257 }
18258
18259 external = next;
18260
18261 /* Prevent out-of-bounds indexing. */
18262 if ( inote.namedata + inote.namesz > end
18263 || inote.namedata + inote.namesz < inote.namedata)
18264 {
18265 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18266 (unsigned long) ((char *) external - (char *) pnotes));
18267 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18268 inote.type, inote.namesz, inote.descsz);
18269 break;
18270 }
18271
18272 printf (" %s: ", get_v850_elf_note_type (inote.type));
18273
18274 if (! print_v850_note (& inote))
18275 {
18276 res = FALSE;
18277 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18278 inote.namesz, inote.descsz);
18279 }
18280 }
18281
18282 free (pnotes);
18283
18284 return res;
18285 }
18286
18287 static bfd_boolean
18288 process_note_sections (Filedata * filedata)
18289 {
18290 Elf_Internal_Shdr * section;
18291 unsigned long i;
18292 unsigned int n = 0;
18293 bfd_boolean res = TRUE;
18294
18295 for (i = 0, section = filedata->section_headers;
18296 i < filedata->file_header.e_shnum && section != NULL;
18297 i++, section++)
18298 {
18299 if (section->sh_type == SHT_NOTE)
18300 {
18301 if (! process_notes_at (filedata, section,
18302 (bfd_vma) section->sh_offset,
18303 (bfd_vma) section->sh_size,
18304 (bfd_vma) section->sh_addralign))
18305 res = FALSE;
18306 n++;
18307 }
18308
18309 if (( filedata->file_header.e_machine == EM_V800
18310 || filedata->file_header.e_machine == EM_V850
18311 || filedata->file_header.e_machine == EM_CYGNUS_V850)
18312 && section->sh_type == SHT_RENESAS_INFO)
18313 {
18314 if (! process_v850_notes (filedata,
18315 (bfd_vma) section->sh_offset,
18316 (bfd_vma) section->sh_size))
18317 res = FALSE;
18318 n++;
18319 }
18320 }
18321
18322 if (n == 0)
18323 /* Try processing NOTE segments instead. */
18324 return process_corefile_note_segments (filedata);
18325
18326 return res;
18327 }
18328
18329 static bfd_boolean
18330 process_notes (Filedata * filedata)
18331 {
18332 /* If we have not been asked to display the notes then do nothing. */
18333 if (! do_notes)
18334 return TRUE;
18335
18336 if (filedata->file_header.e_type != ET_CORE)
18337 return process_note_sections (filedata);
18338
18339 /* No program headers means no NOTE segment. */
18340 if (filedata->file_header.e_phnum > 0)
18341 return process_corefile_note_segments (filedata);
18342
18343 printf (_("No note segments present in the core file.\n"));
18344 return TRUE;
18345 }
18346
18347 static unsigned char *
18348 display_public_gnu_attributes (unsigned char * start,
18349 const unsigned char * const end)
18350 {
18351 printf (_(" Unknown GNU attribute: %s\n"), start);
18352
18353 start += strnlen ((char *) start, end - start);
18354 display_raw_attribute (start, end);
18355
18356 return (unsigned char *) end;
18357 }
18358
18359 static unsigned char *
18360 display_generic_attribute (unsigned char * start,
18361 unsigned int tag,
18362 const unsigned char * const end)
18363 {
18364 if (tag == 0)
18365 return (unsigned char *) end;
18366
18367 return display_tag_value (tag, start, end);
18368 }
18369
18370 static bfd_boolean
18371 process_arch_specific (Filedata * filedata)
18372 {
18373 if (! do_arch)
18374 return TRUE;
18375
18376 switch (filedata->file_header.e_machine)
18377 {
18378 case EM_ARC:
18379 case EM_ARC_COMPACT:
18380 case EM_ARC_COMPACT2:
18381 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18382 display_arc_attribute,
18383 display_generic_attribute);
18384 case EM_ARM:
18385 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18386 display_arm_attribute,
18387 display_generic_attribute);
18388
18389 case EM_MIPS:
18390 case EM_MIPS_RS3_LE:
18391 return process_mips_specific (filedata);
18392
18393 case EM_MSP430:
18394 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18395 display_msp430x_attribute,
18396 display_generic_attribute);
18397
18398 case EM_NDS32:
18399 return process_nds32_specific (filedata);
18400
18401 case EM_PPC:
18402 case EM_PPC64:
18403 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18404 display_power_gnu_attribute);
18405
18406 case EM_S390:
18407 case EM_S390_OLD:
18408 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18409 display_s390_gnu_attribute);
18410
18411 case EM_SPARC:
18412 case EM_SPARC32PLUS:
18413 case EM_SPARCV9:
18414 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18415 display_sparc_gnu_attribute);
18416
18417 case EM_TI_C6000:
18418 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18419 display_tic6x_attribute,
18420 display_generic_attribute);
18421
18422 default:
18423 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18424 display_public_gnu_attributes,
18425 display_generic_attribute);
18426 }
18427 }
18428
18429 static bfd_boolean
18430 get_file_header (Filedata * filedata)
18431 {
18432 /* Read in the identity array. */
18433 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18434 return FALSE;
18435
18436 /* Determine how to read the rest of the header. */
18437 switch (filedata->file_header.e_ident[EI_DATA])
18438 {
18439 default:
18440 case ELFDATANONE:
18441 case ELFDATA2LSB:
18442 byte_get = byte_get_little_endian;
18443 byte_put = byte_put_little_endian;
18444 break;
18445 case ELFDATA2MSB:
18446 byte_get = byte_get_big_endian;
18447 byte_put = byte_put_big_endian;
18448 break;
18449 }
18450
18451 /* For now we only support 32 bit and 64 bit ELF files. */
18452 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18453
18454 /* Read in the rest of the header. */
18455 if (is_32bit_elf)
18456 {
18457 Elf32_External_Ehdr ehdr32;
18458
18459 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18460 return FALSE;
18461
18462 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18463 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18464 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18465 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18466 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18467 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18468 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18469 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18470 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18471 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18472 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18473 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18474 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
18475 }
18476 else
18477 {
18478 Elf64_External_Ehdr ehdr64;
18479
18480 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18481 we will not be able to cope with the 64bit data found in
18482 64 ELF files. Detect this now and abort before we start
18483 overwriting things. */
18484 if (sizeof (bfd_vma) < 8)
18485 {
18486 error (_("This instance of readelf has been built without support for a\n\
18487 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18488 return FALSE;
18489 }
18490
18491 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18492 return FALSE;
18493
18494 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18495 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18496 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18497 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18498 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18499 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18500 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18501 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18502 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18503 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
18504 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18505 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
18506 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
18507 }
18508
18509 if (filedata->file_header.e_shoff)
18510 {
18511 /* There may be some extensions in the first section header. Don't
18512 bomb if we can't read it. */
18513 if (is_32bit_elf)
18514 get_32bit_section_headers (filedata, TRUE);
18515 else
18516 get_64bit_section_headers (filedata, TRUE);
18517 }
18518
18519 return TRUE;
18520 }
18521
18522 static void
18523 close_file (Filedata * filedata)
18524 {
18525 if (filedata)
18526 {
18527 if (filedata->handle)
18528 fclose (filedata->handle);
18529 free (filedata);
18530 }
18531 }
18532
18533 void
18534 close_debug_file (void * data)
18535 {
18536 close_file ((Filedata *) data);
18537 }
18538
18539 static Filedata *
18540 open_file (const char * pathname)
18541 {
18542 struct stat statbuf;
18543 Filedata * filedata = NULL;
18544
18545 if (stat (pathname, & statbuf) < 0
18546 || ! S_ISREG (statbuf.st_mode))
18547 goto fail;
18548
18549 filedata = calloc (1, sizeof * filedata);
18550 if (filedata == NULL)
18551 goto fail;
18552
18553 filedata->handle = fopen (pathname, "rb");
18554 if (filedata->handle == NULL)
18555 goto fail;
18556
18557 filedata->file_size = (bfd_size_type) statbuf.st_size;
18558 filedata->file_name = pathname;
18559
18560 if (! get_file_header (filedata))
18561 goto fail;
18562
18563 if (filedata->file_header.e_shoff)
18564 {
18565 bfd_boolean res;
18566
18567 /* Read the section headers again, this time for real. */
18568 if (is_32bit_elf)
18569 res = get_32bit_section_headers (filedata, FALSE);
18570 else
18571 res = get_64bit_section_headers (filedata, FALSE);
18572
18573 if (!res)
18574 goto fail;
18575 }
18576
18577 return filedata;
18578
18579 fail:
18580 if (filedata)
18581 {
18582 if (filedata->handle)
18583 fclose (filedata->handle);
18584 free (filedata);
18585 }
18586 return NULL;
18587 }
18588
18589 void *
18590 open_debug_file (const char * pathname)
18591 {
18592 return open_file (pathname);
18593 }
18594
18595 /* Process one ELF object file according to the command line options.
18596 This file may actually be stored in an archive. The file is
18597 positioned at the start of the ELF object. Returns TRUE if no
18598 problems were encountered, FALSE otherwise. */
18599
18600 static bfd_boolean
18601 process_object (Filedata * filedata)
18602 {
18603 Filedata * separates;
18604 unsigned int i;
18605 bfd_boolean res = TRUE;
18606
18607 if (! get_file_header (filedata))
18608 {
18609 error (_("%s: Failed to read file header\n"), filedata->file_name);
18610 return FALSE;
18611 }
18612
18613 /* Initialise per file variables. */
18614 for (i = ARRAY_SIZE (version_info); i--;)
18615 version_info[i] = 0;
18616
18617 for (i = ARRAY_SIZE (dynamic_info); i--;)
18618 dynamic_info[i] = 0;
18619 dynamic_info_DT_GNU_HASH = 0;
18620
18621 /* Process the file. */
18622 if (show_name)
18623 printf (_("\nFile: %s\n"), filedata->file_name);
18624
18625 /* Initialise the dump_sects array from the cmdline_dump_sects array.
18626 Note we do this even if cmdline_dump_sects is empty because we
18627 must make sure that the dump_sets array is zeroed out before each
18628 object file is processed. */
18629 if (filedata->num_dump_sects > cmdline.num_dump_sects)
18630 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18631
18632 if (cmdline.num_dump_sects > 0)
18633 {
18634 if (filedata->num_dump_sects == 0)
18635 /* A sneaky way of allocating the dump_sects array. */
18636 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18637
18638 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18639 memcpy (filedata->dump_sects, cmdline.dump_sects,
18640 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18641 }
18642
18643 if (! process_file_header (filedata))
18644 return FALSE;
18645
18646 if (! process_section_headers (filedata))
18647 {
18648 /* Without loaded section headers we cannot process lots of things. */
18649 do_unwind = do_version = do_dump = do_arch = FALSE;
18650
18651 if (! do_using_dynamic)
18652 do_syms = do_dyn_syms = do_reloc = FALSE;
18653 }
18654
18655 if (! process_section_groups (filedata))
18656 /* Without loaded section groups we cannot process unwind. */
18657 do_unwind = FALSE;
18658
18659 if (process_program_headers (filedata))
18660 process_dynamic_section (filedata);
18661 else
18662 res = FALSE;
18663
18664 if (! process_relocs (filedata))
18665 res = FALSE;
18666
18667 if (! process_unwind (filedata))
18668 res = FALSE;
18669
18670 if (! process_symbol_table (filedata))
18671 res = FALSE;
18672
18673 if (! process_syminfo (filedata))
18674 res = FALSE;
18675
18676 if (! process_version_sections (filedata))
18677 res = FALSE;
18678
18679 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18680 separates = load_separate_debug_file (filedata, filedata->file_name);
18681 else
18682 separates = NULL;
18683
18684 if (! process_section_contents (filedata))
18685 res = FALSE;
18686
18687 if (separates)
18688 {
18689 if (! process_section_headers (separates))
18690 res = FALSE;
18691 else if (! process_section_contents (separates))
18692 res = FALSE;
18693 }
18694
18695 if (! process_notes (filedata))
18696 res = FALSE;
18697
18698 if (! process_gnu_liblist (filedata))
18699 res = FALSE;
18700
18701 if (! process_arch_specific (filedata))
18702 res = FALSE;
18703
18704 free (filedata->program_headers);
18705 filedata->program_headers = NULL;
18706
18707 free (filedata->section_headers);
18708 filedata->section_headers = NULL;
18709
18710 free (filedata->string_table);
18711 filedata->string_table = NULL;
18712 filedata->string_table_length = 0;
18713
18714 if (dynamic_strings)
18715 {
18716 free (dynamic_strings);
18717 dynamic_strings = NULL;
18718 dynamic_strings_length = 0;
18719 }
18720
18721 if (dynamic_symbols)
18722 {
18723 free (dynamic_symbols);
18724 dynamic_symbols = NULL;
18725 num_dynamic_syms = 0;
18726 }
18727
18728 if (dynamic_syminfo)
18729 {
18730 free (dynamic_syminfo);
18731 dynamic_syminfo = NULL;
18732 }
18733
18734 if (dynamic_section)
18735 {
18736 free (dynamic_section);
18737 dynamic_section = NULL;
18738 }
18739
18740 if (section_headers_groups)
18741 {
18742 free (section_headers_groups);
18743 section_headers_groups = NULL;
18744 }
18745
18746 if (section_groups)
18747 {
18748 struct group_list * g;
18749 struct group_list * next;
18750
18751 for (i = 0; i < group_count; i++)
18752 {
18753 for (g = section_groups [i].root; g != NULL; g = next)
18754 {
18755 next = g->next;
18756 free (g);
18757 }
18758 }
18759
18760 free (section_groups);
18761 section_groups = NULL;
18762 }
18763
18764 free_debug_memory ();
18765
18766 return res;
18767 }
18768
18769 /* Process an ELF archive.
18770 On entry the file is positioned just after the ARMAG string.
18771 Returns TRUE upon success, FALSE otherwise. */
18772
18773 static bfd_boolean
18774 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18775 {
18776 struct archive_info arch;
18777 struct archive_info nested_arch;
18778 size_t got;
18779 bfd_boolean ret = TRUE;
18780
18781 show_name = TRUE;
18782
18783 /* The ARCH structure is used to hold information about this archive. */
18784 arch.file_name = NULL;
18785 arch.file = NULL;
18786 arch.index_array = NULL;
18787 arch.sym_table = NULL;
18788 arch.longnames = NULL;
18789
18790 /* The NESTED_ARCH structure is used as a single-item cache of information
18791 about a nested archive (when members of a thin archive reside within
18792 another regular archive file). */
18793 nested_arch.file_name = NULL;
18794 nested_arch.file = NULL;
18795 nested_arch.index_array = NULL;
18796 nested_arch.sym_table = NULL;
18797 nested_arch.longnames = NULL;
18798
18799 if (setup_archive (&arch, filedata->file_name, filedata->handle,
18800 is_thin_archive, do_archive_index) != 0)
18801 {
18802 ret = FALSE;
18803 goto out;
18804 }
18805
18806 if (do_archive_index)
18807 {
18808 if (arch.sym_table == NULL)
18809 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18810 else
18811 {
18812 unsigned long i, l;
18813 unsigned long current_pos;
18814
18815 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18816 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18817
18818 current_pos = ftell (filedata->handle);
18819
18820 for (i = l = 0; i < arch.index_num; i++)
18821 {
18822 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18823 {
18824 char * member_name;
18825
18826 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18827
18828 if (member_name != NULL)
18829 {
18830 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18831
18832 if (qualified_name != NULL)
18833 {
18834 printf (_("Contents of binary %s at offset "), qualified_name);
18835 (void) print_vma (arch.index_array[i], PREFIX_HEX);
18836 putchar ('\n');
18837 free (qualified_name);
18838 }
18839 }
18840 }
18841
18842 if (l >= arch.sym_size)
18843 {
18844 error (_("%s: end of the symbol table reached before the end of the index\n"),
18845 filedata->file_name);
18846 ret = FALSE;
18847 break;
18848 }
18849 /* PR 17531: file: 0b6630b2. */
18850 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18851 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
18852 }
18853
18854 if (arch.uses_64bit_indicies)
18855 l = (l + 7) & ~ 7;
18856 else
18857 l += l & 1;
18858
18859 if (l < arch.sym_size)
18860 {
18861 error (ngettext ("%s: %ld byte remains in the symbol table, "
18862 "but without corresponding entries in "
18863 "the index table\n",
18864 "%s: %ld bytes remain in the symbol table, "
18865 "but without corresponding entries in "
18866 "the index table\n",
18867 arch.sym_size - l),
18868 filedata->file_name, arch.sym_size - l);
18869 ret = FALSE;
18870 }
18871
18872 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
18873 {
18874 error (_("%s: failed to seek back to start of object files in the archive\n"),
18875 filedata->file_name);
18876 ret = FALSE;
18877 goto out;
18878 }
18879 }
18880
18881 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18882 && !do_segments && !do_header && !do_dump && !do_version
18883 && !do_histogram && !do_debugging && !do_arch && !do_notes
18884 && !do_section_groups && !do_dyn_syms)
18885 {
18886 ret = TRUE; /* Archive index only. */
18887 goto out;
18888 }
18889 }
18890
18891 while (1)
18892 {
18893 char * name;
18894 size_t namelen;
18895 char * qualified_name;
18896
18897 /* Read the next archive header. */
18898 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
18899 {
18900 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
18901 return FALSE;
18902 }
18903 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
18904 if (got != sizeof arch.arhdr)
18905 {
18906 if (got == 0)
18907 break;
18908 error (_("%s: failed to read archive header\n"), filedata->file_name);
18909 ret = FALSE;
18910 break;
18911 }
18912 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18913 {
18914 error (_("%s: did not find a valid archive header\n"), arch.file_name);
18915 ret = FALSE;
18916 break;
18917 }
18918
18919 arch.next_arhdr_offset += sizeof arch.arhdr;
18920
18921 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18922 if (archive_file_size & 01)
18923 ++archive_file_size;
18924
18925 name = get_archive_member_name (&arch, &nested_arch);
18926 if (name == NULL)
18927 {
18928 error (_("%s: bad archive file name\n"), filedata->file_name);
18929 ret = FALSE;
18930 break;
18931 }
18932 namelen = strlen (name);
18933
18934 qualified_name = make_qualified_name (&arch, &nested_arch, name);
18935 if (qualified_name == NULL)
18936 {
18937 error (_("%s: bad archive file name\n"), filedata->file_name);
18938 ret = FALSE;
18939 break;
18940 }
18941
18942 if (is_thin_archive && arch.nested_member_origin == 0)
18943 {
18944 /* This is a proxy for an external member of a thin archive. */
18945 Filedata * member_filedata;
18946 char * member_file_name = adjust_relative_path
18947 (filedata->file_name, name, namelen);
18948
18949 if (member_file_name == NULL)
18950 {
18951 ret = FALSE;
18952 break;
18953 }
18954
18955 member_filedata = open_file (member_file_name);
18956 if (member_filedata == NULL)
18957 {
18958 error (_("Input file '%s' is not readable.\n"), member_file_name);
18959 free (member_file_name);
18960 ret = FALSE;
18961 break;
18962 }
18963
18964 archive_file_offset = arch.nested_member_origin;
18965 member_filedata->file_name = qualified_name;
18966
18967 if (! process_object (member_filedata))
18968 ret = FALSE;
18969
18970 close_file (member_filedata);
18971 free (member_file_name);
18972 }
18973 else if (is_thin_archive)
18974 {
18975 Filedata thin_filedata;
18976
18977 memset (&thin_filedata, 0, sizeof (thin_filedata));
18978
18979 /* PR 15140: Allow for corrupt thin archives. */
18980 if (nested_arch.file == NULL)
18981 {
18982 error (_("%s: contains corrupt thin archive: %s\n"),
18983 filedata->file_name, name);
18984 ret = FALSE;
18985 break;
18986 }
18987
18988 /* This is a proxy for a member of a nested archive. */
18989 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
18990
18991 /* The nested archive file will have been opened and setup by
18992 get_archive_member_name. */
18993 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
18994 {
18995 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
18996 ret = FALSE;
18997 break;
18998 }
18999
19000 thin_filedata.handle = nested_arch.file;
19001 thin_filedata.file_name = qualified_name;
19002
19003 if (! process_object (& thin_filedata))
19004 ret = FALSE;
19005 }
19006 else
19007 {
19008 archive_file_offset = arch.next_arhdr_offset;
19009 arch.next_arhdr_offset += archive_file_size;
19010
19011 filedata->file_name = qualified_name;
19012 if (! process_object (filedata))
19013 ret = FALSE;
19014 }
19015
19016 if (filedata->dump_sects != NULL)
19017 {
19018 free (filedata->dump_sects);
19019 filedata->dump_sects = NULL;
19020 filedata->num_dump_sects = 0;
19021 }
19022
19023 free (qualified_name);
19024 }
19025
19026 out:
19027 if (nested_arch.file != NULL)
19028 fclose (nested_arch.file);
19029 release_archive (&nested_arch);
19030 release_archive (&arch);
19031
19032 return ret;
19033 }
19034
19035 static bfd_boolean
19036 process_file (char * file_name)
19037 {
19038 Filedata * filedata = NULL;
19039 struct stat statbuf;
19040 char armag[SARMAG];
19041 bfd_boolean ret = TRUE;
19042
19043 if (stat (file_name, &statbuf) < 0)
19044 {
19045 if (errno == ENOENT)
19046 error (_("'%s': No such file\n"), file_name);
19047 else
19048 error (_("Could not locate '%s'. System error message: %s\n"),
19049 file_name, strerror (errno));
19050 return FALSE;
19051 }
19052
19053 if (! S_ISREG (statbuf.st_mode))
19054 {
19055 error (_("'%s' is not an ordinary file\n"), file_name);
19056 return FALSE;
19057 }
19058
19059 filedata = calloc (1, sizeof * filedata);
19060 if (filedata == NULL)
19061 {
19062 error (_("Out of memory allocating file data structure\n"));
19063 return FALSE;
19064 }
19065
19066 filedata->file_name = file_name;
19067 filedata->handle = fopen (file_name, "rb");
19068 if (filedata->handle == NULL)
19069 {
19070 error (_("Input file '%s' is not readable.\n"), file_name);
19071 free (filedata);
19072 return FALSE;
19073 }
19074
19075 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19076 {
19077 error (_("%s: Failed to read file's magic number\n"), file_name);
19078 fclose (filedata->handle);
19079 free (filedata);
19080 return FALSE;
19081 }
19082
19083 filedata->file_size = (bfd_size_type) statbuf.st_size;
19084
19085 if (memcmp (armag, ARMAG, SARMAG) == 0)
19086 {
19087 if (! process_archive (filedata, FALSE))
19088 ret = FALSE;
19089 }
19090 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19091 {
19092 if ( ! process_archive (filedata, TRUE))
19093 ret = FALSE;
19094 }
19095 else
19096 {
19097 if (do_archive_index)
19098 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19099 file_name);
19100
19101 rewind (filedata->handle);
19102 archive_file_size = archive_file_offset = 0;
19103
19104 if (! process_object (filedata))
19105 ret = FALSE;
19106 }
19107
19108 fclose (filedata->handle);
19109 free (filedata);
19110
19111 return ret;
19112 }
19113
19114 #ifdef SUPPORT_DISASSEMBLY
19115 /* Needed by the i386 disassembler. For extra credit, someone could
19116 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19117 symbols. */
19118
19119 void
19120 print_address (unsigned int addr, FILE * outfile)
19121 {
19122 fprintf (outfile,"0x%8.8x", addr);
19123 }
19124
19125 /* Needed by the i386 disassembler. */
19126
19127 void
19128 db_task_printsym (unsigned int addr)
19129 {
19130 print_address (addr, stderr);
19131 }
19132 #endif
19133
19134 int
19135 main (int argc, char ** argv)
19136 {
19137 int err;
19138
19139 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19140 setlocale (LC_MESSAGES, "");
19141 #endif
19142 #if defined (HAVE_SETLOCALE)
19143 setlocale (LC_CTYPE, "");
19144 #endif
19145 bindtextdomain (PACKAGE, LOCALEDIR);
19146 textdomain (PACKAGE);
19147
19148 expandargv (&argc, &argv);
19149
19150 cmdline.file_name = "<cmdline>";
19151 parse_args (& cmdline, argc, argv);
19152
19153 if (optind < (argc - 1))
19154 show_name = TRUE;
19155 else if (optind >= argc)
19156 {
19157 warn (_("Nothing to do.\n"));
19158 usage (stderr);
19159 }
19160
19161 err = FALSE;
19162 while (optind < argc)
19163 if (! process_file (argv[optind++]))
19164 err = TRUE;
19165
19166 if (cmdline.dump_sects != NULL)
19167 free (cmdline.dump_sects);
19168
19169 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19170 }
This page took 0.446868 seconds and 4 git commands to generate.