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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 205 julius
/* objdump.c -- dump information about an object file.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GNU Binutils.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3, or (at your option)
11
   any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
 
23
 
24
/* Objdump overview.
25
 
26
   Objdump displays information about one or more object files, either on
27
   their own, or inside libraries.  It is commonly used as a disassembler,
28
   but it can also display information about file headers, symbol tables,
29
   relocations, debugging directives and more.
30
 
31
   The flow of execution is as follows:
32
 
33
   1. Command line arguments are checked for control switches and the
34
      information to be displayed is selected.
35
 
36
   2. Any remaining arguments are assumed to be object files, and they are
37
      processed in order by display_bfd().  If the file is an archive each
38
      of its elements is processed in turn.
39
 
40
   3. The file's target architecture and binary file format are determined
41
      by bfd_check_format().  If they are recognised, then dump_bfd() is
42
      called.
43
 
44
   4. dump_bfd() in turn calls separate functions to display the requested
45
      item(s) of information(s).  For example disassemble_data() is called if
46
      a disassembly has been requested.
47
 
48
   When disassembling the code loops through blocks of instructions bounded
49
   by symbols, calling disassemble_bytes() on each block.  The actual
50
   disassembling is done by the libopcodes library, via a function pointer
51
   supplied by the disassembler() function.  */
52
 
53
#include "sysdep.h"
54
#include "bfd.h"
55
#include "elf-bfd.h"
56
#include "progress.h"
57
#include "bucomm.h"
58
#include "dwarf.h"
59
#include "getopt.h"
60
#include "safe-ctype.h"
61
#include "dis-asm.h"
62
#include "libiberty.h"
63
#include "demangle.h"
64
#include "filenames.h"
65
#include "debug.h"
66
#include "budbg.h"
67
 
68
#ifdef HAVE_MMAP
69
#include <sys/mman.h>
70
#endif
71
 
72
#include <sys/stat.h>
73
 
74
/* Internal headers for the ELF .stab-dump code - sorry.  */
75
#define BYTES_IN_WORD   32
76
#include "aout/aout64.h"
77
 
78
/* Exit status.  */
79
static int exit_status = 0;
80
 
81
static char *default_target = NULL;     /* Default at runtime.  */
82
 
83
/* The following variables are set based on arguments passed on the
84
   command line.  */
85
static int show_version = 0;             /* Show the version number.  */
86
static int dump_section_contents;       /* -s */
87
static int dump_section_headers;        /* -h */
88
static bfd_boolean dump_file_header;    /* -f */
89
static int dump_symtab;                 /* -t */
90
static int dump_dynamic_symtab;         /* -T */
91
static int dump_reloc_info;             /* -r */
92
static int dump_dynamic_reloc_info;     /* -R */
93
static int dump_ar_hdrs;                /* -a */
94
static int dump_private_headers;        /* -p */
95
static int prefix_addresses;            /* --prefix-addresses */
96
static int with_line_numbers;           /* -l */
97
static bfd_boolean with_source_code;    /* -S */
98
static int show_raw_insn;               /* --show-raw-insn */
99
static int dump_dwarf_section_info;     /* --dwarf */
100
static int dump_stab_section_info;      /* --stabs */
101
static int do_demangle;                 /* -C, --demangle */
102
static bfd_boolean disassemble;         /* -d */
103
static bfd_boolean disassemble_all;     /* -D */
104
static int disassemble_zeroes;          /* --disassemble-zeroes */
105
static bfd_boolean formats_info;        /* -i */
106
static int wide_output;                 /* -w */
107
static int insn_width;                  /* --insn-width */
108
static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
109
static bfd_vma stop_address = (bfd_vma) -1;  /* --stop-address */
110
static int dump_debugging;              /* --debugging */
111
static int dump_debugging_tags;         /* --debugging-tags */
112
static int dump_special_syms = 0;        /* --special-syms */
113
static bfd_vma adjust_section_vma = 0;   /* --adjust-vma */
114
static int file_start_context = 0;      /* --file-start-context */
115
static bfd_boolean display_file_offsets;/* -F */
116
static const char *prefix;              /* --prefix */
117
static int prefix_strip;                /* --prefix-strip */
118
static size_t prefix_length;
119
 
120
/* Pointer to an array of section names provided by
121
   one or more "-j secname" command line options.  */
122
static char **only;
123
/* The total number of slots in the only[] array.  */
124
static size_t only_size = 0;
125
/* The number of occupied slots in the only[] array.  */
126
static size_t only_used = 0;
127
 
128
/* Variables for handling include file path table.  */
129
static const char **include_paths;
130
static int include_path_count;
131
 
132
/* Extra info to pass to the section disassembler and address printing
133
   function.  */
134
struct objdump_disasm_info
135
{
136
  bfd *              abfd;
137
  asection *         sec;
138
  bfd_boolean        require_sec;
139
  arelent **         dynrelbuf;
140
  long               dynrelcount;
141
  disassembler_ftype disassemble_fn;
142
  arelent *          reloc;
143
};
144
 
145
/* Architecture to disassemble for, or default if NULL.  */
146
static char *machine = NULL;
147
 
148
/* Target specific options to the disassembler.  */
149
static char *disassembler_options = NULL;
150
 
151
/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN.  */
152
static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
153
 
154
/* The symbol table.  */
155
static asymbol **syms;
156
 
157
/* Number of symbols in `syms'.  */
158
static long symcount = 0;
159
 
160
/* The sorted symbol table.  */
161
static asymbol **sorted_syms;
162
 
163
/* Number of symbols in `sorted_syms'.  */
164
static long sorted_symcount = 0;
165
 
166
/* The dynamic symbol table.  */
167
static asymbol **dynsyms;
168
 
169
/* The synthetic symbol table.  */
170
static asymbol *synthsyms;
171
static long synthcount = 0;
172
 
173
/* Number of symbols in `dynsyms'.  */
174
static long dynsymcount = 0;
175
 
176
static bfd_byte *stabs;
177
static bfd_size_type stab_size;
178
 
179
static char *strtab;
180
static bfd_size_type stabstr_size;
181
 
182
static bfd_boolean is_relocatable = FALSE;
183
 
