* elf32-spu.c (build_stub): Fix malloc under-allocation.
[binutils.git] / binutils / objdump.c
blobf55b79d645415e466de4c3d7a6b8e4bde285329d
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 2012 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
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.
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.
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. */
24 /* Objdump overview.
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.
31 The flow of execution is as follows:
33 1. Command line arguments are checked for control switches and the
34 information to be displayed is selected.
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.
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.
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.
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. */
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"
70 #ifdef HAVE_MMAP
71 #include <sys/mman.h>
72 #endif
74 /* Internal headers for the ELF .stab-dump code - sorry. */
75 #define BYTES_IN_WORD 32
76 #include "aout/aout64.h"
78 /* Exit status. */
79 static int exit_status = 0;
81 static char *default_target = NULL; /* Default at runtime. */
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;
122 /* A structure to record the sections mentioned in -j switches. */
123 struct only
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. */
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;
133 /* Variables for handling include file path table. */
134 static const char **include_paths;
135 static int include_path_count;
137 /* Extra info to pass to the section disassembler and address printing
138 function. */
139 struct objdump_disasm_info
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;
150 /* Architecture to disassemble for, or default if NULL. */
151 static char *machine = NULL;
153 /* Target specific options to the disassembler. */
154 static char *disassembler_options = NULL;
156 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
157 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
159 /* The symbol table. */
160 static asymbol **syms;
162 /* Number of symbols in `syms'. */
163 static long symcount = 0;
165 /* The sorted symbol table. */
166 static asymbol **sorted_syms;
168 /* Number of symbols in `sorted_syms'. */
169 static long sorted_symcount = 0;
171 /* The dynamic symbol table. */
172 static asymbol **dynsyms;
174 /* The synthetic symbol table. */
175 static asymbol *synthsyms;
176 static long synthcount = 0;
178 /* Number of symbols in `dynsyms'. */
179 static long dynsymcount = 0;
181 static bfd_byte *stabs;
182 static bfd_size_type stab_size;
184 static char *strtab;
185 static bfd_size_type stabstr_size;
187 static bfd_boolean is_relocatable = FALSE;
189 /* Handlers for -P/--private. */
190 static const struct objdump_private_desc * const objdump_private_vectors[] =
192 OBJDUMP_PRIVATE_VECTORS
193 NULL
196 static void
197 usage (FILE *stream, int status)
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)
232 const struct objdump_private_desc * const *desc;
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);
268 disassembler_usage (stream);
270 if (objdump_private_vectors[0] != NULL)
272 fprintf (stream,
273 _("\nOptions supported for -P/--private switch:\n"));
274 for (desc = objdump_private_vectors; *desc != NULL; desc++)
275 (*desc)->help (stream);
278 if (REPORT_BUGS_TO[0] && status == 0)
279 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
280 exit (status);
283 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
284 enum option_values
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
298 static struct option long_options[]=
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}
349 static void
350 nonfatal (const char *msg)
352 bfd_nonfatal (msg);
353 exit_status = 1;
356 /* Returns TRUE if the specified section should be dumped. */
358 static bfd_boolean
359 process_section_p (asection * section)
361 struct only * only;
363 if (only_list == NULL)
364 return TRUE;
366 for (only = only_list; only; only = only->next)
367 if (strcmp (only->name, section->name) == 0)
369 only->seen = TRUE;
370 return TRUE;
373 return FALSE;
376 /* Add an entry to the 'only' list. */
378 static void
379 add_only (char * name)
381 struct only * only;
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;
389 only = xmalloc (sizeof * only);
390 only->name = name;
391 only->seen = FALSE;
392 only->next = only_list;
393 only_list = only;
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. */
403 static void
404 free_only_list (void)
406 bfd_boolean at_least_one_seen = FALSE;
407 struct only * only;
408 struct only * next;
410 if (only_list == NULL)
411 return;
413 for (only = only_list; only; only = only->next)
414 if (only->seen)
416 at_least_one_seen = TRUE;
417 break;
420 for (only = only_list; only; only = next)
422 if (! at_least_one_seen)
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;
429 next = only->next;
430 free (only);
435 static void
436 dump_section_header (bfd *abfd, asection *section,
437 void *ignored ATTRIBUTE_UNUSED)
439 char *comma = "";
440 unsigned int opb = bfd_octets_per_byte (abfd);
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;
447 /* PR 10413: Skip sections that we are ignoring. */
448 if (! process_section_p (section))
449 return;
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 (" ");
463 #define PF(x, y) \
464 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
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)
481 PF (SEC_TIC54X_BLOCK, "BLOCK");
482 PF (SEC_TIC54X_CLINK, "CLINK");
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");
490 if ((section->flags & SEC_LINK_ONCE) != 0)
492 const char *ls;
493 struct coff_comdat_info *comdat;
495 switch (section->flags & SEC_LINK_DUPLICATES)
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;
512 printf ("%s%s", comma, ls);
514 comdat = bfd_coff_get_comdat_section (abfd, section);
515 if (comdat != NULL)
516 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
518 comma = ", ";
521 printf ("\n");
522 #undef PF
525 static void
526 dump_headers (bfd *abfd)
528 printf (_("Sections:\n"));
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
540 if (wide_output)
541 printf (_(" Flags"));
542 printf ("\n");
544 bfd_map_over_sections (abfd, dump_section_header, NULL);
547 static asymbol **
548 slurp_symtab (bfd *abfd)
550 asymbol **sy = NULL;
551 long storage;
553 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
555 symcount = 0;
556 return NULL;
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);
565 symcount = bfd_canonicalize_symtab (abfd, sy);
566 if (symcount < 0)
567 bfd_fatal (bfd_get_filename (abfd));
568 return sy;
571 /* Read in the dynamic symbols. */
573 static asymbol **
574 slurp_dynamic_symtab (bfd *abfd)
576 asymbol **sy = NULL;
577 long storage;
579 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
580 if (storage < 0)
582 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
584 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
585 exit_status = 1;
586 dynsymcount = 0;
587 return NULL;
590 bfd_fatal (bfd_get_filename (abfd));
592 if (storage)
593 sy = (asymbol **) xmalloc (storage);
595 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
596 if (dynsymcount < 0)
597 bfd_fatal (bfd_get_filename (abfd));
598 return sy;
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. */
605 static long
606 remove_useless_symbols (asymbol **symbols, long count)
608 asymbol **in_ptr = symbols, **out_ptr = symbols;
610 while (--count >= 0)
612 asymbol *sym = *in_ptr++;
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;
622 *out_ptr++ = sym;
624 return out_ptr - symbols;
627 /* Sort symbols into value order. */
629 static int
630 compare_symbols (const void *ap, const void *bp)
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;
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;
648 if (a->section > b->section)
649 return 1;
650 else if (a->section < b->section)
651 return -1;
653 an = bfd_asymbol_name (a);
654 bn = bfd_asymbol_name (b);
655 anl = strlen (an);
656 bnl = strlen (bn);
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);
665 if (af && ! bf)
666 return 1;
667 if (! af && bf)
668 return -1;
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. */
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')))
681 af = file_symbol (a, an, anl);
682 bf = file_symbol (b, bn, bnl);
684 if (af && ! bf)
685 return 1;
686 if (! af && bf)
687 return -1;
689 /* Try to sort global symbols before local symbols before function
690 symbols before debugging symbols. */
692 aflags = a->flags;
693 bflags = b->flags;
695 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
697 if ((aflags & BSF_DEBUGGING) != 0)
698 return 1;
699 else
700 return -1;
702 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
704 if ((aflags & BSF_FUNCTION) != 0)
705 return -1;
706 else
707 return 1;
709 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
711 if ((aflags & BSF_LOCAL) != 0)
712 return 1;
713 else
714 return -1;
716 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
718 if ((aflags & BSF_GLOBAL) != 0)
719 return -1;
720 else
721 return 1;
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;
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);
736 /* Sort relocs into address order. */
738 static int
739 compare_relocs (const void *ap, const void *bp)
741 const arelent *a = * (const arelent **) ap;
742 const arelent *b = * (const arelent **) bp;
744 if (a->address > b->address)
745 return 1;
746 else if (a->address < b->address)
747 return -1;
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;
759 /* Print an address (VMA) to the output stream in INFO.
760 If SKIP_ZEROES is TRUE, omit leading zeroes. */
762 static void
763 objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
764 bfd_boolean skip_zeroes)
766 char buf[30];
767 char *p;
768 struct objdump_disasm_info *aux;
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
776 for (p = buf; *p == '0'; ++p)
778 if (*p == '\0')
779 --p;
781 (*inf->fprintf_func) (inf->stream, "%s", p);
784 /* Print the name of a symbol. */
786 static void
787 objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
788 asymbol *sym)
790 char *alloc;
791 const char *name;
793 alloc = NULL;
794 name = bfd_asymbol_name (sym);
795 if (do_demangle && name[0] != '\0')
797 /* Demangle the name. */
798 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
799 if (alloc != NULL)
800 name = alloc;
803 if (inf != NULL)
804 (*inf->fprintf_func) (inf->stream, "%s", name);
805 else
806 printf ("%s", name);
808 if (alloc != NULL)
809 free (alloc);
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. */
818 static asymbol *
819 find_symbol_for_address (bfd_vma vma,
820 struct disassemble_info *inf,
821 long *place)
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. */
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;
838 if (sorted_symcount < 1)
839 return NULL;
841 aux = (struct objdump_disasm_info *) inf->application_data;
842 abfd = aux->abfd;
843 sec = aux->sec;
844 opb = inf->octets_per_byte;
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)
850 asymbol *sym;
852 thisplace = (max_count + min) / 2;
853 sym = sorted_syms[thisplace];
855 if (bfd_asymbol_value (sym) > vma)
856 max_count = thisplace;
857 else if (bfd_asymbol_value (sym) < vma)
858 min = thisplace;
859 else
861 min = thisplace;
862 break;
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;
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])))
883 if (sorted_syms[min]->section == sec
884 && inf->symbol_is_valid (sorted_syms[min], inf))
886 thisplace = min;
888 if (place != NULL)
889 *place = thisplace;
891 return sorted_syms[thisplace];
893 ++min;
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.
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.
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))
914 long i;
915 long newplace = sorted_symcount;
917 for (i = min - 1; i >= 0; i--)
919 if ((sorted_syms[i]->section == sec || !want_section)
920 && inf->symbol_is_valid (sorted_syms[i], inf))
922 if (newplace == sorted_symcount)
923 newplace = i;
925 if (bfd_asymbol_value (sorted_syms[i])
926 != bfd_asymbol_value (sorted_syms[newplace]))
927 break;
929 /* Remember this symbol and keep searching until we reach
930 an earlier address. */
931 newplace = i;
935 if (newplace != sorted_symcount)
936 thisplace = newplace;
937 else
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++)
943 if ((sorted_syms[i]->section == sec || !want_section)
944 && inf->symbol_is_valid (sorted_syms[i], inf))
946 thisplace = i;
947 break;
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;
958 if (place != NULL)
959 *place = thisplace;
961 return sorted_syms[thisplace];
964 /* Print an address and the offset to the nearest symbol. */
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)
971 objdump_print_value (vma, inf, skip_zeroes);
973 if (sym == NULL)
975 bfd_vma secaddr;
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)
982 (*inf->fprintf_func) (inf->stream, "-0x");
983 objdump_print_value (secaddr - vma, inf, TRUE);
985 else if (vma > secaddr)
987 (*inf->fprintf_func) (inf->stream, "+0x");
988 objdump_print_value (vma - secaddr, inf, TRUE);
990 (*inf->fprintf_func) (inf->stream, ">");
992 else
994 (*inf->fprintf_func) (inf->stream, " <");
995 objdump_print_symname (abfd, inf, sym);
996 if (bfd_asymbol_value (sym) > vma)
998 (*inf->fprintf_func) (inf->stream, "-0x");
999 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1001 else if (vma > bfd_asymbol_value (sym))
1003 (*inf->fprintf_func) (inf->stream, "+0x");
1004 objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1006 (*inf->fprintf_func) (inf->stream, ">");
1009 if (display_file_offsets)
1010 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1011 (long int)(sec->filepos + (vma - sec->vma)));
1014 /* Print an address (VMA), symbolically if possible.
1015 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
1017 static void
1018 objdump_print_addr (bfd_vma vma,
1019 struct disassemble_info *inf,
1020 bfd_boolean skip_zeroes)
1022 struct objdump_disasm_info *aux;
1023 asymbol *sym = NULL;
1024 bfd_boolean skip_find = FALSE;
1026 aux = (struct objdump_disasm_info *) inf->application_data;
1028 if (sorted_symcount < 1)
1030 (*inf->fprintf_func) (inf->stream, "0x");
1031 objdump_print_value (vma, inf, skip_zeroes);
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;
1039 if (aux->reloc != NULL
1040 && aux->reloc->sym_ptr_ptr != NULL
1041 && * aux->reloc->sym_ptr_ptr != NULL)
1043 sym = * aux->reloc->sym_ptr_ptr;
1045 /* Adjust the vma to the reloc. */
1046 vma += bfd_asymbol_value (sym);
1048 if (bfd_is_und_section (bfd_get_section (sym)))
1049 skip_find = TRUE;
1052 if (!skip_find)
1053 sym = find_symbol_for_address (vma, inf, NULL);
1055 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1056 skip_zeroes);
1059 /* Print VMA to INFO. This function is passed to the disassembler
1060 routine. */
1062 static void
1063 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1065 objdump_print_addr (vma, inf, ! prefix_addresses);
1068 /* Determine if the given address has a symbol associated with it. */
1070 static int
1071 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1073 asymbol * sym;
1075 sym = find_symbol_for_address (vma, inf, NULL);
1077 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1080 /* Hold the last function name and the last line number we displayed
1081 in a disassembly. */
1083 static char *prev_functionname;
1084 static unsigned int prev_line;
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. */
1090 struct print_file_list
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;
1103 static struct print_file_list *print_files;
1105 /* The number of preceding context lines to show when we start
1106 displaying a file for the first time. */
1108 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1110 /* Read a complete file into memory. */
1112 static const char *
1113 slurp_file (const char *fn, size_t *size)
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);
1123 if (fd < 0)
1124 return NULL;
1125 if (fstat (fd, &st) < 0)
1127 close (fd);
1128 return NULL;
1130 *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 if (map != (char *) -1L)
1136 close (fd);
1137 return map;
1139 #endif
1140 map = (const char *) malloc (*size);
1141 if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1143 free ((void *) map);
1144 map = NULL;
1146 close (fd);
1147 return map;
1150 #define line_map_decrease 5
1152 /* Precompute array of lines for a mapped file. */
1154 static const char **
1155 index_file (const char *map, size_t size, unsigned int *maxline)
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;
1163 lineno = 0;
1164 lstart = map;
1165 end = map + size;
1167 for (p = map; p < end; p++)
1169 if (*p == '\n')
1171 if (p + 1 < end && p[1] == '\r')
1172 p++;
1174 else if (*p == '\r')
1176 if (p + 1 < end && p[1] == '\n')
1177 p++;
1179 else
1180 continue;
1182 /* End of line found. */
1184 if (linemap == NULL || line_map_size < lineno + 1)
1186 unsigned long newsize;
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);
1198 linemap[lineno++] = lstart;
1199 lstart = p + 1;
1202 *maxline = lineno;
1203 return linemap;
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. */
1209 static struct print_file_list *
1210 try_print_file_open (const char *origname, const char *modname)
1212 struct print_file_list *p;
1214 p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1216 p->map = slurp_file (modname, &p->mapsize);
1217 if (p->map == NULL)
1219 free (p);
1220 return NULL;
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;
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. */
1237 static struct print_file_list *
1238 update_source_path (const char *filename)
1240 struct print_file_list *p;
1241 const char *fname;
1242 int i;
1244 p = try_print_file_open (filename, filename);
1245 if (p != NULL)
1246 return p;
1248 if (include_path_count == 0)
1249 return NULL;
1251 /* Get the name of the file. */
1252 fname = lbasename (filename);
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++)
1258 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1260 p = try_print_file_open (filename, modname);
1261 if (p)
1262 return p;
1264 free (modname);
1267 return NULL;
1270 /* Print a source file line. */
1272 static void
1273 print_line (struct print_file_list *p, unsigned int linenum)
1275 const char *l;
1276 size_t len;
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');
1288 /* Print a range of source code lines. */
1290 static void
1291 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1293 if (p->map == NULL)
1294 return;
1295 while (start <= end)
1297 print_line (p, start);
1298 start++;
1302 /* Show the line number, or the source line, in a disassembly
1303 listing. */
1305 static void
1306 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1308 const char *filename;
1309 const char *functionname;
1310 unsigned int linenumber;
1311 bfd_boolean reloc;
1313 if (! with_line_numbers && ! with_source_code)
1314 return;
1316 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1317 &functionname, &linenumber))
1318 return;
1320 if (filename != NULL && *filename == '\0')
1321 filename = NULL;
1322 if (functionname != NULL && *functionname == '\0')
1323 functionname = NULL;
1325 if (filename
1326 && IS_ABSOLUTE_PATH (filename)
1327 && prefix)
1329 char *path_up;
1330 const char *fname = filename;
1331 char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
1333 if (prefix_length)
1334 memcpy (path, prefix, prefix_length);
1335 path_up = path + prefix_length;
1337 /* Build relocated filename, stripping off leading directories
1338 from the initial filename if requested. */
1339 if (prefix_strip > 0)
1341 int level = 0;
1342 const char *s;
1344 /* Skip selected directory levels. */
1345 for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1346 if (IS_DIR_SEPARATOR(*s))
1348 fname = s;
1349 level++;
1353 /* Update complete filename. */
1354 strncpy (path_up, fname, PATH_MAX);
1355 path_up[PATH_MAX] = '\0';
1357 filename = path;
1358 reloc = TRUE;
1360 else
1361 reloc = FALSE;
1363 if (with_line_numbers)
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);
1373 if (with_source_code
1374 && filename != NULL
1375 && linenumber > 0)
1377 struct print_file_list **pp, *p;
1378 unsigned l;
1380 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1381 if (filename_cmp ((*pp)->filename, filename) == 0)
1382 break;
1383 p = *pp;
1385 if (p == NULL)
1387 if (reloc)
1388 filename = xstrdup (filename);
1389 p = update_source_path (filename);
1392 if (p != NULL && linenumber != p->last_line)
1394 if (file_start_context && p->first)
1395 l = 1;
1396 else
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;
1404 dump_lines (p, l, linenumber);
1405 p->last_line = linenumber;
1406 p->first = 0;
1410 if (functionname != NULL
1411 && (prev_functionname == NULL
1412 || strcmp (functionname, prev_functionname) != 0))
1414 if (prev_functionname != NULL)
1415 free (prev_functionname);
1416 prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1417 strcpy (prev_functionname, functionname);
1420 if (linenumber > 0 && linenumber != prev_line)
1421 prev_line = linenumber;
1424 /* Pseudo FILE object for strings. */
1425 typedef struct
1427 char *buffer;
1428 size_t pos;
1429 size_t alloc;
1430 } SFILE;
1432 /* sprintf to a "stream". */
1434 static int ATTRIBUTE_PRINTF_2
1435 objdump_sprintf (SFILE *f, const char *format, ...)
1437 size_t n;
1438 va_list args;
1440 while (1)
1442 size_t space = f->alloc - f->pos;
1444 va_start (args, format);
1445 n = vsnprintf (f->buffer + f->pos, space, format, args);
1446 va_end (args);
1448 if (space > n)
1449 break;
1451 f->alloc = (f->alloc + n) * 2;
1452 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1454 f->pos += n;
1456 return n;
1459 /* The number of zeroes we want to see before we start skipping them.
1460 The number is arbitrarily chosen. */
1462 #define DEFAULT_SKIP_ZEROES 8
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. */
1471 #define DEFAULT_SKIP_ZEROES_AT_END 3
1473 /* Disassemble some data in memory between given values. */
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)
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;
1497 aux = (struct objdump_disasm_info *) inf->application_data;
1498 section = aux->sec;
1500 sfile.alloc = 120;
1501 sfile.buffer = (char *) xmalloc (sfile.alloc);
1502 sfile.pos = 0;
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;
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)
1518 char buf[30];
1520 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1522 while (buf[skip_addr_chars] == '0')
1523 ++skip_addr_chars;
1525 /* Don't discard zeros on overflow. */
1526 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1527 skip_addr_chars = 0;
1529 if (skip_addr_chars != 0)
1530 skip_addr_chars = (skip_addr_chars - 1) & -4;
1533 inf->insn_info_valid = 0;
1535 addr_offset = start_offset;
1536 while (addr_offset < stop_offset)
1538 bfd_vma z;
1539 bfd_boolean need_nl = FALSE;
1540 int previous_octets;
1542 /* Remember the length of the previous instruction. */
1543 previous_octets = octets;
1544 octets = 0;
1546 /* Make sure we don't use relocs from previous instructions. */
1547 aux->reloc = NULL;
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)))
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);
1568 octets = z - addr_offset * opb;
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");
1581 else
1583 char buf[50];
1584 int bpc = 0;
1585 int pb = 0;
1587 if (with_line_numbers || with_source_code)
1588 show_line (aux->abfd, section, addr_offset);
1590 if (! prefix_addresses)
1592 char *s;
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);
1601 else
1603 aux->require_sec = TRUE;
1604 objdump_print_address (section->vma + addr_offset, inf);
1605 aux->require_sec = FALSE;
1606 putchar (' ');
1609 if (insns)
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;
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)
1625 bfd_signed_vma distance_to_rel;
1627 distance_to_rel = (**relppp)->address
1628 - (rel_offset + addr_offset);
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)))
1647 inf->flags |= INSN_HAS_RELOC;
1648 aux->reloc = **relppp;
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)
1659 if (sfile.pos)
1660 printf ("%s\n", sfile.buffer);
1661 if (octets >= 0)
1663 non_fatal (_("disassemble_fn returned length %d"),
1664 octets);
1665 exit_status = 1;
1667 break;
1670 else
1672 bfd_vma j;
1674 octets = octets_per_line;
1675 if (addr_offset + octets / opb > stop_offset)
1676 octets = (stop_offset - addr_offset) * opb;
1678 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1680 if (ISPRINT (data[j]))
1681 buf[j - addr_offset * opb] = data[j];
1682 else
1683 buf[j - addr_offset * opb] = '.';
1685 buf[j - addr_offset * opb] = '\0';
1688 if (prefix_addresses
1689 ? show_raw_insn > 0
1690 : show_raw_insn >= 0)
1692 bfd_vma j;
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;
1700 if (inf->bytes_per_chunk)
1701 bpc = inf->bytes_per_chunk;
1702 else
1703 bpc = 1;
1705 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1707 int k;
1709 if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1711 for (k = bpc - 1; k >= 0; k--)
1712 printf ("%02x", (unsigned) data[j + k]);
1713 putchar (' ');
1715 else
1717 for (k = 0; k < bpc; k++)
1718 printf ("%02x", (unsigned) data[j + k]);
1719 putchar (' ');
1723 for (; pb < octets_per_line; pb += bpc)
1725 int k;
1727 for (k = 0; k < bpc; k++)
1728 printf (" ");
1729 putchar (' ');
1732 /* Separate raw data from instruction by extra space. */
1733 if (insns)
1734 putchar ('\t');
1735 else
1736 printf (" ");
1739 if (! insns)
1740 printf ("%s", buf);
1741 else if (sfile.pos)
1742 printf ("%s", sfile.buffer);
1744 if (prefix_addresses
1745 ? show_raw_insn > 0
1746 : show_raw_insn >= 0)
1748 while (pb < octets)
1750 bfd_vma j;
1751 char *s;
1753 putchar ('\n');
1754 j = addr_offset * opb + pb;
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);
1763 pb += octets_per_line;
1764 if (pb > octets)
1765 pb = octets;
1766 for (; j < addr_offset * opb + pb; j += bpc)
1768 int k;
1770 if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1772 for (k = bpc - 1; k >= 0; k--)
1773 printf ("%02x", (unsigned) data[j + k]);
1774 putchar (' ');
1776 else
1778 for (k = 0; k < bpc; k++)
1779 printf ("%02x", (unsigned) data[j + k]);
1780 putchar (' ');
1786 if (!wide_output)
1787 putchar ('\n');
1788 else
1789 need_nl = TRUE;
1792 while ((*relppp) < relppend
1793 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1795 if (dump_reloc_info || dump_dynamic_reloc_info)
1797 arelent *q;
1799 q = **relppp;
1801 if (wide_output)
1802 putchar ('\t');
1803 else
1804 printf ("\t\t\t");
1806 objdump_print_value (section->vma - rel_offset + q->address,
1807 inf, TRUE);
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);
1816 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1817 printf ("*unknown*");
1818 else
1820 const char *sym_name;
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
1827 asection *sym_sec;
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);
1837 if (q->addend)
1839 printf ("+0x");
1840 objdump_print_value (q->addend, inf, TRUE);
1843 printf ("\n");
1844 need_nl = FALSE;
1846 ++(*relppp);
1849 if (need_nl)
1850 printf ("\n");
1852 addr_offset += octets / opb;
1855 free (sfile.buffer);
1858 static void
1859 disassemble_section (bfd *abfd, asection *section, void *inf)
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;
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;
1886 if (! process_section_p (section))
1887 return;
1889 datasize = bfd_get_section_size (section);
1890 if (datasize == 0)
1891 return;
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)
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;
1904 else
1906 rel_count = 0;
1907 rel_pp = NULL;
1908 rel_offset = 0;
1910 if ((section->flags & SEC_RELOC) != 0
1911 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1913 long relsize;
1915 relsize = bfd_get_reloc_upper_bound (abfd, section);
1916 if (relsize < 0)
1917 bfd_fatal (bfd_get_filename (abfd));
1919 if (relsize > 0)
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));
1926 /* Sort the relocs by address. */
1927 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1931 rel_ppend = rel_pp + rel_count;
1933 data = (bfd_byte *) xmalloc (datasize);
1935 bfd_get_section_contents (abfd, section, data, 0, datasize);
1937 paux->sec = section;
1938 pinfo->buffer = data;
1939 pinfo->buffer_vma = section->vma;
1940 pinfo->buffer_length = datasize;
1941 pinfo->section = section;
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;
1949 if (stop_address == (bfd_vma) -1)
1950 stop_offset = datasize / opb;
1951 else
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;
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;
1967 if (addr_offset < stop_offset)
1968 printf (_("\nDisassembly of section %s:\n"), section->name);
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;
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);
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)
1991 bfd_vma addr;
1992 asymbol *nextsym;
1993 unsigned long nextstop_offset;
1994 bfd_boolean insns;
1996 addr = section->vma + addr_offset;
1997 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
1999 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2001 int x;
2003 for (x = place;
2004 (x < sorted_symcount
2005 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2006 ++x)
2007 continue;
2009 pinfo->symbols = sorted_syms + place;
2010 pinfo->num_symbols = x - place;
2011 pinfo->symtab_pos = place;
2013 else
2015 pinfo->symbols = NULL;
2016 pinfo->num_symbols = 0;
2017 pinfo->symtab_pos = -1;
2020 if (! prefix_addresses)
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");
2028 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2029 nextsym = sym;
2030 else if (sym == NULL)
2031 nextsym = NULL;
2032 else
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))
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;
2047 if (place >= sorted_symcount)
2048 nextsym = NULL;
2049 else
2050 nextsym = sorted_syms[place];
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;
2060 if (nextstop_offset > stop_offset
2061 || nextstop_offset <= addr_offset)
2062 nextstop_offset = stop_offset;
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;
2081 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2082 addr_offset, nextstop_offset,
2083 rel_offset, &rel_pp, rel_ppend);
2085 addr_offset = nextstop_offset;
2086 sym = nextsym;
2089 free (data);
2091 if (rel_ppstart != NULL)
2092 free (rel_ppstart);
2095 /* Disassemble the contents of an object file. */
2097 static void
2098 disassemble_data (bfd *abfd)
2100 struct disassemble_info disasm_info;
2101 struct objdump_disasm_info aux;
2102 long i;
2104 print_files = NULL;
2105 prev_functionname = NULL;
2106 prev_line = -1;
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 *));
2116 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2118 for (i = 0; i < synthcount; ++i)
2120 sorted_syms[sorted_symcount] = synthsyms + i;
2121 ++sorted_symcount;
2124 /* Sort the symbols into section and symbol order. */
2125 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2127 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
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;
2136 disasm_info.print_address_func = objdump_print_address;
2137 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2139 if (machine != NULL)
2141 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2143 if (inf == NULL)
2144 fatal (_("can't use supplied machine %s"), machine);
2146 abfd->arch_info = inf;
2149 if (endian != BFD_ENDIAN_UNKNOWN)
2151 struct bfd_target *xvec;
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;
2159 /* Use libopcodes to locate a suitable disassembler. */
2160 aux.disassemble_fn = disassembler (abfd);
2161 if (!aux.disassemble_fn)
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;
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;
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;
2187 /* Allow the target to customize the info structure. */
2188 disassemble_init_for_target (& disasm_info);
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)
2194 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2196 if (relsize < 0)
2197 bfd_fatal (bfd_get_filename (abfd));
2199 if (relsize > 0)
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));
2208 /* Sort the relocs by address. */
2209 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2210 compare_relocs);
2213 disasm_info.symtab = sorted_syms;
2214 disasm_info.symtab_size = sorted_symcount;
2216 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2218 if (aux.dynrelbuf != NULL)
2219 free (aux.dynrelbuf);
2220 free (sorted_syms);
2223 static int
2224 load_specific_debug_section (enum dwarf_section_display_enum debug,
2225 asection *sec, void *file)
2227 struct dwarf_section *section = &debug_displays [debug].section;
2228 bfd *abfd = (bfd *) file;
2229 bfd_boolean ret;
2231 /* If it is already loaded, do nothing. */
2232 if (section->start != NULL)
2233 return 1;
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);
2240 if (! ret)
2242 free_debug_section (debug);
2243 printf (_("\nCan't get contents for section '%s'.\n"),
2244 section->name);
2245 return 0;
2248 if (is_relocatable && debug_displays [debug].relocate)
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;
2258 ret = bfd_simple_get_relocated_section_contents (abfd,
2259 sec,
2260 section->start,
2261 syms) != NULL;
2263 if (! ret)
2265 free_debug_section (debug);
2266 printf (_("\nCan't get contents for section '%s'.\n"),
2267 section->name);
2268 return 0;
2272 return 1;
2276 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2278 struct dwarf_section *section = &debug_displays [debug].section;
2279 bfd *abfd = (bfd *) file;
2280 asection *sec;
2282 /* If it is already loaded, do nothing. */
2283 if (section->start != NULL)
2284 return 1;
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
2292 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2293 if (sec != NULL)
2294 section->name = section->compressed_name;
2296 if (sec == NULL)
2297 return 0;
2299 return load_specific_debug_section (debug, sec, file);
2302 void
2303 free_debug_section (enum dwarf_section_display_enum debug)
2305 struct dwarf_section *section = &debug_displays [debug].section;
2307 if (section->start == NULL)
2308 return;
2310 free ((char *) section->start);
2311 section->start = NULL;
2312 section->address = 0;
2313 section->size = 0;
2316 static void
2317 dump_dwarf_section (bfd *abfd, asection *section,
2318 void *arg ATTRIBUTE_UNUSED)
2320 const char *name = bfd_get_section_name (abfd, section);
2321 const char *match;
2322 int i;
2324 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2325 match = ".debug_info";
2326 else
2327 match = name;
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)
2335 struct dwarf_section *sec = &debug_displays [i].section;
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))
2344 debug_displays [i].display (sec, abfd);
2346 if (i != info && i != abbrev)
2347 free_debug_section ((enum dwarf_section_display_enum) i);
2349 break;
2353 /* Dump the dwarf debugging information. */
2355 static void
2356 dump_dwarf (bfd *abfd)
2358 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2360 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
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 ();
2369 switch (bfd_get_arch (abfd))
2371 case bfd_arch_i386:
2372 switch (bfd_get_mach (abfd))
2374 case bfd_mach_x86_64:
2375 case bfd_mach_x86_64_intel_syntax:
2376 init_dwarf_regnames_x86_64 ();
2377 break;
2379 default:
2380 init_dwarf_regnames_i386 ();
2381 break;
2383 break;
2385 default:
2386 break;
2389 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2391 free_debug_memory ();
2394 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2395 it. Return NULL on failure. */
2397 static char *
2398 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2400 asection *stabsect;
2401 bfd_size_type size;
2402 char *contents;
2404 stabsect = bfd_get_section_by_name (abfd, sect_name);
2405 if (stabsect == NULL)
2407 printf (_("No %s section present\n\n"), sect_name);
2408 return FALSE;
2411 size = bfd_section_size (abfd, stabsect);
2412 contents = (char *) xmalloc (size);
2414 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
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;
2424 *size_ptr = size;
2426 return contents;
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. */
2437 #define STRDXOFF (0)
2438 #define TYPEOFF (4)
2439 #define OTHEROFF (5)
2440 #define DESCOFF (6)
2441 #define VALOFF (8)
2442 #define STABSIZE (12)
2444 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2445 using string table section STRSECT_NAME (in `strtab'). */
2447 static void
2448 print_section_stabs (bfd *abfd,
2449 const char *stabsect_name,
2450 unsigned *string_offset_ptr)
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;
2457 stabp = stabs;
2458 stabs_end = stabp + stab_size;
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");
2463 /* Loop through all symbols and print them.
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++)
2469 const char *name;
2470 unsigned long strx;
2471 unsigned char type, other;
2472 unsigned short desc;
2473 bfd_vma value;
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);
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);
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)
2500 file_string_table_offset = next_file_string_table_offset;
2501 next_file_string_table_offset += value;
2503 else
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 (" *");
2513 printf ("\n\n");
2514 *string_offset_ptr = next_file_string_table_offset;
2517 typedef struct
2519 const char * section_name;
2520 const char * string_section_name;
2521 unsigned string_offset;
2523 stab_section_names;
2525 static void
2526 find_stabs_section (bfd *abfd, asection *section, void *names)
2528 int len;
2529 stab_section_names * sought = (stab_section_names *) names;
2531 /* Check for section names for which stabsect_name is a prefix, to
2532 handle .stab.N, etc. */
2533 len = strlen (sought->section_name);
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]))))
2542 if (strtab == NULL)
2543 strtab = read_section_stabs (abfd, sought->string_section_name,
2544 &stabstr_size);
2546 if (strtab)
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);
2556 static void
2557 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2559 stab_section_names s;
2561 s.section_name = stabsect_name;
2562 s.string_section_name = strsect_name;
2563 s.string_offset = 0;
2565 bfd_map_over_sections (abfd, find_stabs_section, & s);
2567 free (strtab);
2568 strtab = NULL;
2571 /* Dump the any sections containing stabs debugging information. */
2573 static void
2574 dump_stabs (bfd *abfd)
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");
2580 /* For Darwin. */
2581 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2583 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2586 static void
2587 dump_bfd_header (bfd *abfd)
2589 char *comma = "";
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);
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");
2614 static void
2615 dump_bfd_private_header (bfd *abfd)
2617 bfd_print_private_bfd_data (abfd, stdout);
2620 static void
2621 dump_target_specific (bfd *abfd)
2623 const struct objdump_private_desc * const *desc;
2624 struct objdump_private_option *opt;
2625 char *e, *b;
2627 /* Find the desc. */
2628 for (desc = objdump_private_vectors; *desc != NULL; desc++)
2629 if ((*desc)->filter (abfd))
2630 break;
2632 if (desc == NULL)
2634 non_fatal (_("option -P/--private not supported by this file"));
2635 return;
2638 /* Clear all options. */
2639 for (opt = (*desc)->options; opt->name; opt++)
2640 opt->selected = FALSE;
2642 /* Decode options. */
2643 b = dump_private_options;
2646 e = strchr (b, ',');
2648 if (e)
2649 *e = 0;
2651 for (opt = (*desc)->options; opt->name; opt++)
2652 if (strcmp (opt->name, b) == 0)
2654 opt->selected = TRUE;
2655 break;
2657 if (opt->name == NULL)
2658 non_fatal (_("target specific dump '%s' not supported"), b);
2660 if (e)
2662 *e = ',';
2663 b = e + 1;
2666 while (e != NULL);
2668 /* Dump. */
2669 (*desc)->dump (abfd);
2672 /* Display a section in hexadecimal format with associated characters.
2673 Each line prefixed by the zero padded address. */
2675 static void
2676 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
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;
2690 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2691 return;
2693 if (! process_section_p (section))
2694 return;
2696 if ((datasize = bfd_section_size (abfd, section)) == 0)
2697 return;
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;
2706 if (stop_address == (bfd_vma) -1)
2707 stop_offset = datasize / opb;
2708 else
2710 if (stop_address < section->vma)
2711 stop_offset = 0;
2712 else
2713 stop_offset = stop_address - section->vma;
2715 if (stop_offset > datasize / opb)
2716 stop_offset = datasize / opb;
2719 if (start_offset >= stop_offset)
2720 return;
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");
2728 if (!bfd_get_full_section_contents (abfd, section, &data))
2730 non_fatal (_("Reading section failed"));
2731 return;
2734 width = 4;
2736 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2737 if (strlen (buf) >= sizeof (buf))
2738 abort ();
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;
2747 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2748 if (strlen (buf) >= sizeof (buf))
2749 abort ();
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;
2758 for (addr_offset = start_offset;
2759 addr_offset < stop_offset; addr_offset += onaline / opb)
2761 bfd_size_type j;
2763 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2764 count = strlen (buf);
2765 if ((size_t) count >= sizeof (buf))
2766 abort ();
2768 putchar (' ');
2769 while (count < width)
2771 putchar ('0');
2772 count++;
2774 fputs (buf + count - width, stdout);
2775 putchar (' ');
2777 for (j = addr_offset * opb;
2778 j < addr_offset * opb + onaline; j++)
2780 if (j < stop_offset * opb)
2781 printf ("%02x", (unsigned) (data[j]));
2782 else
2783 printf (" ");
2784 if ((j & 3) == 3)
2785 printf (" ");
2788 printf (" ");
2789 for (j = addr_offset * opb;
2790 j < addr_offset * opb + onaline; j++)
2792 if (j >= stop_offset * opb)
2793 printf (" ");
2794 else
2795 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2797 putchar ('\n');
2799 free (data);
2802 /* Actually display the various requested regions. */
2804 static void
2805 dump_data (bfd *abfd)
2807 bfd_map_over_sections (abfd, dump_section, NULL);
2810 /* Should perhaps share code and display with nm? */
2812 static void
2813 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2815 asymbol **current;
2816 long max_count;
2817 long count;
2819 if (dynamic)
2821 current = dynsyms;
2822 max_count = dynsymcount;
2823 printf ("DYNAMIC SYMBOL TABLE:\n");
2825 else
2827 current = syms;
2828 max_count = symcount;
2829 printf ("SYMBOL TABLE:\n");
2832 if (max_count == 0)
2833 printf (_("no symbols\n"));
2835 for (count = 0; count < max_count; count++)
2837 bfd *cur_bfd;
2839 if (*current == NULL)
2840 printf (_("no information for symbol number %ld\n"), count);
2842 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2843 printf (_("could not determine the type of symbol number %ld\n"),
2844 count);
2846 else if (process_section_p ((* current)->section)
2847 && (dump_special_syms
2848 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2850 const char *name = (*current)->name;
2852 if (do_demangle && name != NULL && *name != '\0')
2854 char *alloc;
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)
2866 (*current)->name = name;
2867 free (alloc);
2870 else
2871 bfd_print_symbol (cur_bfd, stdout, *current,
2872 bfd_print_symbol_all);
2873 printf ("\n");
2876 current++;
2878 printf ("\n\n");
2881 static void
2882 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2884 arelent **p;
2885 char *last_filename, *last_functionname;
2886 unsigned int last_line;
2888 /* Get column headers lined up reasonably. */
2890 static int width;
2892 if (width == 0)
2894 char buf[30];
2896 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2897 width = strlen (buf) - 7;
2899 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2902 last_filename = NULL;
2903 last_functionname = NULL;
2904 last_line = 0;
2906 for (p = relpp; relcount && *p != NULL; p++, relcount--)
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;
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;
2922 if (with_line_numbers
2923 && sec != NULL
2924 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2925 &filename, &functionname, &linenumber))
2927 if (functionname != NULL
2928 && (last_functionname == NULL
2929 || strcmp (functionname, last_functionname) != 0))
2931 printf ("%s():\n", functionname);
2932 if (last_functionname != NULL)
2933 free (last_functionname);
2934 last_functionname = xstrdup (functionname);
2937 if (linenumber > 0
2938 && (linenumber != last_line
2939 || (filename != NULL
2940 && last_filename != NULL
2941 && filename_cmp (filename, last_filename) != 0)))
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);
2954 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2956 sym_name = (*(q->sym_ptr_ptr))->name;
2957 section_name = (*(q->sym_ptr_ptr))->section->name;
2959 else
2961 sym_name = NULL;
2962 section_name = NULL;
2965 bfd_printf_vma (abfd, q->address);
2966 if (q->howto == NULL)
2967 printf (" *unknown* ");
2968 else if (q->howto->name)
2970 const char *name = q->howto->name;
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.
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"))
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"))
2993 name = "R_SPARC_OLO10";
2994 addend2 = q2->addend;
2995 p++;
2998 printf (" %-16s ", name);
3000 else
3001 printf (" %-16d ", q->howto->type);
3003 if (sym_name)
3005 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3007 else
3009 if (section_name == NULL)
3010 section_name = "*unknown*";
3011 printf ("[%s]", section_name);
3014 if (q->addend)
3016 printf ("+0x");
3017 bfd_printf_vma (abfd, q->addend);
3019 if (addend2)
3021 printf ("+0x");
3022 bfd_printf_vma (abfd, addend2);
3025 printf ("\n");
3028 if (last_filename != NULL)
3029 free (last_filename);
3030 if (last_functionname != NULL)
3031 free (last_functionname);
3034 static void
3035 dump_relocs_in_section (bfd *abfd,
3036 asection *section,
3037 void *dummy ATTRIBUTE_UNUSED)
3039 arelent **relpp;
3040 long relcount;
3041 long relsize;
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;
3050 relsize = bfd_get_reloc_upper_bound (abfd, section);
3051 if (relsize < 0)
3052 bfd_fatal (bfd_get_filename (abfd));
3054 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
3056 if (relsize == 0)
3058 printf (" (none)\n\n");
3059 return;
3062 relpp = (arelent **) xmalloc (relsize);
3063 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3065 if (relcount < 0)
3066 bfd_fatal (bfd_get_filename (abfd));
3067 else if (relcount == 0)
3068 printf (" (none)\n\n");
3069 else
3071 printf ("\n");
3072 dump_reloc_set (abfd, section, relpp, relcount);
3073 printf ("\n\n");
3075 free (relpp);
3078 static void
3079 dump_relocs (bfd *abfd)
3081 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3084 static void
3085 dump_dynamic_relocs (bfd *abfd)
3087 long relsize;
3088 arelent **relpp;
3089 long relcount;
3091 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3092 if (relsize < 0)
3093 bfd_fatal (bfd_get_filename (abfd));
3095 printf ("DYNAMIC RELOCATION RECORDS");
3097 if (relsize == 0)
3098 printf (" (none)\n\n");
3099 else
3101 relpp = (arelent **) xmalloc (relsize);
3102 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3104 if (relcount < 0)
3105 bfd_fatal (bfd_get_filename (abfd));
3106 else if (relcount == 0)
3107 printf (" (none)\n\n");
3108 else
3110 printf ("\n");
3111 dump_reloc_set (abfd, NULL, relpp, relcount);
3112 printf ("\n\n");
3114 free (relpp);
3118 /* Creates a table of paths, to search for source files. */
3120 static void
3121 add_include_path (const char *path)
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;
3135 static void
3136 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3137 asection *section,
3138 void *arg)
3140 if ((section->flags & SEC_DEBUGGING) == 0)
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;
3149 /* Dump selected contents of ABFD. */
3151 static void
3152 dump_bfd (bfd *abfd)
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)
3159 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3160 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
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);
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)
3190 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3191 dynsymcount, dynsyms, &synthsyms);
3192 if (synthcount < 0)
3193 synthcount = 0;
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);
3213 if (dump_debugging)
3215 void *dhandle;
3217 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3218 if (dhandle != NULL)
3220 if (!print_debugging_info (stdout, dhandle, abfd, syms,
3221 bfd_demangle,
3222 dump_debugging_tags ? TRUE : FALSE))
3224 non_fatal (_("%s: printing debugging information failed"),
3225 bfd_get_filename (abfd));
3226 exit_status = 1;
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)
3233 dump_dwarf (abfd);
3237 if (syms)
3239 free (syms);
3240 syms = NULL;
3243 if (dynsyms)
3245 free (dynsyms);
3246 dynsyms = NULL;
3249 if (synthsyms)
3251 free (synthsyms);
3252 synthsyms = NULL;
3255 symcount = 0;
3256 dynsymcount = 0;
3257 synthcount = 0;
3260 static void
3261 display_object_bfd (bfd *abfd)
3263 char **matching;
3265 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3267 dump_bfd (abfd);
3268 return;
3271 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3273 nonfatal (bfd_get_filename (abfd));
3274 list_matching_formats (matching);
3275 free (matching);
3276 return;
3279 if (bfd_get_error () != bfd_error_file_not_recognized)
3281 nonfatal (bfd_get_filename (abfd));
3282 return;
3285 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3287 dump_bfd (abfd);
3288 return;
3291 nonfatal (bfd_get_filename (abfd));
3293 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3295 list_matching_formats (matching);
3296 free (matching);
3300 static void
3301 display_any_bfd (bfd *file, int level)
3303 /* Decompress sections unless dumping the section contents. */
3304 if (!dump_section_contents)
3305 file->flags |= BFD_DECOMPRESS;
3307 /* If the file is an archive, process all of its elements. */
3308 if (bfd_check_format (file, bfd_archive))
3310 bfd *arfile = NULL;
3311 bfd *last_arfile = NULL;
3313 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));
3318 for (;;)
3320 bfd_set_error (bfd_error_no_error);
3322 arfile = bfd_openr_next_archived_file (file, arfile);
3323 if (arfile == NULL)
3325 if (bfd_get_error () != bfd_error_no_more_archived_files)
3326 nonfatal (bfd_get_filename (file));
3327 break;
3330 display_any_bfd (arfile, level + 1);
3332 if (last_arfile != NULL)
3333 bfd_close (last_arfile);
3334 last_arfile = arfile;
3337 if (last_arfile != NULL)
3338 bfd_close (last_arfile);
3340 else
3341 display_object_bfd (file);
3344 static void
3345 display_file (char *filename, char *target)
3347 bfd *file;
3349 if (get_file_size (filename) < 1)
3351 exit_status = 1;
3352 return;
3355 file = bfd_openr (filename, target);
3356 if (file == NULL)
3358 nonfatal (filename);
3359 return;
3362 display_any_bfd (file, 0);
3364 bfd_close (file);
3368 main (int argc, char **argv)
3370 int c;
3371 char *target = default_target;
3372 bfd_boolean seenflag = FALSE;
3374 #if defined (HAVE_SETLOCALE)
3375 #if defined (HAVE_LC_MESSAGES)
3376 setlocale (LC_MESSAGES, "");
3377 #endif
3378 setlocale (LC_CTYPE, "");
3379 #endif
3381 bindtextdomain (PACKAGE, LOCALEDIR);
3382 textdomain (PACKAGE);
3384 program_name = *argv;
3385 xmalloc_set_program_name (program_name);
3387 START_PROGRESS (program_name, 0);
3389 expandargv (&argc, &argv);
3391 bfd_init ();
3392 set_default_bfd_target ();
3394 while ((c = getopt_long (argc, argv,
3395 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3396 long_options, (int *) 0))
3397 != EOF)
3399 switch (c)
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)
3430 enum demangling_styles style;
3432 style = cplus_demangle_name_to_style (optarg);
3433 if (style == unknown_demangling)
3434 fatal (_("unknown demangling style `%s'"),
3435 optarg);
3437 cplus_demangle_set_style (style);
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
3480 nonfatal (_("unrecognized -E option"));
3481 usage (stderr, 1);
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
3491 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3492 exit_status = 1;
3493 usage (stderr, 1);
3495 break;
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:
3578 char *cp;
3579 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3581 break;
3582 case OPTION_DWARF_START:
3584 char *cp;
3585 dwarf_start_die = strtoul (optarg, & cp, 0);
3586 suppress_bfd_header = 1;
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;
3622 default:
3623 usage (stderr, 1);
3627 if (show_version)
3628 print_version ("objdump");
3630 if (!seenflag)
3631 usage (stderr, 2);
3633 if (formats_info)
3634 exit_status = display_info ();
3635 else
3637 if (optind == argc)
3638 display_file ("a.out", target);
3639 else
3640 for (; optind < argc;)
3641 display_file (argv[optind++], target);
3644 free_only_list ();
3646 END_PROGRESS (program_name);
3648 return exit_status;