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
4 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)
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. */
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
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. */
60 #include "safe-ctype.h"
62 #include "libiberty.h"
73 /* Internal headers for the ELF .stab-dump code - sorry. */
74 #define BYTES_IN_WORD 32
75 #include "aout/aout64.h"
78 static int exit_status
= 0;
80 static char *default_target
= NULL
; /* Default at runtime. */
82 /* The following variables are set based on arguments passed on the
84 static int show_version
= 0; /* Show the version number. */
85 static int dump_section_contents
; /* -s */
86 static int dump_section_headers
; /* -h */
87 static bfd_boolean dump_file_header
; /* -f */
88 static int dump_symtab
; /* -t */
89 static int dump_dynamic_symtab
; /* -T */
90 static int dump_reloc_info
; /* -r */
91 static int dump_dynamic_reloc_info
; /* -R */
92 static int dump_ar_hdrs
; /* -a */
93 static int dump_private_headers
; /* -p */
94 static int prefix_addresses
; /* --prefix-addresses */
95 static int with_line_numbers
; /* -l */
96 static bfd_boolean with_source_code
; /* -S */
97 static int show_raw_insn
; /* --show-raw-insn */
98 static int dump_dwarf_section_info
; /* --dwarf */
99 static int dump_stab_section_info
; /* --stabs */
100 static int do_demangle
; /* -C, --demangle */
101 static bfd_boolean disassemble
; /* -d */
102 static bfd_boolean disassemble_all
; /* -D */
103 static int disassemble_zeroes
; /* --disassemble-zeroes */
104 static bfd_boolean formats_info
; /* -i */
105 static int wide_output
; /* -w */
106 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
107 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
108 static int dump_debugging
; /* --debugging */
109 static int dump_debugging_tags
; /* --debugging-tags */
110 static int dump_special_syms
= 0; /* --special-syms */
111 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
112 static int file_start_context
= 0; /* --file-start-context */
114 /* Pointer to an array of section names provided by
115 one or more "-j secname" command line options. */
117 /* The total number of slots in the only[] array. */
118 static size_t only_size
= 0;
119 /* The number of occupied slots in the only[] array. */
120 static size_t only_used
= 0;
122 /* Variables for handling include file path table. */
123 static const char **include_paths
;
124 static int include_path_count
;
126 /* Extra info to pass to the section disassembler and address printing
128 struct objdump_disasm_info
132 bfd_boolean require_sec
;
133 arelent
** dynrelbuf
;
135 disassembler_ftype disassemble_fn
;
139 /* Architecture to disassemble for, or default if NULL. */
140 static char *machine
= NULL
;
142 /* Target specific options to the disassembler. */
143 static char *disassembler_options
= NULL
;
145 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
146 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
148 /* The symbol table. */
149 static asymbol
**syms
;
151 /* Number of symbols in `syms'. */
152 static long symcount
= 0;
154 /* The sorted symbol table. */
155 static asymbol
**sorted_syms
;
157 /* Number of symbols in `sorted_syms'. */
158 static long sorted_symcount
= 0;
160 /* The dynamic symbol table. */
161 static asymbol
**dynsyms
;
163 /* The synthetic symbol table. */
164 static asymbol
*synthsyms
;
165 static long synthcount
= 0;
167 /* Number of symbols in `dynsyms'. */
168 static long dynsymcount
= 0;
170 static bfd_byte
*stabs
;
171 static bfd_size_type stab_size
;
174 static bfd_size_type stabstr_size
;
176 static bfd_boolean is_relocatable
= FALSE
;
179 usage (FILE *stream
, int status
)
181 fprintf (stream
, _("Usage: %s <option(s)> <file(s)>\n"), program_name
);
182 fprintf (stream
, _(" Display information from object <file(s)>.\n"));
183 fprintf (stream
, _(" At least one of the following switches must be given:\n"));
184 fprintf (stream
, _("\
185 -a, --archive-headers Display archive header information\n\
186 -f, --file-headers Display the contents of the overall file header\n\
187 -p, --private-headers Display object format specific file header contents\n\
188 -h, --[section-]headers Display the contents of the section headers\n\
189 -x, --all-headers Display the contents of all headers\n\
190 -d, --disassemble Display assembler contents of executable sections\n\
191 -D, --disassemble-all Display assembler contents of all sections\n\
192 -S, --source Intermix source code with disassembly\n\
193 -s, --full-contents Display the full contents of all sections requested\n\
194 -g, --debugging Display debug information in object file\n\
195 -e, --debugging-tags Display debug information using ctags style\n\
196 -G, --stabs Display (in raw form) any STABS info in the file\n\
197 -W, --dwarf Display DWARF info in the file\n\
198 -t, --syms Display the contents of the symbol table(s)\n\
199 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
200 -r, --reloc Display the relocation entries in the file\n\
201 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
202 @<file> Read options from <file>\n\
203 -v, --version Display this program's version number\n\
204 -i, --info List object formats and architectures supported\n\
205 -H, --help Display this information\n\
209 fprintf (stream
, _("\n The following switches are optional:\n"));
210 fprintf (stream
, _("\
211 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
212 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
213 -j, --section=NAME Only display information for section NAME\n\
214 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
215 -EB --endian=big Assume big endian format when disassembling\n\
216 -EL --endian=little Assume little endian format when disassembling\n\
217 --file-start-context Include context from start of file (with -S)\n\
218 -I, --include=DIR Add DIR to search list for source files\n\
219 -l, --line-numbers Include line numbers and filenames in output\n\
220 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
221 The STYLE, if specified, can be `auto', `gnu',\n\
222 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
224 -w, --wide Format output for more than 80 columns\n\
225 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
226 --start-address=ADDR Only process data whose address is >= ADDR\n\
227 --stop-address=ADDR Only process data whose address is <= ADDR\n\
228 --prefix-addresses Print complete address alongside disassembly\n\
229 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
230 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
231 --special-syms Include special symbols in symbol dumps\n\
233 list_supported_targets (program_name
, stream
);
234 list_supported_architectures (program_name
, stream
);
236 disassembler_usage (stream
);
238 if (REPORT_BUGS_TO
[0] && status
== 0)
239 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
243 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
247 OPTION_START_ADDRESS
,
252 static struct option long_options
[]=
254 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
255 {"all-headers", no_argument
, NULL
, 'x'},
256 {"private-headers", no_argument
, NULL
, 'p'},
257 {"architecture", required_argument
, NULL
, 'm'},
258 {"archive-headers", no_argument
, NULL
, 'a'},
259 {"debugging", no_argument
, NULL
, 'g'},
260 {"debugging-tags", no_argument
, NULL
, 'e'},
261 {"demangle", optional_argument
, NULL
, 'C'},
262 {"disassemble", no_argument
, NULL
, 'd'},
263 {"disassemble-all", no_argument
, NULL
, 'D'},
264 {"disassembler-options", required_argument
, NULL
, 'M'},
265 {"disassemble-zeroes", no_argument
, NULL
, 'z'},
266 {"dynamic-reloc", no_argument
, NULL
, 'R'},
267 {"dynamic-syms", no_argument
, NULL
, 'T'},
268 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
269 {"file-headers", no_argument
, NULL
, 'f'},
270 {"file-start-context", no_argument
, &file_start_context
, 1},
271 {"full-contents", no_argument
, NULL
, 's'},
272 {"headers", no_argument
, NULL
, 'h'},
273 {"help", no_argument
, NULL
, 'H'},
274 {"info", no_argument
, NULL
, 'i'},
275 {"line-numbers", no_argument
, NULL
, 'l'},
276 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
277 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
278 {"reloc", no_argument
, NULL
, 'r'},
279 {"section", required_argument
, NULL
, 'j'},
280 {"section-headers", no_argument
, NULL
, 'h'},
281 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
282 {"source", no_argument
, NULL
, 'S'},
283 {"special-syms", no_argument
, &dump_special_syms
, 1},
284 {"include", required_argument
, NULL
, 'I'},
285 {"dwarf", no_argument
, NULL
, 'W'},
286 {"stabs", no_argument
, NULL
, 'G'},
287 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
288 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
289 {"syms", no_argument
, NULL
, 't'},
290 {"target", required_argument
, NULL
, 'b'},
291 {"version", no_argument
, NULL
, 'V'},
292 {"wide", no_argument
, NULL
, 'w'},
293 {0, no_argument
, 0, 0}
297 nonfatal (const char *msg
)
304 dump_section_header (bfd
*abfd
, asection
*section
,
305 void *ignored ATTRIBUTE_UNUSED
)
308 unsigned int opb
= bfd_octets_per_byte (abfd
);
310 /* Ignore linker created section. See elfNN_ia64_object_p in
312 if (section
->flags
& SEC_LINKER_CREATED
)
315 printf ("%3d %-13s %08lx ", section
->index
,
316 bfd_get_section_name (abfd
, section
),
317 (unsigned long) bfd_section_size (abfd
, section
) / opb
);
318 bfd_printf_vma (abfd
, bfd_get_section_vma (abfd
, section
));
320 bfd_printf_vma (abfd
, section
->lma
);
321 printf (" %08lx 2**%u", (unsigned long) section
->filepos
,
322 bfd_get_section_alignment (abfd
, section
));
328 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
330 PF (SEC_HAS_CONTENTS
, "CONTENTS");
331 PF (SEC_ALLOC
, "ALLOC");
332 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
333 PF (SEC_LOAD
, "LOAD");
334 PF (SEC_RELOC
, "RELOC");
335 PF (SEC_READONLY
, "READONLY");
336 PF (SEC_CODE
, "CODE");
337 PF (SEC_DATA
, "DATA");
339 PF (SEC_DEBUGGING
, "DEBUGGING");
340 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
341 PF (SEC_EXCLUDE
, "EXCLUDE");
342 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
343 if (bfd_get_arch (abfd
) == bfd_arch_tic54x
)
345 PF (SEC_TIC54X_BLOCK
, "BLOCK");
346 PF (SEC_TIC54X_CLINK
, "CLINK");
348 PF (SEC_SMALL_DATA
, "SMALL_DATA");
349 if (bfd_get_flavour (abfd
) == bfd_target_coff_flavour
)
350 PF (SEC_COFF_SHARED
, "SHARED");
351 PF (SEC_THREAD_LOCAL
, "THREAD_LOCAL");
352 PF (SEC_GROUP
, "GROUP");
354 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
357 struct coff_comdat_info
*comdat
;
359 switch (section
->flags
& SEC_LINK_DUPLICATES
)
363 case SEC_LINK_DUPLICATES_DISCARD
:
364 ls
= "LINK_ONCE_DISCARD";
366 case SEC_LINK_DUPLICATES_ONE_ONLY
:
367 ls
= "LINK_ONCE_ONE_ONLY";
369 case SEC_LINK_DUPLICATES_SAME_SIZE
:
370 ls
= "LINK_ONCE_SAME_SIZE";
372 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
373 ls
= "LINK_ONCE_SAME_CONTENTS";
376 printf ("%s%s", comma
, ls
);
378 comdat
= bfd_coff_get_comdat_section (abfd
, section
);
380 printf (" (COMDAT %s %ld)", comdat
->name
, comdat
->symbol
);
390 dump_headers (bfd
*abfd
)
392 printf (_("Sections:\n"));
395 printf (_("Idx Name Size VMA LMA File off Algn"));
397 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
398 if (bfd_get_arch_size (abfd
) == 32)
399 printf (_("Idx Name Size VMA LMA File off Algn"));
401 printf (_("Idx Name Size VMA LMA File off Algn"));
405 printf (_(" Flags"));
406 if (abfd
->flags
& HAS_LOAD_PAGE
)
410 bfd_map_over_sections (abfd
, dump_section_header
, NULL
);
414 slurp_symtab (bfd
*abfd
)
419 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
425 storage
= bfd_get_symtab_upper_bound (abfd
);
427 bfd_fatal (bfd_get_filename (abfd
));
429 sy
= xmalloc (storage
);
431 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
433 bfd_fatal (bfd_get_filename (abfd
));
437 /* Read in the dynamic symbols. */
440 slurp_dynamic_symtab (bfd
*abfd
)
445 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
448 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
450 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd
));
455 bfd_fatal (bfd_get_filename (abfd
));
458 sy
= xmalloc (storage
);
460 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
462 bfd_fatal (bfd_get_filename (abfd
));
466 /* Filter out (in place) symbols that are useless for disassembly.
467 COUNT is the number of elements in SYMBOLS.
468 Return the number of useful symbols. */
471 remove_useless_symbols (asymbol
**symbols
, long count
)
473 asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
477 asymbol
*sym
= *in_ptr
++;
479 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
481 if (sym
->flags
& (BSF_DEBUGGING
| BSF_SECTION_SYM
))
483 if (bfd_is_und_section (sym
->section
)
484 || bfd_is_com_section (sym
->section
))
489 return out_ptr
- symbols
;
492 /* Sort symbols into value order. */
495 compare_symbols (const void *ap
, const void *bp
)
497 const asymbol
*a
= * (const asymbol
**) ap
;
498 const asymbol
*b
= * (const asymbol
**) bp
;
508 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
510 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
513 if (a
->section
> b
->section
)
515 else if (a
->section
< b
->section
)
518 an
= bfd_asymbol_name (a
);
519 bn
= bfd_asymbol_name (b
);
523 /* The symbols gnu_compiled and gcc2_compiled convey no real
524 information, so put them after other symbols with the same value. */
525 af
= (strstr (an
, "gnu_compiled") != NULL
526 || strstr (an
, "gcc2_compiled") != NULL
);
527 bf
= (strstr (bn
, "gnu_compiled") != NULL
528 || strstr (bn
, "gcc2_compiled") != NULL
);
535 /* We use a heuristic for the file name, to try to sort it after
536 more useful symbols. It may not work on non Unix systems, but it
537 doesn't really matter; the only difference is precisely which
538 symbol names get printed. */
540 #define file_symbol(s, sn, snl) \
541 (((s)->flags & BSF_FILE) != 0 \
542 || ((sn)[(snl) - 2] == '.' \
543 && ((sn)[(snl) - 1] == 'o' \
544 || (sn)[(snl) - 1] == 'a')))
546 af
= file_symbol (a
, an
, anl
);
547 bf
= file_symbol (b
, bn
, bnl
);
554 /* Try to sort global symbols before local symbols before function
555 symbols before debugging symbols. */
560 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
562 if ((aflags
& BSF_DEBUGGING
) != 0)
567 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
569 if ((aflags
& BSF_FUNCTION
) != 0)
574 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
576 if ((aflags
& BSF_LOCAL
) != 0)
581 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
583 if ((aflags
& BSF_GLOBAL
) != 0)
589 /* Symbols that start with '.' might be section names, so sort them
590 after symbols that don't start with '.'. */
591 if (an
[0] == '.' && bn
[0] != '.')
593 if (an
[0] != '.' && bn
[0] == '.')
596 /* Finally, if we can't distinguish them in any other way, try to
597 get consistent results by sorting the symbols by name. */
598 return strcmp (an
, bn
);
601 /* Sort relocs into address order. */
604 compare_relocs (const void *ap
, const void *bp
)
606 const arelent
*a
= * (const arelent
**) ap
;
607 const arelent
*b
= * (const arelent
**) bp
;
609 if (a
->address
> b
->address
)
611 else if (a
->address
< b
->address
)
614 /* So that associated relocations tied to the same address show up
615 in the correct order, we don't do any further sorting. */
624 /* Print an address (VMA) to the output stream in INFO.
625 If SKIP_ZEROES is TRUE, omit leading zeroes. */
628 objdump_print_value (bfd_vma vma
, struct disassemble_info
*info
,
629 bfd_boolean skip_zeroes
)
633 struct objdump_disasm_info
*aux
;
635 aux
= (struct objdump_disasm_info
*) info
->application_data
;
636 bfd_sprintf_vma (aux
->abfd
, buf
, vma
);
641 for (p
= buf
; *p
== '0'; ++p
)
646 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
649 /* Print the name of a symbol. */
652 objdump_print_symname (bfd
*abfd
, struct disassemble_info
*info
,
659 name
= bfd_asymbol_name (sym
);
660 if (do_demangle
&& name
[0] != '\0')
662 /* Demangle the name. */
663 alloc
= bfd_demangle (abfd
, name
, DMGL_ANSI
| DMGL_PARAMS
);
669 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
677 /* Locate a symbol given a bfd and a section (from INFO->application_data),
678 and a VMA. If INFO->application_data->require_sec is TRUE, then always
679 require the symbol to be in the section. Returns NULL if there is no
680 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
681 of the symbol in sorted_syms. */
684 find_symbol_for_address (bfd_vma vma
,
685 struct disassemble_info
*info
,
688 /* @@ Would it speed things up to cache the last two symbols returned,
689 and maybe their address ranges? For many processors, only one memory
690 operand can be present at a time, so the 2-entry cache wouldn't be
691 constantly churned by code doing heavy memory accesses. */
693 /* Indices in `sorted_syms'. */
695 long max
= sorted_symcount
;
697 struct objdump_disasm_info
*aux
;
701 bfd_boolean want_section
;
703 if (sorted_symcount
< 1)
706 aux
= (struct objdump_disasm_info
*) info
->application_data
;
709 opb
= bfd_octets_per_byte (abfd
);
711 /* Perform a binary search looking for the closest symbol to the
712 required value. We are searching the range (min, max]. */
713 while (min
+ 1 < max
)
717 thisplace
= (max
+ min
) / 2;
718 sym
= sorted_syms
[thisplace
];
720 if (bfd_asymbol_value (sym
) > vma
)
722 else if (bfd_asymbol_value (sym
) < vma
)
731 /* The symbol we want is now in min, the low end of the range we
732 were searching. If there are several symbols with the same
733 value, we want the first one. */
736 && (bfd_asymbol_value (sorted_syms
[thisplace
])
737 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
740 /* If the file is relocatable, and the symbol could be from this
741 section, prefer a symbol from this section over symbols from
742 others, even if the other symbol's value might be closer.
744 Note that this may be wrong for some symbol references if the
745 sections have overlapping memory ranges, but in that case there's
746 no way to tell what's desired without looking at the relocation
749 Also give the target a chance to reject symbols. */
750 want_section
= (aux
->require_sec
751 || ((abfd
->flags
& HAS_RELOC
) != 0
752 && vma
>= bfd_get_section_vma (abfd
, sec
)
753 && vma
< (bfd_get_section_vma (abfd
, sec
)
754 + bfd_section_size (abfd
, sec
) / opb
)));
755 if ((sorted_syms
[thisplace
]->section
!= sec
&& want_section
)
756 || !info
->symbol_is_valid (sorted_syms
[thisplace
], info
))
761 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
763 if (bfd_asymbol_value (sorted_syms
[i
])
764 != bfd_asymbol_value (sorted_syms
[thisplace
]))
769 newplace
= sorted_symcount
;
773 if ((sorted_syms
[i
]->section
== sec
|| !want_section
)
774 && info
->symbol_is_valid (sorted_syms
[i
], info
))
776 if (newplace
== sorted_symcount
)
779 if (bfd_asymbol_value (sorted_syms
[i
])
780 != bfd_asymbol_value (sorted_syms
[newplace
]))
783 /* Remember this symbol and keep searching until we reach
784 an earlier address. */
789 if (newplace
!= sorted_symcount
)
790 thisplace
= newplace
;
793 /* We didn't find a good symbol with a smaller value.
794 Look for one with a larger value. */
795 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
797 if ((sorted_syms
[i
]->section
== sec
|| !want_section
)
798 && info
->symbol_is_valid (sorted_syms
[i
], info
))
806 if ((sorted_syms
[thisplace
]->section
!= sec
&& want_section
)
807 || !info
->symbol_is_valid (sorted_syms
[thisplace
], info
))
808 /* There is no suitable symbol. */
815 return sorted_syms
[thisplace
];
818 /* Print an address and the offset to the nearest symbol. */
821 objdump_print_addr_with_sym (bfd
*abfd
, asection
*sec
, asymbol
*sym
,
822 bfd_vma vma
, struct disassemble_info
*info
,
823 bfd_boolean skip_zeroes
)
825 objdump_print_value (vma
, info
, skip_zeroes
);
831 (*info
->fprintf_func
) (info
->stream
, " <%s",
832 bfd_get_section_name (abfd
, sec
));
833 secaddr
= bfd_get_section_vma (abfd
, sec
);
836 (*info
->fprintf_func
) (info
->stream
, "-0x");
837 objdump_print_value (secaddr
- vma
, info
, TRUE
);
839 else if (vma
> secaddr
)
841 (*info
->fprintf_func
) (info
->stream
, "+0x");
842 objdump_print_value (vma
- secaddr
, info
, TRUE
);
844 (*info
->fprintf_func
) (info
->stream
, ">");
848 (*info
->fprintf_func
) (info
->stream
, " <");
849 objdump_print_symname (abfd
, info
, sym
);
850 if (bfd_asymbol_value (sym
) > vma
)
852 (*info
->fprintf_func
) (info
->stream
, "-0x");
853 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, TRUE
);
855 else if (vma
> bfd_asymbol_value (sym
))
857 (*info
->fprintf_func
) (info
->stream
, "+0x");
858 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, TRUE
);
860 (*info
->fprintf_func
) (info
->stream
, ">");
864 /* Print an address (VMA), symbolically if possible.
865 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
868 objdump_print_addr (bfd_vma vma
,
869 struct disassemble_info
*info
,
870 bfd_boolean skip_zeroes
)
872 struct objdump_disasm_info
*aux
;
873 asymbol
*sym
= NULL
; /* Initialize to avoid compiler warning. */
874 bfd_boolean skip_find
= FALSE
;
876 if (sorted_symcount
< 1)
878 (*info
->fprintf_func
) (info
->stream
, "0x");
879 objdump_print_value (vma
, info
, skip_zeroes
);
883 aux
= (struct objdump_disasm_info
*) info
->application_data
;
885 if (aux
->reloc
!= NULL
886 && aux
->reloc
->sym_ptr_ptr
!= NULL
887 && * aux
->reloc
->sym_ptr_ptr
!= NULL
)
889 sym
= * aux
->reloc
->sym_ptr_ptr
;
891 /* Adjust the vma to the reloc. */
892 vma
+= bfd_asymbol_value (sym
);
894 if (bfd_is_und_section (bfd_get_section (sym
)))
899 sym
= find_symbol_for_address (vma
, info
, NULL
);
901 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
905 /* Print VMA to INFO. This function is passed to the disassembler
909 objdump_print_address (bfd_vma vma
, struct disassemble_info
*info
)
911 objdump_print_addr (vma
, info
, ! prefix_addresses
);
914 /* Determine if the given address has a symbol associated with it. */
917 objdump_symbol_at_address (bfd_vma vma
, struct disassemble_info
* info
)
921 sym
= find_symbol_for_address (vma
, info
, NULL
);
923 return (sym
!= NULL
&& (bfd_asymbol_value (sym
) == vma
));
926 /* Hold the last function name and the last line number we displayed
929 static char *prev_functionname
;
930 static unsigned int prev_line
;
932 /* We keep a list of all files that we have seen when doing a
933 disassembly with source, so that we know how much of the file to
934 display. This can be important for inlined functions. */
936 struct print_file_list
938 struct print_file_list
*next
;
939 const char *filename
;
943 const char **linemap
;
949 static struct print_file_list
*print_files
;
951 /* The number of preceding context lines to show when we start
952 displaying a file for the first time. */
954 #define SHOW_PRECEDING_CONTEXT_LINES (5)
956 /* Read a complete file into memory. */
959 slurp_file (const char *fn
, size_t *size
)
962 int ps
= getpagesize ();
967 int fd
= open (fn
, O_RDONLY
);
971 if (fstat (fd
, &st
) < 0)
975 msize
= (*size
+ ps
- 1) & ~(ps
- 1);
976 map
= mmap (NULL
, msize
, PROT_READ
, MAP_SHARED
, fd
, 0);
977 if (map
!= (char *)-1L)
983 map
= malloc (*size
);
984 if (!map
|| (size_t) read (fd
, (char *)map
, *size
) != *size
)
993 #define line_map_decrease 5
995 /* Precompute array of lines for a mapped file. */
998 index_file (const char *map
, size_t size
, unsigned int *maxline
)
1000 const char *p
, *lstart
, *end
;
1001 int chars_per_line
= 45; /* First iteration will use 40. */
1002 unsigned int lineno
;
1003 const char **linemap
= NULL
;
1004 unsigned long line_map_size
= 0;
1010 for (p
= map
; p
< end
; p
++)
1014 if (p
+ 1 < end
&& p
[1] == '\r')
1017 else if (*p
== '\r')
1019 if (p
+ 1 < end
&& p
[1] == '\n')
1025 /* End of line found. */
1027 if (linemap
== NULL
|| line_map_size
< lineno
+ 1)
1029 unsigned long newsize
;
1031 chars_per_line
-= line_map_decrease
;
1032 if (chars_per_line
<= 1)
1034 line_map_size
= size
/ chars_per_line
+ 1;
1035 if (line_map_size
< lineno
+ 1)
1036 line_map_size
= lineno
+ 1;
1037 newsize
= line_map_size
* sizeof (char *);
1038 linemap
= xrealloc (linemap
, newsize
);
1041 linemap
[lineno
++] = lstart
;
1049 /* Tries to open MODNAME, and if successful adds a node to print_files
1050 linked list and returns that node. Returns NULL on failure. */
1052 static struct print_file_list
*
1053 try_print_file_open (const char *origname
, const char *modname
)
1055 struct print_file_list
*p
;
1057 p
= xmalloc (sizeof (struct print_file_list
));
1059 p
->map
= slurp_file (modname
, &p
->mapsize
);
1066 p
->linemap
= index_file (p
->map
, p
->mapsize
, &p
->maxline
);
1068 p
->filename
= origname
;
1069 p
->modname
= modname
;
1070 p
->next
= print_files
;
1076 /* If the the source file, as described in the symtab, is not found
1077 try to locate it in one of the paths specified with -I
1078 If found, add location to print_files linked list. */
1080 static struct print_file_list
*
1081 update_source_path (const char *filename
)
1083 struct print_file_list
*p
;
1087 if (filename
== NULL
)
1090 p
= try_print_file_open (filename
, filename
);
1094 if (include_path_count
== 0)
1097 /* Get the name of the file. */
1098 fname
= strrchr (filename
, '/');
1099 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1101 /* We could have a mixed forward/back slash case. */
1102 char *backslash
= strrchr (filename
, '\\');
1103 if (fname
== NULL
|| (backslash
!= NULL
&& backslash
> fname
))
1105 if (fname
== NULL
&& filename
[0] != '\0' && filename
[1] == ':')
1106 fname
= filename
+ 1;
1114 /* If file exists under a new path, we need to add it to the list
1115 so that show_line knows about it. */
1116 for (i
= 0; i
< include_path_count
; i
++)
1118 char *modname
= concat (include_paths
[i
], "/", fname
, (const char *) 0);
1120 p
= try_print_file_open (filename
, modname
);
1130 /* Print a source file line. */
1133 print_line (struct print_file_list
*p
, unsigned int line
)
1139 if (line
>= p
->maxline
)
1141 l
= p
->linemap
[line
];
1142 /* Test fwrite return value to quiet glibc warning. */
1143 len
= strcspn (l
, "\n\r");
1144 if (len
== 0 || fwrite (l
, len
, 1, stdout
) == 1)
1148 /* Print a range of source code lines. */
1151 dump_lines (struct print_file_list
*p
, unsigned int start
, unsigned int end
)
1155 while (start
<= end
)
1157 print_line (p
, start
);
1162 /* Show the line number, or the source line, in a disassembly
1166 show_line (bfd
*abfd
, asection
*section
, bfd_vma addr_offset
)
1168 const char *filename
;
1169 const char *functionname
;
1172 if (! with_line_numbers
&& ! with_source_code
)
1175 if (! bfd_find_nearest_line (abfd
, section
, syms
, addr_offset
, &filename
,
1176 &functionname
, &line
))
1179 if (filename
!= NULL
&& *filename
== '\0')
1181 if (functionname
!= NULL
&& *functionname
== '\0')
1182 functionname
= NULL
;
1184 if (with_line_numbers
)
1186 if (functionname
!= NULL
1187 && (prev_functionname
== NULL
1188 || strcmp (functionname
, prev_functionname
) != 0))
1189 printf ("%s():\n", functionname
);
1190 if (line
> 0 && line
!= prev_line
)
1191 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
1194 if (with_source_code
1198 struct print_file_list
**pp
, *p
;
1201 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1202 if (strcmp ((*pp
)->filename
, filename
) == 0)
1207 p
= update_source_path (filename
);
1209 if (p
!= NULL
&& line
!= p
->last_line
)
1211 if (file_start_context
&& p
->first
)
1215 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1218 if (p
->last_line
>= l
&& p
->last_line
<= line
)
1219 l
= p
->last_line
+ 1;
1221 dump_lines (p
, l
, line
);
1222 p
->last_line
= line
;
1227 if (functionname
!= NULL
1228 && (prev_functionname
== NULL
1229 || strcmp (functionname
, prev_functionname
) != 0))
1231 if (prev_functionname
!= NULL
)
1232 free (prev_functionname
);
1233 prev_functionname
= xmalloc (strlen (functionname
) + 1);
1234 strcpy (prev_functionname
, functionname
);
1237 if (line
> 0 && line
!= prev_line
)
1241 /* Pseudo FILE object for strings. */
1249 /* sprintf to a "stream". */
1251 static int ATTRIBUTE_PRINTF_2
1252 objdump_sprintf (SFILE
*f
, const char *format
, ...)
1259 size_t space
= f
->alloc
- f
->pos
;
1261 va_start (args
, format
);
1262 n
= vsnprintf (f
->buffer
+ f
->pos
, space
, format
, args
);
1268 f
->alloc
= (f
->alloc
+ n
) * 2;
1269 f
->buffer
= xrealloc (f
->buffer
, f
->alloc
);
1276 /* Returns TRUE if the specified section should be dumped. */
1279 process_section_p (asection
* section
)
1286 for (i
= 0; i
< only_used
; i
++)
1287 if (strcmp (only
[i
], section
->name
) == 0)
1294 /* The number of zeroes we want to see before we start skipping them.
1295 The number is arbitrarily chosen. */
1297 #define DEFAULT_SKIP_ZEROES 8
1299 /* The number of zeroes to skip at the end of a section. If the
1300 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1301 SKIP_ZEROES, they will be disassembled. If there are fewer than
1302 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1303 attempt to avoid disassembling zeroes inserted by section
1306 #define DEFAULT_SKIP_ZEROES_AT_END 3
1308 /* Disassemble some data in memory between given values. */
1311 disassemble_bytes (struct disassemble_info
* info
,
1312 disassembler_ftype disassemble_fn
,
1315 bfd_vma start_offset
,
1316 bfd_vma stop_offset
,
1319 arelent
** relppend
)
1321 struct objdump_disasm_info
*aux
;
1323 int octets_per_line
;
1324 bfd_boolean done_dot
;
1325 int skip_addr_chars
;
1326 bfd_vma addr_offset
;
1327 unsigned int opb
= info
->octets_per_byte
;
1328 unsigned int skip_zeroes
= info
->skip_zeroes
;
1329 unsigned int skip_zeroes_at_end
= info
->skip_zeroes_at_end
;
1333 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1337 sfile
.buffer
= xmalloc (sfile
.alloc
);
1341 octets_per_line
= 4;
1343 octets_per_line
= 16;
1345 /* Figure out how many characters to skip at the start of an
1346 address, to make the disassembly look nicer. We discard leading
1347 zeroes in chunks of 4, ensuring that there is always a leading
1349 skip_addr_chars
= 0;
1350 if (! prefix_addresses
)
1358 + bfd_section_size (section
->owner
, section
) / opb
));
1360 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1363 skip_addr_chars
+= 4;
1368 info
->insn_info_valid
= 0;
1371 addr_offset
= start_offset
;
1372 while (addr_offset
< stop_offset
)
1375 bfd_boolean need_nl
= FALSE
;
1376 int previous_octets
;
1378 /* Remember the length of the previous instruction. */
1379 previous_octets
= octets
;
1382 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1384 for (z
= addr_offset
* opb
; z
< stop_offset
* opb
; z
++)
1387 if (! disassemble_zeroes
1388 && (info
->insn_info_valid
== 0
1389 || info
->branch_delay_insns
== 0)
1390 && (z
- addr_offset
* opb
>= skip_zeroes
1391 || (z
== stop_offset
* opb
&&
1392 z
- addr_offset
* opb
< skip_zeroes_at_end
)))
1396 /* If there are more nonzero octets to follow, we only skip
1397 zeroes in multiples of 4, to try to avoid running over
1398 the start of an instruction which happens to start with
1400 if (z
!= stop_offset
* opb
)
1401 z
= addr_offset
* opb
+ ((z
- addr_offset
* opb
) &~ 3);
1403 octets
= z
- addr_offset
* opb
;
1413 if (with_line_numbers
|| with_source_code
)
1414 show_line (aux
->abfd
, section
, addr_offset
);
1416 if (! prefix_addresses
)
1420 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ addr_offset
);
1421 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1425 printf ("%s:\t", buf
+ skip_addr_chars
);
1429 aux
->require_sec
= TRUE
;
1430 objdump_print_address (section
->vma
+ addr_offset
, info
);
1431 aux
->require_sec
= FALSE
;
1438 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1439 info
->stream
= &sfile
;
1440 info
->bytes_per_line
= 0;
1441 info
->bytes_per_chunk
= 0;
1444 if (info
->disassembler_needs_relocs
1445 && (bfd_get_file_flags (aux
->abfd
) & EXEC_P
) == 0
1446 && (bfd_get_file_flags (aux
->abfd
) & DYNAMIC
) == 0
1447 && *relppp
< relppend
)
1449 bfd_signed_vma distance_to_rel
;
1451 distance_to_rel
= (**relppp
)->address
1452 - (rel_offset
+ addr_offset
);
1454 /* Check to see if the current reloc is associated with
1455 the instruction that we are about to disassemble. */
1456 if (distance_to_rel
== 0
1457 /* FIXME: This is wrong. We are trying to catch
1458 relocs that are addressed part way through the
1459 current instruction, as might happen with a packed
1460 VLIW instruction. Unfortunately we do not know the
1461 length of the current instruction since we have not
1462 disassembled it yet. Instead we take a guess based
1463 upon the length of the previous instruction. The
1464 proper solution is to have a new target-specific
1465 disassembler function which just returns the length
1466 of an instruction at a given address without trying
1467 to display its disassembly. */
1468 || (distance_to_rel
> 0
1469 && distance_to_rel
< (bfd_signed_vma
) (previous_octets
/ opb
)))
1471 info
->flags
= INSN_HAS_RELOC
;
1472 aux
->reloc
= **relppp
;
1478 octets
= (*disassemble_fn
) (section
->vma
+ addr_offset
, info
);
1479 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1480 info
->stream
= stdout
;
1481 if (info
->bytes_per_line
!= 0)
1482 octets_per_line
= info
->bytes_per_line
;
1486 printf ("%s\n", sfile
.buffer
);
1494 octets
= octets_per_line
;
1495 if (addr_offset
+ octets
/ opb
> stop_offset
)
1496 octets
= (stop_offset
- addr_offset
) * opb
;
1498 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ octets
; ++j
)
1500 if (ISPRINT (data
[j
]))
1501 buf
[j
- addr_offset
* opb
] = data
[j
];
1503 buf
[j
- addr_offset
* opb
] = '.';
1505 buf
[j
- addr_offset
* opb
] = '\0';
1508 if (prefix_addresses
1510 : show_raw_insn
>= 0)
1514 /* If ! prefix_addresses and ! wide_output, we print
1515 octets_per_line octets per line. */
1517 if (pb
> octets_per_line
&& ! prefix_addresses
&& ! wide_output
)
1518 pb
= octets_per_line
;
1520 if (info
->bytes_per_chunk
)
1521 bpc
= info
->bytes_per_chunk
;
1525 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1529 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1531 for (k
= bpc
- 1; k
>= 0; k
--)
1532 printf ("%02x", (unsigned) data
[j
+ k
]);
1537 for (k
= 0; k
< bpc
; k
++)
1538 printf ("%02x", (unsigned) data
[j
+ k
]);
1543 for (; pb
< octets_per_line
; pb
+= bpc
)
1547 for (k
= 0; k
< bpc
; k
++)
1552 /* Separate raw data from instruction by extra space. */
1562 printf ("%s", sfile
.buffer
);
1564 if (prefix_addresses
1566 : show_raw_insn
>= 0)
1574 j
= addr_offset
* opb
+ pb
;
1576 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ j
/ opb
);
1577 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1581 printf ("%s:\t", buf
+ skip_addr_chars
);
1583 pb
+= octets_per_line
;
1586 for (; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1590 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1592 for (k
= bpc
- 1; k
>= 0; k
--)
1593 printf ("%02x", (unsigned) data
[j
+ k
]);
1598 for (k
= 0; k
< bpc
; k
++)
1599 printf ("%02x", (unsigned) data
[j
+ k
]);
1612 while ((*relppp
) < relppend
1613 && (**relppp
)->address
< rel_offset
+ addr_offset
+ octets
/ opb
)
1615 if (dump_reloc_info
|| dump_dynamic_reloc_info
)
1626 objdump_print_value (section
->vma
- rel_offset
+ q
->address
,
1629 if (q
->howto
== NULL
)
1630 printf (": *unknown*\t");
1631 else if (q
->howto
->name
)
1632 printf (": %s\t", q
->howto
->name
);
1634 printf (": %d\t", q
->howto
->type
);
1636 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
1637 printf ("*unknown*");
1640 const char *sym_name
;
1642 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1643 if (sym_name
!= NULL
&& *sym_name
!= '\0')
1644 objdump_print_symname (aux
->abfd
, info
, *q
->sym_ptr_ptr
);
1649 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1650 sym_name
= bfd_get_section_name (aux
->abfd
, sym_sec
);
1651 if (sym_name
== NULL
|| *sym_name
== '\0')
1652 sym_name
= "*unknown*";
1653 printf ("%s", sym_name
);
1660 objdump_print_value (q
->addend
, info
, TRUE
);
1672 addr_offset
+= octets
/ opb
;
1675 free (sfile
.buffer
);
1679 disassemble_section (bfd
*abfd
, asection
*section
, void *info
)
1681 struct disassemble_info
* pinfo
= (struct disassemble_info
*) info
;
1682 struct objdump_disasm_info
* paux
;
1683 unsigned int opb
= pinfo
->octets_per_byte
;
1684 bfd_byte
* data
= NULL
;
1685 bfd_size_type datasize
= 0;
1686 arelent
** rel_pp
= NULL
;
1687 arelent
** rel_ppstart
= NULL
;
1688 arelent
** rel_ppend
;
1689 unsigned long stop_offset
;
1690 asymbol
* sym
= NULL
;
1694 unsigned long addr_offset
;
1696 /* Sections that do not contain machine
1697 code are not normally disassembled. */
1698 if (! disassemble_all
1700 && ((section
->flags
& (SEC_CODE
| SEC_HAS_CONTENTS
))
1701 != (SEC_CODE
| SEC_HAS_CONTENTS
)))
1704 if (! process_section_p (section
))
1707 datasize
= bfd_get_section_size (section
);
1711 /* Decide which set of relocs to use. Load them if necessary. */
1712 paux
= (struct objdump_disasm_info
*) pinfo
->application_data
;
1713 if (paux
->dynrelbuf
)
1715 rel_pp
= paux
->dynrelbuf
;
1716 rel_count
= paux
->dynrelcount
;
1717 /* Dynamic reloc addresses are absolute, non-dynamic are section
1718 relative. REL_OFFSET specifies the reloc address corresponding
1719 to the start of this section. */
1720 rel_offset
= section
->vma
;
1728 if ((section
->flags
& SEC_RELOC
) != 0
1729 && (dump_reloc_info
|| pinfo
->disassembler_needs_relocs
))
1733 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1735 bfd_fatal (bfd_get_filename (abfd
));
1739 rel_ppstart
= rel_pp
= xmalloc (relsize
);
1740 rel_count
= bfd_canonicalize_reloc (abfd
, section
, rel_pp
, syms
);
1742 bfd_fatal (bfd_get_filename (abfd
));
1744 /* Sort the relocs by address. */
1745 qsort (rel_pp
, rel_count
, sizeof (arelent
*), compare_relocs
);
1750 rel_ppend
= rel_pp
+ rel_count
;
1752 data
= xmalloc (datasize
);
1754 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1756 paux
->sec
= section
;
1757 pinfo
->buffer
= data
;
1758 pinfo
->buffer_vma
= section
->vma
;
1759 pinfo
->buffer_length
= datasize
;
1760 pinfo
->section
= section
;
1762 if (start_address
== (bfd_vma
) -1
1763 || start_address
< pinfo
->buffer_vma
)
1766 addr_offset
= start_address
- pinfo
->buffer_vma
;
1768 if (stop_address
== (bfd_vma
) -1)
1769 stop_offset
= datasize
/ opb
;
1772 if (stop_address
< pinfo
->buffer_vma
)
1775 stop_offset
= stop_address
- pinfo
->buffer_vma
;
1776 if (stop_offset
> pinfo
->buffer_length
/ opb
)
1777 stop_offset
= pinfo
->buffer_length
/ opb
;
1780 /* Skip over the relocs belonging to addresses below the
1782 while (rel_pp
< rel_ppend
1783 && (*rel_pp
)->address
< rel_offset
+ addr_offset
)
1786 printf (_("Disassembly of section %s:\n"), section
->name
);
1788 /* Find the nearest symbol forwards from our current position. */
1789 paux
->require_sec
= TRUE
;
1790 sym
= find_symbol_for_address (section
->vma
+ addr_offset
, info
, &place
);
1791 paux
->require_sec
= FALSE
;
1793 /* Disassemble a block of instructions up to the address associated with
1794 the symbol we have just found. Then print the symbol and find the
1795 next symbol on. Repeat until we have disassembled the entire section
1796 or we have reached the end of the address range we are interested in. */
1797 while (addr_offset
< stop_offset
)
1801 unsigned long nextstop_offset
;
1804 addr
= section
->vma
+ addr_offset
;
1806 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= addr
)
1811 (x
< sorted_symcount
1812 && (bfd_asymbol_value (sorted_syms
[x
]) <= addr
));
1816 pinfo
->symbols
= sorted_syms
+ place
;
1817 pinfo
->num_symbols
= x
- place
;
1818 pinfo
->symtab_pos
= place
;
1822 pinfo
->symbols
= NULL
;
1823 pinfo
->num_symbols
= 0;
1824 pinfo
->symtab_pos
= -1;
1827 if (! prefix_addresses
)
1829 pinfo
->fprintf_func (pinfo
->stream
, "\n");
1830 objdump_print_addr_with_sym (abfd
, section
, sym
, addr
,
1832 pinfo
->fprintf_func (pinfo
->stream
, ":\n");
1835 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
1837 else if (sym
== NULL
)
1841 #define is_valid_next_sym(SYM) \
1842 ((SYM)->section == section \
1843 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1844 && pinfo->symbol_is_valid (SYM, pinfo))
1846 /* Search forward for the next appropriate symbol in
1847 SECTION. Note that all the symbols are sorted
1848 together into one big array, and that some sections
1849 may have overlapping addresses. */
1850 while (place
< sorted_symcount
1851 && ! is_valid_next_sym (sorted_syms
[place
]))
1854 if (place
>= sorted_symcount
)
1857 nextsym
= sorted_syms
[place
];
1860 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
1861 nextstop_offset
= bfd_asymbol_value (sym
) - section
->vma
;
1862 else if (nextsym
== NULL
)
1863 nextstop_offset
= stop_offset
;
1865 nextstop_offset
= bfd_asymbol_value (nextsym
) - section
->vma
;
1867 if (nextstop_offset
> stop_offset
)
1868 nextstop_offset
= stop_offset
;
1870 /* If a symbol is explicitly marked as being an object
1871 rather than a function, just dump the bytes without
1872 disassembling them. */
1875 || bfd_asymbol_value (sym
) > addr
1876 || ((sym
->flags
& BSF_OBJECT
) == 0
1877 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1879 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1881 || (sym
->flags
& BSF_FUNCTION
) != 0)
1886 disassemble_bytes (pinfo
, paux
->disassemble_fn
, insns
, data
,
1887 addr_offset
, nextstop_offset
,
1888 rel_offset
, &rel_pp
, rel_ppend
);
1890 addr_offset
= nextstop_offset
;
1896 if (rel_ppstart
!= NULL
)
1900 /* Disassemble the contents of an object file. */
1903 disassemble_data (bfd
*abfd
)
1905 struct disassemble_info disasm_info
;
1906 struct objdump_disasm_info aux
;
1910 prev_functionname
= NULL
;
1913 /* We make a copy of syms to sort. We don't want to sort syms
1914 because that will screw up the relocs. */
1915 sorted_symcount
= symcount
? symcount
: dynsymcount
;
1916 sorted_syms
= xmalloc ((sorted_symcount
+ synthcount
) * sizeof (asymbol
*));
1917 memcpy (sorted_syms
, symcount
? syms
: dynsyms
,
1918 sorted_symcount
* sizeof (asymbol
*));
1920 sorted_symcount
= remove_useless_symbols (sorted_syms
, sorted_symcount
);
1922 for (i
= 0; i
< synthcount
; ++i
)
1924 sorted_syms
[sorted_symcount
] = synthsyms
+ i
;
1928 /* Sort the symbols into section and symbol order. */
1929 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1931 init_disassemble_info (&disasm_info
, stdout
, (fprintf_ftype
) fprintf
);
1933 disasm_info
.application_data
= (void *) &aux
;
1935 aux
.require_sec
= FALSE
;
1936 aux
.dynrelbuf
= NULL
;
1937 aux
.dynrelcount
= 0;
1940 disasm_info
.print_address_func
= objdump_print_address
;
1941 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
1943 if (machine
!= NULL
)
1945 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1948 fatal (_("Can't use supplied machine %s"), machine
);
1950 abfd
->arch_info
= info
;
1953 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1955 struct bfd_target
*xvec
;
1957 xvec
= xmalloc (sizeof (struct bfd_target
));
1958 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1959 xvec
->byteorder
= endian
;
1963 /* Use libopcodes to locate a suitable disassembler. */
1964 aux
.disassemble_fn
= disassembler (abfd
);
1965 if (!aux
.disassemble_fn
)
1967 non_fatal (_("Can't disassemble for architecture %s\n"),
1968 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1973 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1974 disasm_info
.arch
= bfd_get_arch (abfd
);
1975 disasm_info
.mach
= bfd_get_mach (abfd
);
1976 disasm_info
.disassembler_options
= disassembler_options
;
1977 disasm_info
.octets_per_byte
= bfd_octets_per_byte (abfd
);
1978 disasm_info
.skip_zeroes
= DEFAULT_SKIP_ZEROES
;
1979 disasm_info
.skip_zeroes_at_end
= DEFAULT_SKIP_ZEROES_AT_END
;
1980 disasm_info
.disassembler_needs_relocs
= FALSE
;
1982 if (bfd_big_endian (abfd
))
1983 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
1984 else if (bfd_little_endian (abfd
))
1985 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1987 /* ??? Aborting here seems too drastic. We could default to big or little
1989 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1991 /* Allow the target to customize the info structure. */
1992 disassemble_init_for_target (& disasm_info
);
1994 /* Pre-load the dynamic relocs if we are going
1995 to be dumping them along with the disassembly. */
1996 if (dump_dynamic_reloc_info
)
1998 long relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2001 bfd_fatal (bfd_get_filename (abfd
));
2005 aux
.dynrelbuf
= xmalloc (relsize
);
2006 aux
.dynrelcount
= bfd_canonicalize_dynamic_reloc (abfd
,
2009 if (aux
.dynrelcount
< 0)
2010 bfd_fatal (bfd_get_filename (abfd
));
2012 /* Sort the relocs by address. */
2013 qsort (aux
.dynrelbuf
, aux
.dynrelcount
, sizeof (arelent
*),
2017 disasm_info
.symtab
= sorted_syms
;
2018 disasm_info
.symtab_size
= sorted_symcount
;
2020 bfd_map_over_sections (abfd
, disassemble_section
, & disasm_info
);
2022 if (aux
.dynrelbuf
!= NULL
)
2023 free (aux
.dynrelbuf
);
2028 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
2030 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
2035 /* If it is already loaded, do nothing. */
2036 if (section
->start
!= NULL
)
2039 /* Locate the debug section. */
2040 sec
= bfd_get_section_by_name (abfd
, section
->name
);
2044 /* Compute a bias to be added to offsets found within the DWARF debug
2045 information. These offsets are meant to be relative to the start of
2046 the dwarf section, and hence the bias should be 0. For MACH-O however
2047 a dwarf section is really just a region of a much larger section and so
2048 the bias is the address of the start of that area within the larger
2049 section. This test is important for PE and COFF based targets which
2050 use DWARF debug information, since unlike ELF, they do not allow the
2051 dwarf sections to be placed at address 0. */
2052 if (bfd_get_flavour (abfd
) == bfd_target_mach_o_flavour
)
2053 section
->address
= bfd_get_section_vma (abfd
, sec
);
2055 section
->address
= 0;
2057 section
->size
= bfd_get_section_size (sec
);
2058 section
->start
= xmalloc (section
->size
);
2060 if (is_relocatable
&& debug_displays
[debug
].relocate
)
2061 ret
= bfd_simple_get_relocated_section_contents (abfd
,
2066 ret
= bfd_get_section_contents (abfd
, sec
, section
->start
, 0,
2071 free_debug_section (debug
);
2072 printf (_("\nCan't get contents for section '%s'.\n"),
2080 free_debug_section (enum dwarf_section_display_enum debug
)
2082 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
2084 if (section
->start
== NULL
)
2087 free ((char *) section
->start
);
2088 section
->start
= NULL
;
2089 section
->address
= 0;
2094 dump_dwarf_section (bfd
*abfd
, asection
*section
,
2095 void *arg ATTRIBUTE_UNUSED
)
2097 const char *name
= bfd_get_section_name (abfd
, section
);
2099 enum dwarf_section_display_enum i
;
2101 if (CONST_STRNEQ (name
, ".gnu.linkonce.wi."))
2102 match
= ".debug_info";
2106 for (i
= 0; i
< max
; i
++)
2107 if (strcmp (debug_displays
[i
].section
.name
, match
) == 0)
2109 if (!debug_displays
[i
].eh_frame
)
2111 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
2113 if (load_debug_section (i
, abfd
))
2115 debug_displays
[i
].display (sec
, abfd
);
2117 if (i
!= info
&& i
!= abbrev
)
2118 free_debug_section (i
);
2125 static const char *mach_o_dwarf_sections
[] = {
2126 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2127 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2128 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2129 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2130 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2131 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2132 ".eh_frame", /* .eh_frame */
2133 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2134 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2135 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2136 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2137 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2138 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2139 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2140 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2141 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2144 static const char *generic_dwarf_sections
[max
];
2147 check_mach_o_dwarf (bfd
*abfd
)
2149 static enum bfd_flavour old_flavour
= bfd_target_unknown_flavour
;
2150 enum bfd_flavour current_flavour
= bfd_get_flavour (abfd
);
2151 enum dwarf_section_display_enum i
;
2153 if (generic_dwarf_sections
[0] == NULL
)
2154 for (i
= 0; i
< max
; i
++)
2155 generic_dwarf_sections
[i
] = debug_displays
[i
].section
.name
;
2157 if (old_flavour
!= current_flavour
)
2159 if (current_flavour
== bfd_target_mach_o_flavour
)
2160 for (i
= 0; i
< max
; i
++)
2161 debug_displays
[i
].section
.name
= mach_o_dwarf_sections
[i
];
2162 else if (old_flavour
== bfd_target_mach_o_flavour
)
2163 for (i
= 0; i
< max
; i
++)
2164 debug_displays
[i
].section
.name
= generic_dwarf_sections
[i
];
2166 old_flavour
= current_flavour
;
2170 /* Dump the dwarf debugging information. */
2173 dump_dwarf (bfd
*abfd
)
2175 is_relocatable
= (abfd
->flags
& (EXEC_P
| DYNAMIC
)) == 0;
2177 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2178 targets will return 64. */
2179 eh_addr_size
= bfd_get_arch_size (abfd
) == 64 ? 8 : 4;
2181 if (bfd_big_endian (abfd
))
2182 byte_get
= byte_get_big_endian
;
2183 else if (bfd_little_endian (abfd
))
2184 byte_get
= byte_get_little_endian
;
2188 check_mach_o_dwarf (abfd
);
2190 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
2192 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
2193 init_dwarf_regnames (bed
->elf_machine_code
);
2196 bfd_map_over_sections (abfd
, dump_dwarf_section
, NULL
);
2198 free_debug_memory ();
2201 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2202 it. Return NULL on failure. */
2205 read_section_stabs (bfd
*abfd
, const char *sect_name
, bfd_size_type
*size_ptr
)
2211 stabsect
= bfd_get_section_by_name (abfd
, sect_name
);
2212 if (stabsect
== NULL
)
2214 printf (_("No %s section present\n\n"), sect_name
);
2218 size
= bfd_section_size (abfd
, stabsect
);
2219 contents
= xmalloc (size
);
2221 if (! bfd_get_section_contents (abfd
, stabsect
, contents
, 0, size
))
2223 non_fatal (_("Reading %s section of %s failed: %s"),
2224 sect_name
, bfd_get_filename (abfd
),
2225 bfd_errmsg (bfd_get_error ()));
2236 /* Stabs entries use a 12 byte format:
2237 4 byte string table index
2239 1 byte stab other field
2240 2 byte stab desc field
2242 FIXME: This will have to change for a 64 bit object format. */
2244 #define STRDXOFF (0)
2246 #define OTHEROFF (5)
2249 #define STABSIZE (12)
2251 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2252 using string table section STRSECT_NAME (in `strtab'). */
2255 print_section_stabs (bfd
*abfd
,
2256 const char *stabsect_name
,
2257 unsigned *string_offset_ptr
)
2260 unsigned file_string_table_offset
= 0;
2261 unsigned next_file_string_table_offset
= *string_offset_ptr
;
2262 bfd_byte
*stabp
, *stabs_end
;
2265 stabs_end
= stabp
+ stab_size
;
2267 printf (_("Contents of %s section:\n\n"), stabsect_name
);
2268 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2270 /* Loop through all symbols and print them.
2272 We start the index at -1 because there is a dummy symbol on
2273 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2274 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
2278 unsigned char type
, other
;
2279 unsigned short desc
;
2282 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
2283 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
2284 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
2285 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
2286 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
2288 printf ("\n%-6d ", i
);
2289 /* Either print the stab name, or, if unnamed, print its number
2290 again (makes consistent formatting for tools like awk). */
2291 name
= bfd_get_stab_name (type
);
2293 printf ("%-6s", name
);
2294 else if (type
== N_UNDF
)
2297 printf ("%-6d", type
);
2298 printf (" %-6d %-6d ", other
, desc
);
2299 bfd_printf_vma (abfd
, value
);
2300 printf (" %-6lu", strx
);
2302 /* Symbols with type == 0 (N_UNDF) specify the length of the
2303 string table associated with this file. We use that info
2304 to know how to relocate the *next* file's string table indices. */
2307 file_string_table_offset
= next_file_string_table_offset
;
2308 next_file_string_table_offset
+= value
;
2312 /* Using the (possibly updated) string table offset, print the
2313 string (if any) associated with this symbol. */
2314 if ((strx
+ file_string_table_offset
) < stabstr_size
)
2315 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
2321 *string_offset_ptr
= next_file_string_table_offset
;
2326 const char * section_name
;
2327 const char * string_section_name
;
2328 unsigned string_offset
;
2333 find_stabs_section (bfd
*abfd
, asection
*section
, void *names
)
2336 stab_section_names
* sought
= (stab_section_names
*) names
;
2338 /* Check for section names for which stabsect_name is a prefix, to
2339 handle .stab.N, etc. */
2340 len
= strlen (sought
->section_name
);
2342 /* If the prefix matches, and the files section name ends with a
2343 nul or a digit, then we match. I.e., we want either an exact
2344 match or a section followed by a number. */
2345 if (strncmp (sought
->section_name
, section
->name
, len
) == 0
2346 && (section
->name
[len
] == 0
2347 || (section
->name
[len
] == '.' && ISDIGIT (section
->name
[len
+ 1]))))
2350 strtab
= read_section_stabs (abfd
, sought
->string_section_name
,
2355 stabs
= (bfd_byte
*) read_section_stabs (abfd
, section
->name
,
2358 print_section_stabs (abfd
, section
->name
, &sought
->string_offset
);
2364 dump_stabs_section (bfd
*abfd
, char *stabsect_name
, char *strsect_name
)
2366 stab_section_names s
;
2368 s
.section_name
= stabsect_name
;
2369 s
.string_section_name
= strsect_name
;
2370 s
.string_offset
= 0;
2372 bfd_map_over_sections (abfd
, find_stabs_section
, & s
);
2378 /* Dump the any sections containing stabs debugging information. */
2381 dump_stabs (bfd
*abfd
)
2383 dump_stabs_section (abfd
, ".stab", ".stabstr");
2384 dump_stabs_section (abfd
, ".stab.excl", ".stab.exclstr");
2385 dump_stabs_section (abfd
, ".stab.index", ".stab.indexstr");
2386 dump_stabs_section (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2390 dump_bfd_header (bfd
*abfd
)
2394 printf (_("architecture: %s, "),
2395 bfd_printable_arch_mach (bfd_get_arch (abfd
),
2396 bfd_get_mach (abfd
)));
2397 printf (_("flags 0x%08x:\n"), abfd
->flags
);
2399 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2400 PF (HAS_RELOC
, "HAS_RELOC");
2401 PF (EXEC_P
, "EXEC_P");
2402 PF (HAS_LINENO
, "HAS_LINENO");
2403 PF (HAS_DEBUG
, "HAS_DEBUG");
2404 PF (HAS_SYMS
, "HAS_SYMS");
2405 PF (HAS_LOCALS
, "HAS_LOCALS");
2406 PF (DYNAMIC
, "DYNAMIC");
2407 PF (WP_TEXT
, "WP_TEXT");
2408 PF (D_PAGED
, "D_PAGED");
2409 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
2410 PF (HAS_LOAD_PAGE
, "HAS_LOAD_PAGE");
2411 printf (_("\nstart address 0x"));
2412 bfd_printf_vma (abfd
, abfd
->start_address
);
2418 dump_bfd_private_header (bfd
*abfd
)
2420 bfd_print_private_bfd_data (abfd
, stdout
);
2424 /* Display a section in hexadecimal format with associated characters.
2425 Each line prefixed by the zero padded address. */
2428 dump_section (bfd
*abfd
, asection
*section
, void *dummy ATTRIBUTE_UNUSED
)
2431 bfd_size_type datasize
;
2432 bfd_size_type addr_offset
;
2433 bfd_size_type start_offset
;
2434 bfd_size_type stop_offset
;
2435 unsigned int opb
= bfd_octets_per_byte (abfd
);
2436 /* Bytes per line. */
2437 const int onaline
= 16;
2442 if ((section
->flags
& SEC_HAS_CONTENTS
) == 0)
2445 if (! process_section_p (section
))
2448 if ((datasize
= bfd_section_size (abfd
, section
)) == 0)
2451 printf (_("Contents of section %s:\n"), section
->name
);
2453 data
= xmalloc (datasize
);
2455 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
2457 /* Compute the address range to display. */
2458 if (start_address
== (bfd_vma
) -1
2459 || start_address
< section
->vma
)
2462 start_offset
= start_address
- section
->vma
;
2464 if (stop_address
== (bfd_vma
) -1)
2465 stop_offset
= datasize
/ opb
;
2468 if (stop_address
< section
->vma
)
2471 stop_offset
= stop_address
- section
->vma
;
2473 if (stop_offset
> datasize
/ opb
)
2474 stop_offset
= datasize
/ opb
;
2479 bfd_sprintf_vma (abfd
, buf
, start_offset
+ section
->vma
);
2480 if (strlen (buf
) >= sizeof (buf
))
2484 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
2486 count
= strlen (buf
) - count
;
2490 bfd_sprintf_vma (abfd
, buf
, stop_offset
+ section
->vma
- 1);
2491 if (strlen (buf
) >= sizeof (buf
))
2495 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
2497 count
= strlen (buf
) - count
;
2501 for (addr_offset
= start_offset
;
2502 addr_offset
< stop_offset
; addr_offset
+= onaline
/ opb
)
2506 bfd_sprintf_vma (abfd
, buf
, (addr_offset
+ section
->vma
));
2507 count
= strlen (buf
);
2508 if ((size_t) count
>= sizeof (buf
))
2512 while (count
< width
)
2517 fputs (buf
+ count
- width
, stdout
);
2520 for (j
= addr_offset
* opb
;
2521 j
< addr_offset
* opb
+ onaline
; j
++)
2523 if (j
< stop_offset
* opb
)
2524 printf ("%02x", (unsigned) (data
[j
]));
2532 for (j
= addr_offset
* opb
;
2533 j
< addr_offset
* opb
+ onaline
; j
++)
2535 if (j
>= stop_offset
* opb
)
2538 printf ("%c", ISPRINT (data
[j
]) ? data
[j
] : '.');
2545 /* Actually display the various requested regions. */
2548 dump_data (bfd
*abfd
)
2550 bfd_map_over_sections (abfd
, dump_section
, NULL
);
2553 /* Should perhaps share code and display with nm? */
2556 dump_symbols (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_boolean dynamic
)
2566 printf ("DYNAMIC SYMBOL TABLE:\n");
2572 printf ("SYMBOL TABLE:\n");
2576 printf (_("no symbols\n"));
2578 for (count
= 0; count
< max
; count
++)
2582 if (*current
== NULL
)
2583 printf (_("no information for symbol number %ld\n"), count
);
2585 else if ((cur_bfd
= bfd_asymbol_bfd (*current
)) == NULL
)
2586 printf (_("could not determine the type of symbol number %ld\n"),
2589 else if (process_section_p ((* current
)->section
)
2590 && (dump_special_syms
2591 || !bfd_is_target_special_symbol (cur_bfd
, *current
)))
2593 const char *name
= (*current
)->name
;
2595 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
2599 /* If we want to demangle the name, we demangle it
2600 here, and temporarily clobber it while calling
2601 bfd_print_symbol. FIXME: This is a gross hack. */
2602 alloc
= bfd_demangle (cur_bfd
, name
, DMGL_ANSI
| DMGL_PARAMS
);
2604 (*current
)->name
= alloc
;
2605 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2606 bfd_print_symbol_all
);
2609 (*current
)->name
= name
;
2614 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2615 bfd_print_symbol_all
);
2625 dump_reloc_set (bfd
*abfd
, asection
*sec
, arelent
**relpp
, long relcount
)
2628 char *last_filename
, *last_functionname
;
2629 unsigned int last_line
;
2631 /* Get column headers lined up reasonably. */
2639 bfd_sprintf_vma (abfd
, buf
, (bfd_vma
) -1);
2640 width
= strlen (buf
) - 7;
2642 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2645 last_filename
= NULL
;
2646 last_functionname
= NULL
;
2649 for (p
= relpp
; relcount
&& *p
!= NULL
; p
++, relcount
--)
2652 const char *filename
, *functionname
;
2654 const char *sym_name
;
2655 const char *section_name
;
2657 if (start_address
!= (bfd_vma
) -1
2658 && q
->address
< start_address
)
2660 if (stop_address
!= (bfd_vma
) -1
2661 && q
->address
> stop_address
)
2664 if (with_line_numbers
2666 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2667 &filename
, &functionname
, &line
))
2669 if (functionname
!= NULL
2670 && (last_functionname
== NULL
2671 || strcmp (functionname
, last_functionname
) != 0))
2673 printf ("%s():\n", functionname
);
2674 if (last_functionname
!= NULL
)
2675 free (last_functionname
);
2676 last_functionname
= xstrdup (functionname
);
2680 && (line
!= last_line
2681 || (filename
!= NULL
2682 && last_filename
!= NULL
2683 && strcmp (filename
, last_filename
) != 0)))
2685 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2687 if (last_filename
!= NULL
)
2688 free (last_filename
);
2689 if (filename
== NULL
)
2690 last_filename
= NULL
;
2692 last_filename
= xstrdup (filename
);
2696 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2698 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2699 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2704 section_name
= NULL
;
2707 bfd_printf_vma (abfd
, q
->address
);
2708 if (q
->howto
== NULL
)
2709 printf (" *unknown* ");
2710 else if (q
->howto
->name
)
2711 printf (" %-16s ", q
->howto
->name
);
2713 printf (" %-16d ", q
->howto
->type
);
2715 objdump_print_symname (abfd
, NULL
, *q
->sym_ptr_ptr
);
2718 if (section_name
== NULL
)
2719 section_name
= "*unknown*";
2720 printf ("[%s]", section_name
);
2726 bfd_printf_vma (abfd
, q
->addend
);
2734 dump_relocs_in_section (bfd
*abfd
,
2736 void *dummy ATTRIBUTE_UNUSED
)
2742 if ( bfd_is_abs_section (section
)
2743 || bfd_is_und_section (section
)
2744 || bfd_is_com_section (section
)
2745 || (! process_section_p (section
))
2746 || ((section
->flags
& SEC_RELOC
) == 0))
2749 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
2751 bfd_fatal (bfd_get_filename (abfd
));
2753 printf ("RELOCATION RECORDS FOR [%s]:", section
->name
);
2757 printf (" (none)\n\n");
2761 relpp
= xmalloc (relsize
);
2762 relcount
= bfd_canonicalize_reloc (abfd
, section
, relpp
, syms
);
2765 bfd_fatal (bfd_get_filename (abfd
));
2766 else if (relcount
== 0)
2767 printf (" (none)\n\n");
2771 dump_reloc_set (abfd
, section
, relpp
, relcount
);
2778 dump_relocs (bfd
*abfd
)
2780 bfd_map_over_sections (abfd
, dump_relocs_in_section
, NULL
);
2784 dump_dynamic_relocs (bfd
*abfd
)
2790 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2792 bfd_fatal (bfd_get_filename (abfd
));
2794 printf ("DYNAMIC RELOCATION RECORDS");
2797 printf (" (none)\n\n");
2800 relpp
= xmalloc (relsize
);
2801 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2804 bfd_fatal (bfd_get_filename (abfd
));
2805 else if (relcount
== 0)
2806 printf (" (none)\n\n");
2810 dump_reloc_set (abfd
, NULL
, relpp
, relcount
);
2817 /* Creates a table of paths, to search for source files. */
2820 add_include_path (const char *path
)
2824 include_path_count
++;
2825 include_paths
= xrealloc (include_paths
,
2826 include_path_count
* sizeof (*include_paths
));
2827 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2828 if (path
[1] == ':' && path
[2] == 0)
2829 path
= concat (path
, ".", (const char *) 0);
2831 include_paths
[include_path_count
- 1] = path
;
2835 adjust_addresses (bfd
*abfd ATTRIBUTE_UNUSED
,
2839 if ((section
->flags
& SEC_DEBUGGING
) == 0)
2841 bfd_boolean
*has_reloc_p
= (bfd_boolean
*) arg
;
2842 section
->vma
+= adjust_section_vma
;
2844 section
->lma
+= adjust_section_vma
;
2848 /* Dump selected contents of ABFD. */
2851 dump_bfd (bfd
*abfd
)
2853 /* If we are adjusting section VMA's, change them all now. Changing
2854 the BFD information is a hack. However, we must do it, or
2855 bfd_find_nearest_line will not do the right thing. */
2856 if (adjust_section_vma
!= 0)
2858 bfd_boolean has_reloc
= (abfd
->flags
& HAS_RELOC
);
2859 bfd_map_over_sections (abfd
, adjust_addresses
, &has_reloc
);
2862 if (! dump_debugging_tags
)
2863 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd
),
2866 print_arelt_descr (stdout
, abfd
, TRUE
);
2867 if (dump_file_header
)
2868 dump_bfd_header (abfd
);
2869 if (dump_private_headers
)
2870 dump_bfd_private_header (abfd
);
2871 if (! dump_debugging_tags
)
2873 if (dump_section_headers
)
2874 dump_headers (abfd
);
2880 || dump_dwarf_section_info
)
2881 syms
= slurp_symtab (abfd
);
2882 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
2883 || (disassemble
&& bfd_get_dynamic_symtab_upper_bound (abfd
) > 0))
2884 dynsyms
= slurp_dynamic_symtab (abfd
);
2887 synthcount
= bfd_get_synthetic_symtab (abfd
, symcount
, syms
,
2888 dynsymcount
, dynsyms
, &synthsyms
);
2894 dump_symbols (abfd
, FALSE
);
2895 if (dump_dynamic_symtab
)
2896 dump_symbols (abfd
, TRUE
);
2897 if (dump_dwarf_section_info
)
2899 if (dump_stab_section_info
)
2901 if (dump_reloc_info
&& ! disassemble
)
2903 if (dump_dynamic_reloc_info
&& ! disassemble
)
2904 dump_dynamic_relocs (abfd
);
2905 if (dump_section_contents
)
2908 disassemble_data (abfd
);
2914 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
2915 if (dhandle
!= NULL
)
2917 if (!print_debugging_info (stdout
, dhandle
, abfd
, syms
,
2919 dump_debugging_tags
? TRUE
: FALSE
))
2921 non_fatal (_("%s: printing debugging information failed"),
2922 bfd_get_filename (abfd
));
2952 display_bfd (bfd
*abfd
)
2956 if (bfd_check_format_matches (abfd
, bfd_object
, &matching
))
2962 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2964 nonfatal (bfd_get_filename (abfd
));
2965 list_matching_formats (matching
);
2970 if (bfd_get_error () != bfd_error_file_not_recognized
)
2972 nonfatal (bfd_get_filename (abfd
));
2976 if (bfd_check_format_matches (abfd
, bfd_core
, &matching
))
2982 nonfatal (bfd_get_filename (abfd
));
2984 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2986 list_matching_formats (matching
);
2992 display_file (char *filename
, char *target
)
2997 if (get_file_size (filename
) < 1)
3003 file
= bfd_openr (filename
, target
);
3006 nonfatal (filename
);
3010 /* If the file is an archive, process all of its elements. */
3011 if (bfd_check_format (file
, bfd_archive
))
3013 bfd
*last_arfile
= NULL
;
3015 printf (_("In archive %s:\n"), bfd_get_filename (file
));
3018 bfd_set_error (bfd_error_no_error
);
3020 arfile
= bfd_openr_next_archived_file (file
, arfile
);
3023 if (bfd_get_error () != bfd_error_no_more_archived_files
)
3024 nonfatal (bfd_get_filename (file
));
3028 display_bfd (arfile
);
3030 if (last_arfile
!= NULL
)
3031 bfd_close (last_arfile
);
3032 last_arfile
= arfile
;
3035 if (last_arfile
!= NULL
)
3036 bfd_close (last_arfile
);
3045 main (int argc
, char **argv
)
3048 char *target
= default_target
;
3049 bfd_boolean seenflag
= FALSE
;
3051 #if defined (HAVE_SETLOCALE)
3052 #if defined (HAVE_LC_MESSAGES)
3053 setlocale (LC_MESSAGES
, "");
3055 setlocale (LC_CTYPE
, "");
3058 bindtextdomain (PACKAGE
, LOCALEDIR
);
3059 textdomain (PACKAGE
);
3061 program_name
= *argv
;
3062 xmalloc_set_program_name (program_name
);
3064 START_PROGRESS (program_name
, 0);
3066 expandargv (&argc
, &argv
);
3069 set_default_bfd_target ();
3071 while ((c
= getopt_long (argc
, argv
, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeGW",
3072 long_options
, (int *) 0))
3078 break; /* We've been given a long option. */
3083 if (disassembler_options
)
3084 /* Ignore potential memory leak for now. */
3085 disassembler_options
= concat (disassembler_options
, ",",
3086 optarg
, (const char *) NULL
);
3088 disassembler_options
= optarg
;
3091 if (only_used
== only_size
)
3094 only
= xrealloc (only
, only_size
* sizeof (char *));
3096 only
[only_used
++] = optarg
;
3099 with_line_numbers
= TRUE
;
3108 enum demangling_styles style
;
3110 style
= cplus_demangle_name_to_style (optarg
);
3111 if (style
== unknown_demangling
)
3112 fatal (_("unknown demangling style `%s'"),
3115 cplus_demangle_set_style (style
);
3121 case OPTION_ADJUST_VMA
:
3122 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
3124 case OPTION_START_ADDRESS
:
3125 start_address
= parse_vma (optarg
, "--start-address");
3127 case OPTION_STOP_ADDRESS
:
3128 stop_address
= parse_vma (optarg
, "--stop-address");
3131 if (strcmp (optarg
, "B") == 0)
3132 endian
= BFD_ENDIAN_BIG
;
3133 else if (strcmp (optarg
, "L") == 0)
3134 endian
= BFD_ENDIAN_LITTLE
;
3137 non_fatal (_("unrecognized -E option"));
3142 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
3143 endian
= BFD_ENDIAN_BIG
;
3144 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
3145 endian
= BFD_ENDIAN_LITTLE
;
3148 non_fatal (_("unrecognized --endian type `%s'"), optarg
);
3154 dump_file_header
= TRUE
;
3158 formats_info
= TRUE
;
3162 add_include_path (optarg
);
3165 dump_private_headers
= TRUE
;
3169 dump_private_headers
= TRUE
;
3171 dump_reloc_info
= TRUE
;
3172 dump_file_header
= TRUE
;
3173 dump_ar_hdrs
= TRUE
;
3174 dump_section_headers
= TRUE
;
3182 dump_dynamic_symtab
= TRUE
;
3190 disassemble_zeroes
= TRUE
;
3194 disassemble_all
= TRUE
;
3199 with_source_code
= TRUE
;
3208 dump_debugging_tags
= 1;
3213 dump_dwarf_section_info
= TRUE
;
3216 do_debug_abbrevs
= 1;
3218 do_debug_pubnames
= 1;
3219 do_debug_aranges
= 1;
3220 do_debug_ranges
= 1;
3221 do_debug_frames
= 1;
3222 do_debug_macinfo
= 1;
3227 dump_stab_section_info
= TRUE
;
3231 dump_section_contents
= TRUE
;
3235 dump_reloc_info
= TRUE
;
3239 dump_dynamic_reloc_info
= TRUE
;
3243 dump_ar_hdrs
= TRUE
;
3247 dump_section_headers
= TRUE
;
3255 show_version
= TRUE
;
3265 print_version ("objdump");
3271 exit_status
= display_info ();
3275 display_file ("a.out", target
);
3277 for (; optind
< argc
;)
3278 display_file (argv
[optind
++], target
);
3281 END_PROGRESS (program_name
);