xref: /trueos/contrib/binutils/binutils/readelf.c (revision f3fa4bdf8b98edb697d801e65b8b2bd542f15787)
1 /* readelf.c -- display contents of an ELF format file
2    Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3    Free Software Foundation, Inc.
4 
5    Originally developed by Eric Youngdale <eric@andante.jic.com>
6    Modifications by Nick Clifton <nickc@redhat.com>
7 
8    This file is part of GNU Binutils.
9 
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14 
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19 
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
23    02110-1301, USA.  */
24 
25 /* The difference between readelf and objdump:
26 
27   Both programs are capable of displaying the contents of ELF format files,
28   so why does the binutils project have two file dumpers ?
29 
30   The reason is that objdump sees an ELF file through a BFD filter of the
31   world; if BFD has a bug where, say, it disagrees about a machine constant
32   in e_flags, then the odds are good that it will remain internally
33   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
34   GAS sees it the BFD way.  There was need for a tool to go find out what
35   the file actually says.
36 
37   This is why the readelf program does not link against the BFD library - it
38   exists as an independent program to help verify the correct working of BFD.
39 
40   There is also the case that readelf can provide more information about an
41   ELF file than is provided by objdump.  In particular it can display DWARF
42   debugging information which (at the moment) objdump cannot.  */
43 
44 #include "sysdep.h"
45 #include <assert.h>
46 #include <sys/stat.h>
47 #include <time.h>
48 
49 /* for PATH_MAX */
50 #ifdef HAVE_LIMITS_H
51 #include <limits.h>
52 #endif
53 
54 #ifndef PATH_MAX
55 /* for MAXPATHLEN */
56 # ifdef HAVE_SYS_PARAM_H
57 #  include <sys/param.h>
58 # endif
59 # ifndef PATH_MAX
60 #  ifdef MAXPATHLEN
61 #   define PATH_MAX MAXPATHLEN
62 #  else
63 #   define PATH_MAX 1024
64 #  endif
65 # endif
66 #endif
67 
68 #if __GNUC__ >= 2
69 /* Define BFD64 here, even if our default architecture is 32 bit ELF
70    as this will allow us to read in and parse 64bit and 32bit ELF files.
71    Only do this if we believe that the compiler can support a 64 bit
72    data type.  For now we only rely on GCC being able to do this.  */
73 #define BFD64
74 #endif
75 
76 #include "bfd.h"
77 #include "bucomm.h"
78 #include "dwarf.h"
79 
80 #include "elf/common.h"
81 #include "elf/external.h"
82 #include "elf/internal.h"
83 
84 
85 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
86    we can obtain the H8 reloc numbers.  We need these for the
87    get_reloc_size() function.  We include h8.h again after defining
88    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
89 
90 #include "elf/h8.h"
91 #undef _ELF_H8_H
92 
93 /* Undo the effects of #including reloc-macros.h.  */
94 
95 #undef START_RELOC_NUMBERS
96 #undef RELOC_NUMBER
97 #undef FAKE_RELOC
98 #undef EMPTY_RELOC
99 #undef END_RELOC_NUMBERS
100 #undef _RELOC_MACROS_H
101 
102 /* The following headers use the elf/reloc-macros.h file to
103    automatically generate relocation recognition functions
104    such as elf_mips_reloc_type()  */
105 
106 #define RELOC_MACROS_GEN_FUNC
107 
108 #include "elf/alpha.h"
109 #include "elf/arc.h"
110 #include "elf/arm.h"
111 #include "elf/avr.h"
112 #include "elf/bfin.h"
113 #include "elf/cris.h"
114 #include "elf/crx.h"
115 #include "elf/d10v.h"
116 #include "elf/d30v.h"
117 #include "elf/dlx.h"
118 #include "elf/fr30.h"
119 #include "elf/frv.h"
120 #include "elf/h8.h"
121 #include "elf/hppa.h"
122 #include "elf/i386.h"
123 #include "elf/i370.h"
124 #include "elf/i860.h"
125 #include "elf/i960.h"
126 #include "elf/ia64.h"
127 #include "elf/ip2k.h"
128 #include "elf/iq2000.h"
129 #include "elf/m32c.h"
130 #include "elf/m32r.h"
131 #include "elf/m68k.h"
132 #include "elf/m68hc11.h"
133 #include "elf/mcore.h"
134 #include "elf/mep.h"
135 #include "elf/mips.h"
136 #include "elf/mmix.h"
137 #include "elf/mn10200.h"
138 #include "elf/mn10300.h"
139 #include "elf/mt.h"
140 #include "elf/msp430.h"
141 #include "elf/or32.h"
142 #include "elf/pj.h"
143 #include "elf/ppc.h"
144 #include "elf/ppc64.h"
145 #include "elf/s390.h"
146 #include "elf/score.h"
147 #include "elf/sh.h"
148 #include "elf/sparc.h"
149 #include "elf/spu.h"
150 #include "elf/v850.h"
151 #include "elf/vax.h"
152 #include "elf/x86-64.h"
153 #include "elf/xstormy16.h"
154 #include "elf/xtensa.h"
155 
156 #include "aout/ar.h"
157 
158 #include "getopt.h"
159 #include "libiberty.h"
160 
161 char *program_name = "readelf";
162 static long archive_file_offset;
163 static unsigned long archive_file_size;
164 static unsigned long dynamic_addr;
165 static bfd_size_type dynamic_size;
166 static unsigned int dynamic_nent;
167 static char *dynamic_strings;
168 static unsigned long dynamic_strings_length;
169 static char *string_table;
170 static unsigned long string_table_length;
171 static unsigned long num_dynamic_syms;
172 static Elf_Internal_Sym *dynamic_symbols;
173 static Elf_Internal_Syminfo *dynamic_syminfo;
174 static unsigned long dynamic_syminfo_offset;
175 static unsigned int dynamic_syminfo_nent;
176 static char program_interpreter[PATH_MAX];
177 static bfd_vma dynamic_info[DT_ENCODING];
178 static bfd_vma dynamic_info_DT_GNU_HASH;
179 static bfd_vma version_info[16];
180 static Elf_Internal_Ehdr elf_header;
181 static Elf_Internal_Shdr *section_headers;
182 static Elf_Internal_Phdr *program_headers;
183 static Elf_Internal_Dyn *dynamic_section;
184 static Elf_Internal_Shdr *symtab_shndx_hdr;
185 static int show_name;
186 static int do_dynamic;
187 static int do_syms;
188 static int do_reloc;
189 static int do_sections;
190 static int do_section_groups;
191 static int do_section_details;
192 static int do_segments;
193 static int do_unwind;
194 static int do_using_dynamic;
195 static int do_header;
196 static int do_dump;
197 static int do_version;
198 static int do_wide;
199 static int do_histogram;
200 static int do_debugging;
201 static int do_arch;
202 static int do_notes;
203 static int is_32bit_elf;
204 
205 struct group_list
206 {
207   struct group_list *next;
208   unsigned int section_index;
209 };
210 
211 struct group
212 {
213   struct group_list *root;
214   unsigned int group_index;
215 };
216 
217 static size_t group_count;
218 static struct group *section_groups;
219 static struct group **section_headers_groups;
220 
221 /* A linked list of the section names for which dumps were requested
222    by name.  */
223 struct dump_list_entry
224 {
225   char *name;
226   int type;
227   struct dump_list_entry *next;
228 };
229 static struct dump_list_entry *dump_sects_byname;
230 
231 /* A dynamic array of flags indicating for which sections a hex dump
232    has been requested (via the -x switch) and/or a disassembly dump
233    (via the -i switch).  */
234 char *cmdline_dump_sects = NULL;
235 unsigned num_cmdline_dump_sects = 0;
236 
237 /* A dynamic array of flags indicating for which sections a dump of
238    some kind has been requested.  It is reset on a per-object file
239    basis and then initialised from the cmdline_dump_sects array,
240    the results of interpreting the -w switch, and the
241    dump_sects_byname list.  */
242 char *dump_sects = NULL;
243 unsigned int num_dump_sects = 0;
244 
245 #define HEX_DUMP	(1 << 0)
246 #define DISASS_DUMP	(1 << 1)
247 #define DEBUG_DUMP	(1 << 2)
248 
249 /* How to print a vma value.  */
250 typedef enum print_mode
251 {
252   HEX,
253   DEC,
254   DEC_5,
255   UNSIGNED,
256   PREFIX_HEX,
257   FULL_HEX,
258   LONG_HEX
259 }
260 print_mode;
261 
262 static void (*byte_put) (unsigned char *, bfd_vma, int);
263 
264 #define UNKNOWN -1
265 
266 #define SECTION_NAME(X)	\
267   ((X) == NULL ? "<none>" \
268   : string_table == NULL ? "<no-name>" \
269   : ((X)->sh_name >= string_table_length ? "<corrupt>" \
270   : string_table + (X)->sh_name))
271 
272 /* Given st_shndx I, map to section_headers index.  */
273 #define SECTION_HEADER_INDEX(I)				\
274   ((I) < SHN_LORESERVE					\
275    ? (I)						\
276    : ((I) <= SHN_HIRESERVE				\
277       ? 0						\
278       : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
279 
280 /* Reverse of the above.  */
281 #define SECTION_HEADER_NUM(N)				\
282   ((N) < SHN_LORESERVE					\
283    ? (N)						\
284    : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
285 
286 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
287 
288 #define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order!  */
289 
290 #define BYTE_GET(field)	byte_get (field, sizeof (field))
291 
292 #define NUM_ELEM(array) 	(sizeof (array) / sizeof ((array)[0]))
293 
294 #define GET_ELF_SYMBOLS(file, section)			\
295   (is_32bit_elf ? get_32bit_elf_symbols (file, section)	\
296    : get_64bit_elf_symbols (file, section))
297 
298 #define VALID_DYNAMIC_NAME(offset)	((dynamic_strings != NULL) && (offset < dynamic_strings_length))
299 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
300    already been called and verified that the string exists.  */
301 #define GET_DYNAMIC_NAME(offset)	(dynamic_strings + offset)
302 
303 /* This is just a bit of syntatic sugar.  */
304 #define streq(a,b)	(strcmp ((a), (b)) == 0)
305 #define strneq(a,b,n)	(strncmp ((a), (b), (n)) == 0)
306 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
307 
308 static void *
get_data(void * var,FILE * file,long offset,size_t size,size_t nmemb,const char * reason)309 get_data (void *var, FILE *file, long offset, size_t size, size_t nmemb,
310 	  const char *reason)
311 {
312   void *mvar;
313 
314   if (size == 0 || nmemb == 0)
315     return NULL;
316 
317   if (fseek (file, archive_file_offset + offset, SEEK_SET))
318     {
319       error (_("Unable to seek to 0x%lx for %s\n"),
320 	     archive_file_offset + offset, reason);
321       return NULL;
322     }
323 
324   mvar = var;
325   if (mvar == NULL)
326     {
327       /* Check for overflow.  */
328       if (nmemb < (~(size_t) 0 - 1) / size)
329 	/* + 1 so that we can '\0' terminate invalid string table sections.  */
330 	mvar = malloc (size * nmemb + 1);
331 
332       if (mvar == NULL)
333 	{
334 	  error (_("Out of memory allocating 0x%lx bytes for %s\n"),
335 		 (unsigned long)(size * nmemb), reason);
336 	  return NULL;
337 	}
338 
339       ((char *) mvar)[size * nmemb] = '\0';
340     }
341 
342   if (fread (mvar, size, nmemb, file) != nmemb)
343     {
344       error (_("Unable to read in 0x%lx bytes of %s\n"),
345 	     (unsigned long)(size * nmemb), reason);
346       if (mvar != var)
347 	free (mvar);
348       return NULL;
349     }
350 
351   return mvar;
352 }
353 
354 static void
byte_put_little_endian(unsigned char * field,bfd_vma value,int size)355 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
356 {
357   switch (size)
358     {
359     case 8:
360       field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
361       field[6] = ((value >> 24) >> 24) & 0xff;
362       field[5] = ((value >> 24) >> 16) & 0xff;
363       field[4] = ((value >> 24) >> 8) & 0xff;
364       /* Fall through.  */
365     case 4:
366       field[3] = (value >> 24) & 0xff;
367       field[2] = (value >> 16) & 0xff;
368       /* Fall through.  */
369     case 2:
370       field[1] = (value >> 8) & 0xff;
371       /* Fall through.  */
372     case 1:
373       field[0] = value & 0xff;
374       break;
375 
376     default:
377       error (_("Unhandled data length: %d\n"), size);
378       abort ();
379     }
380 }
381 
382 #if defined BFD64 && !BFD_HOST_64BIT_LONG
383 static int
print_dec_vma(bfd_vma vma,int is_signed)384 print_dec_vma (bfd_vma vma, int is_signed)
385 {
386   char buf[40];
387   char *bufp = buf;
388   int nc = 0;
389 
390   if (is_signed && (bfd_signed_vma) vma < 0)
391     {
392       vma = -vma;
393       putchar ('-');
394       nc = 1;
395     }
396 
397   do
398     {
399       *bufp++ = '0' + vma % 10;
400       vma /= 10;
401     }
402   while (vma != 0);
403   nc += bufp - buf;
404 
405   while (bufp > buf)
406     putchar (*--bufp);
407   return nc;
408 }
409 
410 static int
print_hex_vma(bfd_vma vma)411 print_hex_vma (bfd_vma vma)
412 {
413   char buf[32];
414   char *bufp = buf;
415   int nc;
416 
417   do
418     {
419       char digit = '0' + (vma & 0x0f);
420       if (digit > '9')
421 	digit += 'a' - '0' - 10;
422       *bufp++ = digit;
423       vma >>= 4;
424     }
425   while (vma != 0);
426   nc = bufp - buf;
427 
428   while (bufp > buf)
429     putchar (*--bufp);
430   return nc;
431 }
432 #endif
433 
434 /* Print a VMA value.  */
435 static int
print_vma(bfd_vma vma,print_mode mode)436 print_vma (bfd_vma vma, print_mode mode)
437 {
438 #ifdef BFD64
439   if (is_32bit_elf)
440 #endif
441     {
442       switch (mode)
443 	{
444 	case FULL_HEX:
445 	  return printf ("0x%8.8lx", (unsigned long) vma);
446 
447 	case LONG_HEX:
448 	  return printf ("%8.8lx", (unsigned long) vma);
449 
450 	case DEC_5:
451 	  if (vma <= 99999)
452 	    return printf ("%5ld", (long) vma);
453 	  /* Drop through.  */
454 
455 	case PREFIX_HEX:
456 	  return printf ("0x%lx", (unsigned long) vma);
457 
458 	case HEX:
459 	  return printf ("%lx", (unsigned long) vma);
460 
461 	case DEC:
462 	  return printf ("%ld", (unsigned long) vma);
463 
464 	case UNSIGNED:
465 	  return printf ("%lu", (unsigned long) vma);
466 	}
467     }
468 #ifdef BFD64
469   else
470     {
471       int nc = 0;
472 
473       switch (mode)
474 	{
475 	case FULL_HEX:
476 	  nc = printf ("0x");
477 	  /* Drop through.  */
478 
479 	case LONG_HEX:
480 	  printf_vma (vma);
481 	  return nc + 16;
482 
483 	case PREFIX_HEX:
484 	  nc = printf ("0x");
485 	  /* Drop through.  */
486 
487 	case HEX:
488 #if BFD_HOST_64BIT_LONG
489 	  return nc + printf ("%lx", vma);
490 #else
491 	  return nc + print_hex_vma (vma);
492 #endif
493 
494 	case DEC:
495 #if BFD_HOST_64BIT_LONG
496 	  return printf ("%ld", vma);
497 #else
498 	  return print_dec_vma (vma, 1);
499 #endif
500 
501 	case DEC_5:
502 #if BFD_HOST_64BIT_LONG
503 	  if (vma <= 99999)
504 	    return printf ("%5ld", vma);
505 	  else
506 	    return printf ("%#lx", vma);
507 #else
508 	  if (vma <= 99999)
509 	    return printf ("%5ld", _bfd_int64_low (vma));
510 	  else
511 	    return print_hex_vma (vma);
512 #endif
513 
514 	case UNSIGNED:
515 #if BFD_HOST_64BIT_LONG
516 	  return printf ("%lu", vma);
517 #else
518 	  return print_dec_vma (vma, 0);
519 #endif
520 	}
521     }
522 #endif
523   return 0;
524 }
525 
526 /* Display a symbol on stdout.  If do_wide is not true then
527    format the symbol to be at most WIDTH characters,
528    truncating as necessary.  If WIDTH is negative then
529    format the string to be exactly - WIDTH characters,
530    truncating or padding as necessary.  */
531 
532 static void
print_symbol(int width,const char * symbol)533 print_symbol (int width, const char *symbol)
534 {
535   if (do_wide)
536     printf ("%s", symbol);
537   else if (width < 0)
538     printf ("%-*.*s", width, width, symbol);
539   else
540     printf ("%-.*s", width, symbol);
541 }
542 
543 static void
byte_put_big_endian(unsigned char * field,bfd_vma value,int size)544 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
545 {
546   switch (size)
547     {
548     case 8:
549       field[7] = value & 0xff;
550       field[6] = (value >> 8) & 0xff;
551       field[5] = (value >> 16) & 0xff;
552       field[4] = (value >> 24) & 0xff;
553       value >>= 16;
554       value >>= 16;
555       /* Fall through.  */
556     case 4:
557       field[3] = value & 0xff;
558       field[2] = (value >> 8) & 0xff;
559       value >>= 16;
560       /* Fall through.  */
561     case 2:
562       field[1] = value & 0xff;
563       value >>= 8;
564       /* Fall through.  */
565     case 1:
566       field[0] = value & 0xff;
567       break;
568 
569     default:
570       error (_("Unhandled data length: %d\n"), size);
571       abort ();
572     }
573 }
574 
575 /* Return a pointer to section NAME, or NULL if no such section exists.  */
576 
577 static Elf_Internal_Shdr *
find_section(const char * name)578 find_section (const char *name)
579 {
580   unsigned int i;
581 
582   for (i = 0; i < elf_header.e_shnum; i++)
583     if (streq (SECTION_NAME (section_headers + i), name))
584       return section_headers + i;
585 
586   return NULL;
587 }
588 
589 /* Guess the relocation size commonly used by the specific machines.  */
590 
591 static int
guess_is_rela(unsigned long e_machine)592 guess_is_rela (unsigned long e_machine)
593 {
594   switch (e_machine)
595     {
596       /* Targets that use REL relocations.  */
597     case EM_386:
598     case EM_486:
599     case EM_960:
600     case EM_ARM:
601     case EM_D10V:
602     case EM_CYGNUS_D10V:
603     case EM_DLX:
604     case EM_MIPS:
605     case EM_MIPS_RS3_LE:
606     case EM_CYGNUS_M32R:
607     case EM_OPENRISC:
608     case EM_OR32:
609     case EM_SCORE:
610       return FALSE;
611 
612       /* Targets that use RELA relocations.  */
613     case EM_68K:
614     case EM_860:
615     case EM_ALPHA:
616     case EM_ALTERA_NIOS2:
617     case EM_AVR:
618     case EM_AVR_OLD:
619     case EM_BLACKFIN:
620     case EM_CRIS:
621     case EM_CRX:
622     case EM_D30V:
623     case EM_CYGNUS_D30V:
624     case EM_FR30:
625     case EM_CYGNUS_FR30:
626     case EM_CYGNUS_FRV:
627     case EM_H8S:
628     case EM_H8_300:
629     case EM_H8_300H:
630     case EM_IA_64:
631     case EM_IP2K:
632     case EM_IP2K_OLD:
633     case EM_IQ2000:
634     case EM_M32C:
635     case EM_M32R:
636     case EM_MCORE:
637     case EM_CYGNUS_MEP:
638     case EM_MMIX:
639     case EM_MN10200:
640     case EM_CYGNUS_MN10200:
641     case EM_MN10300:
642     case EM_CYGNUS_MN10300:
643     case EM_MSP430:
644     case EM_MSP430_OLD:
645     case EM_MT:
646     case EM_NIOS32:
647     case EM_PPC64:
648     case EM_PPC:
649     case EM_S390:
650     case EM_S390_OLD:
651     case EM_SH:
652     case EM_SPARC:
653     case EM_SPARC32PLUS:
654     case EM_SPARCV9:
655     case EM_SPU:
656     case EM_V850:
657     case EM_CYGNUS_V850:
658     case EM_VAX:
659     case EM_X86_64:
660     case EM_XSTORMY16:
661     case EM_XTENSA:
662     case EM_XTENSA_OLD:
663       return TRUE;
664 
665     case EM_68HC05:
666     case EM_68HC08:
667     case EM_68HC11:
668     case EM_68HC16:
669     case EM_FX66:
670     case EM_ME16:
671     case EM_MMA:
672     case EM_NCPU:
673     case EM_NDR1:
674     case EM_PCP:
675     case EM_ST100:
676     case EM_ST19:
677     case EM_ST7:
678     case EM_ST9PLUS:
679     case EM_STARCORE:
680     case EM_SVX:
681     case EM_TINYJ:
682     default:
683       warn (_("Don't know about relocations on this machine architecture\n"));
684       return FALSE;
685     }
686 }
687 
688 static int
slurp_rela_relocs(FILE * file,unsigned long rel_offset,unsigned long rel_size,Elf_Internal_Rela ** relasp,unsigned long * nrelasp)689 slurp_rela_relocs (FILE *file,
690 		   unsigned long rel_offset,
691 		   unsigned long rel_size,
692 		   Elf_Internal_Rela **relasp,
693 		   unsigned long *nrelasp)
694 {
695   Elf_Internal_Rela *relas;
696   unsigned long nrelas;
697   unsigned int i;
698 
699   if (is_32bit_elf)
700     {
701       Elf32_External_Rela *erelas;
702 
703       erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
704       if (!erelas)
705 	return 0;
706 
707       nrelas = rel_size / sizeof (Elf32_External_Rela);
708 
709       relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
710 
711       if (relas == NULL)
712 	{
713 	  free (erelas);
714 	  error (_("out of memory parsing relocs\n"));
715 	  return 0;
716 	}
717 
718       for (i = 0; i < nrelas; i++)
719 	{
720 	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
721 	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
722 	  relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
723 	}
724 
725       free (erelas);
726     }
727   else
728     {
729       Elf64_External_Rela *erelas;
730 
731       erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
732       if (!erelas)
733 	return 0;
734 
735       nrelas = rel_size / sizeof (Elf64_External_Rela);
736 
737       relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
738 
739       if (relas == NULL)
740 	{
741 	  free (erelas);
742 	  error (_("out of memory parsing relocs\n"));
743 	  return 0;
744 	}
745 
746       for (i = 0; i < nrelas; i++)
747 	{
748 	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
749 	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
750 	  relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
751 	}
752 
753       free (erelas);
754     }
755   *relasp = relas;
756   *nrelasp = nrelas;
757   return 1;
758 }
759 
760 static int
slurp_rel_relocs(FILE * file,unsigned long rel_offset,unsigned long rel_size,Elf_Internal_Rela ** relsp,unsigned long * nrelsp)761 slurp_rel_relocs (FILE *file,
762 		  unsigned long rel_offset,
763 		  unsigned long rel_size,
764 		  Elf_Internal_Rela **relsp,
765 		  unsigned long *nrelsp)
766 {
767   Elf_Internal_Rela *rels;
768   unsigned long nrels;
769   unsigned int i;
770 
771   if (is_32bit_elf)
772     {
773       Elf32_External_Rel *erels;
774 
775       erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
776       if (!erels)
777 	return 0;
778 
779       nrels = rel_size / sizeof (Elf32_External_Rel);
780 
781       rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
782 
783       if (rels == NULL)
784 	{
785 	  free (erels);
786 	  error (_("out of memory parsing relocs\n"));
787 	  return 0;
788 	}
789 
790       for (i = 0; i < nrels; i++)
791 	{
792 	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
793 	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
794 	  rels[i].r_addend = 0;
795 	}
796 
797       free (erels);
798     }
799   else
800     {
801       Elf64_External_Rel *erels;
802 
803       erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
804       if (!erels)
805 	return 0;
806 
807       nrels = rel_size / sizeof (Elf64_External_Rel);
808 
809       rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
810 
811       if (rels == NULL)
812 	{
813 	  free (erels);
814 	  error (_("out of memory parsing relocs\n"));
815 	  return 0;
816 	}
817 
818       for (i = 0; i < nrels; i++)
819 	{
820 	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
821 	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
822 	  rels[i].r_addend = 0;
823 	}
824 
825       free (erels);
826     }
827   *relsp = rels;
828   *nrelsp = nrels;
829   return 1;
830 }
831 
832 /* Display the contents of the relocation data found at the specified
833    offset.  */
834 
835 static int
dump_relocations(FILE * file,unsigned long rel_offset,unsigned long rel_size,Elf_Internal_Sym * symtab,unsigned long nsyms,char * strtab,unsigned long strtablen,int is_rela)836 dump_relocations (FILE *file,
837 		  unsigned long rel_offset,
838 		  unsigned long rel_size,
839 		  Elf_Internal_Sym *symtab,
840 		  unsigned long nsyms,
841 		  char *strtab,
842 		  unsigned long strtablen,
843 		  int is_rela)
844 {
845   unsigned int i;
846   Elf_Internal_Rela *rels;
847 
848 
849   if (is_rela == UNKNOWN)
850     is_rela = guess_is_rela (elf_header.e_machine);
851 
852   if (is_rela)
853     {
854       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
855 	return 0;
856     }
857   else
858     {
859       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
860 	return 0;
861     }
862 
863   if (is_32bit_elf)
864     {
865       if (is_rela)
866 	{
867 	  if (do_wide)
868 	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
869 	  else
870 	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
871 	}
872       else
873 	{
874 	  if (do_wide)
875 	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
876 	  else
877 	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
878 	}
879     }
880   else
881     {
882       if (is_rela)
883 	{
884 	  if (do_wide)
885 	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
886 	  else
887 	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
888 	}
889       else
890 	{
891 	  if (do_wide)
892 	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
893 	  else
894 	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
895 	}
896     }
897 
898   for (i = 0; i < rel_size; i++)
899     {
900       const char *rtype;
901       const char *rtype2 = NULL;
902       const char *rtype3 = NULL;
903       bfd_vma offset;
904       bfd_vma info;
905       bfd_vma symtab_index;
906       bfd_vma type;
907       bfd_vma type2 = 0;
908       bfd_vma type3 = 0;
909 
910       offset = rels[i].r_offset;
911       info   = rels[i].r_info;
912 
913       if (is_32bit_elf)
914 	{
915 	  type         = ELF32_R_TYPE (info);
916 	  symtab_index = ELF32_R_SYM  (info);
917 	}
918       else
919 	{
920 	  /* The #ifdef BFD64 below is to prevent a compile time warning.
921 	     We know that if we do not have a 64 bit data type that we
922 	     will never execute this code anyway.  */
923 #ifdef BFD64
924 	  if (elf_header.e_machine == EM_MIPS)
925 	    {
926 	      /* In little-endian objects, r_info isn't really a 64-bit
927 		 little-endian value: it has a 32-bit little-endian
928 		 symbol index followed by four individual byte fields.
929 		 Reorder INFO accordingly.  */
930 	      if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
931 		info = (((info & 0xffffffff) << 32)
932 			| ((info >> 56) & 0xff)
933 			| ((info >> 40) & 0xff00)
934 			| ((info >> 24) & 0xff0000)
935 			| ((info >> 8) & 0xff000000));
936 	      type  = ELF64_MIPS_R_TYPE (info);
937 	      type2 = ELF64_MIPS_R_TYPE2 (info);
938 	      type3 = ELF64_MIPS_R_TYPE3 (info);
939 	    }
940 	  else if (elf_header.e_machine == EM_SPARCV9)
941 	    type = ELF64_R_TYPE_ID (info);
942 	  else
943 	    type = ELF64_R_TYPE (info);
944 
945 	  symtab_index = ELF64_R_SYM  (info);
946 #endif
947 	}
948 
949       if (is_32bit_elf)
950 	{
951 #ifdef _bfd_int64_low
952 	  printf ("%8.8lx  %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
953 #else
954 	  printf ("%8.8lx  %8.8lx ", offset, info);
955 #endif
956 	}
957       else
958 	{
959 #ifdef _bfd_int64_low
960 	  printf (do_wide
961 		  ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
962 		  : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
963 		  _bfd_int64_high (offset),
964 		  _bfd_int64_low (offset),
965 		  _bfd_int64_high (info),
966 		  _bfd_int64_low (info));
967 #else
968 	  printf (do_wide
969 		  ? "%16.16lx  %16.16lx "
970 		  : "%12.12lx  %12.12lx ",
971 		  offset, info);
972 #endif
973 	}
974 
975       switch (elf_header.e_machine)
976 	{
977 	default:
978 	  rtype = NULL;
979 	  break;
980 
981 	case EM_M32R:
982 	case EM_CYGNUS_M32R:
983 	  rtype = elf_m32r_reloc_type (type);
984 	  break;
985 
986 	case EM_386:
987 	case EM_486:
988 	  rtype = elf_i386_reloc_type (type);
989 	  break;
990 
991 	case EM_68HC11:
992 	case EM_68HC12:
993 	  rtype = elf_m68hc11_reloc_type (type);
994 	  break;
995 
996 	case EM_68K:
997 	  rtype = elf_m68k_reloc_type (type);
998 	  break;
999 
1000 	case EM_960:
1001 	  rtype = elf_i960_reloc_type (type);
1002 	  break;
1003 
1004 	case EM_AVR:
1005 	case EM_AVR_OLD:
1006 	  rtype = elf_avr_reloc_type (type);
1007 	  break;
1008 
1009 	case EM_OLD_SPARCV9:
1010 	case EM_SPARC32PLUS:
1011 	case EM_SPARCV9:
1012 	case EM_SPARC:
1013 	  rtype = elf_sparc_reloc_type (type);
1014 	  break;
1015 
1016 	case EM_SPU:
1017 	  rtype = elf_spu_reloc_type (type);
1018 	  break;
1019 
1020 	case EM_V850:
1021 	case EM_CYGNUS_V850:
1022 	  rtype = v850_reloc_type (type);
1023 	  break;
1024 
1025 	case EM_D10V:
1026 	case EM_CYGNUS_D10V:
1027 	  rtype = elf_d10v_reloc_type (type);
1028 	  break;
1029 
1030 	case EM_D30V:
1031 	case EM_CYGNUS_D30V:
1032 	  rtype = elf_d30v_reloc_type (type);
1033 	  break;
1034 
1035 	case EM_DLX:
1036 	  rtype = elf_dlx_reloc_type (type);
1037 	  break;
1038 
1039 	case EM_SH:
1040 	  rtype = elf_sh_reloc_type (type);
1041 	  break;
1042 
1043 	case EM_MN10300:
1044 	case EM_CYGNUS_MN10300:
1045 	  rtype = elf_mn10300_reloc_type (type);
1046 	  break;
1047 
1048 	case EM_MN10200:
1049 	case EM_CYGNUS_MN10200:
1050 	  rtype = elf_mn10200_reloc_type (type);
1051 	  break;
1052 
1053 	case EM_FR30:
1054 	case EM_CYGNUS_FR30:
1055 	  rtype = elf_fr30_reloc_type (type);
1056 	  break;
1057 
1058 	case EM_CYGNUS_FRV:
1059 	  rtype = elf_frv_reloc_type (type);
1060 	  break;
1061 
1062 	case EM_MCORE:
1063 	  rtype = elf_mcore_reloc_type (type);
1064 	  break;
1065 
1066 	case EM_MMIX:
1067 	  rtype = elf_mmix_reloc_type (type);
1068 	  break;
1069 
1070 	case EM_MSP430:
1071 	case EM_MSP430_OLD:
1072 	  rtype = elf_msp430_reloc_type (type);
1073 	  break;
1074 
1075 	case EM_PPC:
1076 	  rtype = elf_ppc_reloc_type (type);
1077 	  break;
1078 
1079 	case EM_PPC64:
1080 	  rtype = elf_ppc64_reloc_type (type);
1081 	  break;
1082 
1083 	case EM_MIPS:
1084 	case EM_MIPS_RS3_LE:
1085 	  rtype = elf_mips_reloc_type (type);
1086 	  if (!is_32bit_elf)
1087 	    {
1088 	      rtype2 = elf_mips_reloc_type (type2);
1089 	      rtype3 = elf_mips_reloc_type (type3);
1090 	    }
1091 	  break;
1092 
1093 	case EM_ALPHA:
1094 	  rtype = elf_alpha_reloc_type (type);
1095 	  break;
1096 
1097 	case EM_ARM:
1098 	  rtype = elf_arm_reloc_type (type);
1099 	  break;
1100 
1101 	case EM_ARC:
1102 	  rtype = elf_arc_reloc_type (type);
1103 	  break;
1104 
1105 	case EM_PARISC:
1106 	  rtype = elf_hppa_reloc_type (type);
1107 	  break;
1108 
1109 	case EM_H8_300:
1110 	case EM_H8_300H:
1111 	case EM_H8S:
1112 	  rtype = elf_h8_reloc_type (type);
1113 	  break;
1114 
1115 	case EM_OPENRISC:
1116 	case EM_OR32:
1117 	  rtype = elf_or32_reloc_type (type);
1118 	  break;
1119 
1120 	case EM_PJ:
1121 	case EM_PJ_OLD:
1122 	  rtype = elf_pj_reloc_type (type);
1123 	  break;
1124 	case EM_IA_64:
1125 	  rtype = elf_ia64_reloc_type (type);
1126 	  break;
1127 
1128 	case EM_CRIS:
1129 	  rtype = elf_cris_reloc_type (type);
1130 	  break;
1131 
1132 	case EM_860:
1133 	  rtype = elf_i860_reloc_type (type);
1134 	  break;
1135 
1136 	case EM_X86_64:
1137 	  rtype = elf_x86_64_reloc_type (type);
1138 	  break;
1139 
1140 	case EM_S370:
1141 	  rtype = i370_reloc_type (type);
1142 	  break;
1143 
1144 	case EM_S390_OLD:
1145 	case EM_S390:
1146 	  rtype = elf_s390_reloc_type (type);
1147 	  break;
1148 
1149 	case EM_SCORE:
1150 	  rtype = elf_score_reloc_type (type);
1151 	  break;
1152 
1153 	case EM_XSTORMY16:
1154 	  rtype = elf_xstormy16_reloc_type (type);
1155 	  break;
1156 
1157 	case EM_CRX:
1158 	  rtype = elf_crx_reloc_type (type);
1159 	  break;
1160 
1161 	case EM_VAX:
1162 	  rtype = elf_vax_reloc_type (type);
1163 	  break;
1164 
1165 	case EM_IP2K:
1166 	case EM_IP2K_OLD:
1167 	  rtype = elf_ip2k_reloc_type (type);
1168 	  break;
1169 
1170 	case EM_IQ2000:
1171 	  rtype = elf_iq2000_reloc_type (type);
1172 	  break;
1173 
1174 	case EM_XTENSA_OLD:
1175 	case EM_XTENSA:
1176 	  rtype = elf_xtensa_reloc_type (type);
1177 	  break;
1178 
1179 	case EM_M32C:
1180 	  rtype = elf_m32c_reloc_type (type);
1181 	  break;
1182 
1183 	case EM_MT:
1184 	  rtype = elf_mt_reloc_type (type);
1185 	  break;
1186 
1187 	case EM_BLACKFIN:
1188 	  rtype = elf_bfin_reloc_type (type);
1189 	  break;
1190 
1191 	case EM_CYGNUS_MEP:
1192 	  rtype = elf_mep_reloc_type (type);
1193 	  break;
1194 	}
1195 
1196       if (rtype == NULL)
1197 #ifdef _bfd_int64_low
1198 	printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1199 #else
1200 	printf (_("unrecognized: %-7lx"), type);
1201 #endif
1202       else
1203 	printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1204 
1205       if (elf_header.e_machine == EM_ALPHA
1206 	  && rtype != NULL
1207 	  && streq (rtype, "R_ALPHA_LITUSE")
1208 	  && is_rela)
1209 	{
1210 	  switch (rels[i].r_addend)
1211 	    {
1212 	    case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1213 	    case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1214 	    case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1215 	    case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1216 	    case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1217 	    case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1218 	    case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1219 	    default: rtype = NULL;
1220 	    }
1221 	  if (rtype)
1222 	    printf (" (%s)", rtype);
1223 	  else
1224 	    {
1225 	      putchar (' ');
1226 	      printf (_("<unknown addend: %lx>"),
1227 		      (unsigned long) rels[i].r_addend);
1228 	    }
1229 	}
1230       else if (symtab_index)
1231 	{
1232 	  if (symtab == NULL || symtab_index >= nsyms)
1233 	    printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1234 	  else
1235 	    {
1236 	      Elf_Internal_Sym *psym;
1237 
1238 	      psym = symtab + symtab_index;
1239 
1240 	      printf (" ");
1241 	      print_vma (psym->st_value, LONG_HEX);
1242 	      printf (is_32bit_elf ? "   " : " ");
1243 
1244 	      if (psym->st_name == 0)
1245 		{
1246 		  const char *sec_name = "<null>";
1247 		  char name_buf[40];
1248 
1249 		  if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1250 		    {
1251 		      bfd_vma sec_index = (bfd_vma) -1;
1252 
1253 		      if (psym->st_shndx < SHN_LORESERVE)
1254 			sec_index = psym->st_shndx;
1255 		      else if (psym->st_shndx > SHN_HIRESERVE)
1256 			sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1257 						      - SHN_LORESERVE);
1258 
1259 		      if (sec_index != (bfd_vma) -1)
1260 			sec_name = SECTION_NAME (section_headers + sec_index);
1261 		      else if (psym->st_shndx == SHN_ABS)
1262 			sec_name = "ABS";
1263 		      else if (psym->st_shndx == SHN_COMMON)
1264 			sec_name = "COMMON";
1265 		      else if (elf_header.e_machine == EM_MIPS
1266 			       && psym->st_shndx == SHN_MIPS_SCOMMON)
1267 			sec_name = "SCOMMON";
1268 		      else if (elf_header.e_machine == EM_MIPS
1269 			       && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1270 			sec_name = "SUNDEF";
1271 		      else if (elf_header.e_machine == EM_X86_64
1272 			       && psym->st_shndx == SHN_X86_64_LCOMMON)
1273 			sec_name = "LARGE_COMMON";
1274 		      else if (elf_header.e_machine == EM_IA_64
1275 			       && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1276 			       && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1277 			sec_name = "ANSI_COM";
1278 		      else
1279 			{
1280 			  sprintf (name_buf, "<section 0x%x>",
1281 				   (unsigned int) psym->st_shndx);
1282 			  sec_name = name_buf;
1283 			}
1284 		    }
1285 		  print_symbol (22, sec_name);
1286 		}
1287 	      else if (strtab == NULL)
1288 		printf (_("<string table index: %3ld>"), psym->st_name);
1289 	      else if (psym->st_name >= strtablen)
1290 		printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1291 	      else
1292 		print_symbol (22, strtab + psym->st_name);
1293 
1294 	      if (is_rela)
1295 		printf (" + %lx", (unsigned long) rels[i].r_addend);
1296 	    }
1297 	}
1298       else if (is_rela)
1299 	{
1300 	  printf ("%*c", is_32bit_elf ?
1301 		  (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1302 	  print_vma (rels[i].r_addend, LONG_HEX);
1303 	}
1304 
1305       if (elf_header.e_machine == EM_SPARCV9
1306 	  && rtype != NULL
1307 	  && streq (rtype, "R_SPARC_OLO10"))
1308 	printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1309 
1310       putchar ('\n');
1311 
1312       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1313 	{
1314 	  printf ("                    Type2: ");
1315 
1316 	  if (rtype2 == NULL)
1317 #ifdef _bfd_int64_low
1318 	    printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1319 #else
1320 	    printf (_("unrecognized: %-7lx"), type2);
1321 #endif
1322 	  else
1323 	    printf ("%-17.17s", rtype2);
1324 
1325 	  printf ("\n                    Type3: ");
1326 
1327 	  if (rtype3 == NULL)
1328 #ifdef _bfd_int64_low
1329 	    printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1330 #else
1331 	    printf (_("unrecognized: %-7lx"), type3);
1332 #endif
1333 	  else
1334 	    printf ("%-17.17s", rtype3);
1335 
1336 	  putchar ('\n');
1337 	}
1338     }
1339 
1340   free (rels);
1341 
1342   return 1;
1343 }
1344 
1345 static const char *
get_mips_dynamic_type(unsigned long type)1346 get_mips_dynamic_type (unsigned long type)
1347 {
1348   switch (type)
1349     {
1350     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1351     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1352     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1353     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1354     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1355     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1356     case DT_MIPS_MSYM: return "MIPS_MSYM";
1357     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1358     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1359     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1360     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1361     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1362     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1363     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1364     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1365     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1366     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1367     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1368     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1369     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1370     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1371     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1372     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1373     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1374     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1375     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1376     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1377     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1378     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1379     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1380     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1381     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1382     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1383     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1384     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1385     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1386     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1387     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1388     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1389     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1390     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1391     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1392     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1393     default:
1394       return NULL;
1395     }
1396 }
1397 
1398 static const char *
get_sparc64_dynamic_type(unsigned long type)1399 get_sparc64_dynamic_type (unsigned long type)
1400 {
1401   switch (type)
1402     {
1403     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1404     default:
1405       return NULL;
1406     }
1407 }
1408 
1409 static const char *
get_ppc_dynamic_type(unsigned long type)1410 get_ppc_dynamic_type (unsigned long type)
1411 {
1412   switch (type)
1413     {
1414     case DT_PPC_GOT: return "PPC_GOT";
1415     default:
1416       return NULL;
1417     }
1418 }
1419 
1420 static const char *
get_ppc64_dynamic_type(unsigned long type)1421 get_ppc64_dynamic_type (unsigned long type)
1422 {
1423   switch (type)
1424     {
1425     case DT_PPC64_GLINK: return "PPC64_GLINK";
1426     case DT_PPC64_OPD:   return "PPC64_OPD";
1427     case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1428     default:
1429       return NULL;
1430     }
1431 }
1432 
1433 static const char *
get_parisc_dynamic_type(unsigned long type)1434 get_parisc_dynamic_type (unsigned long type)
1435 {
1436   switch (type)
1437     {
1438     case DT_HP_LOAD_MAP:	return "HP_LOAD_MAP";
1439     case DT_HP_DLD_FLAGS:	return "HP_DLD_FLAGS";
1440     case DT_HP_DLD_HOOK:	return "HP_DLD_HOOK";
1441     case DT_HP_UX10_INIT:	return "HP_UX10_INIT";
1442     case DT_HP_UX10_INITSZ:	return "HP_UX10_INITSZ";
1443     case DT_HP_PREINIT:		return "HP_PREINIT";
1444     case DT_HP_PREINITSZ:	return "HP_PREINITSZ";
1445     case DT_HP_NEEDED:		return "HP_NEEDED";
1446     case DT_HP_TIME_STAMP:	return "HP_TIME_STAMP";
1447     case DT_HP_CHECKSUM:	return "HP_CHECKSUM";
1448     case DT_HP_GST_SIZE:	return "HP_GST_SIZE";
1449     case DT_HP_GST_VERSION:	return "HP_GST_VERSION";
1450     case DT_HP_GST_HASHVAL:	return "HP_GST_HASHVAL";
1451     case DT_HP_EPLTREL:		return "HP_GST_EPLTREL";
1452     case DT_HP_EPLTRELSZ:	return "HP_GST_EPLTRELSZ";
1453     case DT_HP_FILTERED:	return "HP_FILTERED";
1454     case DT_HP_FILTER_TLS:	return "HP_FILTER_TLS";
1455     case DT_HP_COMPAT_FILTERED:	return "HP_COMPAT_FILTERED";
1456     case DT_HP_LAZYLOAD:	return "HP_LAZYLOAD";
1457     case DT_HP_BIND_NOW_COUNT:	return "HP_BIND_NOW_COUNT";
1458     case DT_PLT:		return "PLT";
1459     case DT_PLT_SIZE:		return "PLT_SIZE";
1460     case DT_DLT:		return "DLT";
1461     case DT_DLT_SIZE:		return "DLT_SIZE";
1462     default:
1463       return NULL;
1464     }
1465 }
1466 
1467 static const char *
get_ia64_dynamic_type(unsigned long type)1468 get_ia64_dynamic_type (unsigned long type)
1469 {
1470   switch (type)
1471     {
1472     case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1473     default:
1474       return NULL;
1475     }
1476 }
1477 
1478 static const char *
get_alpha_dynamic_type(unsigned long type)1479 get_alpha_dynamic_type (unsigned long type)
1480 {
1481   switch (type)
1482     {
1483     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1484     default:
1485       return NULL;
1486     }
1487 }
1488 
1489 static const char *
get_score_dynamic_type(unsigned long type)1490 get_score_dynamic_type (unsigned long type)
1491 {
1492   switch (type)
1493     {
1494     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1495     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1496     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1497     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1498     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1499     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1500     default:
1501       return NULL;
1502     }
1503 }
1504 
1505 
1506 static const char *
get_dynamic_type(unsigned long type)1507 get_dynamic_type (unsigned long type)
1508 {
1509   static char buff[64];
1510 
1511   switch (type)
1512     {
1513     case DT_NULL:	return "NULL";
1514     case DT_NEEDED:	return "NEEDED";
1515     case DT_PLTRELSZ:	return "PLTRELSZ";
1516     case DT_PLTGOT:	return "PLTGOT";
1517     case DT_HASH:	return "HASH";
1518     case DT_STRTAB:	return "STRTAB";
1519     case DT_SYMTAB:	return "SYMTAB";
1520     case DT_RELA:	return "RELA";
1521     case DT_RELASZ:	return "RELASZ";
1522     case DT_RELAENT:	return "RELAENT";
1523     case DT_STRSZ:	return "STRSZ";
1524     case DT_SYMENT:	return "SYMENT";
1525     case DT_INIT:	return "INIT";
1526     case DT_FINI:	return "FINI";
1527     case DT_SONAME:	return "SONAME";
1528     case DT_RPATH:	return "RPATH";
1529     case DT_SYMBOLIC:	return "SYMBOLIC";
1530     case DT_REL:	return "REL";
1531     case DT_RELSZ:	return "RELSZ";
1532     case DT_RELENT:	return "RELENT";
1533     case DT_PLTREL:	return "PLTREL";
1534     case DT_DEBUG:	return "DEBUG";
1535     case DT_TEXTREL:	return "TEXTREL";
1536     case DT_JMPREL:	return "JMPREL";
1537     case DT_BIND_NOW:   return "BIND_NOW";
1538     case DT_INIT_ARRAY: return "INIT_ARRAY";
1539     case DT_FINI_ARRAY: return "FINI_ARRAY";
1540     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1541     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1542     case DT_RUNPATH:    return "RUNPATH";
1543     case DT_FLAGS:      return "FLAGS";
1544 
1545     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1546     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1547 
1548     case DT_CHECKSUM:	return "CHECKSUM";
1549     case DT_PLTPADSZ:	return "PLTPADSZ";
1550     case DT_MOVEENT:	return "MOVEENT";
1551     case DT_MOVESZ:	return "MOVESZ";
1552     case DT_FEATURE:	return "FEATURE";
1553     case DT_POSFLAG_1:	return "POSFLAG_1";
1554     case DT_SYMINSZ:	return "SYMINSZ";
1555     case DT_SYMINENT:	return "SYMINENT"; /* aka VALRNGHI */
1556 
1557     case DT_ADDRRNGLO:  return "ADDRRNGLO";
1558     case DT_CONFIG:	return "CONFIG";
1559     case DT_DEPAUDIT:	return "DEPAUDIT";
1560     case DT_AUDIT:	return "AUDIT";
1561     case DT_PLTPAD:	return "PLTPAD";
1562     case DT_MOVETAB:	return "MOVETAB";
1563     case DT_SYMINFO:	return "SYMINFO"; /* aka ADDRRNGHI */
1564 
1565     case DT_VERSYM:	return "VERSYM";
1566 
1567     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1568     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1569     case DT_RELACOUNT:	return "RELACOUNT";
1570     case DT_RELCOUNT:	return "RELCOUNT";
1571     case DT_FLAGS_1:	return "FLAGS_1";
1572     case DT_VERDEF:	return "VERDEF";
1573     case DT_VERDEFNUM:	return "VERDEFNUM";
1574     case DT_VERNEED:	return "VERNEED";
1575     case DT_VERNEEDNUM:	return "VERNEEDNUM";
1576 
1577     case DT_AUXILIARY:	return "AUXILIARY";
1578     case DT_USED:	return "USED";
1579     case DT_FILTER:	return "FILTER";
1580 
1581     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1582     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1583     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1584     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1585     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1586     case DT_GNU_HASH:	return "GNU_HASH";
1587 
1588     default:
1589       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1590 	{
1591 	  const char *result;
1592 
1593 	  switch (elf_header.e_machine)
1594 	    {
1595 	    case EM_MIPS:
1596 	    case EM_MIPS_RS3_LE:
1597 	      result = get_mips_dynamic_type (type);
1598 	      break;
1599 	    case EM_SPARCV9:
1600 	      result = get_sparc64_dynamic_type (type);
1601 	      break;
1602 	    case EM_PPC:
1603 	      result = get_ppc_dynamic_type (type);
1604 	      break;
1605 	    case EM_PPC64:
1606 	      result = get_ppc64_dynamic_type (type);
1607 	      break;
1608 	    case EM_IA_64:
1609 	      result = get_ia64_dynamic_type (type);
1610 	      break;
1611 	    case EM_ALPHA:
1612 	      result = get_alpha_dynamic_type (type);
1613 	      break;
1614 	    case EM_SCORE:
1615 	      result = get_score_dynamic_type (type);
1616 	      break;
1617 	    default:
1618 	      result = NULL;
1619 	      break;
1620 	    }
1621 
1622 	  if (result != NULL)
1623 	    return result;
1624 
1625 	  snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1626 	}
1627       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1628 	       || (elf_header.e_machine == EM_PARISC
1629 		   && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1630 	{
1631 	  const char *result;
1632 
1633 	  switch (elf_header.e_machine)
1634 	    {
1635 	    case EM_PARISC:
1636 	      result = get_parisc_dynamic_type (type);
1637 	      break;
1638 	    default:
1639 	      result = NULL;
1640 	      break;
1641 	    }
1642 
1643 	  if (result != NULL)
1644 	    return result;
1645 
1646 	  snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1647 		    type);
1648 	}
1649       else
1650 	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1651 
1652       return buff;
1653     }
1654 }
1655 
1656 static char *
get_file_type(unsigned e_type)1657 get_file_type (unsigned e_type)
1658 {
1659   static char buff[32];
1660 
1661   switch (e_type)
1662     {
1663     case ET_NONE:	return _("NONE (None)");
1664     case ET_REL:	return _("REL (Relocatable file)");
1665     case ET_EXEC:	return _("EXEC (Executable file)");
1666     case ET_DYN:	return _("DYN (Shared object file)");
1667     case ET_CORE:	return _("CORE (Core file)");
1668 
1669     default:
1670       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1671 	snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1672       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1673 	snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1674       else
1675 	snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1676       return buff;
1677     }
1678 }
1679 
1680 static char *
get_machine_name(unsigned e_machine)1681 get_machine_name (unsigned e_machine)
1682 {
1683   static char buff[64]; /* XXX */
1684 
1685   switch (e_machine)
1686     {
1687     case EM_NONE:		return _("None");
1688     case EM_M32:		return "WE32100";
1689     case EM_SPARC:		return "Sparc";
1690     case EM_SPU:		return "SPU";
1691     case EM_386:		return "Intel 80386";
1692     case EM_68K:		return "MC68000";
1693     case EM_88K:		return "MC88000";
1694     case EM_486:		return "Intel 80486";
1695     case EM_860:		return "Intel 80860";
1696     case EM_MIPS:		return "MIPS R3000";
1697     case EM_S370:		return "IBM System/370";
1698     case EM_MIPS_RS3_LE:	return "MIPS R4000 big-endian";
1699     case EM_OLD_SPARCV9:	return "Sparc v9 (old)";
1700     case EM_PARISC:		return "HPPA";
1701     case EM_PPC_OLD:		return "Power PC (old)";
1702     case EM_SPARC32PLUS:	return "Sparc v8+" ;
1703     case EM_960:		return "Intel 90860";
1704     case EM_PPC:		return "PowerPC";
1705     case EM_PPC64:		return "PowerPC64";
1706     case EM_V800:		return "NEC V800";
1707     case EM_FR20:		return "Fujitsu FR20";
1708     case EM_RH32:		return "TRW RH32";
1709     case EM_MCORE:		return "MCORE";
1710     case EM_ARM:		return "ARM";
1711     case EM_OLD_ALPHA:		return "Digital Alpha (old)";
1712     case EM_SH:			return "Renesas / SuperH SH";
1713     case EM_SPARCV9:		return "Sparc v9";
1714     case EM_TRICORE:		return "Siemens Tricore";
1715     case EM_ARC:		return "ARC";
1716     case EM_H8_300:		return "Renesas H8/300";
1717     case EM_H8_300H:		return "Renesas H8/300H";
1718     case EM_H8S:		return "Renesas H8S";
1719     case EM_H8_500:		return "Renesas H8/500";
1720     case EM_IA_64:		return "Intel IA-64";
1721     case EM_MIPS_X:		return "Stanford MIPS-X";
1722     case EM_COLDFIRE:		return "Motorola Coldfire";
1723     case EM_68HC12:		return "Motorola M68HC12";
1724     case EM_ALPHA:		return "Alpha";
1725     case EM_CYGNUS_D10V:
1726     case EM_D10V:		return "d10v";
1727     case EM_CYGNUS_D30V:
1728     case EM_D30V:		return "d30v";
1729     case EM_CYGNUS_M32R:
1730     case EM_M32R:		return "Renesas M32R (formerly Mitsubishi M32r)";
1731     case EM_CYGNUS_V850:
1732     case EM_V850:		return "NEC v850";
1733     case EM_CYGNUS_MN10300:
1734     case EM_MN10300:		return "mn10300";
1735     case EM_CYGNUS_MN10200:
1736     case EM_MN10200:		return "mn10200";
1737     case EM_CYGNUS_FR30:
1738     case EM_FR30:		return "Fujitsu FR30";
1739     case EM_CYGNUS_FRV:		return "Fujitsu FR-V";
1740     case EM_PJ_OLD:
1741     case EM_PJ:			return "picoJava";
1742     case EM_MMA:		return "Fujitsu Multimedia Accelerator";
1743     case EM_PCP:		return "Siemens PCP";
1744     case EM_NCPU:		return "Sony nCPU embedded RISC processor";
1745     case EM_NDR1:		return "Denso NDR1 microprocesspr";
1746     case EM_STARCORE:		return "Motorola Star*Core processor";
1747     case EM_ME16:		return "Toyota ME16 processor";
1748     case EM_ST100:		return "STMicroelectronics ST100 processor";
1749     case EM_TINYJ:		return "Advanced Logic Corp. TinyJ embedded processor";
1750     case EM_FX66:		return "Siemens FX66 microcontroller";
1751     case EM_ST9PLUS:		return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1752     case EM_ST7:		return "STMicroelectronics ST7 8-bit microcontroller";
1753     case EM_68HC16:		return "Motorola MC68HC16 Microcontroller";
1754     case EM_68HC11:		return "Motorola MC68HC11 Microcontroller";
1755     case EM_68HC08:		return "Motorola MC68HC08 Microcontroller";
1756     case EM_68HC05:		return "Motorola MC68HC05 Microcontroller";
1757     case EM_SVX:		return "Silicon Graphics SVx";
1758     case EM_ST19:		return "STMicroelectronics ST19 8-bit microcontroller";
1759     case EM_VAX:		return "Digital VAX";
1760     case EM_AVR_OLD:
1761     case EM_AVR:		return "Atmel AVR 8-bit microcontroller";
1762     case EM_CRIS:		return "Axis Communications 32-bit embedded processor";
1763     case EM_JAVELIN:		return "Infineon Technologies 32-bit embedded cpu";
1764     case EM_FIREPATH:		return "Element 14 64-bit DSP processor";
1765     case EM_ZSP:		return "LSI Logic's 16-bit DSP processor";
1766     case EM_MMIX:		return "Donald Knuth's educational 64-bit processor";
1767     case EM_HUANY:		return "Harvard Universitys's machine-independent object format";
1768     case EM_PRISM:		return "Vitesse Prism";
1769     case EM_X86_64:		return "Advanced Micro Devices X86-64";
1770     case EM_S390_OLD:
1771     case EM_S390:		return "IBM S/390";
1772     case EM_SCORE:		return "SUNPLUS S+Core";
1773     case EM_XSTORMY16:		return "Sanyo Xstormy16 CPU core";
1774     case EM_OPENRISC:
1775     case EM_OR32:		return "OpenRISC";
1776     case EM_CRX:		return "National Semiconductor CRX microprocessor";
1777     case EM_DLX:		return "OpenDLX";
1778     case EM_IP2K_OLD:
1779     case EM_IP2K:		return "Ubicom IP2xxx 8-bit microcontrollers";
1780     case EM_IQ2000:       	return "Vitesse IQ2000";
1781     case EM_XTENSA_OLD:
1782     case EM_XTENSA:		return "Tensilica Xtensa Processor";
1783     case EM_M32C:	        return "Renesas M32c";
1784     case EM_MT:                 return "Morpho Techologies MT processor";
1785     case EM_BLACKFIN:		return "Analog Devices Blackfin";
1786     case EM_NIOS32:		return "Altera Nios";
1787     case EM_ALTERA_NIOS2:	return "Altera Nios II";
1788     case EM_XC16X:		return "Infineon Technologies xc16x";
1789     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
1790     default:
1791       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
1792       return buff;
1793     }
1794 }
1795 
1796 static void
decode_ARM_machine_flags(unsigned e_flags,char buf[])1797 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1798 {
1799   unsigned eabi;
1800   int unknown = 0;
1801 
1802   eabi = EF_ARM_EABI_VERSION (e_flags);
1803   e_flags &= ~ EF_ARM_EABIMASK;
1804 
1805   /* Handle "generic" ARM flags.  */
1806   if (e_flags & EF_ARM_RELEXEC)
1807     {
1808       strcat (buf, ", relocatable executable");
1809       e_flags &= ~ EF_ARM_RELEXEC;
1810     }
1811 
1812   if (e_flags & EF_ARM_HASENTRY)
1813     {
1814       strcat (buf, ", has entry point");
1815       e_flags &= ~ EF_ARM_HASENTRY;
1816     }
1817 
1818   /* Now handle EABI specific flags.  */
1819   switch (eabi)
1820     {
1821     default:
1822       strcat (buf, ", <unrecognized EABI>");
1823       if (e_flags)
1824 	unknown = 1;
1825       break;
1826 
1827     case EF_ARM_EABI_VER1:
1828       strcat (buf, ", Version1 EABI");
1829       while (e_flags)
1830 	{
1831 	  unsigned flag;
1832 
1833 	  /* Process flags one bit at a time.  */
1834 	  flag = e_flags & - e_flags;
1835 	  e_flags &= ~ flag;
1836 
1837 	  switch (flag)
1838 	    {
1839 	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
1840 	      strcat (buf, ", sorted symbol tables");
1841 	      break;
1842 
1843 	    default:
1844 	      unknown = 1;
1845 	      break;
1846 	    }
1847 	}
1848       break;
1849 
1850     case EF_ARM_EABI_VER2:
1851       strcat (buf, ", Version2 EABI");
1852       while (e_flags)
1853 	{
1854 	  unsigned flag;
1855 
1856 	  /* Process flags one bit at a time.  */
1857 	  flag = e_flags & - e_flags;
1858 	  e_flags &= ~ flag;
1859 
1860 	  switch (flag)
1861 	    {
1862 	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
1863 	      strcat (buf, ", sorted symbol tables");
1864 	      break;
1865 
1866 	    case EF_ARM_DYNSYMSUSESEGIDX:
1867 	      strcat (buf, ", dynamic symbols use segment index");
1868 	      break;
1869 
1870 	    case EF_ARM_MAPSYMSFIRST:
1871 	      strcat (buf, ", mapping symbols precede others");
1872 	      break;
1873 
1874 	    default:
1875 	      unknown = 1;
1876 	      break;
1877 	    }
1878 	}
1879       break;
1880 
1881     case EF_ARM_EABI_VER3:
1882       strcat (buf, ", Version3 EABI");
1883       break;
1884 
1885     case EF_ARM_EABI_VER4:
1886       strcat (buf, ", Version4 EABI");
1887       goto eabi;
1888 
1889     case EF_ARM_EABI_VER5:
1890       strcat (buf, ", Version5 EABI");
1891     eabi:
1892       while (e_flags)
1893 	{
1894 	  unsigned flag;
1895 
1896 	  /* Process flags one bit at a time.  */
1897 	  flag = e_flags & - e_flags;
1898 	  e_flags &= ~ flag;
1899 
1900 	  switch (flag)
1901 	    {
1902 	    case EF_ARM_BE8:
1903 	      strcat (buf, ", BE8");
1904 	      break;
1905 
1906 	    case EF_ARM_LE8:
1907 	      strcat (buf, ", LE8");
1908 	      break;
1909 
1910 	    default:
1911 	      unknown = 1;
1912 	      break;
1913 	    }
1914 	}
1915       break;
1916 
1917     case EF_ARM_EABI_UNKNOWN:
1918       strcat (buf, ", GNU EABI");
1919       while (e_flags)
1920 	{
1921 	  unsigned flag;
1922 
1923 	  /* Process flags one bit at a time.  */
1924 	  flag = e_flags & - e_flags;
1925 	  e_flags &= ~ flag;
1926 
1927 	  switch (flag)
1928 	    {
1929 	    case EF_ARM_INTERWORK:
1930 	      strcat (buf, ", interworking enabled");
1931 	      break;
1932 
1933 	    case EF_ARM_APCS_26:
1934 	      strcat (buf, ", uses APCS/26");
1935 	      break;
1936 
1937 	    case EF_ARM_APCS_FLOAT:
1938 	      strcat (buf, ", uses APCS/float");
1939 	      break;
1940 
1941 	    case EF_ARM_PIC:
1942 	      strcat (buf, ", position independent");
1943 	      break;
1944 
1945 	    case EF_ARM_ALIGN8:
1946 	      strcat (buf, ", 8 bit structure alignment");
1947 	      break;
1948 
1949 	    case EF_ARM_NEW_ABI:
1950 	      strcat (buf, ", uses new ABI");
1951 	      break;
1952 
1953 	    case EF_ARM_OLD_ABI:
1954 	      strcat (buf, ", uses old ABI");
1955 	      break;
1956 
1957 	    case EF_ARM_SOFT_FLOAT:
1958 	      strcat (buf, ", software FP");
1959 	      break;
1960 
1961 	    case EF_ARM_VFP_FLOAT:
1962 	      strcat (buf, ", VFP");
1963 	      break;
1964 
1965 	    case EF_ARM_MAVERICK_FLOAT:
1966 	      strcat (buf, ", Maverick FP");
1967 	      break;
1968 
1969 	    default:
1970 	      unknown = 1;
1971 	      break;
1972 	    }
1973 	}
1974     }
1975 
1976   if (unknown)
1977     strcat (buf,", <unknown>");
1978 }
1979 
1980 static char *
get_machine_flags(unsigned e_flags,unsigned e_machine)1981 get_machine_flags (unsigned e_flags, unsigned e_machine)
1982 {
1983   static char buf[1024];
1984 
1985   buf[0] = '\0';
1986 
1987   if (e_flags)
1988     {
1989       switch (e_machine)
1990 	{
1991 	default:
1992 	  break;
1993 
1994 	case EM_ARM:
1995 	  decode_ARM_machine_flags (e_flags, buf);
1996 	  break;
1997 
1998 	case EM_CYGNUS_FRV:
1999 	  switch (e_flags & EF_FRV_CPU_MASK)
2000 	    {
2001 	    case EF_FRV_CPU_GENERIC:
2002 	      break;
2003 
2004 	    default:
2005 	      strcat (buf, ", fr???");
2006 	      break;
2007 
2008 	    case EF_FRV_CPU_FR300:
2009 	      strcat (buf, ", fr300");
2010 	      break;
2011 
2012 	    case EF_FRV_CPU_FR400:
2013 	      strcat (buf, ", fr400");
2014 	      break;
2015 	    case EF_FRV_CPU_FR405:
2016 	      strcat (buf, ", fr405");
2017 	      break;
2018 
2019 	    case EF_FRV_CPU_FR450:
2020 	      strcat (buf, ", fr450");
2021 	      break;
2022 
2023 	    case EF_FRV_CPU_FR500:
2024 	      strcat (buf, ", fr500");
2025 	      break;
2026 	    case EF_FRV_CPU_FR550:
2027 	      strcat (buf, ", fr550");
2028 	      break;
2029 
2030 	    case EF_FRV_CPU_SIMPLE:
2031 	      strcat (buf, ", simple");
2032 	      break;
2033 	    case EF_FRV_CPU_TOMCAT:
2034 	      strcat (buf, ", tomcat");
2035 	      break;
2036 	    }
2037 	  break;
2038 
2039 	case EM_68K:
2040 	  if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2041 	    strcat (buf, ", m68000");
2042 	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2043 	    strcat (buf, ", cpu32");
2044 	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2045 	    strcat (buf, ", fido_a");
2046 	  else
2047 	    {
2048 	      char const *isa = _("unknown");
2049 	      char const *mac = _("unknown mac");
2050 	      char const *additional = NULL;
2051 
2052 	      switch (e_flags & EF_M68K_CF_ISA_MASK)
2053 		{
2054 		case EF_M68K_CF_ISA_A_NODIV:
2055 		  isa = "A";
2056 		  additional = ", nodiv";
2057 		  break;
2058 		case EF_M68K_CF_ISA_A:
2059 		  isa = "A";
2060 		  break;
2061 		case EF_M68K_CF_ISA_A_PLUS:
2062 		  isa = "A+";
2063 		  break;
2064 		case EF_M68K_CF_ISA_B_NOUSP:
2065 		  isa = "B";
2066 		  additional = ", nousp";
2067 		  break;
2068 		case EF_M68K_CF_ISA_B:
2069 		  isa = "B";
2070 		  break;
2071 		}
2072 	      strcat (buf, ", cf, isa ");
2073 	      strcat (buf, isa);
2074 	      if (additional)
2075 		strcat (buf, additional);
2076 	      if (e_flags & EF_M68K_CF_FLOAT)
2077 		strcat (buf, ", float");
2078 	      switch (e_flags & EF_M68K_CF_MAC_MASK)
2079 		{
2080 		case 0:
2081 		  mac = NULL;
2082 		  break;
2083 		case EF_M68K_CF_MAC:
2084 		  mac = "mac";
2085 		  break;
2086 		case EF_M68K_CF_EMAC:
2087 		  mac = "emac";
2088 		  break;
2089 		}
2090 	      if (mac)
2091 		{
2092 		  strcat (buf, ", ");
2093 		  strcat (buf, mac);
2094 		}
2095 	    }
2096 	  break;
2097 
2098 	case EM_PPC:
2099 	  if (e_flags & EF_PPC_EMB)
2100 	    strcat (buf, ", emb");
2101 
2102 	  if (e_flags & EF_PPC_RELOCATABLE)
2103 	    strcat (buf, ", relocatable");
2104 
2105 	  if (e_flags & EF_PPC_RELOCATABLE_LIB)
2106 	    strcat (buf, ", relocatable-lib");
2107 	  break;
2108 
2109 	case EM_V850:
2110 	case EM_CYGNUS_V850:
2111 	  switch (e_flags & EF_V850_ARCH)
2112 	    {
2113 	    case E_V850E1_ARCH:
2114 	      strcat (buf, ", v850e1");
2115 	      break;
2116 	    case E_V850E_ARCH:
2117 	      strcat (buf, ", v850e");
2118 	      break;
2119 	    case E_V850_ARCH:
2120 	      strcat (buf, ", v850");
2121 	      break;
2122 	    default:
2123 	      strcat (buf, ", unknown v850 architecture variant");
2124 	      break;
2125 	    }
2126 	  break;
2127 
2128 	case EM_M32R:
2129 	case EM_CYGNUS_M32R:
2130 	  if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2131 	    strcat (buf, ", m32r");
2132 	  break;
2133 
2134 	case EM_MIPS:
2135 	case EM_MIPS_RS3_LE:
2136 	  if (e_flags & EF_MIPS_NOREORDER)
2137 	    strcat (buf, ", noreorder");
2138 
2139 	  if (e_flags & EF_MIPS_PIC)
2140 	    strcat (buf, ", pic");
2141 
2142 	  if (e_flags & EF_MIPS_CPIC)
2143 	    strcat (buf, ", cpic");
2144 
2145 	  if (e_flags & EF_MIPS_UCODE)
2146 	    strcat (buf, ", ugen_reserved");
2147 
2148 	  if (e_flags & EF_MIPS_ABI2)
2149 	    strcat (buf, ", abi2");
2150 
2151 	  if (e_flags & EF_MIPS_OPTIONS_FIRST)
2152 	    strcat (buf, ", odk first");
2153 
2154 	  if (e_flags & EF_MIPS_32BITMODE)
2155 	    strcat (buf, ", 32bitmode");
2156 
2157 	  switch ((e_flags & EF_MIPS_MACH))
2158 	    {
2159 	    case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2160 	    case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2161 	    case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2162 	    case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2163 	    case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2164 	    case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2165 	    case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2166 	    case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2167 	    case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
2168 	    case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2169 	    case 0:
2170 	    /* We simply ignore the field in this case to avoid confusion:
2171 	       MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2172 	       extension.  */
2173 	      break;
2174 	    default: strcat (buf, ", unknown CPU"); break;
2175 	    }
2176 
2177 	  switch ((e_flags & EF_MIPS_ABI))
2178 	    {
2179 	    case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2180 	    case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2181 	    case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2182 	    case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2183 	    case 0:
2184 	    /* We simply ignore the field in this case to avoid confusion:
2185 	       MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2186 	       This means it is likely to be an o32 file, but not for
2187 	       sure.  */
2188 	      break;
2189 	    default: strcat (buf, ", unknown ABI"); break;
2190 	    }
2191 
2192 	  if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2193 	    strcat (buf, ", mdmx");
2194 
2195 	  if (e_flags & EF_MIPS_ARCH_ASE_M16)
2196 	    strcat (buf, ", mips16");
2197 
2198 	  switch ((e_flags & EF_MIPS_ARCH))
2199 	    {
2200 	    case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2201 	    case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2202 	    case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2203 	    case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2204 	    case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2205 	    case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2206 	    case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2207 	    case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2208 	    case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2209 	    default: strcat (buf, ", unknown ISA"); break;
2210 	    }
2211 
2212 	  break;
2213 
2214 	case EM_SH:
2215 	  switch ((e_flags & EF_SH_MACH_MASK))
2216 	    {
2217 	    case EF_SH1: strcat (buf, ", sh1"); break;
2218 	    case EF_SH2: strcat (buf, ", sh2"); break;
2219 	    case EF_SH3: strcat (buf, ", sh3"); break;
2220 	    case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2221 	    case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2222 	    case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2223 	    case EF_SH3E: strcat (buf, ", sh3e"); break;
2224 	    case EF_SH4: strcat (buf, ", sh4"); break;
2225 	    case EF_SH5: strcat (buf, ", sh5"); break;
2226 	    case EF_SH2E: strcat (buf, ", sh2e"); break;
2227 	    case EF_SH4A: strcat (buf, ", sh4a"); break;
2228 	    case EF_SH2A: strcat (buf, ", sh2a"); break;
2229 	    case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2230 	    case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2231 	    case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2232 	    case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2233 	    case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2234 	    case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2235 	    case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2236 	    case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2237 	    case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2238 	    default: strcat (buf, ", unknown ISA"); break;
2239 	    }
2240 
2241 	  break;
2242 
2243 	case EM_SPARCV9:
2244 	  if (e_flags & EF_SPARC_32PLUS)
2245 	    strcat (buf, ", v8+");
2246 
2247 	  if (e_flags & EF_SPARC_SUN_US1)
2248 	    strcat (buf, ", ultrasparcI");
2249 
2250 	  if (e_flags & EF_SPARC_SUN_US3)
2251 	    strcat (buf, ", ultrasparcIII");
2252 
2253 	  if (e_flags & EF_SPARC_HAL_R1)
2254 	    strcat (buf, ", halr1");
2255 
2256 	  if (e_flags & EF_SPARC_LEDATA)
2257 	    strcat (buf, ", ledata");
2258 
2259 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2260 	    strcat (buf, ", tso");
2261 
2262 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2263 	    strcat (buf, ", pso");
2264 
2265 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2266 	    strcat (buf, ", rmo");
2267 	  break;
2268 
2269 	case EM_PARISC:
2270 	  switch (e_flags & EF_PARISC_ARCH)
2271 	    {
2272 	    case EFA_PARISC_1_0:
2273 	      strcpy (buf, ", PA-RISC 1.0");
2274 	      break;
2275 	    case EFA_PARISC_1_1:
2276 	      strcpy (buf, ", PA-RISC 1.1");
2277 	      break;
2278 	    case EFA_PARISC_2_0:
2279 	      strcpy (buf, ", PA-RISC 2.0");
2280 	      break;
2281 	    default:
2282 	      break;
2283 	    }
2284 	  if (e_flags & EF_PARISC_TRAPNIL)
2285 	    strcat (buf, ", trapnil");
2286 	  if (e_flags & EF_PARISC_EXT)
2287 	    strcat (buf, ", ext");
2288 	  if (e_flags & EF_PARISC_LSB)
2289 	    strcat (buf, ", lsb");
2290 	  if (e_flags & EF_PARISC_WIDE)
2291 	    strcat (buf, ", wide");
2292 	  if (e_flags & EF_PARISC_NO_KABP)
2293 	    strcat (buf, ", no kabp");
2294 	  if (e_flags & EF_PARISC_LAZYSWAP)
2295 	    strcat (buf, ", lazyswap");
2296 	  break;
2297 
2298 	case EM_PJ:
2299 	case EM_PJ_OLD:
2300 	  if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2301 	    strcat (buf, ", new calling convention");
2302 
2303 	  if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2304 	    strcat (buf, ", gnu calling convention");
2305 	  break;
2306 
2307 	case EM_IA_64:
2308 	  if ((e_flags & EF_IA_64_ABI64))
2309 	    strcat (buf, ", 64-bit");
2310 	  else
2311 	    strcat (buf, ", 32-bit");
2312 	  if ((e_flags & EF_IA_64_REDUCEDFP))
2313 	    strcat (buf, ", reduced fp model");
2314 	  if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2315 	    strcat (buf, ", no function descriptors, constant gp");
2316 	  else if ((e_flags & EF_IA_64_CONS_GP))
2317 	    strcat (buf, ", constant gp");
2318 	  if ((e_flags & EF_IA_64_ABSOLUTE))
2319 	    strcat (buf, ", absolute");
2320 	  break;
2321 
2322 	case EM_VAX:
2323 	  if ((e_flags & EF_VAX_NONPIC))
2324 	    strcat (buf, ", non-PIC");
2325 	  if ((e_flags & EF_VAX_DFLOAT))
2326 	    strcat (buf, ", D-Float");
2327 	  if ((e_flags & EF_VAX_GFLOAT))
2328 	    strcat (buf, ", G-Float");
2329 	  break;
2330 	}
2331     }
2332 
2333   return buf;
2334 }
2335 
2336 static const char *
get_osabi_name(unsigned int osabi)2337 get_osabi_name (unsigned int osabi)
2338 {
2339   static char buff[32];
2340 
2341   switch (osabi)
2342     {
2343     case ELFOSABI_NONE:		return "UNIX - System V";
2344     case ELFOSABI_HPUX:		return "UNIX - HP-UX";
2345     case ELFOSABI_NETBSD:	return "UNIX - NetBSD";
2346     case ELFOSABI_LINUX:	return "UNIX - Linux";
2347     case ELFOSABI_HURD:		return "GNU/Hurd";
2348     case ELFOSABI_SOLARIS:	return "UNIX - Solaris";
2349     case ELFOSABI_AIX:		return "UNIX - AIX";
2350     case ELFOSABI_IRIX:		return "UNIX - IRIX";
2351     case ELFOSABI_FREEBSD:	return "UNIX - FreeBSD";
2352     case ELFOSABI_TRU64:	return "UNIX - TRU64";
2353     case ELFOSABI_MODESTO:	return "Novell - Modesto";
2354     case ELFOSABI_OPENBSD:	return "UNIX - OpenBSD";
2355     case ELFOSABI_OPENVMS:	return "VMS - OpenVMS";
2356     case ELFOSABI_NSK:		return "HP - Non-Stop Kernel";
2357     case ELFOSABI_AROS:		return "Amiga Research OS";
2358     case ELFOSABI_STANDALONE:	return _("Standalone App");
2359     case ELFOSABI_ARM:		return "ARM";
2360     default:
2361       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2362       return buff;
2363     }
2364 }
2365 
2366 static const char *
get_arm_segment_type(unsigned long type)2367 get_arm_segment_type (unsigned long type)
2368 {
2369   switch (type)
2370     {
2371     case PT_ARM_EXIDX:
2372       return "EXIDX";
2373     default:
2374       break;
2375     }
2376 
2377   return NULL;
2378 }
2379 
2380 static const char *
get_mips_segment_type(unsigned long type)2381 get_mips_segment_type (unsigned long type)
2382 {
2383   switch (type)
2384     {
2385     case PT_MIPS_REGINFO:
2386       return "REGINFO";
2387     case PT_MIPS_RTPROC:
2388       return "RTPROC";
2389     case PT_MIPS_OPTIONS:
2390       return "OPTIONS";
2391     default:
2392       break;
2393     }
2394 
2395   return NULL;
2396 }
2397 
2398 static const char *
get_parisc_segment_type(unsigned long type)2399 get_parisc_segment_type (unsigned long type)
2400 {
2401   switch (type)
2402     {
2403     case PT_HP_TLS:		return "HP_TLS";
2404     case PT_HP_CORE_NONE:	return "HP_CORE_NONE";
2405     case PT_HP_CORE_VERSION:	return "HP_CORE_VERSION";
2406     case PT_HP_CORE_KERNEL:	return "HP_CORE_KERNEL";
2407     case PT_HP_CORE_COMM:	return "HP_CORE_COMM";
2408     case PT_HP_CORE_PROC:	return "HP_CORE_PROC";
2409     case PT_HP_CORE_LOADABLE:	return "HP_CORE_LOADABLE";
2410     case PT_HP_CORE_STACK:	return "HP_CORE_STACK";
2411     case PT_HP_CORE_SHM:	return "HP_CORE_SHM";
2412     case PT_HP_CORE_MMF:	return "HP_CORE_MMF";
2413     case PT_HP_PARALLEL:	return "HP_PARALLEL";
2414     case PT_HP_FASTBIND:	return "HP_FASTBIND";
2415     case PT_HP_OPT_ANNOT:	return "HP_OPT_ANNOT";
2416     case PT_HP_HSL_ANNOT:	return "HP_HSL_ANNOT";
2417     case PT_HP_STACK:		return "HP_STACK";
2418     case PT_HP_CORE_UTSNAME:	return "HP_CORE_UTSNAME";
2419     case PT_PARISC_ARCHEXT:	return "PARISC_ARCHEXT";
2420     case PT_PARISC_UNWIND:	return "PARISC_UNWIND";
2421     case PT_PARISC_WEAKORDER:	return "PARISC_WEAKORDER";
2422     default:
2423       break;
2424     }
2425 
2426   return NULL;
2427 }
2428 
2429 static const char *
get_ia64_segment_type(unsigned long type)2430 get_ia64_segment_type (unsigned long type)
2431 {
2432   switch (type)
2433     {
2434     case PT_IA_64_ARCHEXT:	return "IA_64_ARCHEXT";
2435     case PT_IA_64_UNWIND:	return "IA_64_UNWIND";
2436     case PT_HP_TLS:		return "HP_TLS";
2437     case PT_IA_64_HP_OPT_ANOT:	return "HP_OPT_ANNOT";
2438     case PT_IA_64_HP_HSL_ANOT:	return "HP_HSL_ANNOT";
2439     case PT_IA_64_HP_STACK:	return "HP_STACK";
2440     default:
2441       break;
2442     }
2443 
2444   return NULL;
2445 }
2446 
2447 static const char *
get_segment_type(unsigned long p_type)2448 get_segment_type (unsigned long p_type)
2449 {
2450   static char buff[32];
2451 
2452   switch (p_type)
2453     {
2454     case PT_NULL:	return "NULL";
2455     case PT_LOAD:	return "LOAD";
2456     case PT_DYNAMIC:	return "DYNAMIC";
2457     case PT_INTERP:	return "INTERP";
2458     case PT_NOTE:	return "NOTE";
2459     case PT_SHLIB:	return "SHLIB";
2460     case PT_PHDR:	return "PHDR";
2461     case PT_TLS:	return "TLS";
2462 
2463     case PT_GNU_EH_FRAME:
2464 			return "GNU_EH_FRAME";
2465     case PT_GNU_STACK:	return "GNU_STACK";
2466     case PT_GNU_RELRO:  return "GNU_RELRO";
2467 
2468     default:
2469       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2470 	{
2471 	  const char *result;
2472 
2473 	  switch (elf_header.e_machine)
2474 	    {
2475 	    case EM_ARM:
2476 	      result = get_arm_segment_type (p_type);
2477 	      break;
2478 	    case EM_MIPS:
2479 	    case EM_MIPS_RS3_LE:
2480 	      result = get_mips_segment_type (p_type);
2481 	      break;
2482 	    case EM_PARISC:
2483 	      result = get_parisc_segment_type (p_type);
2484 	      break;
2485 	    case EM_IA_64:
2486 	      result = get_ia64_segment_type (p_type);
2487 	      break;
2488 	    default:
2489 	      result = NULL;
2490 	      break;
2491 	    }
2492 
2493 	  if (result != NULL)
2494 	    return result;
2495 
2496 	  sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2497 	}
2498       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2499 	{
2500 	  const char *result;
2501 
2502 	  switch (elf_header.e_machine)
2503 	    {
2504 	    case EM_PARISC:
2505 	      result = get_parisc_segment_type (p_type);
2506 	      break;
2507 	    case EM_IA_64:
2508 	      result = get_ia64_segment_type (p_type);
2509 	      break;
2510 	    default:
2511 	      result = NULL;
2512 	      break;
2513 	    }
2514 
2515 	  if (result != NULL)
2516 	    return result;
2517 
2518 	  sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2519 	}
2520       else
2521 	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2522 
2523       return buff;
2524     }
2525 }
2526 
2527 static const char *
get_mips_section_type_name(unsigned int sh_type)2528 get_mips_section_type_name (unsigned int sh_type)
2529 {
2530   switch (sh_type)
2531     {
2532     case SHT_MIPS_LIBLIST:	 return "MIPS_LIBLIST";
2533     case SHT_MIPS_MSYM:		 return "MIPS_MSYM";
2534     case SHT_MIPS_CONFLICT:	 return "MIPS_CONFLICT";
2535     case SHT_MIPS_GPTAB:	 return "MIPS_GPTAB";
2536     case SHT_MIPS_UCODE:	 return "MIPS_UCODE";
2537     case SHT_MIPS_DEBUG:	 return "MIPS_DEBUG";
2538     case SHT_MIPS_REGINFO:	 return "MIPS_REGINFO";
2539     case SHT_MIPS_PACKAGE:	 return "MIPS_PACKAGE";
2540     case SHT_MIPS_PACKSYM:	 return "MIPS_PACKSYM";
2541     case SHT_MIPS_RELD:		 return "MIPS_RELD";
2542     case SHT_MIPS_IFACE:	 return "MIPS_IFACE";
2543     case SHT_MIPS_CONTENT:	 return "MIPS_CONTENT";
2544     case SHT_MIPS_OPTIONS:	 return "MIPS_OPTIONS";
2545     case SHT_MIPS_SHDR:		 return "MIPS_SHDR";
2546     case SHT_MIPS_FDESC:	 return "MIPS_FDESC";
2547     case SHT_MIPS_EXTSYM:	 return "MIPS_EXTSYM";
2548     case SHT_MIPS_DENSE:	 return "MIPS_DENSE";
2549     case SHT_MIPS_PDESC:	 return "MIPS_PDESC";
2550     case SHT_MIPS_LOCSYM:	 return "MIPS_LOCSYM";
2551     case SHT_MIPS_AUXSYM:	 return "MIPS_AUXSYM";
2552     case SHT_MIPS_OPTSYM:	 return "MIPS_OPTSYM";
2553     case SHT_MIPS_LOCSTR:	 return "MIPS_LOCSTR";
2554     case SHT_MIPS_LINE:		 return "MIPS_LINE";
2555     case SHT_MIPS_RFDESC:	 return "MIPS_RFDESC";
2556     case SHT_MIPS_DELTASYM:	 return "MIPS_DELTASYM";
2557     case SHT_MIPS_DELTAINST:	 return "MIPS_DELTAINST";
2558     case SHT_MIPS_DELTACLASS:	 return "MIPS_DELTACLASS";
2559     case SHT_MIPS_DWARF:	 return "MIPS_DWARF";
2560     case SHT_MIPS_DELTADECL:	 return "MIPS_DELTADECL";
2561     case SHT_MIPS_SYMBOL_LIB:	 return "MIPS_SYMBOL_LIB";
2562     case SHT_MIPS_EVENTS:	 return "MIPS_EVENTS";
2563     case SHT_MIPS_TRANSLATE:	 return "MIPS_TRANSLATE";
2564     case SHT_MIPS_PIXIE:	 return "MIPS_PIXIE";
2565     case SHT_MIPS_XLATE:	 return "MIPS_XLATE";
2566     case SHT_MIPS_XLATE_DEBUG:	 return "MIPS_XLATE_DEBUG";
2567     case SHT_MIPS_WHIRL:	 return "MIPS_WHIRL";
2568     case SHT_MIPS_EH_REGION:	 return "MIPS_EH_REGION";
2569     case SHT_MIPS_XLATE_OLD:	 return "MIPS_XLATE_OLD";
2570     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2571     default:
2572       break;
2573     }
2574   return NULL;
2575 }
2576 
2577 static const char *
get_parisc_section_type_name(unsigned int sh_type)2578 get_parisc_section_type_name (unsigned int sh_type)
2579 {
2580   switch (sh_type)
2581     {
2582     case SHT_PARISC_EXT:	return "PARISC_EXT";
2583     case SHT_PARISC_UNWIND:	return "PARISC_UNWIND";
2584     case SHT_PARISC_DOC:	return "PARISC_DOC";
2585     case SHT_PARISC_ANNOT:	return "PARISC_ANNOT";
2586     case SHT_PARISC_SYMEXTN:	return "PARISC_SYMEXTN";
2587     case SHT_PARISC_STUBS:	return "PARISC_STUBS";
2588     case SHT_PARISC_DLKM:	return "PARISC_DLKM";
2589     default:
2590       break;
2591     }
2592   return NULL;
2593 }
2594 
2595 static const char *
get_ia64_section_type_name(unsigned int sh_type)2596 get_ia64_section_type_name (unsigned int sh_type)
2597 {
2598   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
2599   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2600     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2601 
2602   switch (sh_type)
2603     {
2604     case SHT_IA_64_EXT:		  return "IA_64_EXT";
2605     case SHT_IA_64_UNWIND:	  return "IA_64_UNWIND";
2606     case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2607     default:
2608       break;
2609     }
2610   return NULL;
2611 }
2612 
2613 static const char *
get_x86_64_section_type_name(unsigned int sh_type)2614 get_x86_64_section_type_name (unsigned int sh_type)
2615 {
2616   switch (sh_type)
2617     {
2618     case SHT_X86_64_UNWIND:	return "X86_64_UNWIND";
2619     default:
2620       break;
2621     }
2622   return NULL;
2623 }
2624 
2625 static const char *
get_arm_section_type_name(unsigned int sh_type)2626 get_arm_section_type_name (unsigned int sh_type)
2627 {
2628   switch (sh_type)
2629     {
2630     case SHT_ARM_EXIDX:
2631       return "ARM_EXIDX";
2632     case SHT_ARM_PREEMPTMAP:
2633       return "ARM_PREEMPTMAP";
2634     case SHT_ARM_ATTRIBUTES:
2635       return "ARM_ATTRIBUTES";
2636     default:
2637       break;
2638     }
2639   return NULL;
2640 }
2641 
2642 static const char *
get_section_type_name(unsigned int sh_type)2643 get_section_type_name (unsigned int sh_type)
2644 {
2645   static char buff[32];
2646 
2647   switch (sh_type)
2648     {
2649     case SHT_NULL:		return "NULL";
2650     case SHT_PROGBITS:		return "PROGBITS";
2651     case SHT_SYMTAB:		return "SYMTAB";
2652     case SHT_STRTAB:		return "STRTAB";
2653     case SHT_RELA:		return "RELA";
2654     case SHT_HASH:		return "HASH";
2655     case SHT_DYNAMIC:		return "DYNAMIC";
2656     case SHT_NOTE:		return "NOTE";
2657     case SHT_NOBITS:		return "NOBITS";
2658     case SHT_REL:		return "REL";
2659     case SHT_SHLIB:		return "SHLIB";
2660     case SHT_DYNSYM:		return "DYNSYM";
2661     case SHT_INIT_ARRAY:	return "INIT_ARRAY";
2662     case SHT_FINI_ARRAY:	return "FINI_ARRAY";
2663     case SHT_PREINIT_ARRAY:	return "PREINIT_ARRAY";
2664     case SHT_GNU_HASH:		return "GNU_HASH";
2665     case SHT_GROUP:		return "GROUP";
2666     case SHT_SYMTAB_SHNDX:	return "SYMTAB SECTION INDICIES";
2667     case SHT_GNU_verdef:	return "VERDEF";
2668     case SHT_GNU_verneed:	return "VERNEED";
2669     case SHT_GNU_versym:	return "VERSYM";
2670     case 0x6ffffff0:		return "VERSYM";
2671     case 0x6ffffffc:		return "VERDEF";
2672     case 0x7ffffffd:		return "AUXILIARY";
2673     case 0x7fffffff:		return "FILTER";
2674     case SHT_GNU_LIBLIST:	return "GNU_LIBLIST";
2675 
2676     default:
2677       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2678 	{
2679 	  const char *result;
2680 
2681 	  switch (elf_header.e_machine)
2682 	    {
2683 	    case EM_MIPS:
2684 	    case EM_MIPS_RS3_LE:
2685 	      result = get_mips_section_type_name (sh_type);
2686 	      break;
2687 	    case EM_PARISC:
2688 	      result = get_parisc_section_type_name (sh_type);
2689 	      break;
2690 	    case EM_IA_64:
2691 	      result = get_ia64_section_type_name (sh_type);
2692 	      break;
2693 	    case EM_X86_64:
2694 	      result = get_x86_64_section_type_name (sh_type);
2695 	      break;
2696 	    case EM_ARM:
2697 	      result = get_arm_section_type_name (sh_type);
2698 	      break;
2699 	    default:
2700 	      result = NULL;
2701 	      break;
2702 	    }
2703 
2704 	  if (result != NULL)
2705 	    return result;
2706 
2707 	  sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2708 	}
2709       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2710 	sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2711       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2712 	sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2713       else
2714 	snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
2715 
2716       return buff;
2717     }
2718 }
2719 
2720 #define OPTION_DEBUG_DUMP	512
2721 
2722 static struct option options[] =
2723 {
2724   {"all",	       no_argument, 0, 'a'},
2725   {"file-header",      no_argument, 0, 'h'},
2726   {"program-headers",  no_argument, 0, 'l'},
2727   {"headers",	       no_argument, 0, 'e'},
2728   {"histogram",	       no_argument, 0, 'I'},
2729   {"segments",	       no_argument, 0, 'l'},
2730   {"sections",	       no_argument, 0, 'S'},
2731   {"section-headers",  no_argument, 0, 'S'},
2732   {"section-groups",   no_argument, 0, 'g'},
2733   {"section-details",  no_argument, 0, 't'},
2734   {"full-section-name",no_argument, 0, 'N'},
2735   {"symbols",	       no_argument, 0, 's'},
2736   {"syms",	       no_argument, 0, 's'},
2737   {"relocs",	       no_argument, 0, 'r'},
2738   {"notes",	       no_argument, 0, 'n'},
2739   {"dynamic",	       no_argument, 0, 'd'},
2740   {"arch-specific",    no_argument, 0, 'A'},
2741   {"version-info",     no_argument, 0, 'V'},
2742   {"use-dynamic",      no_argument, 0, 'D'},
2743   {"hex-dump",	       required_argument, 0, 'x'},
2744   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
2745   {"unwind",	       no_argument, 0, 'u'},
2746 #ifdef SUPPORT_DISASSEMBLY
2747   {"instruction-dump", required_argument, 0, 'i'},
2748 #endif
2749 
2750   {"version",	       no_argument, 0, 'v'},
2751   {"wide",	       no_argument, 0, 'W'},
2752   {"help",	       no_argument, 0, 'H'},
2753   {0,		       no_argument, 0, 0}
2754 };
2755 
2756 static void
usage(FILE * stream)2757 usage (FILE *stream)
2758 {
2759   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
2760   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
2761   fprintf (stream, _(" Options are:\n\
2762   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2763   -h --file-header       Display the ELF file header\n\
2764   -l --program-headers   Display the program headers\n\
2765      --segments          An alias for --program-headers\n\
2766   -S --section-headers   Display the sections' header\n\
2767      --sections          An alias for --section-headers\n\
2768   -g --section-groups    Display the section groups\n\
2769   -t --section-details   Display the section details\n\
2770   -e --headers           Equivalent to: -h -l -S\n\
2771   -s --syms              Display the symbol table\n\
2772       --symbols          An alias for --syms\n\
2773   -n --notes             Display the core notes (if present)\n\
2774   -r --relocs            Display the relocations (if present)\n\
2775   -u --unwind            Display the unwind info (if present)\n\
2776   -d --dynamic           Display the dynamic section (if present)\n\
2777   -V --version-info      Display the version sections (if present)\n\
2778   -A --arch-specific     Display architecture specific information (if any).\n\
2779   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
2780   -x --hex-dump=<number> Dump the contents of section <number>\n\
2781   -w[liaprmfFsoR] or\n\
2782   --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2783                          Display the contents of DWARF2 debug sections\n"));
2784 #ifdef SUPPORT_DISASSEMBLY
2785   fprintf (stream, _("\
2786   -i --instruction-dump=<number>\n\
2787                          Disassemble the contents of section <number>\n"));
2788 #endif
2789   fprintf (stream, _("\
2790   -I --histogram         Display histogram of bucket list lengths\n\
2791   -W --wide              Allow output width to exceed 80 characters\n\
2792   @<file>                Read options from <file>\n\
2793   -H --help              Display this information\n\
2794   -v --version           Display the version number of readelf\n"));
2795 
2796   if (REPORT_BUGS_TO[0] && stream == stdout)
2797     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2798 
2799   exit (stream == stdout ? 0 : 1);
2800 }
2801 
2802 /* Record the fact that the user wants the contents of section number
2803    SECTION to be displayed using the method(s) encoded as flags bits
2804    in TYPE.  Note, TYPE can be zero if we are creating the array for
2805    the first time.  */
2806 
2807 static void
request_dump(unsigned int section,int type)2808 request_dump (unsigned int section, int type)
2809 {
2810   if (section >= num_dump_sects)
2811     {
2812       char *new_dump_sects;
2813 
2814       new_dump_sects = calloc (section + 1, 1);
2815 
2816       if (new_dump_sects == NULL)
2817 	error (_("Out of memory allocating dump request table.\n"));
2818       else
2819 	{
2820 	  /* Copy current flag settings.  */
2821 	  memcpy (new_dump_sects, dump_sects, num_dump_sects);
2822 
2823 	  free (dump_sects);
2824 
2825 	  dump_sects = new_dump_sects;
2826 	  num_dump_sects = section + 1;
2827 	}
2828     }
2829 
2830   if (dump_sects)
2831     dump_sects[section] |= type;
2832 
2833   return;
2834 }
2835 
2836 /* Request a dump by section name.  */
2837 
2838 static void
request_dump_byname(const char * section,int type)2839 request_dump_byname (const char *section, int type)
2840 {
2841   struct dump_list_entry *new_request;
2842 
2843   new_request = malloc (sizeof (struct dump_list_entry));
2844   if (!new_request)
2845     error (_("Out of memory allocating dump request table.\n"));
2846 
2847   new_request->name = strdup (section);
2848   if (!new_request->name)
2849     error (_("Out of memory allocating dump request table.\n"));
2850 
2851   new_request->type = type;
2852 
2853   new_request->next = dump_sects_byname;
2854   dump_sects_byname = new_request;
2855 }
2856 
2857 static void
parse_args(int argc,char ** argv)2858 parse_args (int argc, char **argv)
2859 {
2860   int c;
2861 
2862   if (argc < 2)
2863     usage (stderr);
2864 
2865   while ((c = getopt_long
2866 	  (argc, argv, "ersuahnldSDAINtgw::x:i:vVWH", options, NULL)) != EOF)
2867     {
2868       char *cp;
2869       int section;
2870 
2871       switch (c)
2872 	{
2873 	case 0:
2874 	  /* Long options.  */
2875 	  break;
2876 	case 'H':
2877 	  usage (stdout);
2878 	  break;
2879 
2880 	case 'a':
2881 	  do_syms++;
2882 	  do_reloc++;
2883 	  do_unwind++;
2884 	  do_dynamic++;
2885 	  do_header++;
2886 	  do_sections++;
2887 	  do_section_groups++;
2888 	  do_segments++;
2889 	  do_version++;
2890 	  do_histogram++;
2891 	  do_arch++;
2892 	  do_notes++;
2893 	  break;
2894 	case 'g':
2895 	  do_section_groups++;
2896 	  break;
2897 	case 't':
2898 	case 'N':
2899 	  do_sections++;
2900 	  do_section_details++;
2901 	  break;
2902 	case 'e':
2903 	  do_header++;
2904 	  do_sections++;
2905 	  do_segments++;
2906 	  break;
2907 	case 'A':
2908 	  do_arch++;
2909 	  break;
2910 	case 'D':
2911 	  do_using_dynamic++;
2912 	  break;
2913 	case 'r':
2914 	  do_reloc++;
2915 	  break;
2916 	case 'u':
2917 	  do_unwind++;
2918 	  break;
2919 	case 'h':
2920 	  do_header++;
2921 	  break;
2922 	case 'l':
2923 	  do_segments++;
2924 	  break;
2925 	case 's':
2926 	  do_syms++;
2927 	  break;
2928 	case 'S':
2929 	  do_sections++;
2930 	  break;
2931 	case 'd':
2932 	  do_dynamic++;
2933 	  break;
2934 	case 'I':
2935 	  do_histogram++;
2936 	  break;
2937 	case 'n':
2938 	  do_notes++;
2939 	  break;
2940 	case 'x':
2941 	  do_dump++;
2942 	  section = strtoul (optarg, & cp, 0);
2943 	  if (! *cp && section >= 0)
2944 	    request_dump (section, HEX_DUMP);
2945 	  else
2946 	    request_dump_byname (optarg, HEX_DUMP);
2947 	  break;
2948 	case 'w':
2949 	  do_dump++;
2950 	  if (optarg == 0)
2951 	    do_debugging = 1;
2952 	  else
2953 	    {
2954 	      unsigned int index = 0;
2955 
2956 	      do_debugging = 0;
2957 
2958 	      while (optarg[index])
2959 		switch (optarg[index++])
2960 		  {
2961 		  case 'i':
2962 		  case 'I':
2963 		    do_debug_info = 1;
2964 		    break;
2965 
2966 		  case 'a':
2967 		  case 'A':
2968 		    do_debug_abbrevs = 1;
2969 		    break;
2970 
2971 		  case 'l':
2972 		  case 'L':
2973 		    do_debug_lines = 1;
2974 		    break;
2975 
2976 		  case 'p':
2977 		  case 'P':
2978 		    do_debug_pubnames = 1;
2979 		    break;
2980 
2981 		  case 'r':
2982 		    do_debug_aranges = 1;
2983 		    break;
2984 
2985 		  case 'R':
2986 		    do_debug_ranges = 1;
2987 		    break;
2988 
2989 		  case 'F':
2990 		    do_debug_frames_interp = 1;
2991 		  case 'f':
2992 		    do_debug_frames = 1;
2993 		    break;
2994 
2995 		  case 'm':
2996 		  case 'M':
2997 		    do_debug_macinfo = 1;
2998 		    break;
2999 
3000 		  case 's':
3001 		  case 'S':
3002 		    do_debug_str = 1;
3003 		    break;
3004 
3005 		  case 'o':
3006 		  case 'O':
3007 		    do_debug_loc = 1;
3008 		    break;
3009 
3010 		  default:
3011 		    warn (_("Unrecognized debug option '%s'\n"), optarg);
3012 		    break;
3013 		  }
3014 	    }
3015 	  break;
3016 	case OPTION_DEBUG_DUMP:
3017 	  do_dump++;
3018 	  if (optarg == 0)
3019 	    do_debugging = 1;
3020 	  else
3021 	    {
3022 	      typedef struct
3023 	      {
3024 		const char * option;
3025 		int *        variable;
3026 	      }
3027 	      debug_dump_long_opts;
3028 
3029 	      debug_dump_long_opts opts_table [] =
3030 		{
3031 		  /* Please keep this table alpha- sorted.  */
3032 		  { "Ranges", & do_debug_ranges },
3033 		  { "abbrev", & do_debug_abbrevs },
3034 		  { "aranges", & do_debug_aranges },
3035 		  { "frames", & do_debug_frames },
3036 		  { "frames-interp", & do_debug_frames_interp },
3037 		  { "info", & do_debug_info },
3038 		  { "line", & do_debug_lines },
3039 		  { "loc",  & do_debug_loc },
3040 		  { "macro", & do_debug_macinfo },
3041 		  { "pubnames", & do_debug_pubnames },
3042 		  /* This entry is for compatability
3043 		     with earlier versions of readelf.  */
3044 		  { "ranges", & do_debug_aranges },
3045 		  { "str", & do_debug_str },
3046 		  { NULL, NULL }
3047 		};
3048 
3049 	      const char *p;
3050 
3051 	      do_debugging = 0;
3052 
3053 	      p = optarg;
3054 	      while (*p)
3055 		{
3056 		  debug_dump_long_opts * entry;
3057 
3058 		  for (entry = opts_table; entry->option; entry++)
3059 		    {
3060 		      size_t len = strlen (entry->option);
3061 
3062 		      if (strneq (p, entry->option, len)
3063 			  && (p[len] == ',' || p[len] == '\0'))
3064 			{
3065 			  * entry->variable = 1;
3066 
3067 			  /* The --debug-dump=frames-interp option also
3068 			     enables the --debug-dump=frames option.  */
3069 			  if (do_debug_frames_interp)
3070 			    do_debug_frames = 1;
3071 
3072 			  p += len;
3073 			  break;
3074 			}
3075 		    }
3076 
3077 		  if (entry->option == NULL)
3078 		    {
3079 		      warn (_("Unrecognized debug option '%s'\n"), p);
3080 		      p = strchr (p, ',');
3081 		      if (p == NULL)
3082 			break;
3083 		    }
3084 
3085 		  if (*p == ',')
3086 		    p++;
3087 		}
3088 	    }
3089 	  break;
3090 #ifdef SUPPORT_DISASSEMBLY
3091 	case 'i':
3092 	  do_dump++;
3093 	  section = strtoul (optarg, & cp, 0);
3094 	  if (! *cp && section >= 0)
3095 	    {
3096 	      request_dump (section, DISASS_DUMP);
3097 	      break;
3098 	    }
3099 	  goto oops;
3100 #endif
3101 	case 'v':
3102 	  print_version (program_name);
3103 	  break;
3104 	case 'V':
3105 	  do_version++;
3106 	  break;
3107 	case 'W':
3108 	  do_wide++;
3109 	  break;
3110 	default:
3111 #ifdef SUPPORT_DISASSEMBLY
3112 	oops:
3113 #endif
3114 	  /* xgettext:c-format */
3115 	  error (_("Invalid option '-%c'\n"), c);
3116 	  /* Drop through.  */
3117 	case '?':
3118 	  usage (stderr);
3119 	}
3120     }
3121 
3122   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3123       && !do_segments && !do_header && !do_dump && !do_version
3124       && !do_histogram && !do_debugging && !do_arch && !do_notes
3125       && !do_section_groups)
3126     usage (stderr);
3127   else if (argc < 3)
3128     {
3129       warn (_("Nothing to do.\n"));
3130       usage (stderr);
3131     }
3132 }
3133 
3134 static const char *
get_elf_class(unsigned int elf_class)3135 get_elf_class (unsigned int elf_class)
3136 {
3137   static char buff[32];
3138 
3139   switch (elf_class)
3140     {
3141     case ELFCLASSNONE: return _("none");
3142     case ELFCLASS32:   return "ELF32";
3143     case ELFCLASS64:   return "ELF64";
3144     default:
3145       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3146       return buff;
3147     }
3148 }
3149 
3150 static const char *
get_data_encoding(unsigned int encoding)3151 get_data_encoding (unsigned int encoding)
3152 {
3153   static char buff[32];
3154 
3155   switch (encoding)
3156     {
3157     case ELFDATANONE: return _("none");
3158     case ELFDATA2LSB: return _("2's complement, little endian");
3159     case ELFDATA2MSB: return _("2's complement, big endian");
3160     default:
3161       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3162       return buff;
3163     }
3164 }
3165 
3166 /* Decode the data held in 'elf_header'.  */
3167 
3168 static int
process_file_header(void)3169 process_file_header (void)
3170 {
3171   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
3172       || elf_header.e_ident[EI_MAG1] != ELFMAG1
3173       || elf_header.e_ident[EI_MAG2] != ELFMAG2
3174       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3175     {
3176       error
3177 	(_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3178       return 0;
3179     }
3180 
3181   if (do_header)
3182     {
3183       int i;
3184 
3185       printf (_("ELF Header:\n"));
3186       printf (_("  Magic:   "));
3187       for (i = 0; i < EI_NIDENT; i++)
3188 	printf ("%2.2x ", elf_header.e_ident[i]);
3189       printf ("\n");
3190       printf (_("  Class:                             %s\n"),
3191 	      get_elf_class (elf_header.e_ident[EI_CLASS]));
3192       printf (_("  Data:                              %s\n"),
3193 	      get_data_encoding (elf_header.e_ident[EI_DATA]));
3194       printf (_("  Version:                           %d %s\n"),
3195 	      elf_header.e_ident[EI_VERSION],
3196 	      (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3197 	       ? "(current)"
3198 	       : (elf_header.e_ident[EI_VERSION] != EV_NONE
3199 		  ? "<unknown: %lx>"
3200 		  : "")));
3201       printf (_("  OS/ABI:                            %s\n"),
3202 	      get_osabi_name (elf_header.e_ident[EI_OSABI]));
3203       printf (_("  ABI Version:                       %d\n"),
3204 	      elf_header.e_ident[EI_ABIVERSION]);
3205       printf (_("  Type:                              %s\n"),
3206 	      get_file_type (elf_header.e_type));
3207       printf (_("  Machine:                           %s\n"),
3208 	      get_machine_name (elf_header.e_machine));
3209       printf (_("  Version:                           0x%lx\n"),
3210 	      (unsigned long) elf_header.e_version);
3211 
3212       printf (_("  Entry point address:               "));
3213       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3214       printf (_("\n  Start of program headers:          "));
3215       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3216       printf (_(" (bytes into file)\n  Start of section headers:          "));
3217       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3218       printf (_(" (bytes into file)\n"));
3219 
3220       printf (_("  Flags:                             0x%lx%s\n"),
3221 	      (unsigned long) elf_header.e_flags,
3222 	      get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3223       printf (_("  Size of this header:               %ld (bytes)\n"),
3224 	      (long) elf_header.e_ehsize);
3225       printf (_("  Size of program headers:           %ld (bytes)\n"),
3226 	      (long) elf_header.e_phentsize);
3227       printf (_("  Number of program headers:         %ld\n"),
3228 	      (long) elf_header.e_phnum);
3229       printf (_("  Size of section headers:           %ld (bytes)\n"),
3230 	      (long) elf_header.e_shentsize);
3231       printf (_("  Number of section headers:         %ld"),
3232 	      (long) elf_header.e_shnum);
3233       if (section_headers != NULL && elf_header.e_shnum == 0)
3234 	printf (" (%ld)", (long) section_headers[0].sh_size);
3235       putc ('\n', stdout);
3236       printf (_("  Section header string table index: %ld"),
3237 	      (long) elf_header.e_shstrndx);
3238       if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
3239 	printf (" (%ld)", (long) section_headers[0].sh_link);
3240       else if (elf_header.e_shstrndx != SHN_UNDEF
3241 	       && (elf_header.e_shstrndx >= elf_header.e_shnum
3242 		   || (elf_header.e_shstrndx >= SHN_LORESERVE
3243 		       && elf_header.e_shstrndx <= SHN_HIRESERVE)))
3244 	printf (" <corrupt: out of range>");
3245       putc ('\n', stdout);
3246     }
3247 
3248   if (section_headers != NULL)
3249     {
3250       if (elf_header.e_shnum == 0)
3251 	elf_header.e_shnum = section_headers[0].sh_size;
3252       if (elf_header.e_shstrndx == SHN_XINDEX)
3253 	elf_header.e_shstrndx = section_headers[0].sh_link;
3254       else if (elf_header.e_shstrndx != SHN_UNDEF
3255 	       && (elf_header.e_shstrndx >= elf_header.e_shnum
3256 		   || (elf_header.e_shstrndx >= SHN_LORESERVE
3257 		       && elf_header.e_shstrndx <= SHN_HIRESERVE)))
3258 	elf_header.e_shstrndx = SHN_UNDEF;
3259       free (section_headers);
3260       section_headers = NULL;
3261     }
3262 
3263   return 1;
3264 }
3265 
3266 
3267 static int
get_32bit_program_headers(FILE * file,Elf_Internal_Phdr * program_headers)3268 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3269 {
3270   Elf32_External_Phdr *phdrs;
3271   Elf32_External_Phdr *external;
3272   Elf_Internal_Phdr *internal;
3273   unsigned int i;
3274 
3275   phdrs = get_data (NULL, file, elf_header.e_phoff,
3276 		    elf_header.e_phentsize, elf_header.e_phnum,
3277 		    _("program headers"));
3278   if (!phdrs)
3279     return 0;
3280 
3281   for (i = 0, internal = program_headers, external = phdrs;
3282        i < elf_header.e_phnum;
3283        i++, internal++, external++)
3284     {
3285       internal->p_type   = BYTE_GET (external->p_type);
3286       internal->p_offset = BYTE_GET (external->p_offset);
3287       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3288       internal->p_paddr  = BYTE_GET (external->p_paddr);
3289       internal->p_filesz = BYTE_GET (external->p_filesz);
3290       internal->p_memsz  = BYTE_GET (external->p_memsz);
3291       internal->p_flags  = BYTE_GET (external->p_flags);
3292       internal->p_align  = BYTE_GET (external->p_align);
3293     }
3294 
3295   free (phdrs);
3296 
3297   return 1;
3298 }
3299 
3300 static int
get_64bit_program_headers(FILE * file,Elf_Internal_Phdr * program_headers)3301 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3302 {
3303   Elf64_External_Phdr *phdrs;
3304   Elf64_External_Phdr *external;
3305   Elf_Internal_Phdr *internal;
3306   unsigned int i;
3307 
3308   phdrs = get_data (NULL, file, elf_header.e_phoff,
3309 		    elf_header.e_phentsize, elf_header.e_phnum,
3310 		    _("program headers"));
3311   if (!phdrs)
3312     return 0;
3313 
3314   for (i = 0, internal = program_headers, external = phdrs;
3315        i < elf_header.e_phnum;
3316        i++, internal++, external++)
3317     {
3318       internal->p_type   = BYTE_GET (external->p_type);
3319       internal->p_flags  = BYTE_GET (external->p_flags);
3320       internal->p_offset = BYTE_GET (external->p_offset);
3321       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
3322       internal->p_paddr  = BYTE_GET (external->p_paddr);
3323       internal->p_filesz = BYTE_GET (external->p_filesz);
3324       internal->p_memsz  = BYTE_GET (external->p_memsz);
3325       internal->p_align  = BYTE_GET (external->p_align);
3326     }
3327 
3328   free (phdrs);
3329 
3330   return 1;
3331 }
3332 
3333 /* Returns 1 if the program headers were read into `program_headers'.  */
3334 
3335 static int
get_program_headers(FILE * file)3336 get_program_headers (FILE *file)
3337 {
3338   Elf_Internal_Phdr *phdrs;
3339 
3340   /* Check cache of prior read.  */
3341   if (program_headers != NULL)
3342     return 1;
3343 
3344   phdrs = cmalloc (elf_header.e_phnum, sizeof (Elf_Internal_Phdr));
3345 
3346   if (phdrs == NULL)
3347     {
3348       error (_("Out of memory\n"));
3349       return 0;
3350     }
3351 
3352   if (is_32bit_elf
3353       ? get_32bit_program_headers (file, phdrs)
3354       : get_64bit_program_headers (file, phdrs))
3355     {
3356       program_headers = phdrs;
3357       return 1;
3358     }
3359 
3360   free (phdrs);
3361   return 0;
3362 }
3363 
3364 /* Returns 1 if the program headers were loaded.  */
3365 
3366 static int
process_program_headers(FILE * file)3367 process_program_headers (FILE *file)
3368 {
3369   Elf_Internal_Phdr *segment;
3370   unsigned int i;
3371 
3372   if (elf_header.e_phnum == 0)
3373     {
3374       if (do_segments)
3375 	printf (_("\nThere are no program headers in this file.\n"));
3376       return 0;
3377     }
3378 
3379   if (do_segments && !do_header)
3380     {
3381       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3382       printf (_("Entry point "));
3383       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3384       printf (_("\nThere are %d program headers, starting at offset "),
3385 	      elf_header.e_phnum);
3386       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3387       printf ("\n");
3388     }
3389 
3390   if (! get_program_headers (file))
3391       return 0;
3392 
3393   if (do_segments)
3394     {
3395       if (elf_header.e_phnum > 1)
3396 	printf (_("\nProgram Headers:\n"));
3397       else
3398 	printf (_("\nProgram Headers:\n"));
3399 
3400       if (is_32bit_elf)
3401 	printf
3402 	  (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
3403       else if (do_wide)
3404 	printf
3405 	  (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
3406       else
3407 	{
3408 	  printf
3409 	    (_("  Type           Offset             VirtAddr           PhysAddr\n"));
3410 	  printf
3411 	    (_("                 FileSiz            MemSiz              Flags  Align\n"));
3412 	}
3413     }
3414 
3415   dynamic_addr = 0;
3416   dynamic_size = 0;
3417 
3418   for (i = 0, segment = program_headers;
3419        i < elf_header.e_phnum;
3420        i++, segment++)
3421     {
3422       if (do_segments)
3423 	{
3424 	  printf ("  %-14.14s ", get_segment_type (segment->p_type));
3425 
3426 	  if (is_32bit_elf)
3427 	    {
3428 	      printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3429 	      printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3430 	      printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3431 	      printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3432 	      printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3433 	      printf ("%c%c%c ",
3434 		      (segment->p_flags & PF_R ? 'R' : ' '),
3435 		      (segment->p_flags & PF_W ? 'W' : ' '),
3436 		      (segment->p_flags & PF_X ? 'E' : ' '));
3437 	      printf ("%#lx", (unsigned long) segment->p_align);
3438 	    }
3439 	  else if (do_wide)
3440 	    {
3441 	      if ((unsigned long) segment->p_offset == segment->p_offset)
3442 		printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3443 	      else
3444 		{
3445 		  print_vma (segment->p_offset, FULL_HEX);
3446 		  putchar (' ');
3447 		}
3448 
3449 	      print_vma (segment->p_vaddr, FULL_HEX);
3450 	      putchar (' ');
3451 	      print_vma (segment->p_paddr, FULL_HEX);
3452 	      putchar (' ');
3453 
3454 	      if ((unsigned long) segment->p_filesz == segment->p_filesz)
3455 		printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3456 	      else
3457 		{
3458 		  print_vma (segment->p_filesz, FULL_HEX);
3459 		  putchar (' ');
3460 		}
3461 
3462 	      if ((unsigned long) segment->p_memsz == segment->p_memsz)
3463 		printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3464 	      else
3465 		{
3466 		  print_vma (segment->p_offset, FULL_HEX);
3467 		}
3468 
3469 	      printf (" %c%c%c ",
3470 		      (segment->p_flags & PF_R ? 'R' : ' '),
3471 		      (segment->p_flags & PF_W ? 'W' : ' '),
3472 		      (segment->p_flags & PF_X ? 'E' : ' '));
3473 
3474 	      if ((unsigned long) segment->p_align == segment->p_align)
3475 		printf ("%#lx", (unsigned long) segment->p_align);
3476 	      else
3477 		{
3478 		  print_vma (segment->p_align, PREFIX_HEX);
3479 		}
3480 	    }
3481 	  else
3482 	    {
3483 	      print_vma (segment->p_offset, FULL_HEX);
3484 	      putchar (' ');
3485 	      print_vma (segment->p_vaddr, FULL_HEX);
3486 	      putchar (' ');
3487 	      print_vma (segment->p_paddr, FULL_HEX);
3488 	      printf ("\n                 ");
3489 	      print_vma (segment->p_filesz, FULL_HEX);
3490 	      putchar (' ');
3491 	      print_vma (segment->p_memsz, FULL_HEX);
3492 	      printf ("  %c%c%c    ",
3493 		      (segment->p_flags & PF_R ? 'R' : ' '),
3494 		      (segment->p_flags & PF_W ? 'W' : ' '),
3495 		      (segment->p_flags & PF_X ? 'E' : ' '));
3496 	      print_vma (segment->p_align, HEX);
3497 	    }
3498 	}
3499 
3500       switch (segment->p_type)
3501 	{
3502 	case PT_DYNAMIC:
3503 	  if (dynamic_addr)
3504 	    error (_("more than one dynamic segment\n"));
3505 
3506 	  /* Try to locate the .dynamic section. If there is
3507 	     a section header table, we can easily locate it.  */
3508 	  if (section_headers != NULL)
3509 	    {
3510 	      Elf_Internal_Shdr *sec;
3511 
3512 	      sec = find_section (".dynamic");
3513 	      if (sec == NULL || sec->sh_size == 0)
3514 		{
3515 		  error (_("no .dynamic section in the dynamic segment\n"));
3516 		  break;
3517 		}
3518 
3519 	      if (sec->sh_type == SHT_NOBITS)
3520 		break;
3521 
3522 	      dynamic_addr = sec->sh_offset;
3523 	      dynamic_size = sec->sh_size;
3524 
3525 	      if (dynamic_addr < segment->p_offset
3526 		  || dynamic_addr > segment->p_offset + segment->p_filesz)
3527 		warn (_("the .dynamic section is not contained within the dynamic segment\n"));
3528 	      else if (dynamic_addr > segment->p_offset)
3529 		warn (_("the .dynamic section is not the first section in the dynamic segment.\n"));
3530 	    }
3531 	  else
3532 	    {
3533 	      /* Otherwise, we can only assume that the .dynamic
3534 		 section is the first section in the DYNAMIC segment.  */
3535 	      dynamic_addr = segment->p_offset;
3536 	      dynamic_size = segment->p_filesz;
3537 	    }
3538 	  break;
3539 
3540 	case PT_INTERP:
3541 	  if (fseek (file, archive_file_offset + (long) segment->p_offset,
3542 		     SEEK_SET))
3543 	    error (_("Unable to find program interpreter name\n"));
3544 	  else
3545 	    {
3546 	      char fmt [32];
3547 	      int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3548 
3549 	      if (ret >= (int) sizeof (fmt) || ret < 0)
3550 		error (_("Internal error: failed to create format string to display program interpreter\n"));
3551 
3552 	      program_interpreter[0] = 0;
3553 	      if (fscanf (file, fmt, program_interpreter) <= 0)
3554 		error (_("Unable to read program interpreter name\n"));
3555 
3556 	      if (do_segments)
3557 		printf (_("\n      [Requesting program interpreter: %s]"),
3558 		    program_interpreter);
3559 	    }
3560 	  break;
3561 	}
3562 
3563       if (do_segments)
3564 	putc ('\n', stdout);
3565     }
3566 
3567   if (do_segments && section_headers != NULL && string_table != NULL)
3568     {
3569       printf (_("\n Section to Segment mapping:\n"));
3570       printf (_("  Segment Sections...\n"));
3571 
3572       for (i = 0; i < elf_header.e_phnum; i++)
3573 	{
3574 	  unsigned int j;
3575 	  Elf_Internal_Shdr *section;
3576 
3577 	  segment = program_headers + i;
3578 	  section = section_headers;
3579 
3580 	  printf ("   %2.2d     ", i);
3581 
3582 	  for (j = 1; j < elf_header.e_shnum; j++, section++)
3583 	    {
3584 	      if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section, segment))
3585 		printf ("%s ", SECTION_NAME (section));
3586 	    }
3587 
3588 	  putc ('\n',stdout);
3589 	}
3590     }
3591 
3592   return 1;
3593 }
3594 
3595 
3596 /* Find the file offset corresponding to VMA by using the program headers.  */
3597 
3598 static long
offset_from_vma(FILE * file,bfd_vma vma,bfd_size_type size)3599 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3600 {
3601   Elf_Internal_Phdr *seg;
3602 
3603   if (! get_program_headers (file))
3604     {
3605       warn (_("Cannot interpret virtual addresses without program headers.\n"));
3606       return (long) vma;
3607     }
3608 
3609   for (seg = program_headers;
3610        seg < program_headers + elf_header.e_phnum;
3611        ++seg)
3612     {
3613       if (seg->p_type != PT_LOAD)
3614 	continue;
3615 
3616       if (vma >= (seg->p_vaddr & -seg->p_align)
3617 	  && vma + size <= seg->p_vaddr + seg->p_filesz)
3618 	return vma - seg->p_vaddr + seg->p_offset;
3619     }
3620 
3621   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3622 	(long) vma);
3623   return (long) vma;
3624 }
3625 
3626 
3627 static int
get_32bit_section_headers(FILE * file,unsigned int num)3628 get_32bit_section_headers (FILE *file, unsigned int num)
3629 {
3630   Elf32_External_Shdr *shdrs;
3631   Elf_Internal_Shdr *internal;
3632   unsigned int i;
3633 
3634   shdrs = get_data (NULL, file, elf_header.e_shoff,
3635 		    elf_header.e_shentsize, num, _("section headers"));
3636   if (!shdrs)
3637     return 0;
3638 
3639   section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3640 
3641   if (section_headers == NULL)
3642     {
3643       error (_("Out of memory\n"));
3644       return 0;
3645     }
3646 
3647   for (i = 0, internal = section_headers;
3648        i < num;
3649        i++, internal++)
3650     {
3651       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
3652       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
3653       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
3654       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
3655       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
3656       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
3657       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
3658       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
3659       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3660       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
3661     }
3662 
3663   free (shdrs);
3664 
3665   return 1;
3666 }
3667 
3668 static int
get_64bit_section_headers(FILE * file,unsigned int num)3669 get_64bit_section_headers (FILE *file, unsigned int num)
3670 {
3671   Elf64_External_Shdr *shdrs;
3672   Elf_Internal_Shdr *internal;
3673   unsigned int i;
3674 
3675   shdrs = get_data (NULL, file, elf_header.e_shoff,
3676 		    elf_header.e_shentsize, num, _("section headers"));
3677   if (!shdrs)
3678     return 0;
3679 
3680   section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3681 
3682   if (section_headers == NULL)
3683     {
3684       error (_("Out of memory\n"));
3685       return 0;
3686     }
3687 
3688   for (i = 0, internal = section_headers;
3689        i < num;
3690        i++, internal++)
3691     {
3692       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
3693       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
3694       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
3695       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
3696       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
3697       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
3698       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
3699       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
3700       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
3701       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3702     }
3703 
3704   free (shdrs);
3705 
3706   return 1;
3707 }
3708 
3709 static Elf_Internal_Sym *
get_32bit_elf_symbols(FILE * file,Elf_Internal_Shdr * section)3710 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3711 {
3712   unsigned long number;
3713   Elf32_External_Sym *esyms;
3714   Elf_External_Sym_Shndx *shndx;
3715   Elf_Internal_Sym *isyms;
3716   Elf_Internal_Sym *psym;
3717   unsigned int j;
3718 
3719   esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3720 		    _("symbols"));
3721   if (!esyms)
3722     return NULL;
3723 
3724   shndx = NULL;
3725   if (symtab_shndx_hdr != NULL
3726       && (symtab_shndx_hdr->sh_link
3727 	  == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3728     {
3729       shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3730 			1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3731       if (!shndx)
3732 	{
3733 	  free (esyms);
3734 	  return NULL;
3735 	}
3736     }
3737 
3738   number = section->sh_size / section->sh_entsize;
3739   isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3740 
3741   if (isyms == NULL)
3742     {
3743       error (_("Out of memory\n"));
3744       if (shndx)
3745 	free (shndx);
3746       free (esyms);
3747       return NULL;
3748     }
3749 
3750   for (j = 0, psym = isyms;
3751        j < number;
3752        j++, psym++)
3753     {
3754       psym->st_name  = BYTE_GET (esyms[j].st_name);
3755       psym->st_value = BYTE_GET (esyms[j].st_value);
3756       psym->st_size  = BYTE_GET (esyms[j].st_size);
3757       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3758       if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3759 	psym->st_shndx
3760 	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3761       psym->st_info  = BYTE_GET (esyms[j].st_info);
3762       psym->st_other = BYTE_GET (esyms[j].st_other);
3763     }
3764 
3765   if (shndx)
3766     free (shndx);
3767   free (esyms);
3768 
3769   return isyms;
3770 }
3771 
3772 static Elf_Internal_Sym *
get_64bit_elf_symbols(FILE * file,Elf_Internal_Shdr * section)3773 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3774 {
3775   unsigned long number;
3776   Elf64_External_Sym *esyms;
3777   Elf_External_Sym_Shndx *shndx;
3778   Elf_Internal_Sym *isyms;
3779   Elf_Internal_Sym *psym;
3780   unsigned int j;
3781 
3782   esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3783 		    _("symbols"));
3784   if (!esyms)
3785     return NULL;
3786 
3787   shndx = NULL;
3788   if (symtab_shndx_hdr != NULL
3789       && (symtab_shndx_hdr->sh_link
3790 	  == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3791     {
3792       shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3793 			1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3794       if (!shndx)
3795 	{
3796 	  free (esyms);
3797 	  return NULL;
3798 	}
3799     }
3800 
3801   number = section->sh_size / section->sh_entsize;
3802   isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3803 
3804   if (isyms == NULL)
3805     {
3806       error (_("Out of memory\n"));
3807       if (shndx)
3808 	free (shndx);
3809       free (esyms);
3810       return NULL;
3811     }
3812 
3813   for (j = 0, psym = isyms;
3814        j < number;
3815        j++, psym++)
3816     {
3817       psym->st_name  = BYTE_GET (esyms[j].st_name);
3818       psym->st_info  = BYTE_GET (esyms[j].st_info);
3819       psym->st_other = BYTE_GET (esyms[j].st_other);
3820       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3821       if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3822 	psym->st_shndx
3823 	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3824       psym->st_value = BYTE_GET (esyms[j].st_value);
3825       psym->st_size  = BYTE_GET (esyms[j].st_size);
3826     }
3827 
3828   if (shndx)
3829     free (shndx);
3830   free (esyms);
3831 
3832   return isyms;
3833 }
3834 
3835 static const char *
get_elf_section_flags(bfd_vma sh_flags)3836 get_elf_section_flags (bfd_vma sh_flags)
3837 {
3838   static char buff[1024];
3839   char *p = buff;
3840   int field_size = is_32bit_elf ? 8 : 16;
3841   int index, size = sizeof (buff) - (field_size + 4 + 1);
3842   bfd_vma os_flags = 0;
3843   bfd_vma proc_flags = 0;
3844   bfd_vma unknown_flags = 0;
3845   const struct
3846     {
3847       const char *str;
3848       int len;
3849     }
3850   flags [] =
3851     {
3852 	{ "WRITE", 5 },
3853 	{ "ALLOC", 5 },
3854 	{ "EXEC", 4 },
3855 	{ "MERGE", 5 },
3856 	{ "STRINGS", 7 },
3857 	{ "INFO LINK", 9 },
3858 	{ "LINK ORDER", 10 },
3859 	{ "OS NONCONF", 10 },
3860 	{ "GROUP", 5 },
3861 	{ "TLS", 3 }
3862     };
3863 
3864   if (do_section_details)
3865     {
3866       sprintf (buff, "[%*.*lx]: ",
3867 	       field_size, field_size, (unsigned long) sh_flags);
3868       p += field_size + 4;
3869     }
3870 
3871   while (sh_flags)
3872     {
3873       bfd_vma flag;
3874 
3875       flag = sh_flags & - sh_flags;
3876       sh_flags &= ~ flag;
3877 
3878       if (do_section_details)
3879 	{
3880 	  switch (flag)
3881 	    {
3882 	    case SHF_WRITE:		index = 0; break;
3883 	    case SHF_ALLOC:		index = 1; break;
3884 	    case SHF_EXECINSTR:		index = 2; break;
3885 	    case SHF_MERGE:		index = 3; break;
3886 	    case SHF_STRINGS:		index = 4; break;
3887 	    case SHF_INFO_LINK:		index = 5; break;
3888 	    case SHF_LINK_ORDER:	index = 6; break;
3889 	    case SHF_OS_NONCONFORMING:	index = 7; break;
3890 	    case SHF_GROUP:		index = 8; break;
3891 	    case SHF_TLS:		index = 9; break;
3892 
3893 	    default:
3894 	      index = -1;
3895 	      break;
3896 	    }
3897 
3898 	  if (index != -1)
3899 	    {
3900 	      if (p != buff + field_size + 4)
3901 		{
3902 		  if (size < (10 + 2))
3903 		    abort ();
3904 		  size -= 2;
3905 		  *p++ = ',';
3906 		  *p++ = ' ';
3907 		}
3908 
3909 	      size -= flags [index].len;
3910 	      p = stpcpy (p, flags [index].str);
3911 	    }
3912 	  else if (flag & SHF_MASKOS)
3913 	    os_flags |= flag;
3914 	  else if (flag & SHF_MASKPROC)
3915 	    proc_flags |= flag;
3916 	  else
3917 	    unknown_flags |= flag;
3918 	}
3919       else
3920 	{
3921 	  switch (flag)
3922 	    {
3923 	    case SHF_WRITE:		*p = 'W'; break;
3924 	    case SHF_ALLOC:		*p = 'A'; break;
3925 	    case SHF_EXECINSTR:		*p = 'X'; break;
3926 	    case SHF_MERGE:		*p = 'M'; break;
3927 	    case SHF_STRINGS:		*p = 'S'; break;
3928 	    case SHF_INFO_LINK:		*p = 'I'; break;
3929 	    case SHF_LINK_ORDER:	*p = 'L'; break;
3930 	    case SHF_OS_NONCONFORMING:	*p = 'O'; break;
3931 	    case SHF_GROUP:		*p = 'G'; break;
3932 	    case SHF_TLS:		*p = 'T'; break;
3933 
3934 	    default:
3935 	      if (elf_header.e_machine == EM_X86_64
3936 		  && flag == SHF_X86_64_LARGE)
3937 		*p = 'l';
3938 	      else if (flag & SHF_MASKOS)
3939 		{
3940 		  *p = 'o';
3941 		  sh_flags &= ~ SHF_MASKOS;
3942 		}
3943 	      else if (flag & SHF_MASKPROC)
3944 		{
3945 		  *p = 'p';
3946 		  sh_flags &= ~ SHF_MASKPROC;
3947 		}
3948 	      else
3949 		*p = 'x';
3950 	      break;
3951 	    }
3952 	  p++;
3953 	}
3954     }
3955 
3956   if (do_section_details)
3957     {
3958       if (os_flags)
3959 	{
3960 	  size -= 5 + field_size;
3961 	  if (p != buff + field_size + 4)
3962 	    {
3963 	      if (size < (2 + 1))
3964 		abort ();
3965 	      size -= 2;
3966 	      *p++ = ',';
3967 	      *p++ = ' ';
3968 	    }
3969 	  sprintf (p, "OS (%*.*lx)", field_size, field_size,
3970 		   (unsigned long) os_flags);
3971 	  p += 5 + field_size;
3972 	}
3973       if (proc_flags)
3974 	{
3975 	  size -= 7 + field_size;
3976 	  if (p != buff + field_size + 4)
3977 	    {
3978 	      if (size < (2 + 1))
3979 		abort ();
3980 	      size -= 2;
3981 	      *p++ = ',';
3982 	      *p++ = ' ';
3983 	    }
3984 	  sprintf (p, "PROC (%*.*lx)", field_size, field_size,
3985 		   (unsigned long) proc_flags);
3986 	  p += 7 + field_size;
3987 	}
3988       if (unknown_flags)
3989 	{
3990 	  size -= 10 + field_size;
3991 	  if (p != buff + field_size + 4)
3992 	    {
3993 	      if (size < (2 + 1))
3994 		abort ();
3995 	      size -= 2;
3996 	      *p++ = ',';
3997 	      *p++ = ' ';
3998 	    }
3999 	  sprintf (p, "UNKNOWN (%*.*lx)", field_size, field_size,
4000 		   (unsigned long) unknown_flags);
4001 	  p += 10 + field_size;
4002 	}
4003     }
4004 
4005   *p = '\0';
4006   return buff;
4007 }
4008 
4009 static int
process_section_headers(FILE * file)4010 process_section_headers (FILE *file)
4011 {
4012   Elf_Internal_Shdr *section;
4013   unsigned int i;
4014 
4015   section_headers = NULL;
4016 
4017   if (elf_header.e_shnum == 0)
4018     {
4019       if (do_sections)
4020 	printf (_("\nThere are no sections in this file.\n"));
4021 
4022       return 1;
4023     }
4024 
4025   if (do_sections && !do_header)
4026     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4027 	    elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4028 
4029   if (is_32bit_elf)
4030     {
4031       if (! get_32bit_section_headers (file, elf_header.e_shnum))
4032 	return 0;
4033     }
4034   else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4035     return 0;
4036 
4037   /* Read in the string table, so that we have names to display.  */
4038   if (elf_header.e_shstrndx != SHN_UNDEF
4039        && SECTION_HEADER_INDEX (elf_header.e_shstrndx) < elf_header.e_shnum)
4040     {
4041       section = SECTION_HEADER (elf_header.e_shstrndx);
4042 
4043       if (section->sh_size != 0)
4044 	{
4045 	  string_table = get_data (NULL, file, section->sh_offset,
4046 				   1, section->sh_size, _("string table"));
4047 
4048 	  string_table_length = string_table != NULL ? section->sh_size : 0;
4049 	}
4050     }
4051 
4052   /* Scan the sections for the dynamic symbol table
4053      and dynamic string table and debug sections.  */
4054   dynamic_symbols = NULL;
4055   dynamic_strings = NULL;
4056   dynamic_syminfo = NULL;
4057   symtab_shndx_hdr = NULL;
4058 
4059   eh_addr_size = is_32bit_elf ? 4 : 8;
4060   switch (elf_header.e_machine)
4061     {
4062     case EM_MIPS:
4063     case EM_MIPS_RS3_LE:
4064       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4065 	 FDE addresses.  However, the ABI also has a semi-official ILP32
4066 	 variant for which the normal FDE address size rules apply.
4067 
4068 	 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4069 	 section, where XX is the size of longs in bits.  Unfortunately,
4070 	 earlier compilers provided no way of distinguishing ILP32 objects
4071 	 from LP64 objects, so if there's any doubt, we should assume that
4072 	 the official LP64 form is being used.  */
4073       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4074 	  && find_section (".gcc_compiled_long32") == NULL)
4075 	eh_addr_size = 8;
4076       break;
4077 
4078     case EM_H8_300:
4079     case EM_H8_300H:
4080       switch (elf_header.e_flags & EF_H8_MACH)
4081 	{
4082 	case E_H8_MACH_H8300:
4083 	case E_H8_MACH_H8300HN:
4084 	case E_H8_MACH_H8300SN:
4085 	case E_H8_MACH_H8300SXN:
4086 	  eh_addr_size = 2;
4087 	  break;
4088 	case E_H8_MACH_H8300H:
4089 	case E_H8_MACH_H8300S:
4090 	case E_H8_MACH_H8300SX:
4091 	  eh_addr_size = 4;
4092 	  break;
4093 	}
4094     }
4095 
4096 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4097   do									    \
4098     {									    \
4099       size_t expected_entsize						    \
4100 	= is_32bit_elf ? size32 : size64;				    \
4101       if (section->sh_entsize != expected_entsize)			    \
4102 	error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4103 	       i, (unsigned long int) section->sh_entsize,		    \
4104 	       (unsigned long int) expected_entsize);			    \
4105       section->sh_entsize = expected_entsize;				    \
4106     }									    \
4107   while (0)
4108 #define CHECK_ENTSIZE(section, i, type) \
4109   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),	    \
4110 			sizeof (Elf64_External_##type))
4111 
4112   for (i = 0, section = section_headers;
4113        i < elf_header.e_shnum;
4114        i++, section++)
4115     {
4116       char *name = SECTION_NAME (section);
4117 
4118       if (section->sh_type == SHT_DYNSYM)
4119 	{
4120 	  if (dynamic_symbols != NULL)
4121 	    {
4122 	      error (_("File contains multiple dynamic symbol tables\n"));
4123 	      continue;
4124 	    }
4125 
4126 	  CHECK_ENTSIZE (section, i, Sym);
4127 	  num_dynamic_syms = section->sh_size / section->sh_entsize;
4128 	  dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4129 	}
4130       else if (section->sh_type == SHT_STRTAB
4131 	       && streq (name, ".dynstr"))
4132 	{
4133 	  if (dynamic_strings != NULL)
4134 	    {
4135 	      error (_("File contains multiple dynamic string tables\n"));
4136 	      continue;
4137 	    }
4138 
4139 	  dynamic_strings = get_data (NULL, file, section->sh_offset,
4140 				      1, section->sh_size, _("dynamic strings"));
4141 	  dynamic_strings_length = section->sh_size;
4142 	}
4143       else if (section->sh_type == SHT_SYMTAB_SHNDX)
4144 	{
4145 	  if (symtab_shndx_hdr != NULL)
4146 	    {
4147 	      error (_("File contains multiple symtab shndx tables\n"));
4148 	      continue;
4149 	    }
4150 	  symtab_shndx_hdr = section;
4151 	}
4152       else if (section->sh_type == SHT_SYMTAB)
4153 	CHECK_ENTSIZE (section, i, Sym);
4154       else if (section->sh_type == SHT_GROUP)
4155 	CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4156       else if (section->sh_type == SHT_REL)
4157 	CHECK_ENTSIZE (section, i, Rel);
4158       else if (section->sh_type == SHT_RELA)
4159 	CHECK_ENTSIZE (section, i, Rela);
4160       else if ((do_debugging || do_debug_info || do_debug_abbrevs
4161 		|| do_debug_lines || do_debug_pubnames || do_debug_aranges
4162 		|| do_debug_frames || do_debug_macinfo || do_debug_str
4163 		|| do_debug_loc || do_debug_ranges)
4164 	       && const_strneq (name, ".debug_"))
4165 	{
4166 	  name += 7;
4167 
4168 	  if (do_debugging
4169 	      || (do_debug_info     && streq (name, "info"))
4170 	      || (do_debug_abbrevs  && streq (name, "abbrev"))
4171 	      || (do_debug_lines    && streq (name, "line"))
4172 	      || (do_debug_pubnames && streq (name, "pubnames"))
4173 	      || (do_debug_aranges  && streq (name, "aranges"))
4174 	      || (do_debug_ranges   && streq (name, "ranges"))
4175 	      || (do_debug_frames   && streq (name, "frame"))
4176 	      || (do_debug_macinfo  && streq (name, "macinfo"))
4177 	      || (do_debug_str      && streq (name, "str"))
4178 	      || (do_debug_loc      && streq (name, "loc"))
4179 	      )
4180 	    request_dump (i, DEBUG_DUMP);
4181 	}
4182       /* linkonce section to be combined with .debug_info at link time.  */
4183       else if ((do_debugging || do_debug_info)
4184 	       && const_strneq (name, ".gnu.linkonce.wi."))
4185 	request_dump (i, DEBUG_DUMP);
4186       else if (do_debug_frames && streq (name, ".eh_frame"))
4187 	request_dump (i, DEBUG_DUMP);
4188     }
4189 
4190   if (! do_sections)
4191     return 1;
4192 
4193   if (elf_header.e_shnum > 1)
4194     printf (_("\nSection Headers:\n"));
4195   else
4196     printf (_("\nSection Header:\n"));
4197 
4198   if (is_32bit_elf)
4199     {
4200       if (do_section_details)
4201 	{
4202 	  printf (_("  [Nr] Name\n"));
4203 	  printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
4204 	}
4205       else
4206 	printf
4207 	  (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
4208     }
4209   else if (do_wide)
4210     {
4211       if (do_section_details)
4212 	{
4213 	  printf (_("  [Nr] Name\n"));
4214 	  printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
4215 	}
4216       else
4217 	printf
4218 	  (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
4219     }
4220   else
4221     {
4222       if (do_section_details)
4223 	{
4224 	  printf (_("  [Nr] Name\n"));
4225 	  printf (_("       Type              Address          Offset            Link\n"));
4226 	  printf (_("       Size              EntSize          Info              Align\n"));
4227 	}
4228       else
4229 	{
4230 	  printf (_("  [Nr] Name              Type             Address           Offset\n"));
4231 	  printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
4232 	}
4233     }
4234 
4235   if (do_section_details)
4236     printf (_("       Flags\n"));
4237 
4238   for (i = 0, section = section_headers;
4239        i < elf_header.e_shnum;
4240        i++, section++)
4241     {
4242       if (do_section_details)
4243 	{
4244 	  printf ("  [%2u] %s\n",
4245 		  SECTION_HEADER_NUM (i),
4246 		  SECTION_NAME (section));
4247 	  if (is_32bit_elf || do_wide)
4248 	    printf ("       %-15.15s ",
4249 		    get_section_type_name (section->sh_type));
4250 	}
4251       else
4252 	printf ("  [%2u] %-17.17s %-15.15s ",
4253 		SECTION_HEADER_NUM (i),
4254 		SECTION_NAME (section),
4255 		get_section_type_name (section->sh_type));
4256 
4257       if (is_32bit_elf)
4258 	{
4259 	  print_vma (section->sh_addr, LONG_HEX);
4260 
4261 	  printf ( " %6.6lx %6.6lx %2.2lx",
4262 		   (unsigned long) section->sh_offset,
4263 		   (unsigned long) section->sh_size,
4264 		   (unsigned long) section->sh_entsize);
4265 
4266 	  if (do_section_details)
4267 	    fputs ("  ", stdout);
4268 	  else
4269 	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
4270 
4271 	  printf ("%2ld %3lu %2ld\n",
4272 		  (unsigned long) section->sh_link,
4273 		  (unsigned long) section->sh_info,
4274 		  (unsigned long) section->sh_addralign);
4275 	}
4276       else if (do_wide)
4277 	{
4278 	  print_vma (section->sh_addr, LONG_HEX);
4279 
4280 	  if ((long) section->sh_offset == section->sh_offset)
4281 	    printf (" %6.6lx", (unsigned long) section->sh_offset);
4282 	  else
4283 	    {
4284 	      putchar (' ');
4285 	      print_vma (section->sh_offset, LONG_HEX);
4286 	    }
4287 
4288 	  if ((unsigned long) section->sh_size == section->sh_size)
4289 	    printf (" %6.6lx", (unsigned long) section->sh_size);
4290 	  else
4291 	    {
4292 	      putchar (' ');
4293 	      print_vma (section->sh_size, LONG_HEX);
4294 	    }
4295 
4296 	  if ((unsigned long) section->sh_entsize == section->sh_entsize)
4297 	    printf (" %2.2lx", (unsigned long) section->sh_entsize);
4298 	  else
4299 	    {
4300 	      putchar (' ');
4301 	      print_vma (section->sh_entsize, LONG_HEX);
4302 	    }
4303 
4304 	  if (do_section_details)
4305 	    fputs ("  ", stdout);
4306 	  else
4307 	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
4308 
4309 	  printf ("%2ld %3lu ",
4310 		  (unsigned long) section->sh_link,
4311 		  (unsigned long) section->sh_info);
4312 
4313 	  if ((unsigned long) section->sh_addralign == section->sh_addralign)
4314 	    printf ("%2ld\n", (unsigned long) section->sh_addralign);
4315 	  else
4316 	    {
4317 	      print_vma (section->sh_addralign, DEC);
4318 	      putchar ('\n');
4319 	    }
4320 	}
4321       else if (do_section_details)
4322 	{
4323 	  printf ("       %-15.15s  ",
4324 		  get_section_type_name (section->sh_type));
4325 	  print_vma (section->sh_addr, LONG_HEX);
4326 	  if ((long) section->sh_offset == section->sh_offset)
4327 	    printf ("  %16.16lx", (unsigned long) section->sh_offset);
4328 	  else
4329 	    {
4330 	      printf ("  ");
4331 	      print_vma (section->sh_offset, LONG_HEX);
4332 	    }
4333 	  printf ("  %ld\n       ", (unsigned long) section->sh_link);
4334 	  print_vma (section->sh_size, LONG_HEX);
4335 	  putchar (' ');
4336 	  print_vma (section->sh_entsize, LONG_HEX);
4337 
4338 	  printf ("  %-16lu  %ld\n",
4339 		  (unsigned long) section->sh_info,
4340 		  (unsigned long) section->sh_addralign);
4341 	}
4342       else
4343 	{
4344 	  putchar (' ');
4345 	  print_vma (section->sh_addr, LONG_HEX);
4346 	  if ((long) section->sh_offset == section->sh_offset)
4347 	    printf ("  %8.8lx", (unsigned long) section->sh_offset);
4348 	  else
4349 	    {
4350 	      printf ("  ");
4351 	      print_vma (section->sh_offset, LONG_HEX);
4352 	    }
4353 	  printf ("\n       ");
4354 	  print_vma (section->sh_size, LONG_HEX);
4355 	  printf ("  ");
4356 	  print_vma (section->sh_entsize, LONG_HEX);
4357 
4358 	  printf (" %3s ", get_elf_section_flags (section->sh_flags));
4359 
4360 	  printf ("     %2ld   %3lu     %ld\n",
4361 		  (unsigned long) section->sh_link,
4362 		  (unsigned long) section->sh_info,
4363 		  (unsigned long) section->sh_addralign);
4364 	}
4365 
4366       if (do_section_details)
4367 	printf ("       %s\n", get_elf_section_flags (section->sh_flags));
4368     }
4369 
4370   if (!do_section_details)
4371     printf (_("Key to Flags:\n\
4372   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4373   I (info), L (link order), G (group), x (unknown)\n\
4374   O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4375 
4376   return 1;
4377 }
4378 
4379 static const char *
get_group_flags(unsigned int flags)4380 get_group_flags (unsigned int flags)
4381 {
4382   static char buff[32];
4383   switch (flags)
4384     {
4385     case GRP_COMDAT:
4386       return "COMDAT";
4387 
4388    default:
4389       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x]"), flags);
4390       break;
4391     }
4392   return buff;
4393 }
4394 
4395 static int
process_section_groups(FILE * file)4396 process_section_groups (FILE *file)
4397 {
4398   Elf_Internal_Shdr *section;
4399   unsigned int i;
4400   struct group *group;
4401   Elf_Internal_Shdr *symtab_sec, *strtab_sec;
4402   Elf_Internal_Sym *symtab;
4403   char *strtab;
4404   size_t strtab_size;
4405 
4406   /* Don't process section groups unless needed.  */
4407   if (!do_unwind && !do_section_groups)
4408     return 1;
4409 
4410   if (elf_header.e_shnum == 0)
4411     {
4412       if (do_section_groups)
4413 	printf (_("\nThere are no sections in this file.\n"));
4414 
4415       return 1;
4416     }
4417 
4418   if (section_headers == NULL)
4419     {
4420       error (_("Section headers are not available!\n"));
4421       abort ();
4422     }
4423 
4424   section_headers_groups = calloc (elf_header.e_shnum,
4425 				   sizeof (struct group *));
4426 
4427   if (section_headers_groups == NULL)
4428     {
4429       error (_("Out of memory\n"));
4430       return 0;
4431     }
4432 
4433   /* Scan the sections for the group section.  */
4434   group_count = 0;
4435   for (i = 0, section = section_headers;
4436        i < elf_header.e_shnum;
4437        i++, section++)
4438     if (section->sh_type == SHT_GROUP)
4439       group_count++;
4440 
4441   if (group_count == 0)
4442     {
4443       if (do_section_groups)
4444 	printf (_("\nThere are no section groups in this file.\n"));
4445 
4446       return 1;
4447     }
4448 
4449   section_groups = calloc (group_count, sizeof (struct group));
4450 
4451   if (section_groups == NULL)
4452     {
4453       error (_("Out of memory\n"));
4454       return 0;
4455     }
4456 
4457   symtab_sec = NULL;
4458   strtab_sec = NULL;
4459   symtab = NULL;
4460   strtab = NULL;
4461   strtab_size = 0;
4462   for (i = 0, section = section_headers, group = section_groups;
4463        i < elf_header.e_shnum;
4464        i++, section++)
4465     {
4466       if (section->sh_type == SHT_GROUP)
4467 	{
4468 	  char *name = SECTION_NAME (section);
4469 	  char *group_name;
4470 	  unsigned char *start, *indices;
4471 	  unsigned int entry, j, size;
4472 	  Elf_Internal_Shdr *sec;
4473 	  Elf_Internal_Sym *sym;
4474 
4475 	  /* Get the symbol table.  */
4476 	  if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum
4477 	      || ((sec = SECTION_HEADER (section->sh_link))->sh_type
4478 		  != SHT_SYMTAB))
4479 	    {
4480 	      error (_("Bad sh_link in group section `%s'\n"), name);
4481 	      continue;
4482 	    }
4483 
4484 	  if (symtab_sec != sec)
4485 	    {
4486 	      symtab_sec = sec;
4487 	      if (symtab)
4488 		free (symtab);
4489 	      symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4490 	    }
4491 
4492 	  sym = symtab + section->sh_info;
4493 
4494 	  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4495 	    {
4496 	      bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
4497 	      if (sec_index == 0)
4498 		{
4499 		  error (_("Bad sh_info in group section `%s'\n"), name);
4500 		  continue;
4501 		}
4502 
4503 	      group_name = SECTION_NAME (section_headers + sec_index);
4504 	      strtab_sec = NULL;
4505 	      if (strtab)
4506 		free (strtab);
4507 	      strtab = NULL;
4508 	      strtab_size = 0;
4509 	    }
4510 	  else
4511 	    {
4512 	      /* Get the string table.  */
4513 	      if (SECTION_HEADER_INDEX (symtab_sec->sh_link)
4514 		  >= elf_header.e_shnum)
4515 		{
4516 		  strtab_sec = NULL;
4517 		  if (strtab)
4518 		    free (strtab);
4519 		  strtab = NULL;
4520 		  strtab_size = 0;
4521 		}
4522 	      else if (strtab_sec
4523 		       != (sec = SECTION_HEADER (symtab_sec->sh_link)))
4524 		{
4525 		  strtab_sec = sec;
4526 		  if (strtab)
4527 		    free (strtab);
4528 		  strtab = get_data (NULL, file, strtab_sec->sh_offset,
4529 				     1, strtab_sec->sh_size,
4530 				     _("string table"));
4531 		  strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
4532 		}
4533 	      group_name = sym->st_name < strtab_size
4534 			   ? strtab + sym->st_name : "<corrupt>";
4535 	    }
4536 
4537 	  start = get_data (NULL, file, section->sh_offset,
4538 			    1, section->sh_size, _("section data"));
4539 
4540 	  indices = start;
4541 	  size = (section->sh_size / section->sh_entsize) - 1;
4542 	  entry = byte_get (indices, 4);
4543 	  indices += 4;
4544 
4545 	  if (do_section_groups)
4546 	    {
4547 	      printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4548 		      get_group_flags (entry), i, name, group_name, size);
4549 
4550 	      printf (_("   [Index]    Name\n"));
4551 	    }
4552 
4553 	  group->group_index = i;
4554 
4555 	  for (j = 0; j < size; j++)
4556 	    {
4557 	      struct group_list *g;
4558 
4559 	      entry = byte_get (indices, 4);
4560 	      indices += 4;
4561 
4562 	      if (SECTION_HEADER_INDEX (entry) >= elf_header.e_shnum)
4563 		{
4564 		  error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4565 			 entry, i, elf_header.e_shnum - 1);
4566 		  continue;
4567 		}
4568 	      else if (entry >= SHN_LORESERVE && entry <= SHN_HIRESERVE)
4569 		{
4570 		  error (_("invalid section [%5u] in group section [%5u]\n"),
4571 			 entry, i);
4572 		  continue;
4573 		}
4574 
4575 	      if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
4576 		  != NULL)
4577 		{
4578 		  if (entry)
4579 		    {
4580 		      error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4581 			     entry, i,
4582 			     section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4583 		      continue;
4584 		    }
4585 		  else
4586 		    {
4587 		      /* Intel C/C++ compiler may put section 0 in a
4588 			 section group. We just warn it the first time
4589 			 and ignore it afterwards.  */
4590 		      static int warned = 0;
4591 		      if (!warned)
4592 			{
4593 			  error (_("section 0 in group section [%5u]\n"),
4594 				 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4595 			  warned++;
4596 			}
4597 		    }
4598 		}
4599 
4600 	      section_headers_groups [SECTION_HEADER_INDEX (entry)]
4601 		= group;
4602 
4603 	      if (do_section_groups)
4604 		{
4605 		  sec = SECTION_HEADER (entry);
4606 		  printf ("   [%5u]   %s\n", entry, SECTION_NAME (sec));
4607 		}
4608 
4609 	      g = xmalloc (sizeof (struct group_list));
4610 	      g->section_index = entry;
4611 	      g->next = group->root;
4612 	      group->root = g;
4613 	    }
4614 
4615 	  if (start)
4616 	    free (start);
4617 
4618 	  group++;
4619 	}
4620     }
4621 
4622   if (symtab)
4623     free (symtab);
4624   if (strtab)
4625     free (strtab);
4626   return 1;
4627 }
4628 
4629 static struct
4630 {
4631   const char *name;
4632   int reloc;
4633   int size;
4634   int rela;
4635 } dynamic_relocations [] =
4636 {
4637     { "REL", DT_REL, DT_RELSZ, FALSE },
4638     { "RELA", DT_RELA, DT_RELASZ, TRUE },
4639     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4640 };
4641 
4642 /* Process the reloc section.  */
4643 
4644 static int
process_relocs(FILE * file)4645 process_relocs (FILE *file)
4646 {
4647   unsigned long rel_size;
4648   unsigned long rel_offset;
4649 
4650 
4651   if (!do_reloc)
4652     return 1;
4653 
4654   if (do_using_dynamic)
4655     {
4656       int is_rela;
4657       const char *name;
4658       int has_dynamic_reloc;
4659       unsigned int i;
4660 
4661       has_dynamic_reloc = 0;
4662 
4663       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4664 	{
4665 	  is_rela = dynamic_relocations [i].rela;
4666 	  name = dynamic_relocations [i].name;
4667 	  rel_size = dynamic_info [dynamic_relocations [i].size];
4668 	  rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4669 
4670 	  has_dynamic_reloc |= rel_size;
4671 
4672 	  if (is_rela == UNKNOWN)
4673 	    {
4674 	      if (dynamic_relocations [i].reloc == DT_JMPREL)
4675 		switch (dynamic_info[DT_PLTREL])
4676 		  {
4677 		  case DT_REL:
4678 		    is_rela = FALSE;
4679 		    break;
4680 		  case DT_RELA:
4681 		    is_rela = TRUE;
4682 		    break;
4683 		  }
4684 	    }
4685 
4686 	  if (rel_size)
4687 	    {
4688 	      printf
4689 		(_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4690 		 name, rel_offset, rel_size);
4691 
4692 	      dump_relocations (file,
4693 				offset_from_vma (file, rel_offset, rel_size),
4694 				rel_size,
4695 				dynamic_symbols, num_dynamic_syms,
4696 				dynamic_strings, dynamic_strings_length, is_rela);
4697 	    }
4698 	}
4699 
4700       if (! has_dynamic_reloc)
4701 	printf (_("\nThere are no dynamic relocations in this file.\n"));
4702     }
4703   else
4704     {
4705       Elf_Internal_Shdr *section;
4706       unsigned long i;
4707       int found = 0;
4708 
4709       for (i = 0, section = section_headers;
4710 	   i < elf_header.e_shnum;
4711 	   i++, section++)
4712 	{
4713 	  if (   section->sh_type != SHT_RELA
4714 	      && section->sh_type != SHT_REL)
4715 	    continue;
4716 
4717 	  rel_offset = section->sh_offset;
4718 	  rel_size   = section->sh_size;
4719 
4720 	  if (rel_size)
4721 	    {
4722 	      Elf_Internal_Shdr *strsec;
4723 	      int is_rela;
4724 
4725 	      printf (_("\nRelocation section "));
4726 
4727 	      if (string_table == NULL)
4728 		printf ("%d", section->sh_name);
4729 	      else
4730 		printf (_("'%s'"), SECTION_NAME (section));
4731 
4732 	      printf (_(" at offset 0x%lx contains %lu entries:\n"),
4733 		 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4734 
4735 	      is_rela = section->sh_type == SHT_RELA;
4736 
4737 	      if (section->sh_link
4738 		  && SECTION_HEADER_INDEX (section->sh_link)
4739 		     < elf_header.e_shnum)
4740 		{
4741 		  Elf_Internal_Shdr *symsec;
4742 		  Elf_Internal_Sym *symtab;
4743 		  unsigned long nsyms;
4744 		  unsigned long strtablen = 0;
4745 		  char *strtab = NULL;
4746 
4747 		  symsec = SECTION_HEADER (section->sh_link);
4748 		  if (symsec->sh_type != SHT_SYMTAB
4749 		      && symsec->sh_type != SHT_DYNSYM)
4750                     continue;
4751 
4752 		  nsyms = symsec->sh_size / symsec->sh_entsize;
4753 		  symtab = GET_ELF_SYMBOLS (file, symsec);
4754 
4755 		  if (symtab == NULL)
4756 		    continue;
4757 
4758 		  if (SECTION_HEADER_INDEX (symsec->sh_link)
4759 		      < elf_header.e_shnum)
4760 		    {
4761 		      strsec = SECTION_HEADER (symsec->sh_link);
4762 
4763 		      strtab = get_data (NULL, file, strsec->sh_offset,
4764 					 1, strsec->sh_size,
4765 					 _("string table"));
4766 		      strtablen = strtab == NULL ? 0 : strsec->sh_size;
4767 		    }
4768 
4769 		  dump_relocations (file, rel_offset, rel_size,
4770 				    symtab, nsyms, strtab, strtablen, is_rela);
4771 		  if (strtab)
4772 		    free (strtab);
4773 		  free (symtab);
4774 		}
4775 	      else
4776 		dump_relocations (file, rel_offset, rel_size,
4777 				  NULL, 0, NULL, 0, is_rela);
4778 
4779 	      found = 1;
4780 	    }
4781 	}
4782 
4783       if (! found)
4784 	printf (_("\nThere are no relocations in this file.\n"));
4785     }
4786 
4787   return 1;
4788 }
4789 
4790 /* Process the unwind section.  */
4791 
4792 #include "unwind-ia64.h"
4793 
4794 /* An absolute address consists of a section and an offset.  If the
4795    section is NULL, the offset itself is the address, otherwise, the
4796    address equals to LOAD_ADDRESS(section) + offset.  */
4797 
4798 struct absaddr
4799   {
4800     unsigned short section;
4801     bfd_vma offset;
4802   };
4803 
4804 #define ABSADDR(a) \
4805   ((a).section \
4806    ? section_headers [(a).section].sh_addr + (a).offset \
4807    : (a).offset)
4808 
4809 struct ia64_unw_aux_info
4810   {
4811     struct ia64_unw_table_entry
4812       {
4813 	struct absaddr start;
4814 	struct absaddr end;
4815 	struct absaddr info;
4816       }
4817     *table;			/* Unwind table.  */
4818     unsigned long table_len;	/* Length of unwind table.  */
4819     unsigned char *info;	/* Unwind info.  */
4820     unsigned long info_size;	/* Size of unwind info.  */
4821     bfd_vma info_addr;		/* starting address of unwind info.  */
4822     bfd_vma seg_base;		/* Starting address of segment.  */
4823     Elf_Internal_Sym *symtab;	/* The symbol table.  */
4824     unsigned long nsyms;	/* Number of symbols.  */
4825     char *strtab;		/* The string table.  */
4826     unsigned long strtab_size;	/* Size of string table.  */
4827   };
4828 
4829 static void
find_symbol_for_address(Elf_Internal_Sym * symtab,unsigned long nsyms,const char * strtab,unsigned long strtab_size,struct absaddr addr,const char ** symname,bfd_vma * offset)4830 find_symbol_for_address (Elf_Internal_Sym *symtab,
4831 			 unsigned long nsyms,
4832 			 const char *strtab,
4833 			 unsigned long strtab_size,
4834 			 struct absaddr addr,
4835 			 const char **symname,
4836 			 bfd_vma *offset)
4837 {
4838   bfd_vma dist = 0x100000;
4839   Elf_Internal_Sym *sym, *best = NULL;
4840   unsigned long i;
4841 
4842   for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4843     {
4844       if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4845 	  && sym->st_name != 0
4846 	  && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4847 	  && addr.offset >= sym->st_value
4848 	  && addr.offset - sym->st_value < dist)
4849 	{
4850 	  best = sym;
4851 	  dist = addr.offset - sym->st_value;
4852 	  if (!dist)
4853 	    break;
4854 	}
4855     }
4856   if (best)
4857     {
4858       *symname = (best->st_name >= strtab_size
4859 		  ? "<corrupt>" : strtab + best->st_name);
4860       *offset = dist;
4861       return;
4862     }
4863   *symname = NULL;
4864   *offset = addr.offset;
4865 }
4866 
4867 static void
dump_ia64_unwind(struct ia64_unw_aux_info * aux)4868 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4869 {
4870   struct ia64_unw_table_entry *tp;
4871   int in_body;
4872 
4873   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4874     {
4875       bfd_vma stamp;
4876       bfd_vma offset;
4877       const unsigned char *dp;
4878       const unsigned char *head;
4879       const char *procname;
4880 
4881       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4882 			       aux->strtab_size, tp->start, &procname, &offset);
4883 
4884       fputs ("\n<", stdout);
4885 
4886       if (procname)
4887 	{
4888 	  fputs (procname, stdout);
4889 
4890 	  if (offset)
4891 	    printf ("+%lx", (unsigned long) offset);
4892 	}
4893 
4894       fputs (">: [", stdout);
4895       print_vma (tp->start.offset, PREFIX_HEX);
4896       fputc ('-', stdout);
4897       print_vma (tp->end.offset, PREFIX_HEX);
4898       printf ("], info at +0x%lx\n",
4899 	      (unsigned long) (tp->info.offset - aux->seg_base));
4900 
4901       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
4902       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4903 
4904       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4905 	      (unsigned) UNW_VER (stamp),
4906 	      (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4907 	      UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4908 	      UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4909 	      (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4910 
4911       if (UNW_VER (stamp) != 1)
4912 	{
4913 	  printf ("\tUnknown version.\n");
4914 	  continue;
4915 	}
4916 
4917       in_body = 0;
4918       for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
4919 	dp = unw_decode (dp, in_body, & in_body);
4920     }
4921 }
4922 
4923 static int
slurp_ia64_unwind_table(FILE * file,struct ia64_unw_aux_info * aux,Elf_Internal_Shdr * sec)4924 slurp_ia64_unwind_table (FILE *file,
4925 			 struct ia64_unw_aux_info *aux,
4926 			 Elf_Internal_Shdr *sec)
4927 {
4928   unsigned long size, nrelas, i;
4929   Elf_Internal_Phdr *seg;
4930   struct ia64_unw_table_entry *tep;
4931   Elf_Internal_Shdr *relsec;
4932   Elf_Internal_Rela *rela, *rp;
4933   unsigned char *table, *tp;
4934   Elf_Internal_Sym *sym;
4935   const char *relname;
4936 
4937   /* First, find the starting address of the segment that includes
4938      this section: */
4939 
4940   if (elf_header.e_phnum)
4941     {
4942       if (! get_program_headers (file))
4943 	  return 0;
4944 
4945       for (seg = program_headers;
4946 	   seg < program_headers + elf_header.e_phnum;
4947 	   ++seg)
4948 	{
4949 	  if (seg->p_type != PT_LOAD)
4950 	    continue;
4951 
4952 	  if (sec->sh_addr >= seg->p_vaddr
4953 	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4954 	    {
4955 	      aux->seg_base = seg->p_vaddr;
4956 	      break;
4957 	    }
4958 	}
4959     }
4960 
4961   /* Second, build the unwind table from the contents of the unwind section:  */
4962   size = sec->sh_size;
4963   table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
4964   if (!table)
4965     return 0;
4966 
4967   aux->table = xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
4968   tep = aux->table;
4969   for (tp = table; tp < table + size; tp += 3 * eh_addr_size, ++tep)
4970     {
4971       tep->start.section = SHN_UNDEF;
4972       tep->end.section   = SHN_UNDEF;
4973       tep->info.section  = SHN_UNDEF;
4974       if (is_32bit_elf)
4975 	{
4976 	  tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4977 	  tep->end.offset   = byte_get ((unsigned char *) tp + 4, 4);
4978 	  tep->info.offset  = byte_get ((unsigned char *) tp + 8, 4);
4979 	}
4980       else
4981 	{
4982 	  tep->start.offset = BYTE_GET ((unsigned char *) tp +  0);
4983 	  tep->end.offset   = BYTE_GET ((unsigned char *) tp +  8);
4984 	  tep->info.offset  = BYTE_GET ((unsigned char *) tp + 16);
4985 	}
4986       tep->start.offset += aux->seg_base;
4987       tep->end.offset   += aux->seg_base;
4988       tep->info.offset  += aux->seg_base;
4989     }
4990   free (table);
4991 
4992   /* Third, apply any relocations to the unwind table: */
4993 
4994   for (relsec = section_headers;
4995        relsec < section_headers + elf_header.e_shnum;
4996        ++relsec)
4997     {
4998       if (relsec->sh_type != SHT_RELA
4999 	  || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
5000 	  || SECTION_HEADER (relsec->sh_info) != sec)
5001 	continue;
5002 
5003       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5004 			      & rela, & nrelas))
5005 	return 0;
5006 
5007       for (rp = rela; rp < rela + nrelas; ++rp)
5008 	{
5009 	  if (is_32bit_elf)
5010 	    {
5011 	      relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
5012 	      sym = aux->symtab + ELF32_R_SYM (rp->r_info);
5013 	    }
5014 	  else
5015 	    {
5016 	      relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
5017 	      sym = aux->symtab + ELF64_R_SYM (rp->r_info);
5018 	    }
5019 
5020 	  if (! const_strneq (relname, "R_IA64_SEGREL"))
5021 	    {
5022 	      warn (_("Skipping unexpected relocation type %s\n"), relname);
5023 	      continue;
5024 	    }
5025 
5026 	  i = rp->r_offset / (3 * eh_addr_size);
5027 
5028 	  switch (rp->r_offset/eh_addr_size % 3)
5029 	    {
5030 	    case 0:
5031 	      aux->table[i].start.section = sym->st_shndx;
5032 	      aux->table[i].start.offset += rp->r_addend + sym->st_value;
5033 	      break;
5034 	    case 1:
5035 	      aux->table[i].end.section   = sym->st_shndx;
5036 	      aux->table[i].end.offset   += rp->r_addend + sym->st_value;
5037 	      break;
5038 	    case 2:
5039 	      aux->table[i].info.section  = sym->st_shndx;
5040 	      aux->table[i].info.offset  += rp->r_addend + sym->st_value;
5041 	      break;
5042 	    default:
5043 	      break;
5044 	    }
5045 	}
5046 
5047       free (rela);
5048     }
5049 
5050   aux->table_len = size / (3 * eh_addr_size);
5051   return 1;
5052 }
5053 
5054 static int
ia64_process_unwind(FILE * file)5055 ia64_process_unwind (FILE *file)
5056 {
5057   Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
5058   unsigned long i, unwcount = 0, unwstart = 0;
5059   struct ia64_unw_aux_info aux;
5060 
5061   memset (& aux, 0, sizeof (aux));
5062 
5063   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5064     {
5065       if (sec->sh_type == SHT_SYMTAB
5066 	  && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
5067 	{
5068 	  aux.nsyms = sec->sh_size / sec->sh_entsize;
5069 	  aux.symtab = GET_ELF_SYMBOLS (file, sec);
5070 
5071 	  strsec = SECTION_HEADER (sec->sh_link);
5072 	  aux.strtab = get_data (NULL, file, strsec->sh_offset,
5073 				 1, strsec->sh_size, _("string table"));
5074 	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5075 	}
5076       else if (sec->sh_type == SHT_IA_64_UNWIND)
5077 	unwcount++;
5078     }
5079 
5080   if (!unwcount)
5081     printf (_("\nThere are no unwind sections in this file.\n"));
5082 
5083   while (unwcount-- > 0)
5084     {
5085       char *suffix;
5086       size_t len, len2;
5087 
5088       for (i = unwstart, sec = section_headers + unwstart;
5089 	   i < elf_header.e_shnum; ++i, ++sec)
5090 	if (sec->sh_type == SHT_IA_64_UNWIND)
5091 	  {
5092 	    unwsec = sec;
5093 	    break;
5094 	  }
5095 
5096       unwstart = i + 1;
5097       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5098 
5099       if ((unwsec->sh_flags & SHF_GROUP) != 0)
5100 	{
5101 	  /* We need to find which section group it is in.  */
5102 	  struct group_list *g = section_headers_groups [i]->root;
5103 
5104 	  for (; g != NULL; g = g->next)
5105 	    {
5106 	      sec = SECTION_HEADER (g->section_index);
5107 
5108 	      if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5109 		break;
5110 	    }
5111 
5112 	  if (g == NULL)
5113 	    i = elf_header.e_shnum;
5114 	}
5115       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5116 	{
5117 	  /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
5118 	  len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5119 	  suffix = SECTION_NAME (unwsec) + len;
5120 	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5121 	       ++i, ++sec)
5122 	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5123 		&& streq (SECTION_NAME (sec) + len2, suffix))
5124 	      break;
5125 	}
5126       else
5127 	{
5128 	  /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5129 	     .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
5130 	  len = sizeof (ELF_STRING_ia64_unwind) - 1;
5131 	  len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5132 	  suffix = "";
5133 	  if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5134 	    suffix = SECTION_NAME (unwsec) + len;
5135 	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5136 	       ++i, ++sec)
5137 	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5138 		&& streq (SECTION_NAME (sec) + len2, suffix))
5139 	      break;
5140 	}
5141 
5142       if (i == elf_header.e_shnum)
5143 	{
5144 	  printf (_("\nCould not find unwind info section for "));
5145 
5146 	  if (string_table == NULL)
5147 	    printf ("%d", unwsec->sh_name);
5148 	  else
5149 	    printf (_("'%s'"), SECTION_NAME (unwsec));
5150 	}
5151       else
5152 	{
5153 	  aux.info_size = sec->sh_size;
5154 	  aux.info_addr = sec->sh_addr;
5155 	  aux.info = get_data (NULL, file, sec->sh_offset, 1, aux.info_size,
5156 			       _("unwind info"));
5157 
5158 	  printf (_("\nUnwind section "));
5159 
5160 	  if (string_table == NULL)
5161 	    printf ("%d", unwsec->sh_name);
5162 	  else
5163 	    printf (_("'%s'"), SECTION_NAME (unwsec));
5164 
5165 	  printf (_(" at offset 0x%lx contains %lu entries:\n"),
5166 		  (unsigned long) unwsec->sh_offset,
5167 		  (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5168 
5169 	  (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5170 
5171 	  if (aux.table_len > 0)
5172 	    dump_ia64_unwind (& aux);
5173 
5174 	  if (aux.table)
5175 	    free ((char *) aux.table);
5176 	  if (aux.info)
5177 	    free ((char *) aux.info);
5178 	  aux.table = NULL;
5179 	  aux.info = NULL;
5180 	}
5181     }
5182 
5183   if (aux.symtab)
5184     free (aux.symtab);
5185   if (aux.strtab)
5186     free ((char *) aux.strtab);
5187 
5188   return 1;
5189 }
5190 
5191 struct hppa_unw_aux_info
5192   {
5193     struct hppa_unw_table_entry
5194       {
5195 	struct absaddr start;
5196 	struct absaddr end;
5197 	unsigned int Cannot_unwind:1;			/* 0 */
5198 	unsigned int Millicode:1;			/* 1 */
5199 	unsigned int Millicode_save_sr0:1;		/* 2 */
5200 	unsigned int Region_description:2;		/* 3..4 */
5201 	unsigned int reserved1:1;			/* 5 */
5202 	unsigned int Entry_SR:1;			/* 6 */
5203 	unsigned int Entry_FR:4;     /* number saved */	/* 7..10 */
5204 	unsigned int Entry_GR:5;     /* number saved */	/* 11..15 */
5205 	unsigned int Args_stored:1;			/* 16 */
5206 	unsigned int Variable_Frame:1;			/* 17 */
5207 	unsigned int Separate_Package_Body:1;		/* 18 */
5208 	unsigned int Frame_Extension_Millicode:1;	/* 19 */
5209 	unsigned int Stack_Overflow_Check:1;		/* 20 */
5210 	unsigned int Two_Instruction_SP_Increment:1;	/* 21 */
5211 	unsigned int Ada_Region:1;			/* 22 */
5212 	unsigned int cxx_info:1;			/* 23 */
5213 	unsigned int cxx_try_catch:1;			/* 24 */
5214 	unsigned int sched_entry_seq:1;			/* 25 */
5215 	unsigned int reserved2:1;			/* 26 */
5216 	unsigned int Save_SP:1;				/* 27 */
5217 	unsigned int Save_RP:1;				/* 28 */
5218 	unsigned int Save_MRP_in_frame:1;		/* 29 */
5219 	unsigned int extn_ptr_defined:1;		/* 30 */
5220 	unsigned int Cleanup_defined:1;			/* 31 */
5221 
5222 	unsigned int MPE_XL_interrupt_marker:1;		/* 0 */
5223 	unsigned int HP_UX_interrupt_marker:1;		/* 1 */
5224 	unsigned int Large_frame:1;			/* 2 */
5225 	unsigned int Pseudo_SP_Set:1;			/* 3 */
5226 	unsigned int reserved4:1;			/* 4 */
5227 	unsigned int Total_frame_size:27;		/* 5..31 */
5228       }
5229     *table;			/* Unwind table.  */
5230     unsigned long table_len;	/* Length of unwind table.  */
5231     bfd_vma seg_base;		/* Starting address of segment.  */
5232     Elf_Internal_Sym *symtab;	/* The symbol table.  */
5233     unsigned long nsyms;	/* Number of symbols.  */
5234     char *strtab;		/* The string table.  */
5235     unsigned long strtab_size;	/* Size of string table.  */
5236   };
5237 
5238 static void
dump_hppa_unwind(struct hppa_unw_aux_info * aux)5239 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
5240 {
5241   struct hppa_unw_table_entry *tp;
5242 
5243   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5244     {
5245       bfd_vma offset;
5246       const char *procname;
5247 
5248       find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5249 			       aux->strtab_size, tp->start, &procname,
5250 			       &offset);
5251 
5252       fputs ("\n<", stdout);
5253 
5254       if (procname)
5255 	{
5256 	  fputs (procname, stdout);
5257 
5258 	  if (offset)
5259 	    printf ("+%lx", (unsigned long) offset);
5260 	}
5261 
5262       fputs (">: [", stdout);
5263       print_vma (tp->start.offset, PREFIX_HEX);
5264       fputc ('-', stdout);
5265       print_vma (tp->end.offset, PREFIX_HEX);
5266       printf ("]\n\t");
5267 
5268 #define PF(_m) if (tp->_m) printf (#_m " ");
5269 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5270       PF(Cannot_unwind);
5271       PF(Millicode);
5272       PF(Millicode_save_sr0);
5273       /* PV(Region_description);  */
5274       PF(Entry_SR);
5275       PV(Entry_FR);
5276       PV(Entry_GR);
5277       PF(Args_stored);
5278       PF(Variable_Frame);
5279       PF(Separate_Package_Body);
5280       PF(Frame_Extension_Millicode);
5281       PF(Stack_Overflow_Check);
5282       PF(Two_Instruction_SP_Increment);
5283       PF(Ada_Region);
5284       PF(cxx_info);
5285       PF(cxx_try_catch);
5286       PF(sched_entry_seq);
5287       PF(Save_SP);
5288       PF(Save_RP);
5289       PF(Save_MRP_in_frame);
5290       PF(extn_ptr_defined);
5291       PF(Cleanup_defined);
5292       PF(MPE_XL_interrupt_marker);
5293       PF(HP_UX_interrupt_marker);
5294       PF(Large_frame);
5295       PF(Pseudo_SP_Set);
5296       PV(Total_frame_size);
5297 #undef PF
5298 #undef PV
5299     }
5300 
5301   printf ("\n");
5302 }
5303 
5304 static int
slurp_hppa_unwind_table(FILE * file,struct hppa_unw_aux_info * aux,Elf_Internal_Shdr * sec)5305 slurp_hppa_unwind_table (FILE *file,
5306 			 struct hppa_unw_aux_info *aux,
5307 			 Elf_Internal_Shdr *sec)
5308 {
5309   unsigned long size, unw_ent_size, nentries, nrelas, i;
5310   Elf_Internal_Phdr *seg;
5311   struct hppa_unw_table_entry *tep;
5312   Elf_Internal_Shdr *relsec;
5313   Elf_Internal_Rela *rela, *rp;
5314   unsigned char *table, *tp;
5315   Elf_Internal_Sym *sym;
5316   const char *relname;
5317 
5318   /* First, find the starting address of the segment that includes
5319      this section.  */
5320 
5321   if (elf_header.e_phnum)
5322     {
5323       if (! get_program_headers (file))
5324 	return 0;
5325 
5326       for (seg = program_headers;
5327 	   seg < program_headers + elf_header.e_phnum;
5328 	   ++seg)
5329 	{
5330 	  if (seg->p_type != PT_LOAD)
5331 	    continue;
5332 
5333 	  if (sec->sh_addr >= seg->p_vaddr
5334 	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5335 	    {
5336 	      aux->seg_base = seg->p_vaddr;
5337 	      break;
5338 	    }
5339 	}
5340     }
5341 
5342   /* Second, build the unwind table from the contents of the unwind
5343      section.  */
5344   size = sec->sh_size;
5345   table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
5346   if (!table)
5347     return 0;
5348 
5349   unw_ent_size = 16;
5350   nentries = size / unw_ent_size;
5351   size = unw_ent_size * nentries;
5352 
5353   tep = aux->table = xcmalloc (nentries, sizeof (aux->table[0]));
5354 
5355   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
5356     {
5357       unsigned int tmp1, tmp2;
5358 
5359       tep->start.section = SHN_UNDEF;
5360       tep->end.section   = SHN_UNDEF;
5361 
5362       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
5363       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
5364       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
5365       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
5366 
5367       tep->start.offset += aux->seg_base;
5368       tep->end.offset   += aux->seg_base;
5369 
5370       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
5371       tep->Millicode = (tmp1 >> 30) & 0x1;
5372       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
5373       tep->Region_description = (tmp1 >> 27) & 0x3;
5374       tep->reserved1 = (tmp1 >> 26) & 0x1;
5375       tep->Entry_SR = (tmp1 >> 25) & 0x1;
5376       tep->Entry_FR = (tmp1 >> 21) & 0xf;
5377       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
5378       tep->Args_stored = (tmp1 >> 15) & 0x1;
5379       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
5380       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
5381       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
5382       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
5383       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
5384       tep->Ada_Region = (tmp1 >> 9) & 0x1;
5385       tep->cxx_info = (tmp1 >> 8) & 0x1;
5386       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
5387       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
5388       tep->reserved2 = (tmp1 >> 5) & 0x1;
5389       tep->Save_SP = (tmp1 >> 4) & 0x1;
5390       tep->Save_RP = (tmp1 >> 3) & 0x1;
5391       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
5392       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
5393       tep->Cleanup_defined = tmp1 & 0x1;
5394 
5395       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
5396       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
5397       tep->Large_frame = (tmp2 >> 29) & 0x1;
5398       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
5399       tep->reserved4 = (tmp2 >> 27) & 0x1;
5400       tep->Total_frame_size = tmp2 & 0x7ffffff;
5401     }
5402   free (table);
5403 
5404   /* Third, apply any relocations to the unwind table.  */
5405 
5406   for (relsec = section_headers;
5407        relsec < section_headers + elf_header.e_shnum;
5408        ++relsec)
5409     {
5410       if (relsec->sh_type != SHT_RELA
5411 	  || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
5412 	  || SECTION_HEADER (relsec->sh_info) != sec)
5413 	continue;
5414 
5415       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5416 			      & rela, & nrelas))
5417 	return 0;
5418 
5419       for (rp = rela; rp < rela + nrelas; ++rp)
5420 	{
5421 	  if (is_32bit_elf)
5422 	    {
5423 	      relname = elf_hppa_reloc_type (ELF32_R_TYPE (rp->r_info));
5424 	      sym = aux->symtab + ELF32_R_SYM (rp->r_info);
5425 	    }
5426 	  else
5427 	    {
5428 	      relname = elf_hppa_reloc_type (ELF64_R_TYPE (rp->r_info));
5429 	      sym = aux->symtab + ELF64_R_SYM (rp->r_info);
5430 	    }
5431 
5432 	  /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
5433 	  if (! const_strneq (relname, "R_PARISC_SEGREL"))
5434 	    {
5435 	      warn (_("Skipping unexpected relocation type %s\n"), relname);
5436 	      continue;
5437 	    }
5438 
5439 	  i = rp->r_offset / unw_ent_size;
5440 
5441 	  switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
5442 	    {
5443 	    case 0:
5444 	      aux->table[i].start.section = sym->st_shndx;
5445 	      aux->table[i].start.offset += sym->st_value + rp->r_addend;
5446 	      break;
5447 	    case 1:
5448 	      aux->table[i].end.section   = sym->st_shndx;
5449 	      aux->table[i].end.offset   += sym->st_value + rp->r_addend;
5450 	      break;
5451 	    default:
5452 	      break;
5453 	    }
5454 	}
5455 
5456       free (rela);
5457     }
5458 
5459   aux->table_len = nentries;
5460 
5461   return 1;
5462 }
5463 
5464 static int
hppa_process_unwind(FILE * file)5465 hppa_process_unwind (FILE *file)
5466 {
5467   struct hppa_unw_aux_info aux;
5468   Elf_Internal_Shdr *unwsec = NULL;
5469   Elf_Internal_Shdr *strsec;
5470   Elf_Internal_Shdr *sec;
5471   unsigned long i;
5472 
5473   memset (& aux, 0, sizeof (aux));
5474 
5475   if (string_table == NULL)
5476     return 1;
5477 
5478   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5479     {
5480       if (sec->sh_type == SHT_SYMTAB
5481 	  && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
5482 	{
5483 	  aux.nsyms = sec->sh_size / sec->sh_entsize;
5484 	  aux.symtab = GET_ELF_SYMBOLS (file, sec);
5485 
5486 	  strsec = SECTION_HEADER (sec->sh_link);
5487 	  aux.strtab = get_data (NULL, file, strsec->sh_offset,
5488 				 1, strsec->sh_size, _("string table"));
5489 	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5490 	}
5491       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5492 	unwsec = sec;
5493     }
5494 
5495   if (!unwsec)
5496     printf (_("\nThere are no unwind sections in this file.\n"));
5497 
5498   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5499     {
5500       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5501 	{
5502 	  printf (_("\nUnwind section "));
5503 	  printf (_("'%s'"), SECTION_NAME (sec));
5504 
5505 	  printf (_(" at offset 0x%lx contains %lu entries:\n"),
5506 		  (unsigned long) sec->sh_offset,
5507 		  (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
5508 
5509           slurp_hppa_unwind_table (file, &aux, sec);
5510 	  if (aux.table_len > 0)
5511 	    dump_hppa_unwind (&aux);
5512 
5513 	  if (aux.table)
5514 	    free ((char *) aux.table);
5515 	  aux.table = NULL;
5516 	}
5517     }
5518 
5519   if (aux.symtab)
5520     free (aux.symtab);
5521   if (aux.strtab)
5522     free ((char *) aux.strtab);
5523 
5524   return 1;
5525 }
5526 
5527 static int
process_unwind(FILE * file)5528 process_unwind (FILE *file)
5529 {
5530   struct unwind_handler {
5531     int machtype;
5532     int (*handler)(FILE *file);
5533   } handlers[] = {
5534     { EM_IA_64, ia64_process_unwind },
5535     { EM_PARISC, hppa_process_unwind },
5536     { 0, 0 }
5537   };
5538   int i;
5539 
5540   if (!do_unwind)
5541     return 1;
5542 
5543   for (i = 0; handlers[i].handler != NULL; i++)
5544     if (elf_header.e_machine == handlers[i].machtype)
5545       return handlers[i].handler (file);
5546 
5547   printf (_("\nThere are no unwind sections in this file.\n"));
5548   return 1;
5549 }
5550 
5551 static void
dynamic_section_mips_val(Elf_Internal_Dyn * entry)5552 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5553 {
5554   switch (entry->d_tag)
5555     {
5556     case DT_MIPS_FLAGS:
5557       if (entry->d_un.d_val == 0)
5558 	printf ("NONE\n");
5559       else
5560 	{
5561 	  static const char * opts[] =
5562 	  {
5563 	    "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5564 	    "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5565 	    "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5566 	    "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5567 	    "RLD_ORDER_SAFE"
5568 	  };
5569 	  unsigned int cnt;
5570 	  int first = 1;
5571 	  for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
5572 	    if (entry->d_un.d_val & (1 << cnt))
5573 	      {
5574 		printf ("%s%s", first ? "" : " ", opts[cnt]);
5575 		first = 0;
5576 	      }
5577 	  puts ("");
5578 	}
5579       break;
5580 
5581     case DT_MIPS_IVERSION:
5582       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5583 	printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5584       else
5585 	printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5586       break;
5587 
5588     case DT_MIPS_TIME_STAMP:
5589       {
5590 	char timebuf[20];
5591 	struct tm *tmp;
5592 
5593 	time_t time = entry->d_un.d_val;
5594 	tmp = gmtime (&time);
5595 	snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
5596 		  tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5597 		  tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5598 	printf ("Time Stamp: %s\n", timebuf);
5599       }
5600       break;
5601 
5602     case DT_MIPS_RLD_VERSION:
5603     case DT_MIPS_LOCAL_GOTNO:
5604     case DT_MIPS_CONFLICTNO:
5605     case DT_MIPS_LIBLISTNO:
5606     case DT_MIPS_SYMTABNO:
5607     case DT_MIPS_UNREFEXTNO:
5608     case DT_MIPS_HIPAGENO:
5609     case DT_MIPS_DELTA_CLASS_NO:
5610     case DT_MIPS_DELTA_INSTANCE_NO:
5611     case DT_MIPS_DELTA_RELOC_NO:
5612     case DT_MIPS_DELTA_SYM_NO:
5613     case DT_MIPS_DELTA_CLASSSYM_NO:
5614     case DT_MIPS_COMPACT_SIZE:
5615       printf ("%ld\n", (long) entry->d_un.d_ptr);
5616       break;
5617 
5618     default:
5619       printf ("%#lx\n", (long) entry->d_un.d_ptr);
5620     }
5621 }
5622 
5623 
5624 static void
dynamic_section_parisc_val(Elf_Internal_Dyn * entry)5625 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5626 {
5627   switch (entry->d_tag)
5628     {
5629     case DT_HP_DLD_FLAGS:
5630       {
5631 	static struct
5632 	{
5633 	  long int bit;
5634 	  const char *str;
5635 	}
5636 	flags[] =
5637 	{
5638 	  { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5639 	  { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5640 	  { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5641 	  { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5642 	  { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5643 	  { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5644 	  { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5645 	  { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5646 	  { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5647 	  { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5648 	  { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
5649 	  { DT_HP_GST, "HP_GST" },
5650 	  { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
5651 	  { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
5652 	  { DT_HP_NODELETE, "HP_NODELETE" },
5653 	  { DT_HP_GROUP, "HP_GROUP" },
5654 	  { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5655 	};
5656 	int first = 1;
5657 	size_t cnt;
5658 	bfd_vma val = entry->d_un.d_val;
5659 
5660 	for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
5661 	  if (val & flags[cnt].bit)
5662 	    {
5663 	      if (! first)
5664 		putchar (' ');
5665 	      fputs (flags[cnt].str, stdout);
5666 	      first = 0;
5667 	      val ^= flags[cnt].bit;
5668 	    }
5669 
5670 	if (val != 0 || first)
5671 	  {
5672 	    if (! first)
5673 	      putchar (' ');
5674 	    print_vma (val, HEX);
5675 	  }
5676       }
5677       break;
5678 
5679     default:
5680       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5681       break;
5682     }
5683   putchar ('\n');
5684 }
5685 
5686 static void
dynamic_section_ia64_val(Elf_Internal_Dyn * entry)5687 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5688 {
5689   switch (entry->d_tag)
5690     {
5691     case DT_IA_64_PLT_RESERVE:
5692       /* First 3 slots reserved.  */
5693       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5694       printf (" -- ");
5695       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5696       break;
5697 
5698     default:
5699       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5700       break;
5701     }
5702   putchar ('\n');
5703 }
5704 
5705 static int
get_32bit_dynamic_section(FILE * file)5706 get_32bit_dynamic_section (FILE *file)
5707 {
5708   Elf32_External_Dyn *edyn, *ext;
5709   Elf_Internal_Dyn *entry;
5710 
5711   edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5712 		   _("dynamic section"));
5713   if (!edyn)
5714     return 0;
5715 
5716 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5717    might not have the luxury of section headers.  Look for the DT_NULL
5718    terminator to determine the number of entries.  */
5719   for (ext = edyn, dynamic_nent = 0;
5720        (char *) ext < (char *) edyn + dynamic_size;
5721        ext++)
5722     {
5723       dynamic_nent++;
5724       if (BYTE_GET (ext->d_tag) == DT_NULL)
5725 	break;
5726     }
5727 
5728   dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5729   if (dynamic_section == NULL)
5730     {
5731       error (_("Out of memory\n"));
5732       free (edyn);
5733       return 0;
5734     }
5735 
5736   for (ext = edyn, entry = dynamic_section;
5737        entry < dynamic_section + dynamic_nent;
5738        ext++, entry++)
5739     {
5740       entry->d_tag      = BYTE_GET (ext->d_tag);
5741       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5742     }
5743 
5744   free (edyn);
5745 
5746   return 1;
5747 }
5748 
5749 static int
get_64bit_dynamic_section(FILE * file)5750 get_64bit_dynamic_section (FILE *file)
5751 {
5752   Elf64_External_Dyn *edyn, *ext;
5753   Elf_Internal_Dyn *entry;
5754 
5755   edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5756 		   _("dynamic section"));
5757   if (!edyn)
5758     return 0;
5759 
5760 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5761    might not have the luxury of section headers.  Look for the DT_NULL
5762    terminator to determine the number of entries.  */
5763   for (ext = edyn, dynamic_nent = 0;
5764        (char *) ext < (char *) edyn + dynamic_size;
5765        ext++)
5766     {
5767       dynamic_nent++;
5768       if (BYTE_GET (ext->d_tag) == DT_NULL)
5769 	break;
5770     }
5771 
5772   dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5773   if (dynamic_section == NULL)
5774     {
5775       error (_("Out of memory\n"));
5776       free (edyn);
5777       return 0;
5778     }
5779 
5780   for (ext = edyn, entry = dynamic_section;
5781        entry < dynamic_section + dynamic_nent;
5782        ext++, entry++)
5783     {
5784       entry->d_tag      = BYTE_GET (ext->d_tag);
5785       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5786     }
5787 
5788   free (edyn);
5789 
5790   return 1;
5791 }
5792 
5793 static void
print_dynamic_flags(bfd_vma flags)5794 print_dynamic_flags (bfd_vma flags)
5795 {
5796   int first = 1;
5797 
5798   while (flags)
5799     {
5800       bfd_vma flag;
5801 
5802       flag = flags & - flags;
5803       flags &= ~ flag;
5804 
5805       if (first)
5806 	first = 0;
5807       else
5808 	putc (' ', stdout);
5809 
5810       switch (flag)
5811 	{
5812 	case DF_ORIGIN:		fputs ("ORIGIN", stdout); break;
5813 	case DF_SYMBOLIC:	fputs ("SYMBOLIC", stdout); break;
5814 	case DF_TEXTREL:	fputs ("TEXTREL", stdout); break;
5815 	case DF_BIND_NOW:	fputs ("BIND_NOW", stdout); break;
5816 	case DF_STATIC_TLS:	fputs ("STATIC_TLS", stdout); break;
5817 	default:		fputs ("unknown", stdout); break;
5818 	}
5819     }
5820   puts ("");
5821 }
5822 
5823 /* Parse and display the contents of the dynamic section.  */
5824 
5825 static int
process_dynamic_section(FILE * file)5826 process_dynamic_section (FILE *file)
5827 {
5828   Elf_Internal_Dyn *entry;
5829 
5830   if (dynamic_size == 0)
5831     {
5832       if (do_dynamic)
5833 	printf (_("\nThere is no dynamic section in this file.\n"));
5834 
5835       return 1;
5836     }
5837 
5838   if (is_32bit_elf)
5839     {
5840       if (! get_32bit_dynamic_section (file))
5841 	return 0;
5842     }
5843   else if (! get_64bit_dynamic_section (file))
5844     return 0;
5845 
5846   /* Find the appropriate symbol table.  */
5847   if (dynamic_symbols == NULL)
5848     {
5849       for (entry = dynamic_section;
5850 	   entry < dynamic_section + dynamic_nent;
5851 	   ++entry)
5852 	{
5853 	  Elf_Internal_Shdr section;
5854 
5855 	  if (entry->d_tag != DT_SYMTAB)
5856 	    continue;
5857 
5858 	  dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5859 
5860 	  /* Since we do not know how big the symbol table is,
5861 	     we default to reading in the entire file (!) and
5862 	     processing that.  This is overkill, I know, but it
5863 	     should work.  */
5864 	  section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5865 
5866 	  if (archive_file_offset != 0)
5867 	    section.sh_size = archive_file_size - section.sh_offset;
5868 	  else
5869 	    {
5870 	      if (fseek (file, 0, SEEK_END))
5871 		error (_("Unable to seek to end of file!\n"));
5872 
5873 	      section.sh_size = ftell (file) - section.sh_offset;
5874 	    }
5875 
5876 	  if (is_32bit_elf)
5877 	    section.sh_entsize = sizeof (Elf32_External_Sym);
5878 	  else
5879 	    section.sh_entsize = sizeof (Elf64_External_Sym);
5880 
5881 	  num_dynamic_syms = section.sh_size / section.sh_entsize;
5882 	  if (num_dynamic_syms < 1)
5883 	    {
5884 	      error (_("Unable to determine the number of symbols to load\n"));
5885 	      continue;
5886 	    }
5887 
5888 	  dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
5889 	}
5890     }
5891 
5892   /* Similarly find a string table.  */
5893   if (dynamic_strings == NULL)
5894     {
5895       for (entry = dynamic_section;
5896 	   entry < dynamic_section + dynamic_nent;
5897 	   ++entry)
5898 	{
5899 	  unsigned long offset;
5900 	  long str_tab_len;
5901 
5902 	  if (entry->d_tag != DT_STRTAB)
5903 	    continue;
5904 
5905 	  dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5906 
5907 	  /* Since we do not know how big the string table is,
5908 	     we default to reading in the entire file (!) and
5909 	     processing that.  This is overkill, I know, but it
5910 	     should work.  */
5911 
5912 	  offset = offset_from_vma (file, entry->d_un.d_val, 0);
5913 
5914 	  if (archive_file_offset != 0)
5915 	    str_tab_len = archive_file_size - offset;
5916 	  else
5917 	    {
5918 	      if (fseek (file, 0, SEEK_END))
5919 		error (_("Unable to seek to end of file\n"));
5920 	      str_tab_len = ftell (file) - offset;
5921 	    }
5922 
5923 	  if (str_tab_len < 1)
5924 	    {
5925 	      error
5926 		(_("Unable to determine the length of the dynamic string table\n"));
5927 	      continue;
5928 	    }
5929 
5930 	  dynamic_strings = get_data (NULL, file, offset, 1, str_tab_len,
5931 				      _("dynamic string table"));
5932 	  dynamic_strings_length = str_tab_len;
5933 	  break;
5934 	}
5935     }
5936 
5937   /* And find the syminfo section if available.  */
5938   if (dynamic_syminfo == NULL)
5939     {
5940       unsigned long syminsz = 0;
5941 
5942       for (entry = dynamic_section;
5943 	   entry < dynamic_section + dynamic_nent;
5944 	   ++entry)
5945 	{
5946 	  if (entry->d_tag == DT_SYMINENT)
5947 	    {
5948 	      /* Note: these braces are necessary to avoid a syntax
5949 		 error from the SunOS4 C compiler.  */
5950 	      assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
5951 	    }
5952 	  else if (entry->d_tag == DT_SYMINSZ)
5953 	    syminsz = entry->d_un.d_val;
5954 	  else if (entry->d_tag == DT_SYMINFO)
5955 	    dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
5956 						      syminsz);
5957 	}
5958 
5959       if (dynamic_syminfo_offset != 0 && syminsz != 0)
5960 	{
5961 	  Elf_External_Syminfo *extsyminfo, *extsym;
5962 	  Elf_Internal_Syminfo *syminfo;
5963 
5964 	  /* There is a syminfo section.  Read the data.  */
5965 	  extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, 1,
5966 				 syminsz, _("symbol information"));
5967 	  if (!extsyminfo)
5968 	    return 0;
5969 
5970 	  dynamic_syminfo = malloc (syminsz);
5971 	  if (dynamic_syminfo == NULL)
5972 	    {
5973 	      error (_("Out of memory\n"));
5974 	      return 0;
5975 	    }
5976 
5977 	  dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
5978 	  for (syminfo = dynamic_syminfo, extsym = extsyminfo;
5979 	       syminfo < dynamic_syminfo + dynamic_syminfo_nent;
5980 	       ++syminfo, ++extsym)
5981 	    {
5982 	      syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
5983 	      syminfo->si_flags = BYTE_GET (extsym->si_flags);
5984 	    }
5985 
5986 	  free (extsyminfo);
5987 	}
5988     }
5989 
5990   if (do_dynamic && dynamic_addr)
5991     printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5992 	    dynamic_addr, dynamic_nent);
5993   if (do_dynamic)
5994     printf (_("  Tag        Type                         Name/Value\n"));
5995 
5996   for (entry = dynamic_section;
5997        entry < dynamic_section + dynamic_nent;
5998        entry++)
5999     {
6000       if (do_dynamic)
6001 	{
6002 	  const char *dtype;
6003 
6004 	  putchar (' ');
6005 	  print_vma (entry->d_tag, FULL_HEX);
6006 	  dtype = get_dynamic_type (entry->d_tag);
6007 	  printf (" (%s)%*s", dtype,
6008 		  ((is_32bit_elf ? 27 : 19)
6009 		   - (int) strlen (dtype)),
6010 		  " ");
6011 	}
6012 
6013       switch (entry->d_tag)
6014 	{
6015 	case DT_FLAGS:
6016 	  if (do_dynamic)
6017 	    print_dynamic_flags (entry->d_un.d_val);
6018 	  break;
6019 
6020 	case DT_AUXILIARY:
6021 	case DT_FILTER:
6022 	case DT_CONFIG:
6023 	case DT_DEPAUDIT:
6024 	case DT_AUDIT:
6025 	  if (do_dynamic)
6026 	    {
6027 	      switch (entry->d_tag)
6028 		{
6029 		case DT_AUXILIARY:
6030 		  printf (_("Auxiliary library"));
6031 		  break;
6032 
6033 		case DT_FILTER:
6034 		  printf (_("Filter library"));
6035 		  break;
6036 
6037 		case DT_CONFIG:
6038 		  printf (_("Configuration file"));
6039 		  break;
6040 
6041 		case DT_DEPAUDIT:
6042 		  printf (_("Dependency audit library"));
6043 		  break;
6044 
6045 		case DT_AUDIT:
6046 		  printf (_("Audit library"));
6047 		  break;
6048 		}
6049 
6050 	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6051 		printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
6052 	      else
6053 		{
6054 		  printf (": ");
6055 		  print_vma (entry->d_un.d_val, PREFIX_HEX);
6056 		  putchar ('\n');
6057 		}
6058 	    }
6059 	  break;
6060 
6061 	case DT_FEATURE:
6062 	  if (do_dynamic)
6063 	    {
6064 	      printf (_("Flags:"));
6065 
6066 	      if (entry->d_un.d_val == 0)
6067 		printf (_(" None\n"));
6068 	      else
6069 		{
6070 		  unsigned long int val = entry->d_un.d_val;
6071 
6072 		  if (val & DTF_1_PARINIT)
6073 		    {
6074 		      printf (" PARINIT");
6075 		      val ^= DTF_1_PARINIT;
6076 		    }
6077 		  if (val & DTF_1_CONFEXP)
6078 		    {
6079 		      printf (" CONFEXP");
6080 		      val ^= DTF_1_CONFEXP;
6081 		    }
6082 		  if (val != 0)
6083 		    printf (" %lx", val);
6084 		  puts ("");
6085 		}
6086 	    }
6087 	  break;
6088 
6089 	case DT_POSFLAG_1:
6090 	  if (do_dynamic)
6091 	    {
6092 	      printf (_("Flags:"));
6093 
6094 	      if (entry->d_un.d_val == 0)
6095 		printf (_(" None\n"));
6096 	      else
6097 		{
6098 		  unsigned long int val = entry->d_un.d_val;
6099 
6100 		  if (val & DF_P1_LAZYLOAD)
6101 		    {
6102 		      printf (" LAZYLOAD");
6103 		      val ^= DF_P1_LAZYLOAD;
6104 		    }
6105 		  if (val & DF_P1_GROUPPERM)
6106 		    {
6107 		      printf (" GROUPPERM");
6108 		      val ^= DF_P1_GROUPPERM;
6109 		    }
6110 		  if (val != 0)
6111 		    printf (" %lx", val);
6112 		  puts ("");
6113 		}
6114 	    }
6115 	  break;
6116 
6117 	case DT_FLAGS_1:
6118 	  if (do_dynamic)
6119 	    {
6120 	      printf (_("Flags:"));
6121 	      if (entry->d_un.d_val == 0)
6122 		printf (_(" None\n"));
6123 	      else
6124 		{
6125 		  unsigned long int val = entry->d_un.d_val;
6126 
6127 		  if (val & DF_1_NOW)
6128 		    {
6129 		      printf (" NOW");
6130 		      val ^= DF_1_NOW;
6131 		    }
6132 		  if (val & DF_1_GLOBAL)
6133 		    {
6134 		      printf (" GLOBAL");
6135 		      val ^= DF_1_GLOBAL;
6136 		    }
6137 		  if (val & DF_1_GROUP)
6138 		    {
6139 		      printf (" GROUP");
6140 		      val ^= DF_1_GROUP;
6141 		    }
6142 		  if (val & DF_1_NODELETE)
6143 		    {
6144 		      printf (" NODELETE");
6145 		      val ^= DF_1_NODELETE;
6146 		    }
6147 		  if (val & DF_1_LOADFLTR)
6148 		    {
6149 		      printf (" LOADFLTR");
6150 		      val ^= DF_1_LOADFLTR;
6151 		    }
6152 		  if (val & DF_1_INITFIRST)
6153 		    {
6154 		      printf (" INITFIRST");
6155 		      val ^= DF_1_INITFIRST;
6156 		    }
6157 		  if (val & DF_1_NOOPEN)
6158 		    {
6159 		      printf (" NOOPEN");
6160 		      val ^= DF_1_NOOPEN;
6161 		    }
6162 		  if (val & DF_1_ORIGIN)
6163 		    {
6164 		      printf (" ORIGIN");
6165 		      val ^= DF_1_ORIGIN;
6166 		    }
6167 		  if (val & DF_1_DIRECT)
6168 		    {
6169 		      printf (" DIRECT");
6170 		      val ^= DF_1_DIRECT;
6171 		    }
6172 		  if (val & DF_1_TRANS)
6173 		    {
6174 		      printf (" TRANS");
6175 		      val ^= DF_1_TRANS;
6176 		    }
6177 		  if (val & DF_1_INTERPOSE)
6178 		    {
6179 		      printf (" INTERPOSE");
6180 		      val ^= DF_1_INTERPOSE;
6181 		    }
6182 		  if (val & DF_1_NODEFLIB)
6183 		    {
6184 		      printf (" NODEFLIB");
6185 		      val ^= DF_1_NODEFLIB;
6186 		    }
6187 		  if (val & DF_1_NODUMP)
6188 		    {
6189 		      printf (" NODUMP");
6190 		      val ^= DF_1_NODUMP;
6191 		    }
6192 		  if (val & DF_1_CONLFAT)
6193 		    {
6194 		      printf (" CONLFAT");
6195 		      val ^= DF_1_CONLFAT;
6196 		    }
6197 		  if (val != 0)
6198 		    printf (" %lx", val);
6199 		  puts ("");
6200 		}
6201 	    }
6202 	  break;
6203 
6204 	case DT_PLTREL:
6205 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
6206 	  if (do_dynamic)
6207 	    puts (get_dynamic_type (entry->d_un.d_val));
6208 	  break;
6209 
6210 	case DT_NULL	:
6211 	case DT_NEEDED	:
6212 	case DT_PLTGOT	:
6213 	case DT_HASH	:
6214 	case DT_STRTAB	:
6215 	case DT_SYMTAB	:
6216 	case DT_RELA	:
6217 	case DT_INIT	:
6218 	case DT_FINI	:
6219 	case DT_SONAME	:
6220 	case DT_RPATH	:
6221 	case DT_SYMBOLIC:
6222 	case DT_REL	:
6223 	case DT_DEBUG	:
6224 	case DT_TEXTREL	:
6225 	case DT_JMPREL	:
6226 	case DT_RUNPATH	:
6227 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
6228 
6229 	  if (do_dynamic)
6230 	    {
6231 	      char *name;
6232 
6233 	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6234 		name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6235 	      else
6236 		name = NULL;
6237 
6238 	      if (name)
6239 		{
6240 		  switch (entry->d_tag)
6241 		    {
6242 		    case DT_NEEDED:
6243 		      printf (_("Shared library: [%s]"), name);
6244 
6245 		      if (streq (name, program_interpreter))
6246 			printf (_(" program interpreter"));
6247 		      break;
6248 
6249 		    case DT_SONAME:
6250 		      printf (_("Library soname: [%s]"), name);
6251 		      break;
6252 
6253 		    case DT_RPATH:
6254 		      printf (_("Library rpath: [%s]"), name);
6255 		      break;
6256 
6257 		    case DT_RUNPATH:
6258 		      printf (_("Library runpath: [%s]"), name);
6259 		      break;
6260 
6261 		    default:
6262 		      print_vma (entry->d_un.d_val, PREFIX_HEX);
6263 		      break;
6264 		    }
6265 		}
6266 	      else
6267 		print_vma (entry->d_un.d_val, PREFIX_HEX);
6268 
6269 	      putchar ('\n');
6270 	    }
6271 	  break;
6272 
6273 	case DT_PLTRELSZ:
6274 	case DT_RELASZ	:
6275 	case DT_STRSZ	:
6276 	case DT_RELSZ	:
6277 	case DT_RELAENT	:
6278 	case DT_SYMENT	:
6279 	case DT_RELENT	:
6280 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
6281 	case DT_PLTPADSZ:
6282 	case DT_MOVEENT	:
6283 	case DT_MOVESZ	:
6284 	case DT_INIT_ARRAYSZ:
6285 	case DT_FINI_ARRAYSZ:
6286 	case DT_GNU_CONFLICTSZ:
6287 	case DT_GNU_LIBLISTSZ:
6288 	  if (do_dynamic)
6289 	    {
6290 	      print_vma (entry->d_un.d_val, UNSIGNED);
6291 	      printf (" (bytes)\n");
6292 	    }
6293 	  break;
6294 
6295 	case DT_VERDEFNUM:
6296 	case DT_VERNEEDNUM:
6297 	case DT_RELACOUNT:
6298 	case DT_RELCOUNT:
6299 	  if (do_dynamic)
6300 	    {
6301 	      print_vma (entry->d_un.d_val, UNSIGNED);
6302 	      putchar ('\n');
6303 	    }
6304 	  break;
6305 
6306 	case DT_SYMINSZ:
6307 	case DT_SYMINENT:
6308 	case DT_SYMINFO:
6309 	case DT_USED:
6310 	case DT_INIT_ARRAY:
6311 	case DT_FINI_ARRAY:
6312 	  if (do_dynamic)
6313 	    {
6314 	      if (entry->d_tag == DT_USED
6315 		  && VALID_DYNAMIC_NAME (entry->d_un.d_val))
6316 		{
6317 		  char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6318 
6319 		  if (*name)
6320 		    {
6321 		      printf (_("Not needed object: [%s]\n"), name);
6322 		      break;
6323 		    }
6324 		}
6325 
6326 	      print_vma (entry->d_un.d_val, PREFIX_HEX);
6327 	      putchar ('\n');
6328 	    }
6329 	  break;
6330 
6331 	case DT_BIND_NOW:
6332 	  /* The value of this entry is ignored.  */
6333 	  if (do_dynamic)
6334 	    putchar ('\n');
6335 	  break;
6336 
6337 	case DT_GNU_PRELINKED:
6338 	  if (do_dynamic)
6339 	    {
6340 	      struct tm *tmp;
6341 	      time_t time = entry->d_un.d_val;
6342 
6343 	      tmp = gmtime (&time);
6344 	      printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6345 		      tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6346 		      tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6347 
6348 	    }
6349 	  break;
6350 
6351 	case DT_GNU_HASH:
6352 	  dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
6353 	  if (do_dynamic)
6354 	    {
6355 	      print_vma (entry->d_un.d_val, PREFIX_HEX);
6356 	      putchar ('\n');
6357 	    }
6358 	  break;
6359 
6360 	default:
6361 	  if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
6362 	    version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
6363 	      entry->d_un.d_val;
6364 
6365 	  if (do_dynamic)
6366 	    {
6367 	      switch (elf_header.e_machine)
6368 		{
6369 		case EM_MIPS:
6370 		case EM_MIPS_RS3_LE:
6371 		  dynamic_section_mips_val (entry);
6372 		  break;
6373 		case EM_PARISC:
6374 		  dynamic_section_parisc_val (entry);
6375 		  break;
6376 		case EM_IA_64:
6377 		  dynamic_section_ia64_val (entry);
6378 		  break;
6379 		default:
6380 		  print_vma (entry->d_un.d_val, PREFIX_HEX);
6381 		  putchar ('\n');
6382 		}
6383 	    }
6384 	  break;
6385 	}
6386     }
6387 
6388   return 1;
6389 }
6390 
6391 static char *
get_ver_flags(unsigned int flags)6392 get_ver_flags (unsigned int flags)
6393 {
6394   static char buff[32];
6395 
6396   buff[0] = 0;
6397 
6398   if (flags == 0)
6399     return _("none");
6400 
6401   if (flags & VER_FLG_BASE)
6402     strcat (buff, "BASE ");
6403 
6404   if (flags & VER_FLG_WEAK)
6405     {
6406       if (flags & VER_FLG_BASE)
6407 	strcat (buff, "| ");
6408 
6409       strcat (buff, "WEAK ");
6410     }
6411 
6412   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
6413     strcat (buff, "| <unknown>");
6414 
6415   return buff;
6416 }
6417 
6418 /* Display the contents of the version sections.  */
6419 static int
process_version_sections(FILE * file)6420 process_version_sections (FILE *file)
6421 {
6422   Elf_Internal_Shdr *section;
6423   unsigned i;
6424   int found = 0;
6425 
6426   if (! do_version)
6427     return 1;
6428 
6429   for (i = 0, section = section_headers;
6430        i < elf_header.e_shnum;
6431        i++, section++)
6432     {
6433       switch (section->sh_type)
6434 	{
6435 	case SHT_GNU_verdef:
6436 	  {
6437 	    Elf_External_Verdef *edefs;
6438 	    unsigned int idx;
6439 	    unsigned int cnt;
6440 
6441 	    found = 1;
6442 
6443 	    printf
6444 	      (_("\nVersion definition section '%s' contains %ld entries:\n"),
6445 	       SECTION_NAME (section), section->sh_info);
6446 
6447 	    printf (_("  Addr: 0x"));
6448 	    printf_vma (section->sh_addr);
6449 	    printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
6450 		    (unsigned long) section->sh_offset, section->sh_link,
6451 		    SECTION_HEADER_INDEX (section->sh_link)
6452 		    < elf_header.e_shnum
6453 		    ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6454 		    : "<corrupt>");
6455 
6456 	    edefs = get_data (NULL, file, section->sh_offset, 1,
6457 			      section->sh_size,
6458 			      _("version definition section"));
6459 	    if (!edefs)
6460 	      break;
6461 
6462 	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6463 	      {
6464 		char *vstart;
6465 		Elf_External_Verdef *edef;
6466 		Elf_Internal_Verdef ent;
6467 		Elf_External_Verdaux *eaux;
6468 		Elf_Internal_Verdaux aux;
6469 		int j;
6470 		int isum;
6471 
6472 		vstart = ((char *) edefs) + idx;
6473 
6474 		edef = (Elf_External_Verdef *) vstart;
6475 
6476 		ent.vd_version = BYTE_GET (edef->vd_version);
6477 		ent.vd_flags   = BYTE_GET (edef->vd_flags);
6478 		ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
6479 		ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
6480 		ent.vd_hash    = BYTE_GET (edef->vd_hash);
6481 		ent.vd_aux     = BYTE_GET (edef->vd_aux);
6482 		ent.vd_next    = BYTE_GET (edef->vd_next);
6483 
6484 		printf (_("  %#06x: Rev: %d  Flags: %s"),
6485 			idx, ent.vd_version, get_ver_flags (ent.vd_flags));
6486 
6487 		printf (_("  Index: %d  Cnt: %d  "),
6488 			ent.vd_ndx, ent.vd_cnt);
6489 
6490 		vstart += ent.vd_aux;
6491 
6492 		eaux = (Elf_External_Verdaux *) vstart;
6493 
6494 		aux.vda_name = BYTE_GET (eaux->vda_name);
6495 		aux.vda_next = BYTE_GET (eaux->vda_next);
6496 
6497 		if (VALID_DYNAMIC_NAME (aux.vda_name))
6498 		  printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
6499 		else
6500 		  printf (_("Name index: %ld\n"), aux.vda_name);
6501 
6502 		isum = idx + ent.vd_aux;
6503 
6504 		for (j = 1; j < ent.vd_cnt; j++)
6505 		  {
6506 		    isum   += aux.vda_next;
6507 		    vstart += aux.vda_next;
6508 
6509 		    eaux = (Elf_External_Verdaux *) vstart;
6510 
6511 		    aux.vda_name = BYTE_GET (eaux->vda_name);
6512 		    aux.vda_next = BYTE_GET (eaux->vda_next);
6513 
6514 		    if (VALID_DYNAMIC_NAME (aux.vda_name))
6515 		      printf (_("  %#06x: Parent %d: %s\n"),
6516 			      isum, j, GET_DYNAMIC_NAME (aux.vda_name));
6517 		    else
6518 		      printf (_("  %#06x: Parent %d, name index: %ld\n"),
6519 			      isum, j, aux.vda_name);
6520 		  }
6521 
6522 		idx += ent.vd_next;
6523 	      }
6524 
6525 	    free (edefs);
6526 	  }
6527 	  break;
6528 
6529 	case SHT_GNU_verneed:
6530 	  {
6531 	    Elf_External_Verneed *eneed;
6532 	    unsigned int idx;
6533 	    unsigned int cnt;
6534 
6535 	    found = 1;
6536 
6537 	    printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6538 		    SECTION_NAME (section), section->sh_info);
6539 
6540 	    printf (_(" Addr: 0x"));
6541 	    printf_vma (section->sh_addr);
6542 	    printf (_("  Offset: %#08lx  Link to section: %ld (%s)\n"),
6543 		    (unsigned long) section->sh_offset, section->sh_link,
6544 		    SECTION_HEADER_INDEX (section->sh_link)
6545 		    < elf_header.e_shnum
6546 		    ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6547 		    : "<corrupt>");
6548 
6549 	    eneed = get_data (NULL, file, section->sh_offset, 1,
6550 			      section->sh_size,
6551 			      _("version need section"));
6552 	    if (!eneed)
6553 	      break;
6554 
6555 	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6556 	      {
6557 		Elf_External_Verneed *entry;
6558 		Elf_Internal_Verneed ent;
6559 		int j;
6560 		int isum;
6561 		char *vstart;
6562 
6563 		vstart = ((char *) eneed) + idx;
6564 
6565 		entry = (Elf_External_Verneed *) vstart;
6566 
6567 		ent.vn_version = BYTE_GET (entry->vn_version);
6568 		ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
6569 		ent.vn_file    = BYTE_GET (entry->vn_file);
6570 		ent.vn_aux     = BYTE_GET (entry->vn_aux);
6571 		ent.vn_next    = BYTE_GET (entry->vn_next);
6572 
6573 		printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
6574 
6575 		if (VALID_DYNAMIC_NAME (ent.vn_file))
6576 		  printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6577 		else
6578 		  printf (_("  File: %lx"), ent.vn_file);
6579 
6580 		printf (_("  Cnt: %d\n"), ent.vn_cnt);
6581 
6582 		vstart += ent.vn_aux;
6583 
6584 		for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6585 		  {
6586 		    Elf_External_Vernaux *eaux;
6587 		    Elf_Internal_Vernaux aux;
6588 
6589 		    eaux = (Elf_External_Vernaux *) vstart;
6590 
6591 		    aux.vna_hash  = BYTE_GET (eaux->vna_hash);
6592 		    aux.vna_flags = BYTE_GET (eaux->vna_flags);
6593 		    aux.vna_other = BYTE_GET (eaux->vna_other);
6594 		    aux.vna_name  = BYTE_GET (eaux->vna_name);
6595 		    aux.vna_next  = BYTE_GET (eaux->vna_next);
6596 
6597 		    if (VALID_DYNAMIC_NAME (aux.vna_name))
6598 		      printf (_("  %#06x:   Name: %s"),
6599 			      isum, GET_DYNAMIC_NAME (aux.vna_name));
6600 		    else
6601 		      printf (_("  %#06x:   Name index: %lx"),
6602 			      isum, aux.vna_name);
6603 
6604 		    printf (_("  Flags: %s  Version: %d\n"),
6605 			    get_ver_flags (aux.vna_flags), aux.vna_other);
6606 
6607 		    isum   += aux.vna_next;
6608 		    vstart += aux.vna_next;
6609 		  }
6610 
6611 		idx += ent.vn_next;
6612 	      }
6613 
6614 	    free (eneed);
6615 	  }
6616 	  break;
6617 
6618 	case SHT_GNU_versym:
6619 	  {
6620 	    Elf_Internal_Shdr *link_section;
6621 	    int total;
6622 	    int cnt;
6623 	    unsigned char *edata;
6624 	    unsigned short *data;
6625 	    char *strtab;
6626 	    Elf_Internal_Sym *symbols;
6627 	    Elf_Internal_Shdr *string_sec;
6628 	    long off;
6629 
6630 	    if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
6631 	      break;
6632 
6633 	    link_section = SECTION_HEADER (section->sh_link);
6634 	    total = section->sh_size / sizeof (Elf_External_Versym);
6635 
6636 	    if (SECTION_HEADER_INDEX (link_section->sh_link)
6637 		>= elf_header.e_shnum)
6638 	      break;
6639 
6640 	    found = 1;
6641 
6642 	    symbols = GET_ELF_SYMBOLS (file, link_section);
6643 
6644 	    string_sec = SECTION_HEADER (link_section->sh_link);
6645 
6646 	    strtab = get_data (NULL, file, string_sec->sh_offset, 1,
6647 			       string_sec->sh_size, _("version string table"));
6648 	    if (!strtab)
6649 	      break;
6650 
6651 	    printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6652 		    SECTION_NAME (section), total);
6653 
6654 	    printf (_(" Addr: "));
6655 	    printf_vma (section->sh_addr);
6656 	    printf (_("  Offset: %#08lx  Link: %lx (%s)\n"),
6657 		    (unsigned long) section->sh_offset, section->sh_link,
6658 		    SECTION_NAME (link_section));
6659 
6660 	    off = offset_from_vma (file,
6661 				   version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6662 				   total * sizeof (short));
6663 	    edata = get_data (NULL, file, off, total, sizeof (short),
6664 			      _("version symbol data"));
6665 	    if (!edata)
6666 	      {
6667 		free (strtab);
6668 		break;
6669 	      }
6670 
6671 	    data = cmalloc (total, sizeof (short));
6672 
6673 	    for (cnt = total; cnt --;)
6674 	      data[cnt] = byte_get (edata + cnt * sizeof (short),
6675 				    sizeof (short));
6676 
6677 	    free (edata);
6678 
6679 	    for (cnt = 0; cnt < total; cnt += 4)
6680 	      {
6681 		int j, nn;
6682 		int check_def, check_need;
6683 		char *name;
6684 
6685 		printf ("  %03x:", cnt);
6686 
6687 		for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6688 		  switch (data[cnt + j])
6689 		    {
6690 		    case 0:
6691 		      fputs (_("   0 (*local*)    "), stdout);
6692 		      break;
6693 
6694 		    case 1:
6695 		      fputs (_("   1 (*global*)   "), stdout);
6696 		      break;
6697 
6698 		    default:
6699 		      nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6700 				   data[cnt + j] & 0x8000 ? 'h' : ' ');
6701 
6702 		      check_def = 1;
6703 		      check_need = 1;
6704 		      if (SECTION_HEADER_INDEX (symbols[cnt + j].st_shndx)
6705 			  >= elf_header.e_shnum
6706 			  || SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
6707 			     != SHT_NOBITS)
6708 			{
6709 			  if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6710 			    check_def = 0;
6711 			  else
6712 			    check_need = 0;
6713 			}
6714 
6715 		      if (check_need
6716 			  && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6717 			{
6718 			  Elf_Internal_Verneed ivn;
6719 			  unsigned long offset;
6720 
6721 			  offset = offset_from_vma
6722 			    (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6723 			     sizeof (Elf_External_Verneed));
6724 
6725 			  do
6726 			    {
6727 			      Elf_Internal_Vernaux ivna;
6728 			      Elf_External_Verneed evn;
6729 			      Elf_External_Vernaux evna;
6730 			      unsigned long a_off;
6731 
6732 			      get_data (&evn, file, offset, sizeof (evn), 1,
6733 					_("version need"));
6734 
6735 			      ivn.vn_aux  = BYTE_GET (evn.vn_aux);
6736 			      ivn.vn_next = BYTE_GET (evn.vn_next);
6737 
6738 			      a_off = offset + ivn.vn_aux;
6739 
6740 			      do
6741 				{
6742 				  get_data (&evna, file, a_off, sizeof (evna),
6743 					    1, _("version need aux (2)"));
6744 
6745 				  ivna.vna_next  = BYTE_GET (evna.vna_next);
6746 				  ivna.vna_other = BYTE_GET (evna.vna_other);
6747 
6748 				  a_off += ivna.vna_next;
6749 				}
6750 			      while (ivna.vna_other != data[cnt + j]
6751 				     && ivna.vna_next != 0);
6752 
6753 			      if (ivna.vna_other == data[cnt + j])
6754 				{
6755 				  ivna.vna_name = BYTE_GET (evna.vna_name);
6756 
6757 				  name = strtab + ivna.vna_name;
6758 				  nn += printf ("(%s%-*s",
6759 						name,
6760 						12 - (int) strlen (name),
6761 						")");
6762 				  check_def = 0;
6763 				  break;
6764 				}
6765 
6766 			      offset += ivn.vn_next;
6767 			    }
6768 			  while (ivn.vn_next);
6769 			}
6770 
6771 		      if (check_def && data[cnt + j] != 0x8001
6772 			  && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6773 			{
6774 			  Elf_Internal_Verdef ivd;
6775 			  Elf_External_Verdef evd;
6776 			  unsigned long offset;
6777 
6778 			  offset = offset_from_vma
6779 			    (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6780 			     sizeof evd);
6781 
6782 			  do
6783 			    {
6784 			      get_data (&evd, file, offset, sizeof (evd), 1,
6785 					_("version def"));
6786 
6787 			      ivd.vd_next = BYTE_GET (evd.vd_next);
6788 			      ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
6789 
6790 			      offset += ivd.vd_next;
6791 			    }
6792 			  while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6793 				 && ivd.vd_next != 0);
6794 
6795 			  if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6796 			    {
6797 			      Elf_External_Verdaux evda;
6798 			      Elf_Internal_Verdaux ivda;
6799 
6800 			      ivd.vd_aux = BYTE_GET (evd.vd_aux);
6801 
6802 			      get_data (&evda, file,
6803 					offset - ivd.vd_next + ivd.vd_aux,
6804 					sizeof (evda), 1,
6805 					_("version def aux"));
6806 
6807 			      ivda.vda_name = BYTE_GET (evda.vda_name);
6808 
6809 			      name = strtab + ivda.vda_name;
6810 			      nn += printf ("(%s%-*s",
6811 					    name,
6812 					    12 - (int) strlen (name),
6813 					    ")");
6814 			    }
6815 			}
6816 
6817 		      if (nn < 18)
6818 			printf ("%*c", 18 - nn, ' ');
6819 		    }
6820 
6821 		putchar ('\n');
6822 	      }
6823 
6824 	    free (data);
6825 	    free (strtab);
6826 	    free (symbols);
6827 	  }
6828 	  break;
6829 
6830 	default:
6831 	  break;
6832 	}
6833     }
6834 
6835   if (! found)
6836     printf (_("\nNo version information found in this file.\n"));
6837 
6838   return 1;
6839 }
6840 
6841 static const char *
get_symbol_binding(unsigned int binding)6842 get_symbol_binding (unsigned int binding)
6843 {
6844   static char buff[32];
6845 
6846   switch (binding)
6847     {
6848     case STB_LOCAL:	return "LOCAL";
6849     case STB_GLOBAL:	return "GLOBAL";
6850     case STB_WEAK:	return "WEAK";
6851     default:
6852       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6853 	snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
6854 		  binding);
6855       else if (binding >= STB_LOOS && binding <= STB_HIOS)
6856 	snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
6857       else
6858 	snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
6859       return buff;
6860     }
6861 }
6862 
6863 static const char *
get_symbol_type(unsigned int type)6864 get_symbol_type (unsigned int type)
6865 {
6866   static char buff[32];
6867 
6868   switch (type)
6869     {
6870     case STT_NOTYPE:	return "NOTYPE";
6871     case STT_OBJECT:	return "OBJECT";
6872     case STT_FUNC:	return "FUNC";
6873     case STT_SECTION:	return "SECTION";
6874     case STT_FILE:	return "FILE";
6875     case STT_COMMON:	return "COMMON";
6876     case STT_TLS:	return "TLS";
6877     case STT_RELC:      return "RELC";
6878     case STT_SRELC:     return "SRELC";
6879     default:
6880       if (type >= STT_LOPROC && type <= STT_HIPROC)
6881 	{
6882 	  if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6883 	    return "THUMB_FUNC";
6884 
6885 	  if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6886 	    return "REGISTER";
6887 
6888 	  if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6889 	    return "PARISC_MILLI";
6890 
6891 	  snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
6892 	}
6893       else if (type >= STT_LOOS && type <= STT_HIOS)
6894 	{
6895 	  if (elf_header.e_machine == EM_PARISC)
6896 	    {
6897 	      if (type == STT_HP_OPAQUE)
6898 		return "HP_OPAQUE";
6899 	      if (type == STT_HP_STUB)
6900 		return "HP_STUB";
6901 	    }
6902 
6903 	  snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
6904 	}
6905       else
6906 	snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
6907       return buff;
6908     }
6909 }
6910 
6911 static const char *
get_symbol_visibility(unsigned int visibility)6912 get_symbol_visibility (unsigned int visibility)
6913 {
6914   switch (visibility)
6915     {
6916     case STV_DEFAULT:	return "DEFAULT";
6917     case STV_INTERNAL:	return "INTERNAL";
6918     case STV_HIDDEN:	return "HIDDEN";
6919     case STV_PROTECTED: return "PROTECTED";
6920     default: abort ();
6921     }
6922 }
6923 
6924 static const char *
get_mips_symbol_other(unsigned int other)6925 get_mips_symbol_other (unsigned int other)
6926 {
6927   switch (other)
6928     {
6929     case STO_OPTIONAL:  return "OPTIONAL";
6930     case STO_MIPS16:    return "MIPS16";
6931     default:      	return NULL;
6932     }
6933 }
6934 
6935 static const char *
get_symbol_other(unsigned int other)6936 get_symbol_other (unsigned int other)
6937 {
6938   const char * result = NULL;
6939   static char buff [32];
6940 
6941   if (other == 0)
6942     return "";
6943 
6944   switch (elf_header.e_machine)
6945     {
6946     case EM_MIPS:
6947       result = get_mips_symbol_other (other);
6948     default:
6949       break;
6950     }
6951 
6952   if (result)
6953     return result;
6954 
6955   snprintf (buff, sizeof buff, _("<other>: %x"), other);
6956   return buff;
6957 }
6958 
6959 static const char *
get_symbol_index_type(unsigned int type)6960 get_symbol_index_type (unsigned int type)
6961 {
6962   static char buff[32];
6963 
6964   switch (type)
6965     {
6966     case SHN_UNDEF:	return "UND";
6967     case SHN_ABS:	return "ABS";
6968     case SHN_COMMON:	return "COM";
6969     default:
6970       if (type == SHN_IA_64_ANSI_COMMON
6971 	  && elf_header.e_machine == EM_IA_64
6972 	  && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
6973 	return "ANSI_COM";
6974       else if (elf_header.e_machine == EM_X86_64
6975 	       && type == SHN_X86_64_LCOMMON)
6976 	return "LARGE_COM";
6977       else if (type == SHN_MIPS_SCOMMON
6978 	       && elf_header.e_machine == EM_MIPS)
6979 	return "SCOM";
6980       else if (type == SHN_MIPS_SUNDEFINED
6981 	       && elf_header.e_machine == EM_MIPS)
6982 	return "SUND";
6983       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
6984 	sprintf (buff, "PRC[0x%04x]", type);
6985       else if (type >= SHN_LOOS && type <= SHN_HIOS)
6986 	sprintf (buff, "OS [0x%04x]", type);
6987       else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
6988 	sprintf (buff, "RSV[0x%04x]", type);
6989       else
6990 	sprintf (buff, "%3d", type);
6991       break;
6992     }
6993 
6994   return buff;
6995 }
6996 
6997 static bfd_vma *
get_dynamic_data(FILE * file,unsigned int number,unsigned int ent_size)6998 get_dynamic_data (FILE *file, unsigned int number, unsigned int ent_size)
6999 {
7000   unsigned char *e_data;
7001   bfd_vma *i_data;
7002 
7003   e_data = cmalloc (number, ent_size);
7004 
7005   if (e_data == NULL)
7006     {
7007       error (_("Out of memory\n"));
7008       return NULL;
7009     }
7010 
7011   if (fread (e_data, ent_size, number, file) != number)
7012     {
7013       error (_("Unable to read in dynamic data\n"));
7014       return NULL;
7015     }
7016 
7017   i_data = cmalloc (number, sizeof (*i_data));
7018 
7019   if (i_data == NULL)
7020     {
7021       error (_("Out of memory\n"));
7022       free (e_data);
7023       return NULL;
7024     }
7025 
7026   while (number--)
7027     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
7028 
7029   free (e_data);
7030 
7031   return i_data;
7032 }
7033 
7034 /* Dump the symbol table.  */
7035 static int
process_symbol_table(FILE * file)7036 process_symbol_table (FILE *file)
7037 {
7038   Elf_Internal_Shdr *section;
7039   bfd_vma nbuckets = 0;
7040   bfd_vma nchains = 0;
7041   bfd_vma *buckets = NULL;
7042   bfd_vma *chains = NULL;
7043   bfd_vma ngnubuckets = 0;
7044   bfd_vma *gnubuckets = NULL;
7045   bfd_vma *gnuchains = NULL;
7046 
7047   if (! do_syms && !do_histogram)
7048     return 1;
7049 
7050   if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
7051 				|| do_histogram))
7052     {
7053       unsigned char nb[8];
7054       unsigned char nc[8];
7055       int hash_ent_size = 4;
7056 
7057       if ((elf_header.e_machine == EM_ALPHA
7058 	   || elf_header.e_machine == EM_S390
7059 	   || elf_header.e_machine == EM_S390_OLD)
7060 	  && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
7061 	hash_ent_size = 8;
7062 
7063       if (fseek (file,
7064 		 (archive_file_offset
7065 		  + offset_from_vma (file, dynamic_info[DT_HASH],
7066 				     sizeof nb + sizeof nc)),
7067 		 SEEK_SET))
7068 	{
7069 	  error (_("Unable to seek to start of dynamic information\n"));
7070 	  return 0;
7071 	}
7072 
7073       if (fread (nb, hash_ent_size, 1, file) != 1)
7074 	{
7075 	  error (_("Failed to read in number of buckets\n"));
7076 	  return 0;
7077 	}
7078 
7079       if (fread (nc, hash_ent_size, 1, file) != 1)
7080 	{
7081 	  error (_("Failed to read in number of chains\n"));
7082 	  return 0;
7083 	}
7084 
7085       nbuckets = byte_get (nb, hash_ent_size);
7086       nchains  = byte_get (nc, hash_ent_size);
7087 
7088       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
7089       chains  = get_dynamic_data (file, nchains, hash_ent_size);
7090 
7091       if (buckets == NULL || chains == NULL)
7092 	return 0;
7093     }
7094 
7095   if (do_syms
7096       && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
7097     {
7098       unsigned long hn;
7099       bfd_vma si;
7100 
7101       printf (_("\nSymbol table for image:\n"));
7102       if (is_32bit_elf)
7103 	printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
7104       else
7105 	printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
7106 
7107       for (hn = 0; hn < nbuckets; hn++)
7108 	{
7109 	  if (! buckets[hn])
7110 	    continue;
7111 
7112 	  for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
7113 	    {
7114 	      Elf_Internal_Sym *psym;
7115 	      int n;
7116 
7117 	      psym = dynamic_symbols + si;
7118 
7119 	      n = print_vma (si, DEC_5);
7120 	      if (n < 5)
7121 		fputs ("     " + n, stdout);
7122 	      printf (" %3lu: ", hn);
7123 	      print_vma (psym->st_value, LONG_HEX);
7124 	      putchar (' ');
7125 	      print_vma (psym->st_size, DEC_5);
7126 
7127 	      printf ("  %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7128 	      printf (" %6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7129 	      printf (" %3s",  get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7130 	      /* Check to see if any other bits in the st_other field are set.
7131 	         Note - displaying this information disrupts the layout of the
7132 	         table being generated, but for the moment this case is very rare.  */
7133 	      if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7134 		printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7135 	      printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
7136 	      if (VALID_DYNAMIC_NAME (psym->st_name))
7137 		print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
7138 	      else
7139 		printf (" <corrupt: %14ld>", psym->st_name);
7140 	      putchar ('\n');
7141 	    }
7142 	}
7143     }
7144   else if (do_syms && !do_using_dynamic)
7145     {
7146       unsigned int i;
7147 
7148       for (i = 0, section = section_headers;
7149 	   i < elf_header.e_shnum;
7150 	   i++, section++)
7151 	{
7152 	  unsigned int si;
7153 	  char *strtab = NULL;
7154 	  unsigned long int strtab_size = 0;
7155 	  Elf_Internal_Sym *symtab;
7156 	  Elf_Internal_Sym *psym;
7157 
7158 
7159 	  if (   section->sh_type != SHT_SYMTAB
7160 	      && section->sh_type != SHT_DYNSYM)
7161 	    continue;
7162 
7163 	  printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7164 		  SECTION_NAME (section),
7165 		  (unsigned long) (section->sh_size / section->sh_entsize));
7166 	  if (is_32bit_elf)
7167 	    printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
7168 	  else
7169 	    printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
7170 
7171 	  symtab = GET_ELF_SYMBOLS (file, section);
7172 	  if (symtab == NULL)
7173 	    continue;
7174 
7175 	  if (section->sh_link == elf_header.e_shstrndx)
7176 	    {
7177 	      strtab = string_table;
7178 	      strtab_size = string_table_length;
7179 	    }
7180 	  else if (SECTION_HEADER_INDEX (section->sh_link) < elf_header.e_shnum)
7181 	    {
7182 	      Elf_Internal_Shdr *string_sec;
7183 
7184 	      string_sec = SECTION_HEADER (section->sh_link);
7185 
7186 	      strtab = get_data (NULL, file, string_sec->sh_offset,
7187 				 1, string_sec->sh_size, _("string table"));
7188 	      strtab_size = strtab != NULL ? string_sec->sh_size : 0;
7189 	    }
7190 
7191 	  for (si = 0, psym = symtab;
7192 	       si < section->sh_size / section->sh_entsize;
7193 	       si++, psym++)
7194 	    {
7195 	      printf ("%6d: ", si);
7196 	      print_vma (psym->st_value, LONG_HEX);
7197 	      putchar (' ');
7198 	      print_vma (psym->st_size, DEC_5);
7199 	      printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7200 	      printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7201 	      printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7202 	      /* Check to see if any other bits in the st_other field are set.
7203 	         Note - displaying this information disrupts the layout of the
7204 	         table being generated, but for the moment this case is very rare.  */
7205 	      if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7206 		printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7207 	      printf (" %4s ", get_symbol_index_type (psym->st_shndx));
7208 	      print_symbol (25, psym->st_name < strtab_size
7209 			    ? strtab + psym->st_name : "<corrupt>");
7210 
7211 	      if (section->sh_type == SHT_DYNSYM &&
7212 		  version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
7213 		{
7214 		  unsigned char data[2];
7215 		  unsigned short vers_data;
7216 		  unsigned long offset;
7217 		  int is_nobits;
7218 		  int check_def;
7219 
7220 		  offset = offset_from_vma
7221 		    (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
7222 		     sizeof data + si * sizeof (vers_data));
7223 
7224 		  get_data (&data, file, offset + si * sizeof (vers_data),
7225 			    sizeof (data), 1, _("version data"));
7226 
7227 		  vers_data = byte_get (data, 2);
7228 
7229 		  is_nobits = (SECTION_HEADER_INDEX (psym->st_shndx)
7230 			       < elf_header.e_shnum
7231 			       && SECTION_HEADER (psym->st_shndx)->sh_type
7232 				  == SHT_NOBITS);
7233 
7234 		  check_def = (psym->st_shndx != SHN_UNDEF);
7235 
7236 		  if ((vers_data & 0x8000) || vers_data > 1)
7237 		    {
7238 		      if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
7239 			  && (is_nobits || ! check_def))
7240 			{
7241 			  Elf_External_Verneed evn;
7242 			  Elf_Internal_Verneed ivn;
7243 			  Elf_Internal_Vernaux ivna;
7244 
7245 			  /* We must test both.  */
7246 			  offset = offset_from_vma
7247 			    (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
7248 			     sizeof evn);
7249 
7250 			  do
7251 			    {
7252 			      unsigned long vna_off;
7253 
7254 			      get_data (&evn, file, offset, sizeof (evn), 1,
7255 					_("version need"));
7256 
7257 			      ivn.vn_aux  = BYTE_GET (evn.vn_aux);
7258 			      ivn.vn_next = BYTE_GET (evn.vn_next);
7259 
7260 			      vna_off = offset + ivn.vn_aux;
7261 
7262 			      do
7263 				{
7264 				  Elf_External_Vernaux evna;
7265 
7266 				  get_data (&evna, file, vna_off,
7267 					    sizeof (evna), 1,
7268 					    _("version need aux (3)"));
7269 
7270 				  ivna.vna_other = BYTE_GET (evna.vna_other);
7271 				  ivna.vna_next  = BYTE_GET (evna.vna_next);
7272 				  ivna.vna_name  = BYTE_GET (evna.vna_name);
7273 
7274 				  vna_off += ivna.vna_next;
7275 				}
7276 			      while (ivna.vna_other != vers_data
7277 				     && ivna.vna_next != 0);
7278 
7279 			      if (ivna.vna_other == vers_data)
7280 				break;
7281 
7282 			      offset += ivn.vn_next;
7283 			    }
7284 			  while (ivn.vn_next != 0);
7285 
7286 			  if (ivna.vna_other == vers_data)
7287 			    {
7288 			      printf ("@%s (%d)",
7289 				      ivna.vna_name < strtab_size
7290 				      ? strtab + ivna.vna_name : "<corrupt>",
7291 				      ivna.vna_other);
7292 			      check_def = 0;
7293 			    }
7294 			  else if (! is_nobits)
7295 			    error (_("bad dynamic symbol\n"));
7296 			  else
7297 			    check_def = 1;
7298 			}
7299 
7300 		      if (check_def)
7301 			{
7302 			  if (vers_data != 0x8001
7303 			      && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
7304 			    {
7305 			      Elf_Internal_Verdef ivd;
7306 			      Elf_Internal_Verdaux ivda;
7307 			      Elf_External_Verdaux evda;
7308 			      unsigned long offset;
7309 
7310 			      offset = offset_from_vma
7311 				(file,
7312 				 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
7313 				 sizeof (Elf_External_Verdef));
7314 
7315 			      do
7316 				{
7317 				  Elf_External_Verdef evd;
7318 
7319 				  get_data (&evd, file, offset, sizeof (evd),
7320 					    1, _("version def"));
7321 
7322 				  ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
7323 				  ivd.vd_aux = BYTE_GET (evd.vd_aux);
7324 				  ivd.vd_next = BYTE_GET (evd.vd_next);
7325 
7326 				  offset += ivd.vd_next;
7327 				}
7328 			      while (ivd.vd_ndx != (vers_data & 0x7fff)
7329 				     && ivd.vd_next != 0);
7330 
7331 			      offset -= ivd.vd_next;
7332 			      offset += ivd.vd_aux;
7333 
7334 			      get_data (&evda, file, offset, sizeof (evda),
7335 					1, _("version def aux"));
7336 
7337 			      ivda.vda_name = BYTE_GET (evda.vda_name);
7338 
7339 			      if (psym->st_name != ivda.vda_name)
7340 				printf ((vers_data & 0x8000)
7341 					? "@%s" : "@@%s",
7342 					ivda.vda_name < strtab_size
7343 					? strtab + ivda.vda_name : "<corrupt>");
7344 			    }
7345 			}
7346 		    }
7347 		}
7348 
7349 	      putchar ('\n');
7350 	    }
7351 
7352 	  free (symtab);
7353 	  if (strtab != string_table)
7354 	    free (strtab);
7355 	}
7356     }
7357   else if (do_syms)
7358     printf
7359       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7360 
7361   if (do_histogram && buckets != NULL)
7362     {
7363       unsigned long *lengths;
7364       unsigned long *counts;
7365       unsigned long hn;
7366       bfd_vma si;
7367       unsigned long maxlength = 0;
7368       unsigned long nzero_counts = 0;
7369       unsigned long nsyms = 0;
7370 
7371       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7372 	      (unsigned long) nbuckets);
7373       printf (_(" Length  Number     %% of total  Coverage\n"));
7374 
7375       lengths = calloc (nbuckets, sizeof (*lengths));
7376       if (lengths == NULL)
7377 	{
7378 	  error (_("Out of memory\n"));
7379 	  return 0;
7380 	}
7381       for (hn = 0; hn < nbuckets; ++hn)
7382 	{
7383 	  for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
7384 	    {
7385 	      ++nsyms;
7386 	      if (maxlength < ++lengths[hn])
7387 		++maxlength;
7388 	    }
7389 	}
7390 
7391       counts = calloc (maxlength + 1, sizeof (*counts));
7392       if (counts == NULL)
7393 	{
7394 	  error (_("Out of memory\n"));
7395 	  return 0;
7396 	}
7397 
7398       for (hn = 0; hn < nbuckets; ++hn)
7399 	++counts[lengths[hn]];
7400 
7401       if (nbuckets > 0)
7402 	{
7403 	  unsigned long i;
7404 	  printf ("      0  %-10lu (%5.1f%%)\n",
7405 		  counts[0], (counts[0] * 100.0) / nbuckets);
7406 	  for (i = 1; i <= maxlength; ++i)
7407 	    {
7408 	      nzero_counts += counts[i] * i;
7409 	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
7410 		      i, counts[i], (counts[i] * 100.0) / nbuckets,
7411 		      (nzero_counts * 100.0) / nsyms);
7412 	    }
7413 	}
7414 
7415       free (counts);
7416       free (lengths);
7417     }
7418 
7419   if (buckets != NULL)
7420     {
7421       free (buckets);
7422       free (chains);
7423     }
7424 
7425   if (do_histogram && dynamic_info_DT_GNU_HASH)
7426     {
7427       unsigned char nb[16];
7428       bfd_vma i, maxchain = 0xffffffff, symidx, bitmaskwords;
7429       unsigned long *lengths;
7430       unsigned long *counts;
7431       unsigned long hn;
7432       unsigned long maxlength = 0;
7433       unsigned long nzero_counts = 0;
7434       unsigned long nsyms = 0;
7435       bfd_vma buckets_vma;
7436 
7437       if (fseek (file,
7438 		 (archive_file_offset
7439 		  + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
7440 				     sizeof nb)),
7441 		 SEEK_SET))
7442 	{
7443 	  error (_("Unable to seek to start of dynamic information\n"));
7444 	  return 0;
7445 	}
7446 
7447       if (fread (nb, 16, 1, file) != 1)
7448 	{
7449 	  error (_("Failed to read in number of buckets\n"));
7450 	  return 0;
7451 	}
7452 
7453       ngnubuckets = byte_get (nb, 4);
7454       symidx = byte_get (nb + 4, 4);
7455       bitmaskwords = byte_get (nb + 8, 4);
7456       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
7457       if (is_32bit_elf)
7458 	buckets_vma += bitmaskwords * 4;
7459       else
7460 	buckets_vma += bitmaskwords * 8;
7461 
7462       if (fseek (file,
7463 		 (archive_file_offset
7464 		  + offset_from_vma (file, buckets_vma, 4)),
7465 		 SEEK_SET))
7466 	{
7467 	  error (_("Unable to seek to start of dynamic information\n"));
7468 	  return 0;
7469 	}
7470 
7471       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
7472 
7473       if (gnubuckets == NULL)
7474 	return 0;
7475 
7476       for (i = 0; i < ngnubuckets; i++)
7477 	if (gnubuckets[i] != 0)
7478 	  {
7479 	    if (gnubuckets[i] < symidx)
7480 	      return 0;
7481 
7482 	    if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
7483 	      maxchain = gnubuckets[i];
7484 	  }
7485 
7486       if (maxchain == 0xffffffff)
7487 	return 0;
7488 
7489       maxchain -= symidx;
7490 
7491       if (fseek (file,
7492 		 (archive_file_offset
7493 		  + offset_from_vma (file, buckets_vma
7494 					   + 4 * (ngnubuckets + maxchain), 4)),
7495 		 SEEK_SET))
7496 	{
7497 	  error (_("Unable to seek to start of dynamic information\n"));
7498 	  return 0;
7499 	}
7500 
7501       do
7502 	{
7503 	  if (fread (nb, 4, 1, file) != 1)
7504 	    {
7505 	      error (_("Failed to determine last chain length\n"));
7506 	      return 0;
7507 	    }
7508 
7509 	  if (maxchain + 1 == 0)
7510 	    return 0;
7511 
7512 	  ++maxchain;
7513 	}
7514       while ((byte_get (nb, 4) & 1) == 0);
7515 
7516       if (fseek (file,
7517 		 (archive_file_offset
7518 		  + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
7519 		 SEEK_SET))
7520 	{
7521 	  error (_("Unable to seek to start of dynamic information\n"));
7522 	  return 0;
7523 	}
7524 
7525       gnuchains = get_dynamic_data (file, maxchain, 4);
7526 
7527       if (gnuchains == NULL)
7528 	return 0;
7529 
7530       lengths = calloc (ngnubuckets, sizeof (*lengths));
7531       if (lengths == NULL)
7532 	{
7533 	  error (_("Out of memory\n"));
7534 	  return 0;
7535 	}
7536 
7537       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7538 	      (unsigned long) ngnubuckets);
7539       printf (_(" Length  Number     %% of total  Coverage\n"));
7540 
7541       for (hn = 0; hn < ngnubuckets; ++hn)
7542 	if (gnubuckets[hn] != 0)
7543 	  {
7544 	    bfd_vma off, length = 1;
7545 
7546 	    for (off = gnubuckets[hn] - symidx;
7547 		 (gnuchains[off] & 1) == 0; ++off)
7548 	      ++length;
7549 	    lengths[hn] = length;
7550 	    if (length > maxlength)
7551 	      maxlength = length;
7552 	    nsyms += length;
7553 	  }
7554 
7555       counts = calloc (maxlength + 1, sizeof (*counts));
7556       if (counts == NULL)
7557 	{
7558 	  error (_("Out of memory\n"));
7559 	  return 0;
7560 	}
7561 
7562       for (hn = 0; hn < ngnubuckets; ++hn)
7563 	++counts[lengths[hn]];
7564 
7565       if (ngnubuckets > 0)
7566 	{
7567 	  unsigned long j;
7568 	  printf ("      0  %-10lu (%5.1f%%)\n",
7569 		  counts[0], (counts[0] * 100.0) / ngnubuckets);
7570 	  for (j = 1; j <= maxlength; ++j)
7571 	    {
7572 	      nzero_counts += counts[j] * j;
7573 	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
7574 		      j, counts[j], (counts[j] * 100.0) / ngnubuckets,
7575 		      (nzero_counts * 100.0) / nsyms);
7576 	    }
7577 	}
7578 
7579       free (counts);
7580       free (lengths);
7581       free (gnubuckets);
7582       free (gnuchains);
7583     }
7584 
7585   return 1;
7586 }
7587 
7588 static int
process_syminfo(FILE * file ATTRIBUTE_UNUSED)7589 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
7590 {
7591   unsigned int i;
7592 
7593   if (dynamic_syminfo == NULL
7594       || !do_dynamic)
7595     /* No syminfo, this is ok.  */
7596     return 1;
7597 
7598   /* There better should be a dynamic symbol section.  */
7599   if (dynamic_symbols == NULL || dynamic_strings == NULL)
7600     return 0;
7601 
7602   if (dynamic_addr)
7603     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7604 	    dynamic_syminfo_offset, dynamic_syminfo_nent);
7605 
7606   printf (_(" Num: Name                           BoundTo     Flags\n"));
7607   for (i = 0; i < dynamic_syminfo_nent; ++i)
7608     {
7609       unsigned short int flags = dynamic_syminfo[i].si_flags;
7610 
7611       printf ("%4d: ", i);
7612       if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
7613 	print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
7614       else
7615 	printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
7616       putchar (' ');
7617 
7618       switch (dynamic_syminfo[i].si_boundto)
7619 	{
7620 	case SYMINFO_BT_SELF:
7621 	  fputs ("SELF       ", stdout);
7622 	  break;
7623 	case SYMINFO_BT_PARENT:
7624 	  fputs ("PARENT     ", stdout);
7625 	  break;
7626 	default:
7627 	  if (dynamic_syminfo[i].si_boundto > 0
7628 	      && dynamic_syminfo[i].si_boundto < dynamic_nent
7629 	      && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
7630 	    {
7631 	      print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
7632 	      putchar (' ' );
7633 	    }
7634 	  else
7635 	    printf ("%-10d ", dynamic_syminfo[i].si_boundto);
7636 	  break;
7637 	}
7638 
7639       if (flags & SYMINFO_FLG_DIRECT)
7640 	printf (" DIRECT");
7641       if (flags & SYMINFO_FLG_PASSTHRU)
7642 	printf (" PASSTHRU");
7643       if (flags & SYMINFO_FLG_COPY)
7644 	printf (" COPY");
7645       if (flags & SYMINFO_FLG_LAZYLOAD)
7646 	printf (" LAZYLOAD");
7647 
7648       puts ("");
7649     }
7650 
7651   return 1;
7652 }
7653 
7654 #ifdef SUPPORT_DISASSEMBLY
7655 static int
disassemble_section(Elf_Internal_Shdr * section,FILE * file)7656 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
7657 {
7658   printf (_("\nAssembly dump of section %s\n"),
7659 	  SECTION_NAME (section));
7660 
7661   /* XXX -- to be done --- XXX */
7662 
7663   return 1;
7664 }
7665 #endif
7666 
7667 static int
dump_section(Elf_Internal_Shdr * section,FILE * file)7668 dump_section (Elf_Internal_Shdr *section, FILE *file)
7669 {
7670   Elf_Internal_Shdr *relsec;
7671   bfd_size_type bytes;
7672   bfd_vma addr;
7673   unsigned char *data;
7674   unsigned char *start;
7675 
7676   bytes = section->sh_size;
7677 
7678   if (bytes == 0 || section->sh_type == SHT_NOBITS)
7679     {
7680       printf (_("\nSection '%s' has no data to dump.\n"),
7681 	      SECTION_NAME (section));
7682       return 0;
7683     }
7684   else
7685     printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
7686 
7687   addr = section->sh_addr;
7688 
7689   start = get_data (NULL, file, section->sh_offset, 1, bytes,
7690 		    _("section data"));
7691   if (!start)
7692     return 0;
7693 
7694   /* If the section being dumped has relocations against it the user might
7695      be expecting these relocations to have been applied.  Check for this
7696      case and issue a warning message in order to avoid confusion.
7697      FIXME: Maybe we ought to have an option that dumps a section with
7698      relocs applied ?  */
7699   for (relsec = section_headers;
7700        relsec < section_headers + elf_header.e_shnum;
7701        ++relsec)
7702     {
7703       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
7704 	  || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
7705 	  || SECTION_HEADER (relsec->sh_info) != section
7706 	  || relsec->sh_size == 0
7707 	  || SECTION_HEADER_INDEX (relsec->sh_link) >= elf_header.e_shnum)
7708 	continue;
7709 
7710       printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7711       break;
7712     }
7713 
7714   data = start;
7715 
7716   while (bytes)
7717     {
7718       int j;
7719       int k;
7720       int lbytes;
7721 
7722       lbytes = (bytes > 16 ? 16 : bytes);
7723 
7724       printf ("  0x%8.8lx ", (unsigned long) addr);
7725 
7726       for (j = 0; j < 16; j++)
7727 	{
7728 	  if (j < lbytes)
7729 	    printf ("%2.2x", data[j]);
7730 	  else
7731 	    printf ("  ");
7732 
7733 	  if ((j & 3) == 3)
7734 	    printf (" ");
7735 	}
7736 
7737       for (j = 0; j < lbytes; j++)
7738 	{
7739 	  k = data[j];
7740 	  if (k >= ' ' && k < 0x7f)
7741 	    printf ("%c", k);
7742 	  else
7743 	    printf (".");
7744 	}
7745 
7746       putchar ('\n');
7747 
7748       data  += lbytes;
7749       addr  += lbytes;
7750       bytes -= lbytes;
7751     }
7752 
7753   free (start);
7754 
7755   putchar ('\n');
7756   return 1;
7757 }
7758 
7759 /* Return the number of bytes affected by a given reloc.
7760    This information is architecture and reloc dependent.
7761    Returns 4 by default, although this is not always correct.
7762    It should return 0 if a decision cannot be made.
7763    FIXME: This is not the correct way to solve this problem.
7764    The proper way is to have target specific reloc sizing functions
7765    created by the reloc-macros.h header, in the same way that it
7766    already creates the reloc naming functions.  */
7767 
7768 static unsigned int
get_reloc_size(Elf_Internal_Rela * reloc)7769 get_reloc_size (Elf_Internal_Rela * reloc)
7770 {
7771   switch (elf_header.e_machine)
7772     {
7773     case EM_H8S:
7774     case EM_H8_300:
7775     case EM_H8_300H:
7776     case EM_H8_500:
7777       switch (ELF32_R_TYPE (reloc->r_info))
7778 	{
7779 	  /* PR gas/3800 - without this information we do not correctly
7780 	     decode the debug information generated by the h8300 assembler.  */
7781 	case R_H8_DIR16:
7782 	  return 2;
7783 	default:
7784 	  return 4;
7785 	}
7786     default:
7787       /* FIXME: We need to extend this switch statement to cope with other
7788 	 architecture's relocs.  (When those relocs are used against debug
7789 	 sections, and when their size is not 4).  But see the multiple
7790 	 inclusions of <elf/h8.h> for an example of the hoops that we need
7791 	 to jump through in order to obtain the reloc numbers.  */
7792       return 4;
7793     }
7794 }
7795 
7796 /* Apply addends of RELA relocations.  */
7797 
7798 static int
debug_apply_rela_addends(void * file,Elf_Internal_Shdr * section,unsigned char * start)7799 debug_apply_rela_addends (void *file,
7800 			  Elf_Internal_Shdr *section,
7801 			  unsigned char *start)
7802 {
7803   Elf_Internal_Shdr *relsec;
7804   unsigned char *end = start + section->sh_size;
7805 
7806   if (!is_relocatable)
7807     return 1;
7808 
7809   /* SH uses RELA but uses in place value instead of the addend field.  */
7810   if (elf_header.e_machine == EM_SH)
7811     return 0;
7812 
7813   for (relsec = section_headers;
7814        relsec < section_headers + elf_header.e_shnum;
7815        ++relsec)
7816     {
7817       unsigned long nrelas;
7818       Elf_Internal_Rela *rela, *rp;
7819       Elf_Internal_Shdr *symsec;
7820       Elf_Internal_Sym *symtab;
7821       Elf_Internal_Sym *sym;
7822 
7823       if (relsec->sh_type != SHT_RELA
7824 	  || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
7825 	  || SECTION_HEADER (relsec->sh_info) != section
7826 	  || relsec->sh_size == 0
7827 	  || SECTION_HEADER_INDEX (relsec->sh_link) >= elf_header.e_shnum)
7828 	continue;
7829 
7830       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7831 			      &rela, &nrelas))
7832 	return 0;
7833 
7834       symsec = SECTION_HEADER (relsec->sh_link);
7835       symtab = GET_ELF_SYMBOLS (file, symsec);
7836 
7837       for (rp = rela; rp < rela + nrelas; ++rp)
7838 	{
7839 	  unsigned char *loc;
7840 	  unsigned int reloc_size;
7841 
7842 	  reloc_size = get_reloc_size (rp);
7843 	  if (reloc_size == 0)
7844 	    {
7845 	      warn (_("skipping relocation of unknown size against offset 0x%lx in section %s\n"),
7846 		    (unsigned long) rp->r_offset,
7847 		    SECTION_NAME (section));
7848 	      continue;
7849 	    }
7850 
7851 	  loc = start + rp->r_offset;
7852 	  if ((loc + reloc_size) > end)
7853 	    {
7854 	      warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7855 		    (unsigned long) rp->r_offset,
7856 		    SECTION_NAME (section));
7857 	      continue;
7858 	    }
7859 
7860 	  if (is_32bit_elf)
7861 	    {
7862 	      sym = symtab + ELF32_R_SYM (rp->r_info);
7863 
7864 	      if (ELF32_R_SYM (rp->r_info) != 0
7865 		  && ELF32_ST_TYPE (sym->st_info) != STT_SECTION
7866 		  /* Relocations against symbols without type can happen.
7867 		     Gcc -feliminate-dwarf2-dups may generate symbols
7868 		     without type for debug info.  */
7869 		  && ELF32_ST_TYPE (sym->st_info) != STT_NOTYPE
7870 		  /* Relocations against object symbols can happen,
7871 		     eg when referencing a global array.  For an
7872 		     example of this see the _clz.o binary in libgcc.a.  */
7873 		  && ELF32_ST_TYPE (sym->st_info) != STT_OBJECT)
7874 		{
7875 		  warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7876 			get_symbol_type (ELF32_ST_TYPE (sym->st_info)),
7877 			SECTION_NAME (section));
7878 		  continue;
7879 		}
7880 	    }
7881 	  else
7882 	    {
7883 	      /* In MIPS little-endian objects, r_info isn't really a
7884 		 64-bit little-endian value: it has a 32-bit little-endian
7885 		 symbol index followed by four individual byte fields.
7886 		 Reorder INFO accordingly.  */
7887 	      if (elf_header.e_machine == EM_MIPS
7888 		  && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
7889 		rp->r_info = (((rp->r_info & 0xffffffff) << 32)
7890 			      | ((rp->r_info >> 56) & 0xff)
7891 			      | ((rp->r_info >> 40) & 0xff00)
7892 			      | ((rp->r_info >> 24) & 0xff0000)
7893 			      | ((rp->r_info >> 8) & 0xff000000));
7894 
7895 	      sym = symtab + ELF64_R_SYM (rp->r_info);
7896 
7897 	      if (ELF64_R_SYM (rp->r_info) != 0
7898 		  && ELF64_ST_TYPE (sym->st_info) != STT_SECTION
7899 		  && ELF64_ST_TYPE (sym->st_info) != STT_NOTYPE
7900 		  && ELF64_ST_TYPE (sym->st_info) != STT_OBJECT)
7901 		{
7902 		  warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7903 			get_symbol_type (ELF64_ST_TYPE (sym->st_info)),
7904 			SECTION_NAME (section));
7905 		  continue;
7906 		}
7907 	    }
7908 
7909 	  byte_put (loc, rp->r_addend, reloc_size);
7910 	}
7911 
7912       free (symtab);
7913       free (rela);
7914       break;
7915     }
7916   return 1;
7917 }
7918 
7919 int
load_debug_section(enum dwarf_section_display_enum debug,void * file)7920 load_debug_section (enum dwarf_section_display_enum debug, void *file)
7921 {
7922   struct dwarf_section *section = &debug_displays [debug].section;
7923   Elf_Internal_Shdr *sec;
7924   char buf [64];
7925 
7926   /* If it is already loaded, do nothing.  */
7927   if (section->start != NULL)
7928     return 1;
7929 
7930   /* Locate the debug section.  */
7931   sec = find_section (section->name);
7932   if (sec == NULL)
7933     return 0;
7934 
7935   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
7936   section->address = sec->sh_addr;
7937   section->size = sec->sh_size;
7938   section->start = get_data (NULL, file, sec->sh_offset, 1,
7939 			     sec->sh_size, buf);
7940 
7941   if (debug_displays [debug].relocate)
7942     debug_apply_rela_addends (file, sec, section->start);
7943 
7944   return section->start != NULL;
7945 }
7946 
7947 void
free_debug_section(enum dwarf_section_display_enum debug)7948 free_debug_section (enum dwarf_section_display_enum debug)
7949 {
7950   struct dwarf_section *section = &debug_displays [debug].section;
7951 
7952   if (section->start == NULL)
7953     return;
7954 
7955   free ((char *) section->start);
7956   section->start = NULL;
7957   section->address = 0;
7958   section->size = 0;
7959 }
7960 
7961 static int
display_debug_section(Elf_Internal_Shdr * section,FILE * file)7962 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
7963 {
7964   char *name = SECTION_NAME (section);
7965   bfd_size_type length;
7966   int result = 1;
7967   enum dwarf_section_display_enum i;
7968 
7969   length = section->sh_size;
7970   if (length == 0)
7971     {
7972       printf (_("\nSection '%s' has no debugging data.\n"), name);
7973       return 0;
7974     }
7975 
7976   if (const_strneq (name, ".gnu.linkonce.wi."))
7977     name = ".debug_info";
7978 
7979   /* See if we know how to display the contents of this section.  */
7980   for (i = 0; i < max; i++)
7981     if (streq (debug_displays[i].section.name, name))
7982       {
7983 	struct dwarf_section *sec = &debug_displays [i].section;
7984 
7985 	if (load_debug_section (i, file))
7986 	  {
7987 	    result &= debug_displays[i].display (sec, file);
7988 
7989 	    if (i != info && i != abbrev)
7990 	      free_debug_section (i);
7991 	  }
7992 
7993 	break;
7994       }
7995 
7996   if (i == max)
7997     {
7998       printf (_("Unrecognized debug section: %s\n"), name);
7999       result = 0;
8000     }
8001 
8002   return result;
8003 }
8004 
8005 /* Set DUMP_SECTS for all sections where dumps were requested
8006    based on section name.  */
8007 
8008 static void
initialise_dumps_byname(void)8009 initialise_dumps_byname (void)
8010 {
8011   struct dump_list_entry *cur;
8012 
8013   for (cur = dump_sects_byname; cur; cur = cur->next)
8014     {
8015       unsigned int i;
8016       int any;
8017 
8018       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
8019 	if (streq (SECTION_NAME (section_headers + i), cur->name))
8020 	  {
8021 	    request_dump (i, cur->type);
8022 	    any = 1;
8023 	  }
8024 
8025       if (!any)
8026 	warn (_("Section '%s' was not dumped because it does not exist!\n"),
8027 	      cur->name);
8028     }
8029 }
8030 
8031 static void
process_section_contents(FILE * file)8032 process_section_contents (FILE *file)
8033 {
8034   Elf_Internal_Shdr *section;
8035   unsigned int i;
8036 
8037   if (! do_dump)
8038     return;
8039 
8040   initialise_dumps_byname ();
8041 
8042   for (i = 0, section = section_headers;
8043        i < elf_header.e_shnum && i < num_dump_sects;
8044        i++, section++)
8045     {
8046 #ifdef SUPPORT_DISASSEMBLY
8047       if (dump_sects[i] & DISASS_DUMP)
8048 	disassemble_section (section, file);
8049 #endif
8050       if (dump_sects[i] & HEX_DUMP)
8051 	dump_section (section, file);
8052 
8053       if (dump_sects[i] & DEBUG_DUMP)
8054 	display_debug_section (section, file);
8055     }
8056 
8057   /* Check to see if the user requested a
8058      dump of a section that does not exist.  */
8059   while (i++ < num_dump_sects)
8060     if (dump_sects[i])
8061       warn (_("Section %d was not dumped because it does not exist!\n"), i);
8062 }
8063 
8064 static void
process_mips_fpe_exception(int mask)8065 process_mips_fpe_exception (int mask)
8066 {
8067   if (mask)
8068     {
8069       int first = 1;
8070       if (mask & OEX_FPU_INEX)
8071 	fputs ("INEX", stdout), first = 0;
8072       if (mask & OEX_FPU_UFLO)
8073 	printf ("%sUFLO", first ? "" : "|"), first = 0;
8074       if (mask & OEX_FPU_OFLO)
8075 	printf ("%sOFLO", first ? "" : "|"), first = 0;
8076       if (mask & OEX_FPU_DIV0)
8077 	printf ("%sDIV0", first ? "" : "|"), first = 0;
8078       if (mask & OEX_FPU_INVAL)
8079 	printf ("%sINVAL", first ? "" : "|");
8080     }
8081   else
8082     fputs ("0", stdout);
8083 }
8084 
8085 /* ARM EABI attributes section.  */
8086 typedef struct
8087 {
8088   int tag;
8089   const char *name;
8090   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
8091   int type;
8092   const char **table;
8093 } arm_attr_public_tag;
8094 
8095 static const char *arm_attr_tag_CPU_arch[] =
8096   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8097    "v6K", "v7"};
8098 static const char *arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
8099 static const char *arm_attr_tag_THUMB_ISA_use[] =
8100   {"No", "Thumb-1", "Thumb-2"};
8101 /* FIXME: VFPv3 encoding was extrapolated!  */
8102 static const char *arm_attr_tag_VFP_arch[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
8103 static const char *arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1"};
8104 static const char *arm_attr_tag_NEON_arch[] = {"No", "NEONv1"};
8105 static const char *arm_attr_tag_ABI_PCS_config[] =
8106   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8107    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8108 static const char *arm_attr_tag_ABI_PCS_R9_use[] =
8109   {"V6", "SB", "TLS", "Unused"};
8110 static const char *arm_attr_tag_ABI_PCS_RW_data[] =
8111   {"Absolute", "PC-relative", "SB-relative", "None"};
8112 static const char *arm_attr_tag_ABI_PCS_RO_DATA[] =
8113   {"Absolute", "PC-relative", "None"};
8114 static const char *arm_attr_tag_ABI_PCS_GOT_use[] =
8115   {"None", "direct", "GOT-indirect"};
8116 static const char *arm_attr_tag_ABI_PCS_wchar_t[] =
8117   {"None", "??? 1", "2", "??? 3", "4"};
8118 static const char *arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
8119 static const char *arm_attr_tag_ABI_FP_denormal[] = {"Unused", "Needed"};
8120 static const char *arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
8121 static const char *arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
8122 static const char *arm_attr_tag_ABI_FP_number_model[] =
8123   {"Unused", "Finite", "RTABI", "IEEE 754"};
8124 static const char *arm_attr_tag_ABI_align8_needed[] = {"No", "Yes", "4-byte"};
8125 static const char *arm_attr_tag_ABI_align8_preserved[] =
8126   {"No", "Yes, except leaf SP", "Yes"};
8127 static const char *arm_attr_tag_ABI_enum_size[] =
8128   {"Unused", "small", "int", "forced to int"};
8129 static const char *arm_attr_tag_ABI_HardFP_use[] =
8130   {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8131 static const char *arm_attr_tag_ABI_VFP_args[] =
8132   {"AAPCS", "VFP registers", "custom"};
8133 static const char *arm_attr_tag_ABI_WMMX_args[] =
8134   {"AAPCS", "WMMX registers", "custom"};
8135 static const char *arm_attr_tag_ABI_optimization_goals[] =
8136   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8137     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8138 static const char *arm_attr_tag_ABI_FP_optimization_goals[] =
8139   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8140     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8141 
8142 #define LOOKUP(id, name) \
8143   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8144 static arm_attr_public_tag arm_attr_public_tags[] =
8145 {
8146   {4, "CPU_raw_name", 1, NULL},
8147   {5, "CPU_name", 1, NULL},
8148   LOOKUP(6, CPU_arch),
8149   {7, "CPU_arch_profile", 0, NULL},
8150   LOOKUP(8, ARM_ISA_use),
8151   LOOKUP(9, THUMB_ISA_use),
8152   LOOKUP(10, VFP_arch),
8153   LOOKUP(11, WMMX_arch),
8154   LOOKUP(12, NEON_arch),
8155   LOOKUP(13, ABI_PCS_config),
8156   LOOKUP(14, ABI_PCS_R9_use),
8157   LOOKUP(15, ABI_PCS_RW_data),
8158   LOOKUP(16, ABI_PCS_RO_DATA),
8159   LOOKUP(17, ABI_PCS_GOT_use),
8160   LOOKUP(18, ABI_PCS_wchar_t),
8161   LOOKUP(19, ABI_FP_rounding),
8162   LOOKUP(20, ABI_FP_denormal),
8163   LOOKUP(21, ABI_FP_exceptions),
8164   LOOKUP(22, ABI_FP_user_exceptions),
8165   LOOKUP(23, ABI_FP_number_model),
8166   LOOKUP(24, ABI_align8_needed),
8167   LOOKUP(25, ABI_align8_preserved),
8168   LOOKUP(26, ABI_enum_size),
8169   LOOKUP(27, ABI_HardFP_use),
8170   LOOKUP(28, ABI_VFP_args),
8171   LOOKUP(29, ABI_WMMX_args),
8172   LOOKUP(30, ABI_optimization_goals),
8173   LOOKUP(31, ABI_FP_optimization_goals),
8174   {32, "compatibility", 0, NULL}
8175 };
8176 #undef LOOKUP
8177 
8178 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
8179    bytes read.  */
8180 static unsigned int
read_uleb128(unsigned char * p,unsigned int * plen)8181 read_uleb128 (unsigned char *p, unsigned int *plen)
8182 {
8183   unsigned char c;
8184   unsigned int val;
8185   int shift;
8186   int len;
8187 
8188   val = 0;
8189   shift = 0;
8190   len = 0;
8191   do
8192     {
8193       c = *(p++);
8194       len++;
8195       val |= ((unsigned int)c & 0x7f) << shift;
8196       shift += 7;
8197     }
8198   while (c & 0x80);
8199 
8200   *plen = len;
8201   return val;
8202 }
8203 
8204 static unsigned char *
display_arm_attribute(unsigned char * p)8205 display_arm_attribute (unsigned char *p)
8206 {
8207   int tag;
8208   unsigned int len;
8209   int val;
8210   arm_attr_public_tag *attr;
8211   unsigned i;
8212   int type;
8213 
8214   tag = read_uleb128 (p, &len);
8215   p += len;
8216   attr = NULL;
8217   for (i = 0; i < ARRAY_SIZE(arm_attr_public_tags); i++)
8218     {
8219       if (arm_attr_public_tags[i].tag == tag)
8220 	{
8221 	  attr = &arm_attr_public_tags[i];
8222 	  break;
8223 	}
8224     }
8225 
8226   if (attr)
8227     {
8228       printf ("  Tag_%s: ", attr->name);
8229       switch (attr->type)
8230 	{
8231 	case 0:
8232 	  switch (tag)
8233 	    {
8234 	    case 7: /* Tag_CPU_arch_profile.  */
8235 	      val = read_uleb128 (p, &len);
8236 	      p += len;
8237 	      switch (val)
8238 		{
8239 		case 0: printf ("None\n"); break;
8240 		case 'A': printf ("Application\n"); break;
8241 		case 'R': printf ("Realtime\n"); break;
8242 		case 'M': printf ("Microcontroller\n"); break;
8243 		default: printf ("??? (%d)\n", val); break;
8244 		}
8245 	      break;
8246 
8247 	    case 32: /* Tag_compatibility.  */
8248 	      val = read_uleb128 (p, &len);
8249 	      p += len;
8250 	      printf ("flag = %d, vendor = %s\n", val, p);
8251 	      p += strlen((char *)p) + 1;
8252 	      break;
8253 
8254 	    default:
8255 	      abort();
8256 	    }
8257 	  return p;
8258 
8259 	case 1:
8260 	case 2:
8261 	  type = attr->type;
8262 	  break;
8263 
8264 	default:
8265 	  assert (attr->type & 0x80);
8266 	  val = read_uleb128 (p, &len);
8267 	  p += len;
8268 	  type = attr->type & 0x7f;
8269 	  if (val >= type)
8270 	    printf ("??? (%d)\n", val);
8271 	  else
8272 	    printf ("%s\n", attr->table[val]);
8273 	  return p;
8274 	}
8275     }
8276   else
8277     {
8278       if (tag & 1)
8279 	type = 1; /* String.  */
8280       else
8281 	type = 2; /* uleb128.  */
8282       printf ("  Tag_unknown_%d: ", tag);
8283     }
8284 
8285   if (type == 1)
8286     {
8287       printf ("\"%s\"\n", p);
8288       p += strlen((char *)p) + 1;
8289     }
8290   else
8291     {
8292       val = read_uleb128 (p, &len);
8293       p += len;
8294       printf ("%d (0x%x)\n", val, val);
8295     }
8296 
8297   return p;
8298 }
8299 
8300 
8301 static unsigned char *
display_gnu_attribute(unsigned char * p,unsigned char * (* display_proc_gnu_attribute)(unsigned char *,int))8302 display_gnu_attribute (unsigned char *p,
8303 		       unsigned char *(*display_proc_gnu_attribute)
8304 			    (unsigned char *, int))
8305 {
8306   int tag;
8307   unsigned int len;
8308   int val;
8309   int type;
8310 
8311   tag = read_uleb128 (p, &len);
8312   p += len;
8313 
8314   /* Tag_compatibility is the only generic GNU attribute defined at
8315      present.  */
8316   if (tag == 32)
8317     {
8318       val = read_uleb128 (p, &len);
8319       p += len;
8320       printf ("flag = %d, vendor = %s\n", val, p);
8321       p += strlen((char *)p) + 1;
8322       return p;
8323     }
8324 
8325   if ((tag & 2) == 0 && display_proc_gnu_attribute)
8326     return display_proc_gnu_attribute (p, tag);
8327 
8328   if (tag & 1)
8329     type = 1; /* String.  */
8330   else
8331     type = 2; /* uleb128.  */
8332   printf ("  Tag_unknown_%d: ", tag);
8333 
8334   if (type == 1)
8335     {
8336       printf ("\"%s\"\n", p);
8337       p += strlen ((char *)p) + 1;
8338     }
8339   else
8340     {
8341       val = read_uleb128 (p, &len);
8342       p += len;
8343       printf ("%d (0x%x)\n", val, val);
8344     }
8345 
8346   return p;
8347 }
8348 
8349 static unsigned char *
display_power_gnu_attribute(unsigned char * p,int tag)8350 display_power_gnu_attribute (unsigned char *p, int tag)
8351 {
8352   int type;
8353   unsigned int len;
8354   int val;
8355 
8356   if (tag == Tag_GNU_Power_ABI_FP)
8357     {
8358       val = read_uleb128 (p, &len);
8359       p += len;
8360       printf ("  Tag_GNU_Power_ABI_FP: ");
8361       switch (val)
8362 	{
8363 	case 0:
8364 	  printf ("Hard or soft float\n");
8365 	  break;
8366 	case 1:
8367 	  printf ("Hard float\n");
8368 	  break;
8369 	case 2:
8370 	  printf ("Soft float\n");
8371 	  break;
8372 	default:
8373 	  printf ("??? (%d)\n", val);
8374 	  break;
8375 	}
8376       return p;
8377    }
8378 
8379   if (tag & 1)
8380     type = 1; /* String.  */
8381   else
8382     type = 2; /* uleb128.  */
8383   printf ("  Tag_unknown_%d: ", tag);
8384 
8385   if (type == 1)
8386     {
8387       printf ("\"%s\"\n", p);
8388       p += strlen ((char *)p) + 1;
8389     }
8390   else
8391     {
8392       val = read_uleb128 (p, &len);
8393       p += len;
8394       printf ("%d (0x%x)\n", val, val);
8395     }
8396 
8397   return p;
8398 }
8399 
8400 static unsigned char *
display_mips_gnu_attribute(unsigned char * p,int tag)8401 display_mips_gnu_attribute (unsigned char *p, int tag)
8402 {
8403   int type;
8404   unsigned int len;
8405   int val;
8406 
8407   if (tag == Tag_GNU_MIPS_ABI_FP)
8408     {
8409       val = read_uleb128 (p, &len);
8410       p += len;
8411       printf ("  Tag_GNU_MIPS_ABI_FP: ");
8412       switch (val)
8413 	{
8414 	case 0:
8415 	  printf ("Hard or soft float\n");
8416 	  break;
8417 	case 1:
8418 	  printf ("Hard float (-mdouble-float)\n");
8419 	  break;
8420 	case 2:
8421 	  printf ("Hard float (-msingle-float)\n");
8422 	  break;
8423 	case 3:
8424 	  printf ("Soft float\n");
8425 	  break;
8426 	default:
8427 	  printf ("??? (%d)\n", val);
8428 	  break;
8429 	}
8430       return p;
8431    }
8432 
8433   if (tag & 1)
8434     type = 1; /* String.  */
8435   else
8436     type = 2; /* uleb128.  */
8437   printf ("  Tag_unknown_%d: ", tag);
8438 
8439   if (type == 1)
8440     {
8441       printf ("\"%s\"\n", p);
8442       p += strlen ((char *)p) + 1;
8443     }
8444   else
8445     {
8446       val = read_uleb128 (p, &len);
8447       p += len;
8448       printf ("%d (0x%x)\n", val, val);
8449     }
8450 
8451   return p;
8452 }
8453 
8454 static int
process_attributes(FILE * file,const char * public_name,unsigned int proc_type,unsigned char * (* display_pub_attribute)(unsigned char *),unsigned char * (* display_proc_gnu_attribute)(unsigned char *,int))8455 process_attributes (FILE *file, const char *public_name,
8456 		    unsigned int proc_type,
8457 		    unsigned char *(*display_pub_attribute) (unsigned char *),
8458 		    unsigned char *(*display_proc_gnu_attribute)
8459 			 (unsigned char *, int))
8460 {
8461   Elf_Internal_Shdr *sect;
8462   unsigned char *contents;
8463   unsigned char *p;
8464   unsigned char *end;
8465   bfd_vma section_len;
8466   bfd_vma len;
8467   unsigned i;
8468 
8469   /* Find the section header so that we get the size.  */
8470   for (i = 0, sect = section_headers;
8471        i < elf_header.e_shnum;
8472        i++, sect++)
8473     {
8474       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
8475 	continue;
8476 
8477       contents = get_data (NULL, file, sect->sh_offset, 1, sect->sh_size,
8478 			   _("attributes"));
8479 
8480       if (!contents)
8481 	continue;
8482       p = contents;
8483       if (*p == 'A')
8484 	{
8485 	  len = sect->sh_size - 1;
8486 	  p++;
8487 	  while (len > 0)
8488 	    {
8489 	      int namelen;
8490 	      bfd_boolean public_section;
8491 	      bfd_boolean gnu_section;
8492 
8493 	      section_len = byte_get (p, 4);
8494 	      p += 4;
8495 	      if (section_len > len)
8496 		{
8497 		  printf (_("ERROR: Bad section length (%d > %d)\n"),
8498 			  (int)section_len, (int)len);
8499 		  section_len = len;
8500 		}
8501 	      len -= section_len;
8502 	      printf ("Attribute Section: %s\n", p);
8503 	      if (public_name && strcmp ((char *)p, public_name) == 0)
8504 		public_section = TRUE;
8505 	      else
8506 		public_section = FALSE;
8507 	      if (strcmp ((char *)p, "gnu") == 0)
8508 		gnu_section = TRUE;
8509 	      else
8510 		gnu_section = FALSE;
8511 	      namelen = strlen ((char *)p) + 1;
8512 	      p += namelen;
8513 	      section_len -= namelen + 4;
8514 	      while (section_len > 0)
8515 		{
8516 		  int tag = *(p++);
8517 		  int val;
8518 		  bfd_vma size;
8519 		  size = byte_get (p, 4);
8520 		  if (size > section_len)
8521 		    {
8522 		      printf (_("ERROR: Bad subsection length (%d > %d)\n"),
8523 			      (int)size, (int)section_len);
8524 		      size = section_len;
8525 		    }
8526 		  section_len -= size;
8527 		  end = p + size - 1;
8528 		  p += 4;
8529 		  switch (tag)
8530 		    {
8531 		    case 1:
8532 		      printf ("File Attributes\n");
8533 		      break;
8534 		    case 2:
8535 		      printf ("Section Attributes:");
8536 		      goto do_numlist;
8537 		    case 3:
8538 		      printf ("Symbol Attributes:");
8539 		    do_numlist:
8540 		      for (;;)
8541 			{
8542 			  unsigned int i;
8543 			  val = read_uleb128 (p, &i);
8544 			  p += i;
8545 			  if (val == 0)
8546 			    break;
8547 			  printf (" %d", val);
8548 			}
8549 		      printf ("\n");
8550 		      break;
8551 		    default:
8552 		      printf ("Unknown tag: %d\n", tag);
8553 		      public_section = FALSE;
8554 		      break;
8555 		    }
8556 		  if (public_section)
8557 		    {
8558 		      while (p < end)
8559 			p = display_pub_attribute (p);
8560 		    }
8561 		  else if (gnu_section)
8562 		    {
8563 		      while (p < end)
8564 			p = display_gnu_attribute (p,
8565 						   display_proc_gnu_attribute);
8566 		    }
8567 		  else
8568 		    {
8569 		      /* ??? Do something sensible, like dump hex.  */
8570 		      printf ("  Unknown section contexts\n");
8571 		      p = end;
8572 		    }
8573 		}
8574 	    }
8575 	}
8576       else
8577 	{
8578 	  printf (_("Unknown format '%c'\n"), *p);
8579 	}
8580 
8581       free(contents);
8582     }
8583   return 1;
8584 }
8585 
8586 static int
process_arm_specific(FILE * file)8587 process_arm_specific (FILE *file)
8588 {
8589   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
8590 			     display_arm_attribute, NULL);
8591 }
8592 
8593 static int
process_power_specific(FILE * file)8594 process_power_specific (FILE *file)
8595 {
8596   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
8597 			     display_power_gnu_attribute);
8598 }
8599 
8600 static int
process_mips_specific(FILE * file)8601 process_mips_specific (FILE *file)
8602 {
8603   Elf_Internal_Dyn *entry;
8604   size_t liblist_offset = 0;
8605   size_t liblistno = 0;
8606   size_t conflictsno = 0;
8607   size_t options_offset = 0;
8608   size_t conflicts_offset = 0;
8609 
8610   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
8611 		      display_mips_gnu_attribute);
8612 
8613   /* We have a lot of special sections.  Thanks SGI!  */
8614   if (dynamic_section == NULL)
8615     /* No information available.  */
8616     return 0;
8617 
8618   for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
8619     switch (entry->d_tag)
8620       {
8621       case DT_MIPS_LIBLIST:
8622 	liblist_offset
8623 	  = offset_from_vma (file, entry->d_un.d_val,
8624 			     liblistno * sizeof (Elf32_External_Lib));
8625 	break;
8626       case DT_MIPS_LIBLISTNO:
8627 	liblistno = entry->d_un.d_val;
8628 	break;
8629       case DT_MIPS_OPTIONS:
8630 	options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8631 	break;
8632       case DT_MIPS_CONFLICT:
8633 	conflicts_offset
8634 	  = offset_from_vma (file, entry->d_un.d_val,
8635 			     conflictsno * sizeof (Elf32_External_Conflict));
8636 	break;
8637       case DT_MIPS_CONFLICTNO:
8638 	conflictsno = entry->d_un.d_val;
8639 	break;
8640       default:
8641 	break;
8642       }
8643 
8644   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8645     {
8646       Elf32_External_Lib *elib;
8647       size_t cnt;
8648 
8649       elib = get_data (NULL, file, liblist_offset,
8650 		       liblistno, sizeof (Elf32_External_Lib),
8651 		       _("liblist"));
8652       if (elib)
8653 	{
8654 	  printf ("\nSection '.liblist' contains %lu entries:\n",
8655 		  (unsigned long) liblistno);
8656 	  fputs ("     Library              Time Stamp          Checksum   Version Flags\n",
8657 		 stdout);
8658 
8659 	  for (cnt = 0; cnt < liblistno; ++cnt)
8660 	    {
8661 	      Elf32_Lib liblist;
8662 	      time_t time;
8663 	      char timebuf[20];
8664 	      struct tm *tmp;
8665 
8666 	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
8667 	      time = BYTE_GET (elib[cnt].l_time_stamp);
8668 	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8669 	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
8670 	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8671 
8672 	      tmp = gmtime (&time);
8673 	      snprintf (timebuf, sizeof (timebuf),
8674 			"%04u-%02u-%02uT%02u:%02u:%02u",
8675 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8676 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8677 
8678 	      printf ("%3lu: ", (unsigned long) cnt);
8679 	      if (VALID_DYNAMIC_NAME (liblist.l_name))
8680 		print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
8681 	      else
8682 		printf ("<corrupt: %9ld>", liblist.l_name);
8683 	      printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8684 		      liblist.l_version);
8685 
8686 	      if (liblist.l_flags == 0)
8687 		puts (" NONE");
8688 	      else
8689 		{
8690 		  static const struct
8691 		  {
8692 		    const char *name;
8693 		    int bit;
8694 		  }
8695 		  l_flags_vals[] =
8696 		  {
8697 		    { " EXACT_MATCH", LL_EXACT_MATCH },
8698 		    { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8699 		    { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8700 		    { " EXPORTS", LL_EXPORTS },
8701 		    { " DELAY_LOAD", LL_DELAY_LOAD },
8702 		    { " DELTA", LL_DELTA }
8703 		  };
8704 		  int flags = liblist.l_flags;
8705 		  size_t fcnt;
8706 
8707 		  for (fcnt = 0;
8708 		       fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8709 		       ++fcnt)
8710 		    if ((flags & l_flags_vals[fcnt].bit) != 0)
8711 		      {
8712 			fputs (l_flags_vals[fcnt].name, stdout);
8713 			flags ^= l_flags_vals[fcnt].bit;
8714 		      }
8715 		  if (flags != 0)
8716 		    printf (" %#x", (unsigned int) flags);
8717 
8718 		  puts ("");
8719 		}
8720 	    }
8721 
8722 	  free (elib);
8723 	}
8724     }
8725 
8726   if (options_offset != 0)
8727     {
8728       Elf_External_Options *eopt;
8729       Elf_Internal_Shdr *sect = section_headers;
8730       Elf_Internal_Options *iopt;
8731       Elf_Internal_Options *option;
8732       size_t offset;
8733       int cnt;
8734 
8735       /* Find the section header so that we get the size.  */
8736       while (sect->sh_type != SHT_MIPS_OPTIONS)
8737 	++sect;
8738 
8739       eopt = get_data (NULL, file, options_offset, 1, sect->sh_size,
8740 		       _("options"));
8741       if (eopt)
8742 	{
8743 	  iopt = cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (*iopt));
8744 	  if (iopt == NULL)
8745 	    {
8746 	      error (_("Out of memory\n"));
8747 	      return 0;
8748 	    }
8749 
8750 	  offset = cnt = 0;
8751 	  option = iopt;
8752 
8753 	  while (offset < sect->sh_size)
8754 	    {
8755 	      Elf_External_Options *eoption;
8756 
8757 	      eoption = (Elf_External_Options *) ((char *) eopt + offset);
8758 
8759 	      option->kind = BYTE_GET (eoption->kind);
8760 	      option->size = BYTE_GET (eoption->size);
8761 	      option->section = BYTE_GET (eoption->section);
8762 	      option->info = BYTE_GET (eoption->info);
8763 
8764 	      offset += option->size;
8765 
8766 	      ++option;
8767 	      ++cnt;
8768 	    }
8769 
8770 	  printf (_("\nSection '%s' contains %d entries:\n"),
8771 		  SECTION_NAME (sect), cnt);
8772 
8773 	  option = iopt;
8774 
8775 	  while (cnt-- > 0)
8776 	    {
8777 	      size_t len;
8778 
8779 	      switch (option->kind)
8780 		{
8781 		case ODK_NULL:
8782 		  /* This shouldn't happen.  */
8783 		  printf (" NULL       %d %lx", option->section, option->info);
8784 		  break;
8785 		case ODK_REGINFO:
8786 		  printf (" REGINFO    ");
8787 		  if (elf_header.e_machine == EM_MIPS)
8788 		    {
8789 		      /* 32bit form.  */
8790 		      Elf32_External_RegInfo *ereg;
8791 		      Elf32_RegInfo reginfo;
8792 
8793 		      ereg = (Elf32_External_RegInfo *) (option + 1);
8794 		      reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8795 		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8796 		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8797 		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8798 		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8799 		      reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8800 
8801 		      printf ("GPR %08lx  GP 0x%lx\n",
8802 			      reginfo.ri_gprmask,
8803 			      (unsigned long) reginfo.ri_gp_value);
8804 		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
8805 			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8806 			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8807 		    }
8808 		  else
8809 		    {
8810 		      /* 64 bit form.  */
8811 		      Elf64_External_RegInfo *ereg;
8812 		      Elf64_Internal_RegInfo reginfo;
8813 
8814 		      ereg = (Elf64_External_RegInfo *) (option + 1);
8815 		      reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
8816 		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8817 		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8818 		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8819 		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8820 		      reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
8821 
8822 		      printf ("GPR %08lx  GP 0x",
8823 			      reginfo.ri_gprmask);
8824 		      printf_vma (reginfo.ri_gp_value);
8825 		      printf ("\n");
8826 
8827 		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
8828 			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8829 			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8830 		    }
8831 		  ++option;
8832 		  continue;
8833 		case ODK_EXCEPTIONS:
8834 		  fputs (" EXCEPTIONS fpe_min(", stdout);
8835 		  process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8836 		  fputs (") fpe_max(", stdout);
8837 		  process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8838 		  fputs (")", stdout);
8839 
8840 		  if (option->info & OEX_PAGE0)
8841 		    fputs (" PAGE0", stdout);
8842 		  if (option->info & OEX_SMM)
8843 		    fputs (" SMM", stdout);
8844 		  if (option->info & OEX_FPDBUG)
8845 		    fputs (" FPDBUG", stdout);
8846 		  if (option->info & OEX_DISMISS)
8847 		    fputs (" DISMISS", stdout);
8848 		  break;
8849 		case ODK_PAD:
8850 		  fputs (" PAD       ", stdout);
8851 		  if (option->info & OPAD_PREFIX)
8852 		    fputs (" PREFIX", stdout);
8853 		  if (option->info & OPAD_POSTFIX)
8854 		    fputs (" POSTFIX", stdout);
8855 		  if (option->info & OPAD_SYMBOL)
8856 		    fputs (" SYMBOL", stdout);
8857 		  break;
8858 		case ODK_HWPATCH:
8859 		  fputs (" HWPATCH   ", stdout);
8860 		  if (option->info & OHW_R4KEOP)
8861 		    fputs (" R4KEOP", stdout);
8862 		  if (option->info & OHW_R8KPFETCH)
8863 		    fputs (" R8KPFETCH", stdout);
8864 		  if (option->info & OHW_R5KEOP)
8865 		    fputs (" R5KEOP", stdout);
8866 		  if (option->info & OHW_R5KCVTL)
8867 		    fputs (" R5KCVTL", stdout);
8868 		  break;
8869 		case ODK_FILL:
8870 		  fputs (" FILL       ", stdout);
8871 		  /* XXX Print content of info word?  */
8872 		  break;
8873 		case ODK_TAGS:
8874 		  fputs (" TAGS       ", stdout);
8875 		  /* XXX Print content of info word?  */
8876 		  break;
8877 		case ODK_HWAND:
8878 		  fputs (" HWAND     ", stdout);
8879 		  if (option->info & OHWA0_R4KEOP_CHECKED)
8880 		    fputs (" R4KEOP_CHECKED", stdout);
8881 		  if (option->info & OHWA0_R4KEOP_CLEAN)
8882 		    fputs (" R4KEOP_CLEAN", stdout);
8883 		  break;
8884 		case ODK_HWOR:
8885 		  fputs (" HWOR      ", stdout);
8886 		  if (option->info & OHWA0_R4KEOP_CHECKED)
8887 		    fputs (" R4KEOP_CHECKED", stdout);
8888 		  if (option->info & OHWA0_R4KEOP_CLEAN)
8889 		    fputs (" R4KEOP_CLEAN", stdout);
8890 		  break;
8891 		case ODK_GP_GROUP:
8892 		  printf (" GP_GROUP  %#06lx  self-contained %#06lx",
8893 			  option->info & OGP_GROUP,
8894 			  (option->info & OGP_SELF) >> 16);
8895 		  break;
8896 		case ODK_IDENT:
8897 		  printf (" IDENT     %#06lx  self-contained %#06lx",
8898 			  option->info & OGP_GROUP,
8899 			  (option->info & OGP_SELF) >> 16);
8900 		  break;
8901 		default:
8902 		  /* This shouldn't happen.  */
8903 		  printf (" %3d ???     %d %lx",
8904 			  option->kind, option->section, option->info);
8905 		  break;
8906 		}
8907 
8908 	      len = sizeof (*eopt);
8909 	      while (len < option->size)
8910 		if (((char *) option)[len] >= ' '
8911 		    && ((char *) option)[len] < 0x7f)
8912 		  printf ("%c", ((char *) option)[len++]);
8913 		else
8914 		  printf ("\\%03o", ((char *) option)[len++]);
8915 
8916 	      fputs ("\n", stdout);
8917 	      ++option;
8918 	    }
8919 
8920 	  free (eopt);
8921 	}
8922     }
8923 
8924   if (conflicts_offset != 0 && conflictsno != 0)
8925     {
8926       Elf32_Conflict *iconf;
8927       size_t cnt;
8928 
8929       if (dynamic_symbols == NULL)
8930 	{
8931 	  error (_("conflict list found without a dynamic symbol table\n"));
8932 	  return 0;
8933 	}
8934 
8935       iconf = cmalloc (conflictsno, sizeof (*iconf));
8936       if (iconf == NULL)
8937 	{
8938 	  error (_("Out of memory\n"));
8939 	  return 0;
8940 	}
8941 
8942       if (is_32bit_elf)
8943 	{
8944 	  Elf32_External_Conflict *econf32;
8945 
8946 	  econf32 = get_data (NULL, file, conflicts_offset,
8947 			      conflictsno, sizeof (*econf32), _("conflict"));
8948 	  if (!econf32)
8949 	    return 0;
8950 
8951 	  for (cnt = 0; cnt < conflictsno; ++cnt)
8952 	    iconf[cnt] = BYTE_GET (econf32[cnt]);
8953 
8954 	  free (econf32);
8955 	}
8956       else
8957 	{
8958 	  Elf64_External_Conflict *econf64;
8959 
8960 	  econf64 = get_data (NULL, file, conflicts_offset,
8961 			      conflictsno, sizeof (*econf64), _("conflict"));
8962 	  if (!econf64)
8963 	    return 0;
8964 
8965 	  for (cnt = 0; cnt < conflictsno; ++cnt)
8966 	    iconf[cnt] = BYTE_GET (econf64[cnt]);
8967 
8968 	  free (econf64);
8969 	}
8970 
8971       printf (_("\nSection '.conflict' contains %lu entries:\n"),
8972 	      (unsigned long) conflictsno);
8973       puts (_("  Num:    Index       Value  Name"));
8974 
8975       for (cnt = 0; cnt < conflictsno; ++cnt)
8976 	{
8977 	  Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
8978 
8979 	  printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
8980 	  print_vma (psym->st_value, FULL_HEX);
8981 	  putchar (' ');
8982 	  if (VALID_DYNAMIC_NAME (psym->st_name))
8983 	    print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8984 	  else
8985 	    printf ("<corrupt: %14ld>", psym->st_name);
8986 	  putchar ('\n');
8987 	}
8988 
8989       free (iconf);
8990     }
8991 
8992   return 1;
8993 }
8994 
8995 static int
process_gnu_liblist(FILE * file)8996 process_gnu_liblist (FILE *file)
8997 {
8998   Elf_Internal_Shdr *section, *string_sec;
8999   Elf32_External_Lib *elib;
9000   char *strtab;
9001   size_t strtab_size;
9002   size_t cnt;
9003   unsigned i;
9004 
9005   if (! do_arch)
9006     return 0;
9007 
9008   for (i = 0, section = section_headers;
9009        i < elf_header.e_shnum;
9010        i++, section++)
9011     {
9012       switch (section->sh_type)
9013 	{
9014 	case SHT_GNU_LIBLIST:
9015 	  if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
9016 	    break;
9017 
9018 	  elib = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9019 			   _("liblist"));
9020 
9021 	  if (elib == NULL)
9022 	    break;
9023 	  string_sec = SECTION_HEADER (section->sh_link);
9024 
9025 	  strtab = get_data (NULL, file, string_sec->sh_offset, 1,
9026 			     string_sec->sh_size, _("liblist string table"));
9027 	  strtab_size = string_sec->sh_size;
9028 
9029 	  if (strtab == NULL
9030 	      || section->sh_entsize != sizeof (Elf32_External_Lib))
9031 	    {
9032 	      free (elib);
9033 	      break;
9034 	    }
9035 
9036 	  printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9037 		  SECTION_NAME (section),
9038 		  (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9039 
9040 	  puts ("     Library              Time Stamp          Checksum   Version Flags");
9041 
9042 	  for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9043 	       ++cnt)
9044 	    {
9045 	      Elf32_Lib liblist;
9046 	      time_t time;
9047 	      char timebuf[20];
9048 	      struct tm *tmp;
9049 
9050 	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
9051 	      time = BYTE_GET (elib[cnt].l_time_stamp);
9052 	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9053 	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
9054 	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9055 
9056 	      tmp = gmtime (&time);
9057 	      snprintf (timebuf, sizeof (timebuf),
9058 			"%04u-%02u-%02uT%02u:%02u:%02u",
9059 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9060 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9061 
9062 	      printf ("%3lu: ", (unsigned long) cnt);
9063 	      if (do_wide)
9064 		printf ("%-20s", liblist.l_name < strtab_size
9065 				 ? strtab + liblist.l_name : "<corrupt>");
9066 	      else
9067 		printf ("%-20.20s", liblist.l_name < strtab_size
9068 				    ? strtab + liblist.l_name : "<corrupt>");
9069 	      printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9070 		      liblist.l_version, liblist.l_flags);
9071 	    }
9072 
9073 	  free (elib);
9074 	}
9075     }
9076 
9077   return 1;
9078 }
9079 
9080 static const char *
get_note_type(unsigned e_type)9081 get_note_type (unsigned e_type)
9082 {
9083   static char buff[64];
9084 
9085   if (elf_header.e_type == ET_CORE)
9086     switch (e_type)
9087       {
9088       case NT_AUXV:
9089 	return _("NT_AUXV (auxiliary vector)");
9090       case NT_PRSTATUS:
9091 	return _("NT_PRSTATUS (prstatus structure)");
9092       case NT_FPREGSET:
9093 	return _("NT_FPREGSET (floating point registers)");
9094       case NT_PRPSINFO:
9095 	return _("NT_PRPSINFO (prpsinfo structure)");
9096       case NT_TASKSTRUCT:
9097 	return _("NT_TASKSTRUCT (task structure)");
9098       case NT_PRXFPREG:
9099 	return _("NT_PRXFPREG (user_xfpregs structure)");
9100       case NT_PSTATUS:
9101 	return _("NT_PSTATUS (pstatus structure)");
9102       case NT_FPREGS:
9103 	return _("NT_FPREGS (floating point registers)");
9104       case NT_PSINFO:
9105 	return _("NT_PSINFO (psinfo structure)");
9106       case NT_LWPSTATUS:
9107 	return _("NT_LWPSTATUS (lwpstatus_t structure)");
9108       case NT_LWPSINFO:
9109 	return _("NT_LWPSINFO (lwpsinfo_t structure)");
9110       case NT_WIN32PSTATUS:
9111 	return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9112       case NT_FILE:
9113         return _("NT_FILE");
9114       case NT_SIGINFO:
9115         return _("NT_SIGINFO");
9116       default:
9117 	break;
9118       }
9119   else
9120     switch (e_type)
9121       {
9122       case NT_VERSION:
9123 	return _("NT_VERSION (version)");
9124       case NT_ARCH:
9125 	return _("NT_ARCH (architecture)");
9126       default:
9127 	break;
9128       }
9129 
9130   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9131   return buff;
9132 }
9133 
9134 static const char *
get_freebsd_note_type(unsigned e_type)9135 get_freebsd_note_type (unsigned e_type)
9136 {
9137   static char buff[64];
9138 
9139   if (elf_header.e_type == ET_CORE)
9140     switch (e_type)
9141       {
9142       case NT_THRMISC:
9143 	return _("NT_THRMISC (thrmisc structure)");
9144       case NT_PROCSTAT_PROC:
9145 	return _("NT_PROCSTAT_PROC (proc data)");
9146       case NT_PROCSTAT_FILES:
9147 	return _("NT_PROCSTAT_FILES (files data)");
9148       case NT_PROCSTAT_VMMAP:
9149 	return _("NT_PROCSTAT_VMMAP (vmmap data)");
9150       case NT_PROCSTAT_GROUPS:
9151 	return _("NT_PROCSTAT_GROUPS (groups data)");
9152       case NT_PROCSTAT_UMASK:
9153 	return _("NT_PROCSTAT_UMASK (umask data)");
9154       case NT_PROCSTAT_RLIMIT:
9155 	return _("NT_PROCSTAT_RLIMIT (rlimit data)");
9156       case NT_PROCSTAT_OSREL:
9157 	return _("NT_PROCSTAT_OSREL (osreldate data)");
9158       case NT_PROCSTAT_PSSTRINGS:
9159 	return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
9160       case NT_PROCSTAT_AUXV:
9161 	return _("NT_PROCSTAT_AUXV (auxv data)");
9162       case NT_X86_XSTATE:
9163 	return _("NT_X86_XSTATE (x86 XSAVE extended state)");
9164       default:
9165 	return get_note_type(e_type);
9166       }
9167   else
9168     switch (e_type)
9169       {
9170       case NT_FREEBSD_ABI_TAG:
9171 	return _("NT_FREEBSD_ABI_TAG");
9172       case NT_FREEBSD_NOINIT_TAG:
9173 	return _("NT_FREEBSD_NOINIT_TAG");
9174       case NT_FREEBSD_ARCH_TAG:
9175 	return _("NT_FREEBSD_ARCH_TAG");
9176       default:
9177 	break;
9178       }
9179 
9180   snprintf (buff, sizeof(buff), _("Unknown note type: (0x%08x)"), e_type);
9181   return buff;
9182 }
9183 
9184 static const char *
get_gnu_note_type(unsigned e_type)9185 get_gnu_note_type (unsigned e_type)
9186 {
9187   static char buff[64];
9188 
9189   switch (e_type)
9190     {
9191     case NT_GNU_ABI_TAG:
9192       return _("NT_GNU_ABI_TAG");
9193     case NT_GNU_BUILD_ID:
9194       return _("NT_GNU_BUILD_ID");
9195     }
9196 
9197   snprintf (buff, sizeof(buff), _("Unknown GNU note type: (0x%08x)"), e_type);
9198   return buff;
9199 }
9200 
9201 static const char *
get_netbsd_elfcore_note_type(unsigned e_type)9202 get_netbsd_elfcore_note_type (unsigned e_type)
9203 {
9204   static char buff[64];
9205 
9206   if (e_type == NT_NETBSDCORE_PROCINFO)
9207     {
9208       /* NetBSD core "procinfo" structure.  */
9209       return _("NetBSD procinfo structure");
9210     }
9211 
9212   /* As of Jan 2002 there are no other machine-independent notes
9213      defined for NetBSD core files.  If the note type is less
9214      than the start of the machine-dependent note types, we don't
9215      understand it.  */
9216 
9217   if (e_type < NT_NETBSDCORE_FIRSTMACH)
9218     {
9219       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9220       return buff;
9221     }
9222 
9223   switch (elf_header.e_machine)
9224     {
9225     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9226        and PT_GETFPREGS == mach+2.  */
9227 
9228     case EM_OLD_ALPHA:
9229     case EM_ALPHA:
9230     case EM_SPARC:
9231     case EM_SPARC32PLUS:
9232     case EM_SPARCV9:
9233       switch (e_type)
9234 	{
9235 	case NT_NETBSDCORE_FIRSTMACH+0:
9236 	  return _("PT_GETREGS (reg structure)");
9237 	case NT_NETBSDCORE_FIRSTMACH+2:
9238 	  return _("PT_GETFPREGS (fpreg structure)");
9239 	default:
9240 	  break;
9241 	}
9242       break;
9243 
9244     /* On all other arch's, PT_GETREGS == mach+1 and
9245        PT_GETFPREGS == mach+3.  */
9246     default:
9247       switch (e_type)
9248 	{
9249 	case NT_NETBSDCORE_FIRSTMACH+1:
9250 	  return _("PT_GETREGS (reg structure)");
9251 	case NT_NETBSDCORE_FIRSTMACH+3:
9252 	  return _("PT_GETFPREGS (fpreg structure)");
9253 	default:
9254 	  break;
9255 	}
9256     }
9257 
9258   snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
9259 	    e_type - NT_NETBSDCORE_FIRSTMACH);
9260   return buff;
9261 }
9262 
9263 /* Note that by the ELF standard, the name field is already null byte
9264    terminated, and namesz includes the terminating null byte.
9265    I.E. the value of namesz for the name "FSF" is 4.
9266 
9267    If the value of namesz is zero, there is no name present.  */
9268 static int
process_note(Elf_Internal_Note * pnote)9269 process_note (Elf_Internal_Note *pnote)
9270 {
9271   const char *nt;
9272 
9273   if (pnote->namesz == 0)
9274     /* If there is no note name, then use the default set of
9275        note type strings.  */
9276     nt = get_note_type (pnote->type);
9277 
9278   else if (const_strneq (pnote->namedata, "FreeBSD"))
9279     /* FreeBSD-specific core file notes.  */
9280     nt = get_freebsd_note_type (pnote->type);
9281 
9282   else if (const_strneq (pnote->namedata, "GNU"))
9283     /* GNU-specific notes */
9284     nt = get_gnu_note_type (pnote->type);
9285 
9286   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
9287     /* NetBSD-specific core file notes.  */
9288     nt = get_netbsd_elfcore_note_type (pnote->type);
9289 
9290   else
9291     /* Don't recognize this note name; just use the default set of
9292        note type strings.  */
9293       nt = get_note_type (pnote->type);
9294 
9295   printf ("  %-13s 0x%08lx\t%s\n",
9296 	  pnote->namesz ? pnote->namedata : "(NONE)",
9297 	  pnote->descsz, nt);
9298   return 1;
9299 }
9300 
9301 
9302 static int
process_corefile_note_segment(FILE * file,bfd_vma offset,bfd_vma length)9303 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
9304 {
9305   Elf_External_Note *pnotes;
9306   Elf_External_Note *external;
9307   int res = 1;
9308 
9309   if (length <= 0)
9310     return 0;
9311 
9312   pnotes = get_data (NULL, file, offset, 1, length, _("notes"));
9313   if (!pnotes)
9314     return 0;
9315 
9316   external = pnotes;
9317 
9318   printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9319 	  (unsigned long) offset, (unsigned long) length);
9320   printf (_("  Owner\t\tData size\tDescription\n"));
9321 
9322   while (external < (Elf_External_Note *)((char *) pnotes + length))
9323     {
9324       Elf_External_Note *next;
9325       Elf_Internal_Note inote;
9326       char *temp = NULL;
9327 
9328       inote.type     = BYTE_GET (external->type);
9329       inote.namesz   = BYTE_GET (external->namesz);
9330       inote.namedata = external->name;
9331       inote.descsz   = BYTE_GET (external->descsz);
9332       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9333       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
9334 
9335       next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9336 
9337       if (((char *) next) > (((char *) pnotes) + length))
9338 	{
9339 	  warn (_("corrupt note found at offset %lx into core notes\n"),
9340 		(long)((char *)external - (char *)pnotes));
9341 	  warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
9342 		inote.type, inote.namesz, inote.descsz);
9343 	  break;
9344 	}
9345 
9346       external = next;
9347 
9348       /* Verify that name is null terminated.  It appears that at least
9349 	 one version of Linux (RedHat 6.0) generates corefiles that don't
9350 	 comply with the ELF spec by failing to include the null byte in
9351 	 namesz.  */
9352       if (inote.namedata[inote.namesz] != '\0')
9353 	{
9354 	  temp = malloc (inote.namesz + 1);
9355 
9356 	  if (temp == NULL)
9357 	    {
9358 	      error (_("Out of memory\n"));
9359 	      res = 0;
9360 	      break;
9361 	    }
9362 
9363 	  strncpy (temp, inote.namedata, inote.namesz);
9364 	  temp[inote.namesz] = 0;
9365 
9366 	  /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
9367 	  inote.namedata = temp;
9368 	}
9369 
9370       res &= process_note (& inote);
9371 
9372       if (temp != NULL)
9373 	{
9374 	  free (temp);
9375 	  temp = NULL;
9376 	}
9377     }
9378 
9379   free (pnotes);
9380 
9381   return res;
9382 }
9383 
9384 static int
process_corefile_note_segments(FILE * file)9385 process_corefile_note_segments (FILE *file)
9386 {
9387   Elf_Internal_Phdr *segment;
9388   unsigned int i;
9389   int res = 1;
9390 
9391   if (! get_program_headers (file))
9392       return 0;
9393 
9394   for (i = 0, segment = program_headers;
9395        i < elf_header.e_phnum;
9396        i++, segment++)
9397     {
9398       if (segment->p_type == PT_NOTE)
9399 	res &= process_corefile_note_segment (file,
9400 					      (bfd_vma) segment->p_offset,
9401 					      (bfd_vma) segment->p_filesz);
9402     }
9403 
9404   return res;
9405 }
9406 
9407 static int
process_note_sections(FILE * file)9408 process_note_sections (FILE *file)
9409 {
9410   Elf_Internal_Shdr *section;
9411   unsigned long i;
9412   int res = 1;
9413 
9414   for (i = 0, section = section_headers;
9415        i < elf_header.e_shnum;
9416        i++, section++)
9417     if (section->sh_type == SHT_NOTE)
9418       res &= process_corefile_note_segment (file,
9419 					    (bfd_vma) section->sh_offset,
9420 					    (bfd_vma) section->sh_size);
9421 
9422   return res;
9423 }
9424 
9425 static int
process_notes(FILE * file)9426 process_notes (FILE *file)
9427 {
9428   /* If we have not been asked to display the notes then do nothing.  */
9429   if (! do_notes)
9430     return 1;
9431 
9432   if (elf_header.e_type != ET_CORE)
9433     return process_note_sections (file);
9434 
9435   /* No program headers means no NOTE segment.  */
9436   if (elf_header.e_phnum > 0)
9437     return process_corefile_note_segments (file);
9438 
9439   printf (_("No note segments present in the core file.\n"));
9440   return 1;
9441 }
9442 
9443 static int
process_arch_specific(FILE * file)9444 process_arch_specific (FILE *file)
9445 {
9446   if (! do_arch)
9447     return 1;
9448 
9449   switch (elf_header.e_machine)
9450     {
9451     case EM_ARM:
9452       return process_arm_specific (file);
9453     case EM_MIPS:
9454     case EM_MIPS_RS3_LE:
9455       return process_mips_specific (file);
9456       break;
9457     case EM_PPC:
9458       return process_power_specific (file);
9459       break;
9460     default:
9461       break;
9462     }
9463   return 1;
9464 }
9465 
9466 static int
get_file_header(FILE * file)9467 get_file_header (FILE *file)
9468 {
9469   /* Read in the identity array.  */
9470   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9471     return 0;
9472 
9473   /* Determine how to read the rest of the header.  */
9474   switch (elf_header.e_ident[EI_DATA])
9475     {
9476     default: /* fall through */
9477     case ELFDATANONE: /* fall through */
9478     case ELFDATA2LSB:
9479       byte_get = byte_get_little_endian;
9480       byte_put = byte_put_little_endian;
9481       break;
9482     case ELFDATA2MSB:
9483       byte_get = byte_get_big_endian;
9484       byte_put = byte_put_big_endian;
9485       break;
9486     }
9487 
9488   /* For now we only support 32 bit and 64 bit ELF files.  */
9489   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9490 
9491   /* Read in the rest of the header.  */
9492   if (is_32bit_elf)
9493     {
9494       Elf32_External_Ehdr ehdr32;
9495 
9496       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9497 	return 0;
9498 
9499       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
9500       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
9501       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
9502       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
9503       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
9504       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
9505       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
9506       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
9507       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9508       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
9509       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9510       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
9511       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
9512     }
9513   else
9514     {
9515       Elf64_External_Ehdr ehdr64;
9516 
9517       /* If we have been compiled with sizeof (bfd_vma) == 4, then
9518 	 we will not be able to cope with the 64bit data found in
9519 	 64 ELF files.  Detect this now and abort before we start
9520 	 overwriting things.  */
9521       if (sizeof (bfd_vma) < 8)
9522 	{
9523 	  error (_("This instance of readelf has been built without support for a\n\
9524 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9525 	  return 0;
9526 	}
9527 
9528       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9529 	return 0;
9530 
9531       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
9532       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
9533       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
9534       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
9535       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
9536       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
9537       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
9538       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
9539       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9540       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
9541       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9542       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
9543       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
9544     }
9545 
9546   if (elf_header.e_shoff)
9547     {
9548       /* There may be some extensions in the first section header.  Don't
9549 	 bomb if we can't read it.  */
9550       if (is_32bit_elf)
9551 	get_32bit_section_headers (file, 1);
9552       else
9553 	get_64bit_section_headers (file, 1);
9554     }
9555 
9556   is_relocatable = elf_header.e_type == ET_REL;
9557 
9558   return 1;
9559 }
9560 
9561 /* Process one ELF object file according to the command line options.
9562    This file may actually be stored in an archive.  The file is
9563    positioned at the start of the ELF object.  */
9564 
9565 static int
process_object(char * file_name,FILE * file)9566 process_object (char *file_name, FILE *file)
9567 {
9568   unsigned int i;
9569 
9570   if (! get_file_header (file))
9571     {
9572       error (_("%s: Failed to read file header\n"), file_name);
9573       return 1;
9574     }
9575 
9576   /* Initialise per file variables.  */
9577   for (i = NUM_ELEM (version_info); i--;)
9578     version_info[i] = 0;
9579 
9580   for (i = NUM_ELEM (dynamic_info); i--;)
9581     dynamic_info[i] = 0;
9582 
9583   /* Process the file.  */
9584   if (show_name)
9585     printf (_("\nFile: %s\n"), file_name);
9586 
9587   /* Initialise the dump_sects array from the cmdline_dump_sects array.
9588      Note we do this even if cmdline_dump_sects is empty because we
9589      must make sure that the dump_sets array is zeroed out before each
9590      object file is processed.  */
9591   if (num_dump_sects > num_cmdline_dump_sects)
9592     memset (dump_sects, 0, num_dump_sects);
9593 
9594   if (num_cmdline_dump_sects > 0)
9595     {
9596       if (num_dump_sects == 0)
9597 	/* A sneaky way of allocating the dump_sects array.  */
9598 	request_dump (num_cmdline_dump_sects, 0);
9599 
9600       assert (num_dump_sects >= num_cmdline_dump_sects);
9601       memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
9602     }
9603 
9604   if (! process_file_header ())
9605     return 1;
9606 
9607   if (! process_section_headers (file))
9608     {
9609       /* Without loaded section headers we cannot process lots of
9610 	 things.  */
9611       do_unwind = do_version = do_dump = do_arch = 0;
9612 
9613       if (! do_using_dynamic)
9614 	do_syms = do_reloc = 0;
9615     }
9616 
9617   if (! process_section_groups (file))
9618     {
9619       /* Without loaded section groups we cannot process unwind.  */
9620       do_unwind = 0;
9621     }
9622 
9623   if (process_program_headers (file))
9624     process_dynamic_section (file);
9625 
9626   process_relocs (file);
9627 
9628   process_unwind (file);
9629 
9630   process_symbol_table (file);
9631 
9632   process_syminfo (file);
9633 
9634   process_version_sections (file);
9635 
9636   process_section_contents (file);
9637 
9638   process_notes (file);
9639 
9640   process_gnu_liblist (file);
9641 
9642   process_arch_specific (file);
9643 
9644   if (program_headers)
9645     {
9646       free (program_headers);
9647       program_headers = NULL;
9648     }
9649 
9650   if (section_headers)
9651     {
9652       free (section_headers);
9653       section_headers = NULL;
9654     }
9655 
9656   if (string_table)
9657     {
9658       free (string_table);
9659       string_table = NULL;
9660       string_table_length = 0;
9661     }
9662 
9663   if (dynamic_strings)
9664     {
9665       free (dynamic_strings);
9666       dynamic_strings = NULL;
9667       dynamic_strings_length = 0;
9668     }
9669 
9670   if (dynamic_symbols)
9671     {
9672       free (dynamic_symbols);
9673       dynamic_symbols = NULL;
9674       num_dynamic_syms = 0;
9675     }
9676 
9677   if (dynamic_syminfo)
9678     {
9679       free (dynamic_syminfo);
9680       dynamic_syminfo = NULL;
9681     }
9682 
9683   if (section_headers_groups)
9684     {
9685       free (section_headers_groups);
9686       section_headers_groups = NULL;
9687     }
9688 
9689   if (section_groups)
9690     {
9691       struct group_list *g, *next;
9692 
9693       for (i = 0; i < group_count; i++)
9694 	{
9695 	  for (g = section_groups [i].root; g != NULL; g = next)
9696 	    {
9697 	      next = g->next;
9698 	      free (g);
9699 	    }
9700 	}
9701 
9702       free (section_groups);
9703       section_groups = NULL;
9704     }
9705 
9706   free_debug_memory ();
9707 
9708   return 0;
9709 }
9710 
9711 /* Process an ELF archive.  The file is positioned just after the
9712    ARMAG string.  */
9713 
9714 static int
process_archive(char * file_name,FILE * file)9715 process_archive (char *file_name, FILE *file)
9716 {
9717   struct ar_hdr arhdr;
9718   size_t got;
9719   unsigned long size;
9720   char *longnames = NULL;
9721   unsigned long longnames_size = 0;
9722   size_t file_name_size;
9723   int ret;
9724 
9725   show_name = 1;
9726 
9727   got = fread (&arhdr, 1, sizeof arhdr, file);
9728   if (got != sizeof arhdr)
9729     {
9730       if (got == 0)
9731 	return 0;
9732 
9733       error (_("%s: failed to read archive header\n"), file_name);
9734       return 1;
9735     }
9736 
9737   if (const_strneq (arhdr.ar_name, "/               "))
9738     {
9739       /* This is the archive symbol table.  Skip it.
9740 	 FIXME: We should have an option to dump it.  */
9741       size = strtoul (arhdr.ar_size, NULL, 10);
9742       if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
9743 	{
9744 	  error (_("%s: failed to skip archive symbol table\n"), file_name);
9745 	  return 1;
9746 	}
9747 
9748       got = fread (&arhdr, 1, sizeof arhdr, file);
9749       if (got != sizeof arhdr)
9750 	{
9751 	  if (got == 0)
9752 	    return 0;
9753 
9754 	  error (_("%s: failed to read archive header\n"), file_name);
9755 	  return 1;
9756 	}
9757     }
9758 
9759   if (const_strneq (arhdr.ar_name, "//              "))
9760     {
9761       /* This is the archive string table holding long member
9762 	 names.  */
9763 
9764       longnames_size = strtoul (arhdr.ar_size, NULL, 10);
9765 
9766       longnames = malloc (longnames_size);
9767       if (longnames == NULL)
9768 	{
9769 	  error (_("Out of memory\n"));
9770 	  return 1;
9771 	}
9772 
9773       if (fread (longnames, longnames_size, 1, file) != 1)
9774 	{
9775 	  free (longnames);
9776 	  error (_("%s: failed to read string table\n"), file_name);
9777 	  return 1;
9778 	}
9779 
9780       if ((longnames_size & 1) != 0)
9781 	(void) getc (file);
9782 
9783       got = fread (&arhdr, 1, sizeof arhdr, file);
9784       if (got != sizeof arhdr)
9785 	{
9786 	  free (longnames);
9787 
9788 	  if (got == 0)
9789 	    return 0;
9790 
9791 	  error (_("%s: failed to read archive header\n"), file_name);
9792 	  return 1;
9793 	}
9794     }
9795 
9796   file_name_size = strlen (file_name);
9797   ret = 0;
9798 
9799   while (1)
9800     {
9801       char *name;
9802       char *nameend;
9803       char *namealc;
9804 
9805       if (arhdr.ar_name[0] == '/')
9806 	{
9807 	  unsigned long off;
9808 
9809 	  off = strtoul (arhdr.ar_name + 1, NULL, 10);
9810 	  if (off >= longnames_size)
9811 	    {
9812 	      error (_("%s: invalid archive string table offset %lu\n"), file_name, off);
9813 	      ret = 1;
9814 	      break;
9815 	    }
9816 
9817 	  name = longnames + off;
9818 	  nameend = memchr (name, '/', longnames_size - off);
9819 	}
9820       else
9821 	{
9822 	  name = arhdr.ar_name;
9823 	  nameend = memchr (name, '/', 16);
9824 	}
9825 
9826       if (nameend == NULL)
9827 	{
9828 	  error (_("%s: bad archive file name\n"), file_name);
9829 	  ret = 1;
9830 	  break;
9831 	}
9832 
9833       namealc = malloc (file_name_size + (nameend - name) + 3);
9834       if (namealc == NULL)
9835 	{
9836 	  error (_("Out of memory\n"));
9837 	  ret = 1;
9838 	  break;
9839 	}
9840 
9841       memcpy (namealc, file_name, file_name_size);
9842       namealc[file_name_size] = '(';
9843       memcpy (namealc + file_name_size + 1, name, nameend - name);
9844       namealc[file_name_size + 1 + (nameend - name)] = ')';
9845       namealc[file_name_size + 2 + (nameend - name)] = '\0';
9846 
9847       archive_file_offset = ftell (file);
9848       archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
9849 
9850       ret |= process_object (namealc, file);
9851 
9852       free (namealc);
9853 
9854       if (fseek (file,
9855 		 (archive_file_offset
9856 		  + archive_file_size
9857 		  + (archive_file_size & 1)),
9858 		 SEEK_SET) != 0)
9859 	{
9860 	  error (_("%s: failed to seek to next archive header\n"), file_name);
9861 	  ret = 1;
9862 	  break;
9863 	}
9864 
9865       got = fread (&arhdr, 1, sizeof arhdr, file);
9866       if (got != sizeof arhdr)
9867 	{
9868 	  if (got == 0)
9869 	    break;
9870 
9871 	  error (_("%s: failed to read archive header\n"), file_name);
9872 	  ret = 1;
9873 	  break;
9874 	}
9875     }
9876 
9877   if (longnames != 0)
9878     free (longnames);
9879 
9880   return ret;
9881 }
9882 
9883 static int
process_file(char * file_name)9884 process_file (char *file_name)
9885 {
9886   FILE *file;
9887   struct stat statbuf;
9888   char armag[SARMAG];
9889   int ret;
9890 
9891   if (stat (file_name, &statbuf) < 0)
9892     {
9893       if (errno == ENOENT)
9894 	error (_("'%s': No such file\n"), file_name);
9895       else
9896 	error (_("Could not locate '%s'.  System error message: %s\n"),
9897 	       file_name, strerror (errno));
9898       return 1;
9899     }
9900 
9901   if (! S_ISREG (statbuf.st_mode))
9902     {
9903       error (_("'%s' is not an ordinary file\n"), file_name);
9904       return 1;
9905     }
9906 
9907   file = fopen (file_name, "rb");
9908   if (file == NULL)
9909     {
9910       error (_("Input file '%s' is not readable.\n"), file_name);
9911       return 1;
9912     }
9913 
9914   if (fread (armag, SARMAG, 1, file) != 1)
9915     {
9916       error (_("%s: Failed to read file header\n"), file_name);
9917       fclose (file);
9918       return 1;
9919     }
9920 
9921   if (memcmp (armag, ARMAG, SARMAG) == 0)
9922     ret = process_archive (file_name, file);
9923   else
9924     {
9925       rewind (file);
9926       archive_file_size = archive_file_offset = 0;
9927       ret = process_object (file_name, file);
9928     }
9929 
9930   fclose (file);
9931 
9932   return ret;
9933 }
9934 
9935 #ifdef SUPPORT_DISASSEMBLY
9936 /* Needed by the i386 disassembler.  For extra credit, someone could
9937    fix this so that we insert symbolic addresses here, esp for GOT/PLT
9938    symbols.  */
9939 
9940 void
print_address(unsigned int addr,FILE * outfile)9941 print_address (unsigned int addr, FILE *outfile)
9942 {
9943   fprintf (outfile,"0x%8.8x", addr);
9944 }
9945 
9946 /* Needed by the i386 disassembler.  */
9947 void
db_task_printsym(unsigned int addr)9948 db_task_printsym (unsigned int addr)
9949 {
9950   print_address (addr, stderr);
9951 }
9952 #endif
9953 
9954 int
main(int argc,char ** argv)9955 main (int argc, char **argv)
9956 {
9957   int err;
9958 
9959 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9960   setlocale (LC_MESSAGES, "");
9961 #endif
9962 #if defined (HAVE_SETLOCALE)
9963   setlocale (LC_CTYPE, "");
9964 #endif
9965   bindtextdomain (PACKAGE, LOCALEDIR);
9966   textdomain (PACKAGE);
9967 
9968   expandargv (&argc, &argv);
9969 
9970   parse_args (argc, argv);
9971 
9972   if (num_dump_sects > 0)
9973     {
9974       /* Make a copy of the dump_sects array.  */
9975       cmdline_dump_sects = malloc (num_dump_sects);
9976       if (cmdline_dump_sects == NULL)
9977 	error (_("Out of memory allocating dump request table.\n"));
9978       else
9979 	{
9980 	  memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
9981 	  num_cmdline_dump_sects = num_dump_sects;
9982 	}
9983     }
9984 
9985   if (optind < (argc - 1))
9986     show_name = 1;
9987 
9988   err = 0;
9989   while (optind < argc)
9990     err |= process_file (argv[optind++]);
9991 
9992   if (dump_sects != NULL)
9993     free (dump_sects);
9994   if (cmdline_dump_sects != NULL)
9995     free (cmdline_dump_sects);
9996 
9997   return err;
9998 }
9999