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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [binutils/] [objdump.c] - Blame information for rev 241

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

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

powered by: WebSVN 2.1.0

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