184
static void
185
usage (FILE *stream, int status)
186
{
187
  fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
188
  fprintf (stream, _(" Display information from object <file(s)>.\n"));
189
  fprintf (stream, _(" At least one of the following switches must be given:\n"));
190
  fprintf (stream, _("\
191
  -a, --archive-headers    Display archive header information\n\
192
  -f, --file-headers       Display the contents of the overall file header\n\
193
  -p, --private-headers    Display object format specific file header contents\n\
194
  -h, --[section-]headers  Display the contents of the section headers\n\
195
  -x, --all-headers        Display the contents of all headers\n\
196
  -d, --disassemble        Display assembler contents of executable sections\n\
197
  -D, --disassemble-all    Display assembler contents of all sections\n\
198
  -S, --source             Intermix source code with disassembly\n\
199
  -s, --full-contents      Display the full contents of all sections requested\n\
200
  -g, --debugging          Display debug information in object file\n\
201
  -e, --debugging-tags     Display debug information using ctags style\n\
202
  -G, --stabs              Display (in raw form) any STABS info in the file\n\
203
  -W[lLiaprmfFsoR] or\n\
204
  --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
205
                           Display DWARF info in the file\n\
206
  -t, --syms               Display the contents of the symbol table(s)\n\
207
  -T, --dynamic-syms       Display the contents of the dynamic symbol table\n\
208
  -r, --reloc              Display the relocation entries in the file\n\
209
  -R, --dynamic-reloc      Display the dynamic relocation entries in the file\n\
210
  @<file>                  Read options from <file>\n\
211
  -v, --version            Display this program's version number\n\
212
  -i, --info               List object formats and architectures supported\n\
213
  -H, --help               Display this information\n\
214
"));
215
  if (status != 2)
216
    {
217
      fprintf (stream, _("\n The following switches are optional:\n"));
218
      fprintf (stream, _("\
219
  -b, --target=BFDNAME           Specify the target object format as BFDNAME\n\
220
  -m, --architecture=MACHINE     Specify the target architecture as MACHINE\n\
221
  -j, --section=NAME             Only display information for section NAME\n\
222
  -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
223
  -EB --endian=big               Assume big endian format when disassembling\n\
224
  -EL --endian=little            Assume little endian format when disassembling\n\
225
      --file-start-context       Include context from start of file (with -S)\n\
226
  -I, --include=DIR              Add DIR to search list for source files\n\
227
  -l, --line-numbers             Include line numbers and filenames in output\n\
228
  -F, --file-offsets             Include file offsets when displaying information\n\
229
  -C, --demangle[=STYLE]         Decode mangled/processed symbol names\n\
230
                                  The STYLE, if specified, can be `auto', `gnu',\n\
231
                                  `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
232
                                  or `gnat'\n\
233
  -w, --wide                     Format output for more than 80 columns\n\
234
  -z, --disassemble-zeroes       Do not skip blocks of zeroes when disassembling\n\
235
      --start-address=ADDR       Only process data whose address is >= ADDR\n\
236
      --stop-address=ADDR        Only process data whose address is <= ADDR\n\
237
      --prefix-addresses         Print complete address alongside disassembly\n\
238
      --[no-]show-raw-insn       Display hex alongside symbolic disassembly\n\
239
      --insn-width=WIDTH         Display WIDTH bytes on a signle line for -d\n\
240
      --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
241
      --special-syms             Include special symbols in symbol dumps\n\
242
      --prefix=PREFIX            Add PREFIX to absolute paths for -S\n\
243
      --prefix-strip=LEVEL       Strip initial directory names for -S\n\
244
\n"));
245
      list_supported_targets (program_name, stream);
246
      list_supported_architectures (program_name, stream);
247
 
248
      disassembler_usage (stream);
249
    }
250
  if (REPORT_BUGS_TO[0] && status == 0)
251
    fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252
  exit (status);
253
}
254
 
255
/* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
256
enum option_values
257
  {
258
    OPTION_ENDIAN=150,
259
    OPTION_START_ADDRESS,
260
    OPTION_STOP_ADDRESS,
261
    OPTION_DWARF,
262
    OPTION_PREFIX,
263
    OPTION_PREFIX_STRIP,
264
    OPTION_INSN_WIDTH,
265
    OPTION_ADJUST_VMA
266
  };
267
 
268
static struct option long_options[]=
269
{
270
  {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
271
  {"all-headers", no_argument, NULL, 'x'},
272
  {"private-headers", no_argument, NULL, 'p'},
273
  {"architecture", required_argument, NULL, 'm'},
274
  {"archive-headers", no_argument, NULL, 'a'},
275
  {"debugging", no_argument, NULL, 'g'},
276
  {"debugging-tags", no_argument, NULL, 'e'},
277
  {"demangle", optional_argument, NULL, 'C'},
278
  {"disassemble", no_argument, NULL, 'd'},
279
  {"disassemble-all", no_argument, NULL, 'D'},
280
  {"disassembler-options", required_argument, NULL, 'M'},
281
  {"disassemble-zeroes", no_argument, NULL, 'z'},
282
  {"dynamic-reloc", no_argument, NULL, 'R'},
283
  {"dynamic-syms", no_argument, NULL, 'T'},
284
  {"endian", required_argument, NULL, OPTION_ENDIAN},
285
  {"file-headers", no_argument, NULL, 'f'},
286
  {"file-offsets", no_argument, NULL, 'F'},
287
  {"file-start-context", no_argument, &file_start_context, 1},
288
  {"full-contents", no_argument, NULL, 's'},
289
  {"headers", no_argument, NULL, 'h'},
290
  {"help", no_argument, NULL, 'H'},
291
  {"info", no_argument, NULL, 'i'},
292
  {"line-numbers", no_argument, NULL, 'l'},
293
  {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
294
  {"prefix-addresses", no_argument, &prefix_addresses, 1},
295
  {"reloc", no_argument, NULL, 'r'},
296
  {"section", required_argument, NULL, 'j'},
297
  {"section-headers", no_argument, NULL, 'h'},
298
  {"show-raw-insn", no_argument, &show_raw_insn, 1},
299
  {"source", no_argument, NULL, 'S'},
300
  {"special-syms", no_argument, &dump_special_syms, 1},
301
  {"include", required_argument, NULL, 'I'},
302
  {"dwarf", optional_argument, NULL, OPTION_DWARF},
303
  {"stabs", no_argument, NULL, 'G'},
304
  {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
305
  {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
306
  {"syms", no_argument, NULL, 't'},
307
  {"target", required_argument, NULL, 'b'},
308
  {"version", no_argument, NULL, 'V'},
309
  {"wide", no_argument, NULL, 'w'},
310
  {"prefix", required_argument, NULL, OPTION_PREFIX},
311
  {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
312
  {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
313
  {0, no_argument, 0, 0}
314
};
315
 
316
static void
317
nonfatal (const char *msg)
318
{
319
  bfd_nonfatal (msg);
320
  exit_status = 1;
321
}
322
 
323
/* Returns TRUE if the specified section should be dumped.  */
324
 
325
static bfd_boolean
326
process_section_p (asection * section)
327
{
328
  size_t i;
329
 
330
  if (only == NULL)
331
    return TRUE;
332
 
333
  for (i = 0; i < only_used; i++)
334
    if (strcmp (only [i], section->name) == 0)
335
      return TRUE;
336
 
337
  return FALSE;
338
}
339
 
340
static void
341
dump_section_header (bfd *abfd, asection *section,
342
                     void *ignored ATTRIBUTE_UNUSED)
343
{
344
  char *comma = "";
345
  unsigned int opb = bfd_octets_per_byte (abfd);
346
 
347
  /* Ignore linker created section.  See elfNN_ia64_object_p in
348
     bfd/elfxx-ia64.c.  */
349
  if (section->flags & SEC_LINKER_CREATED)
350
    return;
351
 
352
  /* PR 10413: Skip sections that we are ignoring.  */
353
  if (! process_section_p (section))
354
    return;
355
 
356
  printf ("%3d %-13s %08lx  ", section->index,
357
          bfd_get_section_name (abfd, section),
358
          (unsigned long) bfd_section_size (abfd, section) / opb);
359
  bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
360
  printf ("  ");
361
  bfd_printf_vma (abfd, section->lma);
362
  printf ("  %08lx  2**%u", (unsigned long) section->filepos,
363
          bfd_get_section_alignment (abfd, section));
364
  if (! wide_output)
365
    printf ("\n                ");
366
  printf ("  ");
367
 
368
#define PF(x, y) \
369
  if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
370
 
371
  PF (SEC_HAS_CONTENTS, "CONTENTS");
372
  PF (SEC_ALLOC, "ALLOC");
373
  PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
374
  PF (SEC_LOAD, "LOAD");
375
  PF (SEC_RELOC, "RELOC");
376
  PF (SEC_READONLY, "READONLY");
377
  PF (SEC_CODE, "CODE");
378
  PF (SEC_DATA, "DATA");
379
  PF (SEC_ROM, "ROM");
380
  PF (SEC_DEBUGGING, "DEBUGGING");
381
  PF (SEC_NEVER_LOAD, "NEVER_LOAD");
382
  PF (SEC_EXCLUDE, "EXCLUDE");
383
  PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
384
  if (bfd_get_arch (abfd) == bfd_arch_tic54x)
385
    {
386
      PF (SEC_TIC54X_BLOCK, "BLOCK");
387
      PF (SEC_TIC54X_CLINK, "CLINK");
388
    }
389
  PF (SEC_SMALL_DATA, "SMALL_DATA");
390
  if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
391
    PF (SEC_COFF_SHARED, "SHARED");
392
  PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
393
  PF (SEC_GROUP, "GROUP");
394
 
395
  if ((section->flags & SEC_LINK_ONCE) != 0)
396
    {
397
      const char *ls;
398
      struct coff_comdat_info *comdat;
399
 
400
      switch (section->flags & SEC_LINK_DUPLICATES)
401
        {
402
        default:
403
          abort ();
404
        case SEC_LINK_DUPLICATES_DISCARD:
405
          ls = "LINK_ONCE_DISCARD";
406
          break;
407
        case SEC_LINK_DUPLICATES_ONE_ONLY:
408
          ls = "LINK_ONCE_ONE_ONLY";
409
          break;
410
        case SEC_LINK_DUPLICATES_SAME_SIZE:
411
          ls = "LINK_ONCE_SAME_SIZE";
412
          break;
413
        case SEC_LINK_DUPLICATES_SAME_CONTENTS:
414
          ls = "LINK_ONCE_SAME_CONTENTS";
415
          break;
416
        }
417
      printf ("%s%s", comma, ls);
418
 
419
      comdat = bfd_coff_get_comdat_section (abfd, section);
420
      if (comdat != NULL)
421
        printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
422
 
423
      comma = ", ";
424
    }
425
 
426
  printf ("\n");
427
#undef PF
428
}
429
 
430
static void
431
dump_headers (bfd *abfd)
432
{
433
  printf (_("Sections:\n"));
434
 
435
#ifndef BFD64
436
  printf (_("Idx Name          Size      VMA       LMA       File off  Algn"));
437
#else
438
  /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses.  */
439
  if (bfd_get_arch_size (abfd) == 32)
440
    printf (_("Idx Name          Size      VMA       LMA       File off  Algn"));
441
  else
442
    printf (_("Idx Name          Size      VMA               LMA               File off  Algn"));
443
#endif
444
 
445
  if (wide_output)
446
    printf (_("  Flags"));
447
  if (abfd->flags & HAS_LOAD_PAGE)
448
    printf (_("  Pg"));
449
  printf ("\n");
450
 
451
  bfd_map_over_sections (abfd, dump_section_header, NULL);
452
}
453
 
454
static asymbol **
455
slurp_symtab (bfd *abfd)
456
{
457
  asymbol **sy = NULL;
458
  long storage;
459
 
460
  if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
461
    {
462
      symcount = 0;
463
      return NULL;
464
    }
465
 
466
  storage = bfd_get_symtab_upper_bound (abfd);
467
  if (storage < 0)
468
    bfd_fatal (bfd_get_filename (abfd));
469
  if (storage)
470
    sy = (asymbol **) xmalloc (storage);
471
 
472
  symcount = bfd_canonicalize_symtab (abfd, sy);
473
  if (symcount < 0)
474
    bfd_fatal (bfd_get_filename (abfd));
475
  return sy;
476
}
477
 
478
/* Read in the dynamic symbols.  */
479
 
480
static asymbol **
481
slurp_dynamic_symtab (bfd *abfd)
482
{
483
  asymbol **sy = NULL;
484
  long storage;
485
 
486
  storage = bfd_get_dynamic_symtab_upper_bound (abfd);
487
  if (storage < 0)
488
    {
489
      if (!(bfd_get_file_flags (abfd) & DYNAMIC))
490
        {
491
          non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
492
          dynsymcount = 0;
493
          return NULL;
494
        }
495
 
496
      bfd_fatal (bfd_get_filename (abfd));
497
    }
498
  if (storage)
499
    sy = (asymbol **) xmalloc (storage);
500
 
501
  dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
502
  if (dynsymcount < 0)
503
    bfd_fatal (bfd_get_filename (abfd));
504
  return sy;
505
}
506
 
507
/* Filter out (in place) symbols that are useless for disassembly.
508
   COUNT is the number of elements in SYMBOLS.
509
   Return the number of useful symbols.  */
510
 
511
static long
512
remove_useless_symbols (asymbol **symbols, long count)
513
{
514
  asymbol **in_ptr = symbols, **out_ptr = symbols;
515
 
516
  while (--count >= 0)
517
    {
518
      asymbol *sym = *in_ptr++;
519
 
520
      if (sym->name == NULL || sym->name[0] == '\0')
521
        continue;
522
      if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
523
        continue;
524
      if (bfd_is_und_section (sym->section)
525
          || bfd_is_com_section (sym->section))
526
        continue;
527
 
528
      *out_ptr++ = sym;
529
    }
530
  return out_ptr - symbols;
531
}
532
 
533
/* Sort symbols into value order.  */
534
 
535
static int
536
compare_symbols (const void *ap, const void *bp)
537
{
538
  const asymbol *a = * (const asymbol **) ap;
539
  const asymbol *b = * (const asymbol **) bp;
540
  const char *an;
541
  const char *bn;
542
  size_t anl;
543
  size_t bnl;
544
  bfd_boolean af;
545
  bfd_boolean bf;
546
  flagword aflags;
547
  flagword bflags;
548
 
549
  if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
550
    return 1;
551
  else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
552
    return -1;
553
 
554
  if (a->section > b->section)
555
    return 1;
556
  else if (a->section < b->section)
557
    return -1;
558
 
559
  an = bfd_asymbol_name (a);
560
  bn = bfd_asymbol_name (b);
561
  anl = strlen (an);
562
  bnl = strlen (bn);
563
 
564
  /* The symbols gnu_compiled and gcc2_compiled convey no real
565
     information, so put them after other symbols with the same value.  */
566
  af = (strstr (an, "gnu_compiled") != NULL
567
        || strstr (an, "gcc2_compiled") != NULL);
568
  bf = (strstr (bn, "gnu_compiled") != NULL
569
        || strstr (bn, "gcc2_compiled") != NULL);
570
 
571
  if (af && ! bf)
572
    return 1;
573
  if (! af && bf)
574
    return -1;
575
 
576
  /* We use a heuristic for the file name, to try to sort it after
577
     more useful symbols.  It may not work on non Unix systems, but it
578
     doesn't really matter; the only difference is precisely which
579
     symbol names get printed.  */
580
 
581
#define file_symbol(s, sn, snl)                 \
582
  (((s)->flags & BSF_FILE) != 0                  \
583
   || ((sn)[(snl) - 2] == '.'                   \
584
       && ((sn)[(snl) - 1] == 'o'               \
585
           || (sn)[(snl) - 1] == 'a')))
586
 
587
  af = file_symbol (a, an, anl);
588
  bf = file_symbol (b, bn, bnl);
589
 
590
  if (af && ! bf)
591
    return 1;
592
  if (! af && bf)
593
    return -1;
594
 
595
  /* Try to sort global symbols before local symbols before function
596
     symbols before debugging symbols.  */
597
 
598
  aflags = a->flags;
599
  bflags = b->flags;
600
 
601
  if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
602
    {
603
      if ((aflags & BSF_DEBUGGING) != 0)
604
        return 1;
605
      else
606
        return -1;
607
    }
608
  if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
609
    {
610
      if ((aflags & BSF_FUNCTION) != 0)
611
        return -1;
612
      else
613
        return 1;
614
    }
615
  if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
616
    {
617
      if ((aflags & BSF_LOCAL) != 0)
618
        return 1;
619
      else
620
        return -1;
621
    }
622
  if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
623
    {
624
      if ((aflags & BSF_GLOBAL) != 0)
625
        return -1;
626
      else
627
        return 1;
628
    }
629
 
630
  /* Symbols that start with '.' might be section names, so sort them
631
     after symbols that don't start with '.'.  */
632
  if (an[0] == '.' && bn[0] != '.')
633
    return 1;
634
  if (an[0] != '.' && bn[0] == '.')
635
    return -1;
636
 
637
  /* Finally, if we can't distinguish them in any other way, try to
638
     get consistent results by sorting the symbols by name.  */
639
  return strcmp (an, bn);
640
}
641
 
642
/* Sort relocs into address order.  */
643
 
644
static int
645
compare_relocs (const void *ap, const void *bp)
646
{
647
  const arelent *a = * (const arelent **) ap;
648
  const arelent *b = * (const arelent **) bp;
649
 
650
  if (a->address > b->address)
651
    return 1;
652
  else if (a->address < b->address)
653
    return -1;
654
 
655
  /* So that associated relocations tied to the same address show up
656
     in the correct order, we don't do any further sorting.  */
657
  if (a > b)
658
    return 1;
659
  else if (a < b)
660
    return -1;
661
  else
662
    return 0;
663
}
664
 
665
/* Print an address (VMA) to the output stream in INFO.
666
   If SKIP_ZEROES is TRUE, omit leading zeroes.  */
667
 
668
static void
669
objdump_print_value (bfd_vma vma, struct disassemble_info *info,
670
                     bfd_boolean skip_zeroes)
671
{
672
  char buf[30];
673
  char *p;
674
  struct objdump_disasm_info *aux;
675
 
676
  aux = (struct objdump_disasm_info *) info->application_data;
677
  bfd_sprintf_vma (aux->abfd, buf, vma);
678
  if (! skip_zeroes)
679
    p = buf;
680
  else
681
    {
682
      for (p = buf; *p == '0'; ++p)
683
        ;
684
      if (*p == '\0')
685
        --p;
686
    }
687
  (*info->fprintf_func) (info->stream, "%s", p);
688
}
689
 
690
/* Print the name of a symbol.  */
691
 
692
static void
693
objdump_print_symname (bfd *abfd, struct disassemble_info *info,
694
                       asymbol *sym)
695
{
696
  char *alloc;
697
  const char *name;
698
 
699
  alloc = NULL;
700
  name = bfd_asymbol_name (sym);
701
  if (do_demangle && name[0] != '\0')
702
    {
703
      /* Demangle the name.  */
704
      alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
705
      if (alloc != NULL)
706
        name = alloc;
707
    }
708
 
709
  if (info != NULL)
710
    (*info->fprintf_func) (info->stream, "%s", name);
711
  else
712
    printf ("%s", name);
713
 
714
  if (alloc != NULL)
715
    free (alloc);
716
}
717
 
718
/* Locate a symbol given a bfd and a section (from INFO->application_data),
719
   and a VMA.  If INFO->application_data->require_sec is TRUE, then always
720
   require the symbol to be in the section.  Returns NULL if there is no
721
   suitable symbol.  If PLACE is not NULL, then *PLACE is set to the index
722
   of the symbol in sorted_syms.  */
723
 
724
static asymbol *
725
find_symbol_for_address (bfd_vma vma,
726
                         struct disassemble_info *info,
727
                         long *place)
728
{
729
  /* @@ Would it speed things up to cache the last two symbols returned,
730
     and maybe their address ranges?  For many processors, only one memory
731
     operand can be present at a time, so the 2-entry cache wouldn't be
732
     constantly churned by code doing heavy memory accesses.  */
733
 
734
  /* Indices in `sorted_syms'.  */
735
  long min = 0;
736
  long max = sorted_symcount;
737
  long thisplace;
738
  struct objdump_disasm_info *aux;
739
  bfd *abfd;
740
  asection *sec;
741
  unsigned int opb;
742
  bfd_boolean want_section;
743
 
744
  if (sorted_symcount < 1)
745
    return NULL;
746
 
747
  aux = (struct objdump_disasm_info *) info->application_data;
748
  abfd = aux->abfd;
749
  sec = aux->sec;
750
  opb = info->octets_per_byte;
751
 
752
  /* Perform a binary search looking for the closest symbol to the
753
     required value.  We are searching the range (min, max].  */
754
  while (min + 1 < max)
755
    {
756
      asymbol *sym;
757
 
758
      thisplace = (max + min) / 2;
759
      sym = sorted_syms[thisplace];
760
 
761
      if (bfd_asymbol_value (sym) > vma)
762
        max = thisplace;
763
      else if (bfd_asymbol_value (sym) < vma)
764
        min = thisplace;
765
      else
766
        {
767
          min = thisplace;
768
          break;
769
        }
770
    }
771
 
772
  /* The symbol we want is now in min, the low end of the range we
773
     were searching.  If there are several symbols with the same
774
     value, we want the first one.  */
775
  thisplace = min;
776
  while (thisplace > 0
777
         && (bfd_asymbol_value (sorted_syms[thisplace])
778
             == bfd_asymbol_value (sorted_syms[thisplace - 1])))
779
    --thisplace;
780
 
781
  /* Prefer a symbol in the current section if we have multple symbols
782
     with the same value, as can occur with overlays or zero size
783
     sections.  */
784
  min = thisplace;
785
  while (min < max
786
         && (bfd_asymbol_value (sorted_syms[min])
787
             == bfd_asymbol_value (sorted_syms[thisplace])))
788
    {
789
      if (sorted_syms[min]->section == sec
790
          && info->symbol_is_valid (sorted_syms[min], info))
791
        {
792
          thisplace = min;
793
 
794
          if (place != NULL)
795
            *place = thisplace;
796
 
797
          return sorted_syms[thisplace];
798
        }
799
      ++min;
800
    }
801
 
802
  /* If the file is relocatable, and the symbol could be from this
803
     section, prefer a symbol from this section over symbols from
804
     others, even if the other symbol's value might be closer.
805
 
806
     Note that this may be wrong for some symbol references if the
807
     sections have overlapping memory ranges, but in that case there's
808
     no way to tell what's desired without looking at the relocation
809
     table.
810
 
811
     Also give the target a chance to reject symbols.  */
812
  want_section = (aux->require_sec
813
                  || ((abfd->flags & HAS_RELOC) != 0
814
                      && vma >= bfd_get_section_vma (abfd, sec)
815
                      && vma < (bfd_get_section_vma (abfd, sec)
816
                                + bfd_section_size (abfd, sec) / opb)));
817
  if ((sorted_syms[thisplace]->section != sec && want_section)
818
      || !info->symbol_is_valid (sorted_syms[thisplace], info))
819
    {
820
      long i;
821
      long newplace = sorted_symcount;
822
 
823
      for (i = min - 1; i >= 0; i--)
824
        {
825
          if ((sorted_syms[i]->section == sec || !want_section)
826
              && info->symbol_is_valid (sorted_syms[i], info))
827
            {
828
              if (newplace == sorted_symcount)
829
                newplace = i;
830
 
831
              if (bfd_asymbol_value (sorted_syms[i])
832
                  != bfd_asymbol_value (sorted_syms[newplace]))
833
                break;
834
 
835
              /* Remember this symbol and keep searching until we reach
836
                 an earlier address.  */
837
              newplace = i;
838
            }
839
        }
840
 
841
      if (newplace != sorted_symcount)
842
        thisplace = newplace;
843
      else
844
        {
845
          /* We didn't find a good symbol with a smaller value.
846
             Look for one with a larger value.  */
847
          for (i = thisplace + 1; i < sorted_symcount; i++)
848
            {
849
              if ((sorted_syms[i]->section == sec || !want_section)
850
                  && info->symbol_is_valid (sorted_syms[i], info))
851
                {
852
                  thisplace = i;
853
                  break;
854
                }
855
            }
856
        }
857
 
858
      if ((sorted_syms[thisplace]->section != sec && want_section)
859
          || !info->symbol_is_valid (sorted_syms[thisplace], info))
860
        /* There is no suitable symbol.  */
861
        return NULL;
862
    }
863
 
864
  if (place != NULL)
865
    *place = thisplace;
866
 
867
  return sorted_syms[thisplace];
868
}
869
 
870
/* Print an address and the offset to the nearest symbol.  */
871
 
872
static void
873
objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
874
                             bfd_vma vma, struct disassemble_info *info,
875
                             bfd_boolean skip_zeroes)
876
{
877
  objdump_print_value (vma, info, skip_zeroes);
878
 
879
  if (sym == NULL)
880
    {
881
      bfd_vma secaddr;
882
 
883
      (*info->fprintf_func) (info->stream, " <%s",
884
                             bfd_get_section_name (abfd, sec));
885
      secaddr = bfd_get_section_vma (abfd, sec);
886
      if (vma < secaddr)
887
        {
888
          (*info->fprintf_func) (info->stream, "-0x");
889
          objdump_print_value (secaddr - vma, info, TRUE);
890
        }
891
      else if (vma > secaddr)
892
        {
893
          (*info->fprintf_func) (info->stream, "+0x");
894
          objdump_print_value (vma - secaddr, info, TRUE);
895
        }
896
      (*info->fprintf_func) (info->stream, ">");
897
    }
898
  else
899
    {
900
      (*info->fprintf_func) (info->stream, " <");
901
      objdump_print_symname (abfd, info, sym);
902
      if (bfd_asymbol_value (sym) > vma)
903
        {
904
          (*info->fprintf_func) (info->stream, "-0x");
905
          objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
906
        }
907
      else if (vma > bfd_asymbol_value (sym))
908
        {
909
          (*info->fprintf_func) (info->stream, "+0x");
910
          objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
911
        }
912
      (*info->fprintf_func) (info->stream, ">");
913
    }
914
 
915
  if (display_file_offsets)
916
    info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
917
                        (long int)(sec->filepos + (vma - sec->vma)));
918
}
919
 
920
/* Print an address (VMA), symbolically if possible.
921
   If SKIP_ZEROES is TRUE, don't output leading zeroes.  */
922
 
923
static void
924
objdump_print_addr (bfd_vma vma,
925
                    struct disassemble_info *info,
926
                    bfd_boolean skip_zeroes)
927
{
928
  struct objdump_disasm_info *aux;
929
  asymbol *sym = NULL;
930
  bfd_boolean skip_find = FALSE;
931
 
932
  aux = (struct objdump_disasm_info *) info->application_data;
933
 
934
  if (sorted_symcount < 1)
935
    {
936
      (*info->fprintf_func) (info->stream, "0x");
937
      objdump_print_value (vma, info, skip_zeroes);
938
 
939
      if (display_file_offsets)
940
        info->fprintf_func (info->stream, _(" (File Offset: 0x%lx)"),
941
                            (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
942
      return;
943
    }
944
 
945
  if (aux->reloc != NULL
946
      && aux->reloc->sym_ptr_ptr != NULL
947
      && * aux->reloc->sym_ptr_ptr != NULL)
948
    {
949
      sym = * aux->reloc->sym_ptr_ptr;
950
 
951
      /* Adjust the vma to the reloc.  */
952
      vma += bfd_asymbol_value (sym);
953
 
954
      if (bfd_is_und_section (bfd_get_section (sym)))
955
        skip_find = TRUE;
956
    }
957
 
958
  if (!skip_find)
959
    sym = find_symbol_for_address (vma, info, NULL);
960
 
961
  objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
962
                               skip_zeroes);
963
}
964
 
965
/* Print VMA to INFO.  This function is passed to the disassembler
966
   routine.  */
967
 
968
static void
969
objdump_print_address (bfd_vma vma, struct disassemble_info *info)
970
{
971
  objdump_print_addr (vma, info, ! prefix_addresses);
972
}
973
 
974
/* Determine if the given address has a symbol associated with it.  */
975
 
976
static int
977
objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
978
{
979
  asymbol * sym;
980
 
981
  sym = find_symbol_for_address (vma, info, NULL);
982
 
983
  return (sym != NULL && (bfd_asymbol_value (sym) == vma));
984
}
985
 
986
/* Hold the last function name and the last line number we displayed
987
   in a disassembly.  */
988
 
989
static char *prev_functionname;
990
static unsigned int prev_line;
991
 
992
/* We keep a list of all files that we have seen when doing a
993
   disassembly with source, so that we know how much of the file to
994
   display.  This can be important for inlined functions.  */
995
 
996
struct print_file_list
997
{
998
  struct print_file_list *next;
999
  const char *filename;
1000
  const char *modname;
1001
  const char *map;
1002
  size_t mapsize;
1003
  const char **linemap;
1004
  unsigned maxline;
1005
  unsigned last_line;
1006
  int first;
1007
};
1008
 
1009
static struct print_file_list *print_files;
1010
 
1011
/* The number of preceding context lines to show when we start
1012
   displaying a file for the first time.  */
1013
 
1014
#define SHOW_PRECEDING_CONTEXT_LINES (5)
1015
 
1016
/* Read a complete file into memory.  */
1017
 
1018
static const char *
1019
slurp_file (const char *fn, size_t *size)
1020
{
1021
#ifdef HAVE_MMAP
1022
  int ps = getpagesize ();
1023
  size_t msize;
1024
#endif
1025
  const char *map;
1026
  struct stat st;
1027
  int fd = open (fn, O_RDONLY | O_BINARY);
1028
 
1029
  if (fd < 0)
1030
    return NULL;
1031
  if (fstat (fd, &st) < 0)
1032
    return NULL;
1033
  *size = st.st_size;
1034
#ifdef HAVE_MMAP
1035
  msize = (*size + ps - 1) & ~(ps - 1);
1036
  map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1037
  if (map != (char *)-1L)
1038
    {
1039
      close(fd);
1040
      return map;
1041
    }
1042
#endif
1043
  map = (const char *) malloc (*size);
1044
  if (!map || (size_t) read (fd, (char *)map, *size) != *size)
1045
    {
1046
      free ((void *)map);
1047
      map = NULL;
1048
    }
1049
  close (fd);
1050
  return map;
1051
}
1052
 
1053
#define line_map_decrease 5
1054
 
1055
/* Precompute array of lines for a mapped file. */
1056
 
1057
static const char **
1058
index_file (const char *map, size_t size, unsigned int *maxline)
1059
{
1060
  const char *p, *lstart, *end;
1061
  int chars_per_line = 45; /* First iteration will use 40.  */
1062
  unsigned int lineno;
1063
  const char **linemap = NULL;
1064
  unsigned long line_map_size = 0;
1065
 
1066
  lineno = 0;
1067
  lstart = map;
1068
  end = map + size;
1069
 
1070
  for (p = map; p < end; p++)
1071
    {
1072
      if (*p == '\n')
1073
        {
1074
          if (p + 1 < end && p[1] == '\r')
1075
            p++;
1076
        }
1077
      else if (*p == '\r')
1078
        {
1079
          if (p + 1 < end && p[1] == '\n')
1080
            p++;
1081
        }
1082
      else
1083
        continue;
1084
 
1085
      /* End of line found.  */
1086
 
1087
      if (linemap == NULL || line_map_size < lineno + 1)
1088
        {
1089
          unsigned long newsize;
1090
 
1091
          chars_per_line -= line_map_decrease;
1092
          if (chars_per_line <= 1)
1093
            chars_per_line = 1;
1094
          line_map_size = size / chars_per_line + 1;
1095
          if (line_map_size < lineno + 1)
1096
            line_map_size = lineno + 1;
1097
          newsize = line_map_size * sizeof (char *);
1098
          linemap = (const char **) xrealloc (linemap, newsize);
1099
        }
1100
 
1101
      linemap[lineno++] = lstart;
1102
      lstart = p + 1;
1103
    }
1104
 
1105
  *maxline = lineno;
1106
  return linemap;
1107
}
1108
 
1109
/* Tries to open MODNAME, and if successful adds a node to print_files
1110
   linked list and returns that node.  Returns NULL on failure.  */
1111
 
1112
static struct print_file_list *
1113
try_print_file_open (const char *origname, const char *modname)
1114
{
1115
  struct print_file_list *p;
1116
 
1117
  p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1118
 
1119
  p->map = slurp_file (modname, &p->mapsize);
1120
  if (p->map == NULL)
1121
    {
1122
      free (p);
1123
      return NULL;
1124
    }
1125
 
1126
  p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1127
  p->last_line = 0;
1128
  p->filename = origname;
1129
  p->modname = modname;
1130
  p->next = print_files;
1131
  p->first = 1;
1132
  print_files = p;
1133
  return p;
1134
}
1135
 
1136
/* If the the source file, as described in the symtab, is not found
1137
   try to locate it in one of the paths specified with -I
1138
   If found, add location to print_files linked list.  */
1139
 
1140
static struct print_file_list *
1141
update_source_path (const char *filename)
1142
{
1143
  struct print_file_list *p;
1144
  const char *fname;
1145
  int i;
1146
 
1147
  if (filename == NULL)
1148
    return NULL;
1149
 
1150
  p = try_print_file_open (filename, filename);
1151
  if (p != NULL)
1152
    return p;
1153
 
1154
  if (include_path_count == 0)
1155
    return NULL;
1156
 
1157
  /* Get the name of the file.  */
1158
  fname = strrchr (filename, '/');
1159
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
1160
  {
1161
    /* We could have a mixed forward/back slash case.  */
1162
    char *backslash = strrchr (filename, '\\');
1163
    if (fname == NULL || (backslash != NULL && backslash > fname))
1164
      fname = backslash;
1165
    if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
1166
      fname = filename + 1;
1167
  }
1168
#endif
1169
  if (fname == NULL)
1170
    fname = filename;
1171
  else
1172
    ++fname;
1173
 
1174
  /* If file exists under a new path, we need to add it to the list
1175
     so that show_line knows about it.  */
1176
  for (i = 0; i < include_path_count; i++)
1177
    {
1178
      char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1179
 
1180
      p = try_print_file_open (filename, modname);
1181
      if (p)
1182
        return p;
1183
 
1184
      free (modname);
1185
    }
1186
 
1187
  return NULL;
1188
}
1189
 
1190
/* Print a source file line.  */
1191
 
1192
static void
1193
print_line (struct print_file_list *p, unsigned int line)
1194
{
1195
  const char *l;
1196
  size_t len;
1197
 
1198
  --line;
1199
  if (line >= p->maxline)
1200
    return;
1201
  l = p->linemap [line];
1202
  /* Test fwrite return value to quiet glibc warning.  */
1203
  len = strcspn (l, "\n\r");
1204
  if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1205
    putchar ('\n');
1206
}
1207
 
1208
/* Print a range of source code lines. */
1209
 
1210
static void
1211
dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1212
{
1213
  if (p->map == NULL)
1214
    return;
1215
  while (start <= end)
1216
    {
1217
      print_line (p, start);
1218
      start++;
1219
    }
1220
}
1221
 
1222
/* Show the line number, or the source line, in a disassembly
1223
   listing.  */
1224
 
1225
static void
1226
show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1227
{
1228
  const char *filename;
1229
  const char *functionname;
1230
  unsigned int line;
1231
  bfd_boolean reloc;
1232
 
1233
  if (! with_line_numbers && ! with_source_code)
1234
    return;
1235
 
1236
  if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1237
                               &functionname, &line))
1238
    return;
1239
 
1240
  if (filename != NULL && *filename == '\0')
1241
    filename = NULL;
1242
  if (functionname != NULL && *functionname == '\0')
1243
    functionname = NULL;
1244
 
1245
  if (filename
1246
      && IS_ABSOLUTE_PATH (filename)
1247
      && prefix)
1248
    {
1249
      char *path_up;
1250
      const char *fname = filename;
1251
      char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
1252
 
1253
      if (prefix_length)
1254
        memcpy (path, prefix, prefix_length);
1255
      path_up = path + prefix_length;
1256
 
1257
      /* Build relocated filename, stripping off leading directories
1258
         from the initial filename if requested. */
1259
      if (prefix_strip > 0)
1260
        {
1261
          int level = 0;
1262
          const char *s;
1263
 
1264
          /* Skip selected directory levels. */
1265
          for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1266
            if (IS_DIR_SEPARATOR(*s))
1267
              {
1268
                fname = s;
1269
                level++;
1270
              }
1271
        }
1272
 
1273
      /* Update complete filename. */
1274
      strncpy (path_up, fname, PATH_MAX);
1275
      path_up[PATH_MAX] = '\0';
1276
 
1277
      filename = path;
1278
      reloc = TRUE;
1279
    }
1280
  else
1281
    reloc = FALSE;
1282
 
1283
  if (with_line_numbers)
1284
    {
1285
      if (functionname != NULL
1286
          && (prev_functionname == NULL
1287
              || strcmp (functionname, prev_functionname) != 0))
1288
        printf ("%s():\n", functionname);
1289
      if (line > 0 && line != prev_line)
1290
        printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1291
    }
1292
 
1293
  if (with_source_code
1294
      && filename != NULL
1295
      && line > 0)
1296
    {
1297
      struct print_file_list **pp, *p;
1298
      unsigned l;
1299
 
1300
      for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1301
        if (strcmp ((*pp)->filename, filename) == 0)
1302
          break;
1303
      p = *pp;
1304
 
1305
      if (p == NULL)
1306
        {
1307
          if (reloc)
1308
            filename = xstrdup (filename);
1309
          p = update_source_path (filename);
1310
        }
1311
 
1312
      if (p != NULL && line != p->last_line)
1313
        {
1314
          if (file_start_context && p->first)
1315
            l = 1;
1316
          else
1317
            {
1318
              l = line - SHOW_PRECEDING_CONTEXT_LINES;
1319
              if (l >= line)
1320
                l = 1;
1321
              if (p->last_line >= l && p->last_line <= line)
1322
                l = p->last_line + 1;
1323
            }
1324
          dump_lines (p, l, line);
1325
          p->last_line = line;
1326
          p->first = 0;
1327
        }
1328
    }
1329
 
1330
  if (functionname != NULL
1331
      && (prev_functionname == NULL
1332
          || strcmp (functionname, prev_functionname) != 0))
1333
    {
1334
      if (prev_functionname != NULL)
1335
        free (prev_functionname);
1336
      prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1337
      strcpy (prev_functionname, functionname);
1338
    }
1339
 
1340
  if (line > 0 && line != prev_line)
1341
    prev_line = line;
1342
}
1343
 
1344
/* Pseudo FILE object for strings.  */
1345
typedef struct
1346
{
1347
  char *buffer;
1348
  size_t pos;
1349
  size_t alloc;
1350
} SFILE;
1351
 
1352
/* sprintf to a "stream".  */
1353
 
1354
static int ATTRIBUTE_PRINTF_2
1355
objdump_sprintf (SFILE *f, const char *format, ...)
1356
{
1357
  size_t n;
1358
  va_list args;
1359
 
1360
  while (1)
1361
    {
1362
      size_t space = f->alloc - f->pos;
1363
 
1364
      va_start (args, format);
1365
      n = vsnprintf (f->buffer + f->pos, space, format, args);
1366
      va_end (args);
1367
 
1368
      if (space > n)
1369
        break;
1370
 
1371
      f->alloc = (f->alloc + n) * 2;
1372
      f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1373
    }
1374
  f->pos += n;
1375
 
1376
  return n;
1377
}
1378
 
1379
/* The number of zeroes we want to see before we start skipping them.
1380
   The number is arbitrarily chosen.  */
1381
 
1382
#define DEFAULT_SKIP_ZEROES 8
1383
 
1384
/* The number of zeroes to skip at the end of a section.  If the
1385
   number of zeroes at the end is between SKIP_ZEROES_AT_END and
1386
   SKIP_ZEROES, they will be disassembled.  If there are fewer than
1387
   SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
1388
   attempt to avoid disassembling zeroes inserted by section
1389
   alignment.  */
1390
 
1391
#define DEFAULT_SKIP_ZEROES_AT_END 3
1392
 
1393
/* Disassemble some data in memory between given values.  */
1394
 
1395
static void
1396
disassemble_bytes (struct disassemble_info * info,
1397
                   disassembler_ftype        disassemble_fn,
1398
                   bfd_boolean               insns,
1399
                   bfd_byte *                data,
1400
                   bfd_vma                   start_offset,
1401
                   bfd_vma                   stop_offset,
1402
                   bfd_vma                   rel_offset,
1403
                   arelent ***               relppp,
1404
                   arelent **                relppend)
1405
{
1406
  struct objdump_disasm_info *aux;
1407
  asection *section;
1408
  int octets_per_line;
1409
  int skip_addr_chars;
1410
  bfd_vma addr_offset;
1411
  unsigned int opb = info->octets_per_byte;
1412
  unsigned int skip_zeroes = info->skip_zeroes;
1413
  unsigned int skip_zeroes_at_end = info->skip_zeroes_at_end;
1414
  int octets = opb;
1415
  SFILE sfile;
1416
 
1417
  aux = (struct objdump_disasm_info *) info->application_data;
1418
  section = aux->sec;
1419
 
1420
  sfile.alloc = 120;
1421
  sfile.buffer = (char *) xmalloc (sfile.alloc);
1422
  sfile.pos = 0;
1423
 
1424
  if (insn_width)
1425
    octets_per_line = insn_width;
1426
  else if (insns)
1427
    octets_per_line = 4;
1428
  else
1429
    octets_per_line = 16;
1430
 
1431
  /* Figure out how many characters to skip at the start of an
1432
     address, to make the disassembly look nicer.  We discard leading
1433
     zeroes in chunks of 4, ensuring that there is always a leading
1434
     zero remaining.  */
1435
  skip_addr_chars = 0;
1436
  if (! prefix_addresses)
1437
    {
1438
      char buf[30];
1439
 
1440
      bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1441
 
1442
      while (buf[skip_addr_chars] == '0')
1443
        ++skip_addr_chars;
1444
 
1445
      /* Don't discard zeros on overflow.  */
1446
      if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1447
        skip_addr_chars = 0;
1448
 
1449
      if (skip_addr_chars != 0)
1450
        skip_addr_chars = (skip_addr_chars - 1) & -4;
1451
    }
1452
 
1453
  info->insn_info_valid = 0;
1454
 
1455
  addr_offset = start_offset;
1456
  while (addr_offset < stop_offset)
1457
    {
1458
      bfd_vma z;
1459
      bfd_boolean need_nl = FALSE;
1460
      int previous_octets;
1461
 
1462
      /* Remember the length of the previous instruction.  */
1463
      previous_octets = octets;
1464
      octets = 0;
1465
 
1466
      /* Make sure we don't use relocs from previous instructions.  */
1467
      aux->reloc = NULL;
1468
 
1469
      /* If we see more than SKIP_ZEROES octets of zeroes, we just
1470
         print `...'.  */
1471
      for (z = addr_offset * opb; z < stop_offset * opb; z++)
1472
        if (data[z] != 0)
1473
          break;
1474
      if (! disassemble_zeroes
1475
          && (info->insn_info_valid == 0
1476
              || info->branch_delay_insns == 0)
1477
          && (z - addr_offset * opb >= skip_zeroes
1478
              || (z == stop_offset * opb &&
1479
                  z - addr_offset * opb < skip_zeroes_at_end)))
1480
        {
1481
          /* If there are more nonzero octets to follow, we only skip
1482
             zeroes in multiples of 4, to try to avoid running over
1483
             the start of an instruction which happens to start with
1484
             zero.  */
1485
          if (z != stop_offset * opb)
1486
            z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1487
 
1488
          octets = z - addr_offset * opb;
1489
 
1490
          /* If we are going to display more data, and we are displaying
1491
             file offsets, then tell the user how many zeroes we skip
1492
             and the file offset from where we resume dumping.  */
1493
          if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1494
            printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1495
                    octets / opb,
1496
                    (unsigned long) (section->filepos
1497
                                     + (addr_offset + (octets / opb))));
1498
          else
1499
            printf ("\t...\n");
1500
        }
1501
      else
1502
        {
1503
          char buf[50];
1504
          int bpc = 0;
1505
          int pb = 0;
1506
 
1507
          if (with_line_numbers || with_source_code)
1508
            show_line (aux->abfd, section, addr_offset);
1509
 
1510
          if (! prefix_addresses)
1511
            {
1512
              char *s;
1513
 
1514
              bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1515
              for (s = buf + skip_addr_chars; *s == '0'; s++)
1516
                *s = ' ';
1517
              if (*s == '\0')
1518
                *--s = '0';
1519
              printf ("%s:\t", buf + skip_addr_chars);
1520
            }
1521
          else
1522
            {
1523
              aux->require_sec = TRUE;
1524
              objdump_print_address (section->vma + addr_offset, info);
1525
              aux->require_sec = FALSE;
1526
              putchar (' ');
1527
            }
1528
 
1529
          if (insns)
1530
            {
1531
              sfile.pos = 0;
1532
              info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1533
              info->stream = &sfile;
1534
              info->bytes_per_line = 0;
1535
              info->bytes_per_chunk = 0;
1536
              info->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1537
              if (machine)
1538
                info->flags |= USER_SPECIFIED_MACHINE_TYPE;
1539
 
1540
              if (info->disassembler_needs_relocs
1541
                  && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1542
                  && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1543
                  && *relppp < relppend)
1544
                {
1545
                  bfd_signed_vma distance_to_rel;
1546
 
1547
                  distance_to_rel = (**relppp)->address
1548
                    - (rel_offset + addr_offset);
1549
 
1550
                  /* Check to see if the current reloc is associated with
1551
                     the instruction that we are about to disassemble.  */
1552
                  if (distance_to_rel == 0
1553
                      /* FIXME: This is wrong.  We are trying to catch
1554
                         relocs that are addressed part way through the
1555
                         current instruction, as might happen with a packed
1556
                         VLIW instruction.  Unfortunately we do not know the
1557
                         length of the current instruction since we have not
1558
                         disassembled it yet.  Instead we take a guess based
1559
                         upon the length of the previous instruction.  The
1560
                         proper solution is to have a new target-specific
1561
                         disassembler function which just returns the length
1562
                         of an instruction at a given address without trying
1563
                         to display its disassembly. */
1564
                      || (distance_to_rel > 0
1565
                          && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1566
                    {
1567
                      info->flags |= INSN_HAS_RELOC;
1568
                      aux->reloc = **relppp;
1569
                    }
1570
                }
1571
 
1572
              octets = (*disassemble_fn) (section->vma + addr_offset, info);
1573
              info->fprintf_func = (fprintf_ftype) fprintf;
1574
              info->stream = stdout;
1575
              if (insn_width == 0 && info->bytes_per_line != 0)
1576
                octets_per_line = info->bytes_per_line;
1577
              if (octets < 0)
1578
                {
1579
                  if (sfile.pos)
1580
                    printf ("%s\n", sfile.buffer);
1581
                  break;
1582
                }
1583
            }
1584
          else
1585
            {
1586
              bfd_vma j;
1587
 
1588
              octets = octets_per_line;
1589
              if (addr_offset + octets / opb > stop_offset)
1590
                octets = (stop_offset - addr_offset) * opb;
1591
 
1592
              for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1593
                {
1594
                  if (ISPRINT (data[j]))
1595
                    buf[j - addr_offset * opb] = data[j];
1596
                  else
1597
                    buf[j - addr_offset * opb] = '.';
1598
                }
1599
              buf[j - addr_offset * opb] = '\0';
1600
            }
1601
 
1602
          if (prefix_addresses
1603
              ? show_raw_insn > 0
1604
              : show_raw_insn >= 0)
1605
            {
1606
              bfd_vma j;
1607
 
1608
              /* If ! prefix_addresses and ! wide_output, we print
1609
                 octets_per_line octets per line.  */
1610
              pb = octets;
1611
              if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1612
                pb = octets_per_line;
1613
 
1614
              if (info->bytes_per_chunk)
1615
                bpc = info->bytes_per_chunk;
1616
              else
1617
                bpc = 1;
1618
 
1619
              for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1620
                {
1621
                  int k;
1622
 
1623
                  if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1624
                    {
1625
                      for (k = bpc - 1; k >= 0; k--)
1626
                        printf ("%02x", (unsigned) data[j + k]);
1627
                      putchar (' ');
1628
                    }
1629
                  else
1630
                    {
1631
                      for (k = 0; k < bpc; k++)
1632
                        printf ("%02x", (unsigned) data[j + k]);
1633
                      putchar (' ');
1634
                    }
1635
                }
1636
 
1637
              for (; pb < octets_per_line; pb += bpc)
1638
                {
1639
                  int k;
1640
 
1641
                  for (k = 0; k < bpc; k++)
1642
                    printf ("  ");
1643
                  putchar (' ');
1644
                }
1645
 
1646
              /* Separate raw data from instruction by extra space.  */
1647
              if (insns)
1648
                putchar ('\t');
1649
              else
1650
                printf ("    ");
1651
            }
1652
 
1653
          if (! insns)
1654
            printf ("%s", buf);
1655
          else if (sfile.pos)
1656
            printf ("%s", sfile.buffer);
1657
 
1658
          if (prefix_addresses
1659
              ? show_raw_insn > 0
1660
              : show_raw_insn >= 0)
1661
            {
1662
              while (pb < octets)
1663
                {
1664
                  bfd_vma j;
1665
                  char *s;
1666
 
1667
                  putchar ('\n');
1668
                  j = addr_offset * opb + pb;
1669
 
1670
                  bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1671
                  for (s = buf + skip_addr_chars; *s == '0'; s++)
1672
                    *s = ' ';
1673
                  if (*s == '\0')
1674
                    *--s = '0';
1675
                  printf ("%s:\t", buf + skip_addr_chars);
1676
 
1677
                  pb += octets_per_line;
1678
                  if (pb > octets)
1679
                    pb = octets;
1680
                  for (; j < addr_offset * opb + pb; j += bpc)
1681
                    {
1682
                      int k;
1683
 
1684
                      if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1685
                        {
1686
                          for (k = bpc - 1; k >= 0; k--)
1687
                            printf ("%02x", (unsigned) data[j + k]);
1688
                          putchar (' ');
1689
                        }
1690
                      else
1691
                        {
1692
                          for (k = 0; k < bpc; k++)
1693
                            printf ("%02x", (unsigned) data[j + k]);
1694
                          putchar (' ');
1695
                        }
1696
                    }
1697
                }
1698
            }
1699
 
1700
          if (!wide_output)
1701
            putchar ('\n');
1702
          else
1703
            need_nl = TRUE;
1704
        }
1705
 
1706
      while ((*relppp) < relppend
1707
             && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1708
        {
1709
          if (dump_reloc_info || dump_dynamic_reloc_info)
1710
            {
1711
              arelent *q;
1712
 
1713
              q = **relppp;
1714
 
1715
              if (wide_output)
1716
                putchar ('\t');
1717
              else
1718
                printf ("\t\t\t");
1719
 
1720
              objdump_print_value (section->vma - rel_offset + q->address,
1721
                                   info, TRUE);
1722
 
1723
              if (q->howto == NULL)
1724
                printf (": *unknown*\t");
1725
              else if (q->howto->name)
1726
                printf (": %s\t", q->howto->name);
1727
              else
1728
                printf (": %d\t", q->howto->type);
1729
 
1730
              if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1731
                printf ("*unknown*");
1732
              else
1733
                {
1734
                  const char *sym_name;
1735
 
1736
                  sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1737
                  if (sym_name != NULL && *sym_name != '\0')
1738
                    objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1739
                  else
1740
                    {
1741
                      asection *sym_sec;
1742
 
1743
                      sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1744
                      sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1745
                      if (sym_name == NULL || *sym_name == '\0')
1746
                        sym_name = "*unknown*";
1747
                      printf ("%s", sym_name);
1748
                    }
1749
                }
1750
 
1751
              if (q->addend)
1752
                {
1753
                  printf ("+0x");
1754
                  objdump_print_value (q->addend, info, TRUE);
1755
                }
1756
 
1757
              printf ("\n");
1758
              need_nl = FALSE;
1759
            }
1760
          ++(*relppp);
1761
        }
1762
 
1763
      if (need_nl)
1764
        printf ("\n");
1765
 
1766
      addr_offset += octets / opb;
1767
    }
1768
 
1769
  free (sfile.buffer);
1770
}
1771
 
1772
static void
1773
disassemble_section (bfd *abfd, asection *section, void *info)
1774
{
1775
  const struct elf_backend_data * bed;
1776
  bfd_vma                      sign_adjust = 0;
1777
  struct disassemble_info *    pinfo = (struct disassemble_info *) info;
1778
  struct objdump_disasm_info * paux;
1779
  unsigned int                 opb = pinfo->octets_per_byte;
1780
  bfd_byte *                   data = NULL;
1781
  bfd_size_type                datasize = 0;
1782
  arelent **                   rel_pp = NULL;
1783
  arelent **                   rel_ppstart = NULL;
1784
  arelent **                   rel_ppend;
1785
  unsigned long                stop_offset;
1786
  asymbol *                    sym = NULL;
1787
  long                         place = 0;
1788
  long                         rel_count;
1789
  bfd_vma                      rel_offset;
1790
  unsigned long                addr_offset;
1791
 
1792
  /* Sections that do not contain machine
1793
     code are not normally disassembled.  */
1794
  if (! disassemble_all
1795
      && only == NULL
1796
      && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1797
          != (SEC_CODE | SEC_HAS_CONTENTS)))
1798
    return;
1799
 
1800
  if (! process_section_p (section))
1801
    return;
1802
 
1803
  datasize = bfd_get_section_size (section);
1804
  if (datasize == 0)
1805
    return;
1806
 
1807
  /* Decide which set of relocs to use.  Load them if necessary.  */
1808
  paux = (struct objdump_disasm_info *) pinfo->application_data;
1809
  if (paux->dynrelbuf)
1810
    {
1811
      rel_pp = paux->dynrelbuf;
1812
      rel_count = paux->dynrelcount;
1813
      /* Dynamic reloc addresses are absolute, non-dynamic are section
1814
         relative.  REL_OFFSET specifies the reloc address corresponding
1815
         to the start of this section.  */
1816
      rel_offset = section->vma;
1817
    }
1818
  else
1819
    {
1820
      rel_count = 0;
1821
      rel_pp = NULL;
1822
      rel_offset = 0;
1823
 
1824
      if ((section->flags & SEC_RELOC) != 0
1825
          && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1826
        {
1827
          long relsize;
1828
 
1829
          relsize = bfd_get_reloc_upper_bound (abfd, section);
1830
          if (relsize < 0)
1831
            bfd_fatal (bfd_get_filename (abfd));
1832
 
1833
          if (relsize > 0)
1834
            {
1835
              rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1836
              rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1837
              if (rel_count < 0)
1838
                bfd_fatal (bfd_get_filename (abfd));
1839
 
1840
              /* Sort the relocs by address.  */
1841
              qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1842
            }
1843
        }
1844
    }
1845
  rel_ppend = rel_pp + rel_count;
1846
 
1847
  data = (bfd_byte *) xmalloc (datasize);
1848
 
1849
  bfd_get_section_contents (abfd, section, data, 0, datasize);
1850
 
1851
  paux->sec = section;
1852
  pinfo->buffer = data;
1853
  pinfo->buffer_vma = section->vma;
1854
  pinfo->buffer_length = datasize;
1855
  pinfo->section = section;
1856
 
1857
  if (start_address == (bfd_vma) -1
1858
      || start_address < pinfo->buffer_vma)
1859
    addr_offset = 0;
1860
  else
1861
    addr_offset = start_address - pinfo->buffer_vma;
1862
 
1863
  if (stop_address == (bfd_vma) -1)
1864
    stop_offset = datasize / opb;
1865
  else
1866
    {
1867
      if (stop_address < pinfo->buffer_vma)
1868
        stop_offset = 0;
1869
      else
1870
        stop_offset = stop_address - pinfo->buffer_vma;
1871
      if (stop_offset > pinfo->buffer_length / opb)
1872
        stop_offset = pinfo->buffer_length / opb;
1873
    }
1874
 
1875
  /* Skip over the relocs belonging to addresses below the
1876
     start address.  */
1877
  while (rel_pp < rel_ppend
1878
         && (*rel_pp)->address < rel_offset + addr_offset)
1879
    ++rel_pp;
1880
 
1881
  if (addr_offset < stop_offset)
1882
    printf (_("\nDisassembly of section %s:\n"), section->name);
1883
 
1884
  /* Find the nearest symbol forwards from our current position.  */
1885
  paux->require_sec = TRUE;
1886
  sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
1887
                                             (struct disassemble_info *) info,
1888
                                             &place);
1889
  paux->require_sec = FALSE;
1890
 
1891
  /* PR 9774: If the target used signed addresses then we must make
1892
     sure that we sign extend the value that we calculate for 'addr'
1893
     in the loop below.  */
1894
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1895
      && (bed = get_elf_backend_data (abfd)) != NULL
1896
      && bed->sign_extend_vma)
1897
    sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
1898
 
1899
  /* Disassemble a block of instructions up to the address associated with
1900
     the symbol we have just found.  Then print the symbol and find the
1901
     next symbol on.  Repeat until we have disassembled the entire section
1902
     or we have reached the end of the address range we are interested in.  */
1903
  while (addr_offset < stop_offset)
1904
    {
1905
      bfd_vma addr;
1906
      asymbol *nextsym;
1907
      unsigned long nextstop_offset;
1908
      bfd_boolean insns;
1909
 
1910
      addr = section->vma + addr_offset;
1911
      addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
1912
 
1913
      if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1914
        {
1915
          int x;
1916
 
1917
          for (x = place;
1918
               (x < sorted_symcount
1919
                && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1920
               ++x)
1921
            continue;
1922
 
1923
          pinfo->symbols = sorted_syms + place;
1924
          pinfo->num_symbols = x - place;
1925
          pinfo->symtab_pos = place;
1926
        }
1927
      else
1928
        {
1929
          pinfo->symbols = NULL;
1930
          pinfo->num_symbols = 0;
1931
          pinfo->symtab_pos = -1;
1932
        }
1933
 
1934
      if (! prefix_addresses)
1935
        {
1936
          pinfo->fprintf_func (pinfo->stream, "\n");
1937
          objdump_print_addr_with_sym (abfd, section, sym, addr,
1938
                                       pinfo, FALSE);
1939
          pinfo->fprintf_func (pinfo->stream, ":\n");
1940
        }
1941
 
1942
      if (sym != NULL && bfd_asymbol_value (sym) > addr)
1943
        nextsym = sym;
1944
      else if (sym == NULL)
1945
        nextsym = NULL;
1946
      else
1947
        {
1948
#define is_valid_next_sym(SYM) \
1949
  ((SYM)->section == section \
1950
   && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1951
   && pinfo->symbol_is_valid (SYM, pinfo))
1952
 
1953
          /* Search forward for the next appropriate symbol in
1954
             SECTION.  Note that all the symbols are sorted
1955
             together into one big array, and that some sections
1956
             may have overlapping addresses.  */
1957
          while (place < sorted_symcount
1958
                 && ! is_valid_next_sym (sorted_syms [place]))
1959
            ++place;
1960
 
1961
          if (place >= sorted_symcount)
1962
            nextsym = NULL;
1963
          else
1964
            nextsym = sorted_syms[place];
1965
        }
1966
 
1967
      if (sym != NULL && bfd_asymbol_value (sym) > addr)
1968
        nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1969
      else if (nextsym == NULL)
1970
        nextstop_offset = stop_offset;
1971
      else
1972
        nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1973
 
1974
      if (nextstop_offset > stop_offset
1975
          || nextstop_offset <= addr_offset)
1976
        nextstop_offset = stop_offset;
1977
 
1978
      /* If a symbol is explicitly marked as being an object
1979
         rather than a function, just dump the bytes without
1980
         disassembling them.  */
1981
      if (disassemble_all
1982
          || sym == NULL
1983
          || sym->section != section
1984
          || bfd_asymbol_value (sym) > addr
1985
          || ((sym->flags & BSF_OBJECT) == 0
1986
              && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1987
                  == NULL)
1988
              && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1989
                  == NULL))
1990
          || (sym->flags & BSF_FUNCTION) != 0)
1991
        insns = TRUE;
1992
      else
1993
        insns = FALSE;
1994
 
1995
      disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1996
                         addr_offset, nextstop_offset,
1997
                         rel_offset, &rel_pp, rel_ppend);
1998
 
1999
      addr_offset = nextstop_offset;
2000
      sym = nextsym;
2001
    }
