OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [binutils/] [readelf.c] - Blame information for rev 846

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.