2002
 
2003
  free (data);
2004
 
2005
  if (rel_ppstart != NULL)
2006
    free (rel_ppstart);
2007
}
2008
 
2009
/* Disassemble the contents of an object file.  */
2010
 
2011
static void
2012
disassemble_data (bfd *abfd)
2013
{
2014
  struct disassemble_info disasm_info;
2015
  struct objdump_disasm_info aux;
2016
  long i;
2017
 
2018
  print_files = NULL;
2019
  prev_functionname = NULL;
2020
  prev_line = -1;
2021
 
2022
  /* We make a copy of syms to sort.  We don't want to sort syms
2023
     because that will screw up the relocs.  */
2024
  sorted_symcount = symcount ? symcount : dynsymcount;
2025
  sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2026
                                      * sizeof (asymbol *));
2027
  memcpy (sorted_syms, symcount ? syms : dynsyms,
2028
          sorted_symcount * sizeof (asymbol *));
2029
 
2030
  sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2031
 
2032
  for (i = 0; i < synthcount; ++i)
2033
    {
2034
      sorted_syms[sorted_symcount] = synthsyms + i;
2035
      ++sorted_symcount;
2036
    }
2037
 
2038
  /* Sort the symbols into section and symbol order.  */
2039
  qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2040
 
2041
  init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2042
 
2043
  disasm_info.application_data = (void *) &aux;
2044
  aux.abfd = abfd;
2045
  aux.require_sec = FALSE;
2046
  aux.dynrelbuf = NULL;
2047
  aux.dynrelcount = 0;
2048
  aux.reloc = NULL;
2049
 
2050
  disasm_info.print_address_func = objdump_print_address;
2051
  disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2052
 
2053
  if (machine != NULL)
2054
    {
2055
      const bfd_arch_info_type *info = bfd_scan_arch (machine);
2056
 
2057
      if (info == NULL)
2058
        fatal (_("Can't use supplied machine %s"), machine);
2059
 
2060
      abfd->arch_info = info;
2061
    }
2062
 
2063
  if (endian != BFD_ENDIAN_UNKNOWN)
2064
    {
2065
      struct bfd_target *xvec;
2066
 
2067
      xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2068
      memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2069
      xvec->byteorder = endian;
2070
      abfd->xvec = xvec;
2071
    }
2072
 
2073
  /* Use libopcodes to locate a suitable disassembler.  */
2074
  aux.disassemble_fn = disassembler (abfd);
2075
  if (!aux.disassemble_fn)
2076
    {
2077
      non_fatal (_("Can't disassemble for architecture %s\n"),
2078
                 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2079
      exit_status = 1;
2080
      return;
2081
    }
2082
 
2083
  disasm_info.flavour = bfd_get_flavour (abfd);
2084
  disasm_info.arch = bfd_get_arch (abfd);
2085
  disasm_info.mach = bfd_get_mach (abfd);
2086
  disasm_info.disassembler_options = disassembler_options;
2087
  disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2088
  disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2089
  disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2090
  disasm_info.disassembler_needs_relocs = FALSE;
2091
 
2092
  if (bfd_big_endian (abfd))
2093
    disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2094
  else if (bfd_little_endian (abfd))
2095
    disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2096
  else
2097
    /* ??? Aborting here seems too drastic.  We could default to big or little
2098
       instead.  */
2099
    disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2100
 
2101
  /* Allow the target to customize the info structure.  */
2102
  disassemble_init_for_target (& disasm_info);
2103
 
2104
  /* Pre-load the dynamic relocs if we are going
2105
     to be dumping them along with the disassembly.  */
2106
  if (dump_dynamic_reloc_info)
2107
    {
2108
      long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2109
 
2110
      if (relsize < 0)
2111
        bfd_fatal (bfd_get_filename (abfd));
2112
 
2113
      if (relsize > 0)
2114
        {
2115
          aux.dynrelbuf = (arelent **) xmalloc (relsize);
2116
          aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2117
                                                            aux.dynrelbuf,
2118
                                                            dynsyms);
2119
          if (aux.dynrelcount < 0)
2120
            bfd_fatal (bfd_get_filename (abfd));
2121
 
2122
          /* Sort the relocs by address.  */
2123
          qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2124
                 compare_relocs);
2125
        }
2126
    }
2127
  disasm_info.symtab = sorted_syms;
2128
  disasm_info.symtab_size = sorted_symcount;
2129
 
2130
  bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2131
 
2132
  if (aux.dynrelbuf != NULL)
2133
    free (aux.dynrelbuf);
2134
  free (sorted_syms);
2135
}
2136
 
2137
static int
2138
load_specific_debug_section (enum dwarf_section_display_enum debug,
2139
                             asection *sec, void *file)
2140
{
2141
  struct dwarf_section *section = &debug_displays [debug].section;
2142
  bfd *abfd = (bfd *) file;
2143
  bfd_boolean ret;
2144
  int section_is_compressed;
2145
 
2146
  /* If it is already loaded, do nothing.  */
2147
  if (section->start != NULL)
2148
    return 1;
2149
 
2150
  section_is_compressed = section->name == section->compressed_name;
2151
 
2152
  section->address = 0;
2153
  section->size = bfd_get_section_size (sec);
2154
  section->start = (unsigned char *) xmalloc (section->size);
2155
 
2156
  if (is_relocatable && debug_displays [debug].relocate)
2157
    ret = bfd_simple_get_relocated_section_contents (abfd,
2158
                                                     sec,
2159
                                                     section->start,
2160
                                                     syms) != NULL;
2161
  else
2162
    ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2163
                                    section->size);
2164
 
2165
  if (! ret)
2166
    {
2167
      free_debug_section (debug);
2168
      printf (_("\nCan't get contents for section '%s'.\n"),
2169
              section->name);
2170
      return 0;
2171
    }
2172
 
2173
  if (section_is_compressed)
2174
    {
2175
      bfd_size_type size = section->size;
2176
      if (! bfd_uncompress_section_contents (&section->start, &size))
2177
        {
2178
          free_debug_section (debug);
2179
          printf (_("\nCan't uncompress section '%s'.\n"), section->name);
2180
          return 0;
2181
        }
2182
      section->size = size;
2183
    }
2184
 
2185
  return 1;
2186
}
2187
 
2188
int
2189
load_debug_section (enum dwarf_section_display_enum debug, void *file)
2190
{
2191
  struct dwarf_section *section = &debug_displays [debug].section;
2192
  bfd *abfd = (bfd *) file;
2193
  asection *sec;
2194
 
2195
  /* If it is already loaded, do nothing.  */
2196
  if (section->start != NULL)
2197
    return 1;
2198
 
2199
  /* Locate the debug section.  */
2200
  sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2201
  if (sec != NULL)
2202
    section->name = section->uncompressed_name;
2203
  else
2204
    {
2205
      sec = bfd_get_section_by_name (abfd, section->compressed_name);
2206
      if (sec != NULL)
2207
        section->name = section->compressed_name;
2208
    }
2209
  if (sec == NULL)
2210
    return 0;
2211
 
2212
  return load_specific_debug_section (debug, sec, file);
2213
}
2214
 
2215
void
2216
free_debug_section (enum dwarf_section_display_enum debug)
2217
{
2218
  struct dwarf_section *section = &debug_displays [debug].section;
2219
 
2220
  if (section->start == NULL)
2221
    return;
2222
 
2223
  free ((char *) section->start);
2224
  section->start = NULL;
2225
  section->address = 0;
2226
  section->size = 0;
2227
}
2228
 
2229
static void
2230
dump_dwarf_section (bfd *abfd, asection *section,
2231
                    void *arg ATTRIBUTE_UNUSED)
2232
{
2233
  const char *name = bfd_get_section_name (abfd, section);
2234
  const char *match;
2235
  int i;
2236
 
2237
  if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2238
    match = ".debug_info";
2239
  else
2240
    match = name;
2241
 
2242
  for (i = 0; i < max; i++)
2243
    if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2244
         || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2245
        && debug_displays [i].enabled != NULL
2246
        && *debug_displays [i].enabled)
2247
      {
2248
        struct dwarf_section *sec = &debug_displays [i].section;
2249
 
2250
        if (strcmp (sec->uncompressed_name, match) == 0)
2251
          sec->name = sec->uncompressed_name;
2252
        else
2253
          sec->name = sec->compressed_name;
2254
        if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2255
                                         section, abfd))
2256
          {
2257
            debug_displays [i].display (sec, abfd);
2258
 
2259
            if (i != info && i != abbrev)
2260
              free_debug_section ((enum dwarf_section_display_enum) i);
2261
          }
2262
        break;
2263
      }
2264
}
2265
 
2266
/* Dump the dwarf debugging information.  */
2267
 
2268
static void
2269
dump_dwarf (bfd *abfd)
2270
{
2271
  is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2272
 
2273
  /* FIXME: bfd_get_arch_size may return -1.  We assume that 64bit
2274
     targets will return 64.  */
2275
  eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2276
 
2277
  if (bfd_big_endian (abfd))
2278
    byte_get = byte_get_big_endian;
2279
  else if (bfd_little_endian (abfd))
2280
    byte_get = byte_get_little_endian;
2281
  else
2282
    abort ();
2283
 
2284
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2285
    {
2286
      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2287
      init_dwarf_regnames (bed->elf_machine_code);
2288
    }
2289
 
2290
  bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2291
 
2292
  free_debug_memory ();
2293
}
2294
 
2295
/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2296
   it.  Return NULL on failure.   */
2297
 
2298
static char *
2299
read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2300
{
2301
  asection *stabsect;
2302
  bfd_size_type size;
2303
  char *contents;
2304
 
2305
  stabsect = bfd_get_section_by_name (abfd, sect_name);
2306
  if (stabsect == NULL)
2307
    {
2308
      printf (_("No %s section present\n\n"), sect_name);
2309
      return FALSE;
2310
    }
2311
 
2312
  size = bfd_section_size (abfd, stabsect);
2313
  contents  = (char *) xmalloc (size);
2314
 
2315
  if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2316
    {
2317
      non_fatal (_("Reading %s section of %s failed: %s"),
2318
                 sect_name, bfd_get_filename (abfd),
2319
                 bfd_errmsg (bfd_get_error ()));
2320
      free (contents);
2321
      exit_status = 1;
2322
      return NULL;
2323
    }
2324
 
2325
  *size_ptr = size;
2326
 
2327
  return contents;
2328
}
2329
 
2330
/* Stabs entries use a 12 byte format:
2331
     4 byte string table index
2332
     1 byte stab type
2333
     1 byte stab other field
2334
     2 byte stab desc field
2335
     4 byte stab value
2336
   FIXME: This will have to change for a 64 bit object format.  */
2337
 
2338
#define STRDXOFF  (0)
2339
#define TYPEOFF   (4)
2340
#define OTHEROFF  (5)
2341
#define DESCOFF   (6)
2342
#define VALOFF    (8)
2343
#define STABSIZE (12)
2344
 
2345
/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2346
   using string table section STRSECT_NAME (in `strtab').  */
2347
 
2348
static void
2349
print_section_stabs (bfd *abfd,
2350
                     const char *stabsect_name,
2351
                     unsigned *string_offset_ptr)
2352
{
2353
  int i;
2354
  unsigned file_string_table_offset = 0;
2355
  unsigned next_file_string_table_offset = *string_offset_ptr;
2356
  bfd_byte *stabp, *stabs_end;
2357
 
2358
  stabp = stabs;
2359
  stabs_end = stabp + stab_size;
2360
 
2361
  printf (_("Contents of %s section:\n\n"), stabsect_name);
2362
  printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
2363
 
2364
  /* Loop through all symbols and print them.
2365
 
2366
     We start the index at -1 because there is a dummy symbol on
2367
     the front of stabs-in-{coff,elf} sections that supplies sizes.  */
2368
  for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2369
    {
2370
      const char *name;
2371
      unsigned long strx;
2372
      unsigned char type, other;
2373
      unsigned short desc;
2374
      bfd_vma value;
2375
 
2376
      strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2377
      type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2378
      other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2379
      desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2380
      value = bfd_h_get_32 (abfd, stabp + VALOFF);
2381
 
2382
      printf ("\n%-6d ", i);
2383
      /* Either print the stab name, or, if unnamed, print its number
2384
         again (makes consistent formatting for tools like awk).  */
2385
      name = bfd_get_stab_name (type);
2386
      if (name != NULL)
2387
        printf ("%-6s", name);
2388
      else if (type == N_UNDF)
2389
        printf ("HdrSym");
2390
      else
2391
        printf ("%-6d", type);
2392
      printf (" %-6d %-6d ", other, desc);
2393
      bfd_printf_vma (abfd, value);
2394
      printf (" %-6lu", strx);
2395
 
2396
      /* Symbols with type == 0 (N_UNDF) specify the length of the
2397
         string table associated with this file.  We use that info
2398
         to know how to relocate the *next* file's string table indices.  */
2399
      if (type == N_UNDF)
2400
        {
2401
          file_string_table_offset = next_file_string_table_offset;
2402
          next_file_string_table_offset += value;
2403
        }
2404
      else
2405
        {
2406
          /* Using the (possibly updated) string table offset, print the
2407
             string (if any) associated with this symbol.  */
2408
          if ((strx + file_string_table_offset) < stabstr_size)
2409
            printf (" %s", &strtab[strx + file_string_table_offset]);
2410
          else
2411
            printf (" *");
2412
        }
2413
    }
2414
  printf ("\n\n");
2415
  *string_offset_ptr = next_file_string_table_offset;
2416
}
2417
 
2418
typedef struct
2419
{
2420
  const char * section_name;
2421
  const char * string_section_name;
2422
  unsigned string_offset;
2423
}
2424
stab_section_names;
2425
 
2426
static void
2427
find_stabs_section (bfd *abfd, asection *section, void *names)
2428
{
2429
  int len;
2430
  stab_section_names * sought = (stab_section_names *) names;
2431
 
2432
  /* Check for section names for which stabsect_name is a prefix, to
2433
     handle .stab.N, etc.  */
2434
  len = strlen (sought->section_name);
2435
 
2436
  /* If the prefix matches, and the files section name ends with a
2437
     nul or a digit, then we match.  I.e., we want either an exact
2438
     match or a section followed by a number.  */
2439
  if (strncmp (sought->section_name, section->name, len) == 0
2440
      && (section->name[len] == 0
2441
          || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2442
    {
2443
      if (strtab == NULL)
2444
        strtab = read_section_stabs (abfd, sought->string_section_name,
2445
                                     &stabstr_size);
2446
 
2447
      if (strtab)
2448
        {
2449
          stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2450
                                                   &stab_size);
2451
          if (stabs)
2452
            print_section_stabs (abfd, section->name, &sought->string_offset);
2453
        }
2454
    }
2455
}
2456
 
2457
static void
2458
dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2459
{
2460
  stab_section_names s;
2461
 
2462
  s.section_name = stabsect_name;
2463
  s.string_section_name = strsect_name;
2464
  s.string_offset = 0;
2465
 
2466
  bfd_map_over_sections (abfd, find_stabs_section, & s);
2467
 
2468
  free (strtab);
2469
  strtab = NULL;
2470
}
2471
 
2472
/* Dump the any sections containing stabs debugging information.  */
2473
 
2474
static void
2475
dump_stabs (bfd *abfd)
2476
{
2477
  dump_stabs_section (abfd, ".stab", ".stabstr");
2478
  dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2479
  dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2480
 
2481
  /* For Darwin.  */
2482
  dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2483
 
2484
  dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2485
}
2486
 
2487
static void
2488
dump_bfd_header (bfd *abfd)
2489
{
2490
  char *comma = "";
2491
 
2492
  printf (_("architecture: %s, "),
2493
          bfd_printable_arch_mach (bfd_get_arch (abfd),
2494
                                   bfd_get_mach (abfd)));
2495
  printf (_("flags 0x%08x:\n"), abfd->flags);
2496
 
2497
#define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2498
  PF (HAS_RELOC, "HAS_RELOC");
2499
  PF (EXEC_P, "EXEC_P");
2500
  PF (HAS_LINENO, "HAS_LINENO");
2501
  PF (HAS_DEBUG, "HAS_DEBUG");
2502
  PF (HAS_SYMS, "HAS_SYMS");
2503
  PF (HAS_LOCALS, "HAS_LOCALS");
2504
  PF (DYNAMIC, "DYNAMIC");
2505
  PF (WP_TEXT, "WP_TEXT");
2506
  PF (D_PAGED, "D_PAGED");
2507
  PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2508
  PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2509
  printf (_("\nstart address 0x"));
2510
  bfd_printf_vma (abfd, abfd->start_address);
2511
  printf ("\n");
2512
}
2513
 
2514
 
2515
static void
2516
dump_bfd_private_header (bfd *abfd)
2517
{
2518
  bfd_print_private_bfd_data (abfd, stdout);
2519
}
2520
 
2521
 
2522
/* Display a section in hexadecimal format with associated characters.
2523
   Each line prefixed by the zero padded address.  */
2524
 
2525
static void
2526
dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2527
{
2528
  bfd_byte *data = 0;
2529
  bfd_size_type datasize;
2530
  bfd_size_type addr_offset;
2531
  bfd_size_type start_offset;
2532
  bfd_size_type stop_offset;
2533
  unsigned int opb = bfd_octets_per_byte (abfd);
2534
  /* Bytes per line.  */
2535
  const int onaline = 16;
2536
  char buf[64];
2537
  int count;
2538
  int width;
2539
 
2540
  if ((section->flags & SEC_HAS_CONTENTS) == 0)
2541
    return;
2542
 
2543
  if (! process_section_p (section))
2544
    return;
2545
 
2546
  if ((datasize = bfd_section_size (abfd, section)) == 0)
2547
    return;
2548
 
2549
  /* Compute the address range to display.  */
2550
  if (start_address == (bfd_vma) -1
2551
      || start_address < section->vma)
2552
    start_offset = 0;
2553
  else
2554
    start_offset = start_address - section->vma;
2555
 
2556
  if (stop_address == (bfd_vma) -1)
2557
    stop_offset = datasize / opb;
2558
  else
2559
    {
2560
      if (stop_address < section->vma)
2561
        stop_offset = 0;
2562
      else
2563
        stop_offset = stop_address - section->vma;
2564
 
2565
      if (stop_offset > datasize / opb)
2566
        stop_offset = datasize / opb;
2567
    }
2568
 
2569
  if (start_offset >= stop_offset)
2570
    return;
2571
 
2572
  printf (_("Contents of section %s:"), section->name);
2573
  if (display_file_offsets)
2574
    printf (_("  (Starting at file offset: 0x%lx)"),
2575
            (unsigned long) (section->filepos + start_offset));
2576
  printf ("\n");
2577
 
2578
  data = (bfd_byte *) xmalloc (datasize);
2579
 
2580
  bfd_get_section_contents (abfd, section, data, 0, datasize);
2581
 
2582
  width = 4;
2583
 
2584
  bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2585
  if (strlen (buf) >= sizeof (buf))
2586
    abort ();
2587
 
2588
  count = 0;
2589
  while (buf[count] == '0' && buf[count+1] != '\0')
2590
    count++;
2591
  count = strlen (buf) - count;
2592
  if (count > width)
2593
    width = count;
2594
 
2595
  bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2596
  if (strlen (buf) >= sizeof (buf))
2597
    abort ();
2598
 
2599
  count = 0;
2600
  while (buf[count] == '0' && buf[count+1] != '\0')
2601
    count++;
2602
  count = strlen (buf) - count;
2603
  if (count > width)
2604
    width = count;
2605
 
2606
  for (addr_offset = start_offset;
2607
       addr_offset < stop_offset; addr_offset += onaline / opb)
2608
    {
2609
      bfd_size_type j;
2610
 
2611
      bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2612
      count = strlen (buf);
2613
      if ((size_t) count >= sizeof (buf))
2614
        abort ();
2615
 
2616
      putchar (' ');
2617
      while (count < width)
2618
        {
2619
          putchar ('0');
2620
          count++;
2621
        }
2622
      fputs (buf + count - width, stdout);
2623
      putchar (' ');
2624
 
2625
      for (j = addr_offset * opb;
2626
           j < addr_offset * opb + onaline; j++)
2627
        {
2628
          if (j < stop_offset * opb)
2629
            printf ("%02x", (unsigned) (data[j]));
2630
          else
2631
            printf ("  ");
2632
          if ((j & 3) == 3)
2633
            printf (" ");
2634
        }
2635
 
2636
      printf (" ");
2637
      for (j = addr_offset * opb;
2638
           j < addr_offset * opb + onaline; j++)
2639
        {
2640
          if (j >= stop_offset * opb)
2641
            printf (" ");
2642
          else
2643
            printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2644
        }
2645
      putchar ('\n');
2646
    }
2647
  free (data);
2648
}
2649
 
2650
/* Actually display the various requested regions.  */
2651
 
2652
static void
2653
dump_data (bfd *abfd)
2654
{
2655
  bfd_map_over_sections (abfd, dump_section, NULL);
2656
}
2657
 
2658
/* Should perhaps share code and display with nm?  */
2659
 
2660
static void
2661
dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2662
{
2663
  asymbol **current;
2664
  long max;
2665
  long count;
2666
 
2667
  if (dynamic)
2668
    {
2669
      current = dynsyms;
2670
      max = dynsymcount;
2671
      printf ("DYNAMIC SYMBOL TABLE:\n");
2672
    }
2673
  else
2674
    {
2675
      current = syms;
2676
      max = symcount;
2677
      printf ("SYMBOL TABLE:\n");
2678
    }
2679
 
2680
  if (max == 0)
2681
    printf (_("no symbols\n"));
2682
 
2683
  for (count = 0; count < max; count++)
2684
    {
2685
      bfd *cur_bfd;
2686
 
2687
      if (*current == NULL)
2688
        printf (_("no information for symbol number %ld\n"), count);
2689
 
2690
      else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2691
        printf (_("could not determine the type of symbol number %ld\n"),
2692
                count);
2693
 
2694
      else if (process_section_p ((* current)->section)
2695
               && (dump_special_syms
2696
                   || !bfd_is_target_special_symbol (cur_bfd, *current)))
2697
        {
2698
          const char *name = (*current)->name;
2699
 
2700
          if (do_demangle && name != NULL && *name != '\0')
2701
            {
2702
              char *alloc;
2703
 
2704
              /* If we want to demangle the name, we demangle it
2705
                 here, and temporarily clobber it while calling
2706
                 bfd_print_symbol.  FIXME: This is a gross hack.  */
2707
              alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2708
              if (alloc != NULL)
2709
                (*current)->name = alloc;
2710
              bfd_print_symbol (cur_bfd, stdout, *current,
2711
                                bfd_print_symbol_all);
2712
              if (alloc != NULL)
2713
                {
2714
                  (*current)->name = name;
2715
                  free (alloc);
2716
                }
2717
            }
2718
          else
2719
            bfd_print_symbol (cur_bfd, stdout, *current,
2720
                              bfd_print_symbol_all);
2721
          printf ("\n");
2722
        }
2723
 
2724
      current++;
2725
    }
2726
  printf ("\n\n");
2727
}
2728
 
2729
static void
2730
dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2731
{
2732
  arelent **p;
2733
  char *last_filename, *last_functionname;
2734
  unsigned int last_line;
2735
 
2736
  /* Get column headers lined up reasonably.  */
2737
  {
2738
    static int width;
2739
 
2740
    if (width == 0)
2741
      {
2742
        char buf[30];
2743
 
2744
        bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2745
        width = strlen (buf) - 7;
2746
      }
2747
    printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2748
  }
2749
 
2750
  last_filename = NULL;
2751
  last_functionname = NULL;
2752
  last_line = 0;
2753
 
2754
  for (p = relpp; relcount && *p != NULL; p++, relcount--)
2755
    {
2756
      arelent *q = *p;
2757
      const char *filename, *functionname;
2758
      unsigned int line;
2759
      const char *sym_name;
2760
      const char *section_name;
2761
 
2762
      if (start_address != (bfd_vma) -1
2763
          && q->address < start_address)
2764
        continue;
2765
      if (stop_address != (bfd_vma) -1
2766
          && q->address > stop_address)
2767
        continue;
2768
 
2769
      if (with_line_numbers
2770
          && sec != NULL
2771
          && bfd_find_nearest_line (abfd, sec, syms, q->address,
2772
                                    &filename, &functionname, &line))
2773
        {
2774
          if (functionname != NULL
2775
              && (last_functionname == NULL
2776
                  || strcmp (functionname, last_functionname) != 0))
2777
            {
2778
              printf ("%s():\n", functionname);
2779
              if (last_functionname != NULL)
2780
                free (last_functionname);
2781
              last_functionname = xstrdup (functionname);
2782
            }
2783
 
2784
          if (line > 0
2785
              && (line != last_line
2786
                  || (filename != NULL
2787
                      && last_filename != NULL
2788
                      && strcmp (filename, last_filename) != 0)))
2789
            {
2790
              printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2791
              last_line = line;
2792
              if (last_filename != NULL)
2793
                free (last_filename);
2794
              if (filename == NULL)
2795
                last_filename = NULL;
2796
              else
2797
                last_filename = xstrdup (filename);
2798
            }
2799
        }
2800
 
2801
      if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2802
        {
2803
          sym_name = (*(q->sym_ptr_ptr))->name;
2804
          section_name = (*(q->sym_ptr_ptr))->section->name;
2805
        }
2806
      else
2807
        {
2808
          sym_name = NULL;
2809
          section_name = NULL;
2810
        }
2811
 
2812
      bfd_printf_vma (abfd, q->address);
2813
      if (q->howto == NULL)
2814
        printf (" *unknown*         ");
2815
      else if (q->howto->name)
2816
        printf (" %-16s  ", q->howto->name);
2817
      else
2818
        printf (" %-16d  ", q->howto->type);
2819
 
2820
      if (sym_name)
2821
        {
2822
          objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2823
        }
2824
      else
2825
        {
2826
          if (section_name == NULL)
2827
            section_name = "*unknown*";
2828
          printf ("[%s]", section_name);
2829
        }
2830
 
2831
      if (q->addend)
2832
        {
2833
          printf ("+0x");
2834
          bfd_printf_vma (abfd, q->addend);
2835
        }
2836
 
2837
      printf ("\n");
2838
    }
2839
}
2840
 
2841
static void
2842
dump_relocs_in_section (bfd *abfd,
2843
                        asection *section,
2844
                        void *dummy ATTRIBUTE_UNUSED)
2845
{
2846
  arelent **relpp;
2847
  long relcount;
2848
  long relsize;
2849
 
2850
  if (   bfd_is_abs_section (section)
2851
      || bfd_is_und_section (section)
2852
      || bfd_is_com_section (section)
2853
      || (! process_section_p (section))
2854
      || ((section->flags & SEC_RELOC) == 0))
2855
    return;
2856
 
2857
  relsize = bfd_get_reloc_upper_bound (abfd, section);
2858
  if (relsize < 0)
2859
    bfd_fatal (bfd_get_filename (abfd));
2860
 
2861
  printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2862
 
2863
  if (relsize == 0)
2864
    {
2865
      printf (" (none)\n\n");
2866
      return;
2867
    }
2868
 
2869
  relpp = (arelent **) xmalloc (relsize);
2870
  relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2871
 
2872
  if (relcount < 0)
2873
    bfd_fatal (bfd_get_filename (abfd));
2874
  else if (relcount == 0)
2875
    printf (" (none)\n\n");
2876
  else
2877
    {
2878
      printf ("\n");
2879
      dump_reloc_set (abfd, section, relpp, relcount);
2880
      printf ("\n\n");
2881
    }
2882
  free (relpp);
2883
}
2884
 
2885
static void
2886
dump_relocs (bfd *abfd)
2887
{
2888
  bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2889
}
2890
 
2891
static void
2892
dump_dynamic_relocs (bfd *abfd)
2893
{
2894
  long relsize;
2895
  arelent **relpp;
2896
  long relcount;
2897
 
2898
  relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2899
  if (relsize < 0)
2900
    bfd_fatal (bfd_get_filename (abfd));
2901
 
2902
  printf ("DYNAMIC RELOCATION RECORDS");
2903
 
2904
  if (relsize == 0)
2905
    printf (" (none)\n\n");
2906
  else
2907
    {
2908
      relpp = (arelent **) xmalloc (relsize);
2909
      relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2910
 
2911
      if (relcount < 0)
2912
        bfd_fatal (bfd_get_filename (abfd));
2913
      else if (relcount == 0)
2914
        printf (" (none)\n\n");
2915
      else
2916
        {
2917
          printf ("\n");
2918
          dump_reloc_set (abfd, NULL, relpp, relcount);
2919
          printf ("\n\n");
2920
        }
2921
      free (relpp);
2922
    }
2923
}
2924
 
2925
/* Creates a table of paths, to search for source files.  */
2926
 
2927
static void
2928
add_include_path (const char *path)
2929
{
2930
  if (path[0] == 0)
2931
    return;
2932
  include_path_count++;
2933
  include_paths = (const char **)
2934
      xrealloc (include_paths, include_path_count * sizeof (*include_paths));
2935
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
2936
  if (path[1] == ':' && path[2] == 0)
2937
    path = concat (path, ".", (const char *) 0);
2938
#endif
2939
  include_paths[include_path_count - 1] = path;
2940
}
2941
 
2942
static void
2943
adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2944
                  asection *section,
2945
                  void *arg)
2946
{
2947
  if ((section->flags & SEC_DEBUGGING) == 0)
2948
    {
2949
      bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2950
      section->vma += adjust_section_vma;
2951
      if (*has_reloc_p)
2952
        section->lma += adjust_section_vma;
2953
    }
2954
}
2955
 
2956
/* Dump selected contents of ABFD.  */
2957
 
2958
static void
2959
dump_bfd (bfd *abfd)
2960
{
2961
  /* If we are adjusting section VMA's, change them all now.  Changing
2962
     the BFD information is a hack.  However, we must do it, or
2963
     bfd_find_nearest_line will not do the right thing.  */
2964
  if (adjust_section_vma != 0)
2965
    {
2966
      bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2967
      bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2968
    }
2969
 
2970
  if (! dump_debugging_tags)
2971
    printf (_("\n%s:     file format %s\n"), bfd_get_filename (abfd),
2972
            abfd->xvec->name);
2973
  if (dump_ar_hdrs)
2974
    print_arelt_descr (stdout, abfd, TRUE);
2975
  if (dump_file_header)
2976
    dump_bfd_header (abfd);
2977
  if (dump_private_headers)
2978
    dump_bfd_private_header (abfd);
2979
  if (! dump_debugging_tags)
2980
    putchar ('\n');
2981
  if (dump_section_headers)
2982
    dump_headers (abfd);
2983
 
2984
  if (dump_symtab
2985
      || dump_reloc_info
2986
      || disassemble
2987
      || dump_debugging
2988
      || dump_dwarf_section_info)
2989
    syms = slurp_symtab (abfd);
2990
  if (dump_dynamic_symtab || dump_dynamic_reloc_info
2991
      || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2992
    dynsyms = slurp_dynamic_symtab (abfd);
2993
  if (disassemble)
2994
    {
2995
      synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2996
                                             dynsymcount, dynsyms, &synthsyms);
2997
      if (synthcount < 0)
2998
        synthcount = 0;
2999
    }
3000
 
3001
  if (dump_symtab)
3002
    dump_symbols (abfd, FALSE);
3003
  if (dump_dynamic_symtab)
3004
    dump_symbols (abfd, TRUE);
3005
  if (dump_dwarf_section_info)
3006
    dump_dwarf (abfd);
3007
  if (dump_stab_section_info)
3008
    dump_stabs (abfd);
3009
  if (dump_reloc_info && ! disassemble)
3010
    dump_relocs (abfd);
3011
  if (dump_dynamic_reloc_info && ! disassemble)
3012
    dump_dynamic_relocs (abfd);
3013
  if (dump_section_contents)
3014
    dump_data (abfd);
3015
  if (disassemble)
3016
    disassemble_data (abfd);
3017
 
3018
  if (dump_debugging)
3019
    {
3020
      void *dhandle;
3021
 
3022
      dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3023
      if (dhandle != NULL)
3024
        {
3025
          if (!print_debugging_info (stdout, dhandle, abfd, syms,
3026
                                     bfd_demangle,
3027
                                     dump_debugging_tags ? TRUE : FALSE))
3028
            {
3029
              non_fatal (_("%s: printing debugging information failed"),
3030
                         bfd_get_filename (abfd));
3031
              exit_status = 1;
3032
            }
3033
        }
3034
      /* PR 6483: If there was no STABS or IEEE debug
3035
         info in the file, try DWARF instead.  */
3036
      else if (! dump_dwarf_section_info)
3037
        {
3038
          dump_dwarf (abfd);
3039
        }
3040
    }
3041
 
3042
  if (syms)
3043
    {
3044
      free (syms);
3045
      syms = NULL;
3046
    }
3047
 
3048
  if (dynsyms)
3049
    {
3050
      free (dynsyms);
3051
      dynsyms = NULL;
3052
    }
3053
 
3054
  if (synthsyms)
3055
    {
3056
      free (synthsyms);
3057
      synthsyms = NULL;
3058
    }
3059
 
3060
  symcount = 0;
3061
  dynsymcount = 0;
3062
  synthcount = 0;
3063
}
3064
 
3065
static void
3066
display_bfd (bfd *abfd)
3067
{
3068
  char **matching;
3069
 
3070
  if (bfd_check_format_matches (abfd, bfd_object, &matching))
3071
    {
3072
      dump_bfd (abfd);
3073
      return;
3074
    }
3075
 
3076
  if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3077
    {
3078
      nonfatal (bfd_get_filename (abfd));
3079
      list_matching_formats (matching);
3080
      free (matching);
3081
      return;
3082
    }
3083
 
3084
  if (bfd_get_error () != bfd_error_file_not_recognized)
3085
    {
3086
      nonfatal (bfd_get_filename (abfd));
3087
      return;
3088
    }
3089
 
3090
  if (bfd_check_format_matches (abfd, bfd_core, &matching))
3091
    {
3092
      dump_bfd (abfd);
3093
      return;
3094
    }
3095
 
3096
  nonfatal (bfd_get_filename (abfd));
3097
 
3098
  if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3099
    {
3100
      list_matching_formats (matching);
3101
      free (matching);
3102
    }
3103
}
3104
 
3105
static void
3106
display_file (char *filename, char *target)
3107
{
3108
  bfd *file;
3109
  bfd *arfile = NULL;
3110
 
3111
  if (get_file_size (filename) < 1)
3112
    {
3113
      exit_status = 1;
3114
      return;
3115
    }
3116
 
3117
  file = bfd_openr (filename, target);
3118
  if (file == NULL)
3119
    {
3120
      nonfatal (filename);
3121
      return;
3122
    }
3123
 
3124
  /* If the file is an archive, process all of its elements.  */
3125
  if (bfd_check_format (file, bfd_archive))
3126
    {
3127
      bfd *last_arfile = NULL;
3128
 
3129
      printf (_("In archive %s:\n"), bfd_get_filename (file));
3130
      for (;;)
3131
        {
3132
          bfd_set_error (bfd_error_no_error);
3133
 
3134
          arfile = bfd_openr_next_archived_file (file, arfile);
3135
          if (arfile == NULL)
3136
            {
3137
              if (bfd_get_error () != bfd_error_no_more_archived_files)
3138
                nonfatal (bfd_get_filename (file));
3139
              break;
3140
            }
3141
 
3142
          display_bfd (arfile);
3143
 
3144
          if (last_arfile != NULL)
3145
            bfd_close (last_arfile);
3146
          last_arfile = arfile;
3147
        }
3148
 
3149
      if (last_arfile != NULL)
3150
        bfd_close (last_arfile);
3151
    }
3152
  else
3153
    display_bfd (file);
3154
 
3155
  bfd_close (file);
3156
}
3157
 
3158
int
3159
main (int argc, char **argv)
3160
{
3161
  int c;
3162
  char *target = default_target;
3163
  bfd_boolean seenflag = FALSE;
3164
 
3165
#if defined (HAVE_SETLOCALE)
3166
#if defined (HAVE_LC_MESSAGES)
3167
  setlocale (LC_MESSAGES, "");
3168
#endif
3169
  setlocale (LC_CTYPE, "");
3170
#endif
3171
 
3172
  bindtextdomain (PACKAGE, LOCALEDIR);
3173
  textdomain (PACKAGE);
3174
 
3175
  program_name = *argv;
3176
  xmalloc_set_program_name (program_name);
3177
 
3178
  START_PROGRESS (program_name, 0);
3179
 
3180
  expandargv (&argc, &argv);
3181
 
3182
  bfd_init ();
3183
  set_default_bfd_target ();
3184
 
3185
  while ((c = getopt_long (argc, argv,
3186
                           "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3187
                           long_options, (int *) 0))
3188
         != EOF)
3189
    {
3190
      switch (c)
3191
        {
3192
        case 0:
3193
          break;                /* We've been given a long option.  */
3194
        case 'm':
3195
          machine = optarg;
3196
          break;
3197
        case 'M':
3198
          if (disassembler_options)
3199
            /* Ignore potential memory leak for now.  */
3200
            disassembler_options = concat (disassembler_options, ",",
3201
                                           optarg, (const char *) NULL);
3202
          else
3203
            disassembler_options = optarg;
3204
          break;
3205
        case 'j':
3206
          if (only_used == only_size)
3207
            {
3208
              only_size += 8;
3209
              only = (char **) xrealloc (only, only_size * sizeof (char *));
3210
            }
3211
          only [only_used++] = optarg;
3212
          break;
3213
        case 'F':
3214
          display_file_offsets = TRUE;
3215
          break;
3216
        case 'l':
3217
          with_line_numbers = TRUE;
3218
          break;
3219
        case 'b':
3220
          target = optarg;
3221
          break;
3222
        case 'C':
3223
          do_demangle = TRUE;
3224
          if (optarg != NULL)
3225
            {
3226
              enum demangling_styles style;
3227
 
3228
              style = cplus_demangle_name_to_style (optarg);
3229
              if (style == unknown_demangling)
3230
                fatal (_("unknown demangling style `%s'"),
3231
                       optarg);
3232
 
3233
              cplus_demangle_set_style (style);
3234
            }
3235
          break;
3236
        case 'w':
3237
          wide_output = TRUE;
3238
          break;
3239
        case OPTION_ADJUST_VMA:
3240
          adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3241
          break;
3242
        case OPTION_START_ADDRESS:
3243
          start_address = parse_vma (optarg, "--start-address");
3244
          if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3245
            fatal (_("error: the start address should be before the end address"));
3246
          break;
3247
        case OPTION_STOP_ADDRESS:
3248
          stop_address = parse_vma (optarg, "--stop-address");
3249
          if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3250
            fatal (_("error: the stop address should be after the start address"));
3251
          break;
3252
        case OPTION_PREFIX:
3253
          prefix = optarg;
3254
          prefix_length = strlen (prefix);
3255
          /* Remove an unnecessary trailing '/' */
3256
          while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3257
            prefix_length--;
3258
          break;
3259
        case OPTION_PREFIX_STRIP:
3260
          prefix_strip = atoi (optarg);
3261
          if (prefix_strip < 0)
3262
            fatal (_("error: prefix strip must be non-negative"));
3263
          break;
3264
        case OPTION_INSN_WIDTH:
3265
          insn_width = strtoul (optarg, NULL, 0);
3266
          if (insn_width <= 0)
3267
            fatal (_("error: instruction width must be positive"));
3268
          break;
3269
        case 'E':
3270
          if (strcmp (optarg, "B") == 0)
3271
            endian = BFD_ENDIAN_BIG;
3272
          else if (strcmp (optarg, "L") == 0)
3273
            endian = BFD_ENDIAN_LITTLE;
3274
          else
3275
            {
3276
              non_fatal (_("unrecognized -E option"));
3277
              usage (stderr, 1);
3278
            }
3279
          break;
3280
        case OPTION_ENDIAN:
3281
          if (strncmp (optarg, "big", strlen (optarg)) == 0)
3282
            endian = BFD_ENDIAN_BIG;
3283
          else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3284
            endian = BFD_ENDIAN_LITTLE;
3285
          else
3286
            {
3287
              non_fatal (_("unrecognized --endian type `%s'"), optarg);
3288
              usage (stderr, 1);
3289
            }
3290
          break;
3291
 
3292
        case 'f':
3293
          dump_file_header = TRUE;
3294
          seenflag = TRUE;
3295
          break;
3296
        case 'i':
3297
          formats_info = TRUE;
3298
          seenflag = TRUE;
3299
          break;
3300
        case 'I':
3301
          add_include_path (optarg);
3302
          break;
3303
        case 'p':
3304
          dump_private_headers = TRUE;
3305
          seenflag = TRUE;
3306
          break;
3307
        case 'x':
3308
          dump_private_headers = TRUE;
3309
          dump_symtab = TRUE;
3310
          dump_reloc_info = TRUE;
3311
          dump_file_header = TRUE;
3312
          dump_ar_hdrs = TRUE;
3313
          dump_section_headers = TRUE;
3314
          seenflag = TRUE;
3315
          break;
3316
        case 't':
3317
          dump_symtab = TRUE;
3318
          seenflag = TRUE;
3319
          break;
3320
        case 'T':
3321
          dump_dynamic_symtab = TRUE;
3322
          seenflag = TRUE;
3323
          break;
3324
        case 'd':
3325
          disassemble = TRUE;
3326
          seenflag = TRUE;
3327
          break;
3328
        case 'z':
3329
          disassemble_zeroes = TRUE;
3330
          break;
3331
        case 'D':
3332
          disassemble = TRUE;
3333
          disassemble_all = TRUE;
3334
          seenflag = TRUE;
3335
          break;
3336
        case 'S':
3337
          disassemble = TRUE;
3338
          with_source_code = TRUE;
3339
          seenflag = TRUE;
3340
          break;
3341
        case 'g':
3342
          dump_debugging = 1;
3343
          seenflag = TRUE;
3344
          break;
3345
        case 'e':
3346
          dump_debugging = 1;
3347
          dump_debugging_tags = 1;
3348
          do_demangle = TRUE;
3349
          seenflag = TRUE;
3350
          break;
3351
        case 'W':
3352
          dump_dwarf_section_info = TRUE;
3353
          seenflag = TRUE;
3354
          if (optarg)
3355
            dwarf_select_sections_by_letters (optarg);
3356
          else
3357
            dwarf_select_sections_all ();
3358
          break;
3359
        case OPTION_DWARF:
3360
          dump_dwarf_section_info = TRUE;
3361
          seenflag = TRUE;
3362
          if (optarg)
3363
            dwarf_select_sections_by_names (optarg);
3364
          else
3365
            dwarf_select_sections_all ();
3366
          break;
3367
        case 'G':
3368
          dump_stab_section_info = TRUE;
3369
          seenflag = TRUE;
3370
          break;
3371
        case 's':
3372
          dump_section_contents = TRUE;
3373
          seenflag = TRUE;
3374
          break;
3375
        case 'r':
3376
          dump_reloc_info = TRUE;
3377
          seenflag = TRUE;
3378
          break;
3379
        case 'R':
3380
          dump_dynamic_reloc_info = TRUE;
3381
          seenflag = TRUE;
3382
          break;
3383
        case 'a':
3384
          dump_ar_hdrs = TRUE;
3385
          seenflag = TRUE;
3386
          break;
3387
        case 'h':
3388
          dump_section_headers = TRUE;
3389
          seenflag = TRUE;
3390
          break;
3391
        case 'H':
3392
          usage (stdout, 0);
3393
          seenflag = TRUE;
3394
        case 'v':
3395
        case 'V':
3396
          show_version = TRUE;
3397
          seenflag = TRUE;
3398
          break;
3399
 
3400
        default:
3401
          usage (stderr, 1);
3402
        }
3403
    }
3404
 
3405
  if (show_version)
3406
    print_version ("objdump");
3407
 
3408
  if (!seenflag)
3409
    usage (stderr, 2);
3410
 
3411
  if (formats_info)
3412
    exit_status = display_info ();
3413
  else
3414
    {
3415
      if (optind == argc)
3416
        display_file ("a.out", target);
3417
      else
3418
        for (; optind < argc;)
3419
          display_file (argv[optind++], target);
3420
    }
3421
 
3422
  END_PROGRESS (program_name);
3423
 
3424
  return exit_status;
3425
}

powered by: WebSVN 2.1.0

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