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
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 2, 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
29 The flow of execution is as follows:
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
38 3. The file's target architecture and binary file format are determined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
42 4. dump_bfd() in turn calls separate functions to display the requested
43 item(s) of information(s). For example disassemble_data() is called if
44 a disassembly has been requested.
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling disassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
57 #include "safe-ctype.h"
59 #include "libiberty.h"
64 /* Internal headers for the ELF .stab-dump code - sorry. */
65 #define BYTES_IN_WORD 32
66 #include "aout/aout64.h"
68 #ifdef NEED_DECLARATION_FPRINTF
69 /* This is needed by init_disassemble_info(). */
70 extern int fprintf (FILE *, const char *, ...);
74 static int exit_status
= 0;
76 static char *default_target
= NULL
; /* Default at runtime. */
78 /* The following variables are set based on arguments passed on the
80 static int show_version
= 0; /* Show the version number. */
81 static int dump_section_contents
; /* -s */
82 static int dump_section_headers
; /* -h */
83 static bfd_boolean dump_file_header
; /* -f */
84 static int dump_symtab
; /* -t */
85 static int dump_dynamic_symtab
; /* -T */
86 static int dump_reloc_info
; /* -r */
87 static int dump_dynamic_reloc_info
; /* -R */
88 static int dump_ar_hdrs
; /* -a */
89 static int dump_private_headers
; /* -p */
90 static int prefix_addresses
; /* --prefix-addresses */
91 static int with_line_numbers
; /* -l */
92 static bfd_boolean with_source_code
; /* -S */
93 static int show_raw_insn
; /* --show-raw-insn */
94 static int dump_stab_section_info
; /* --stabs */
95 static int do_demangle
; /* -C, --demangle */
96 static bfd_boolean disassemble
; /* -d */
97 static bfd_boolean disassemble_all
; /* -D */
98 static int disassemble_zeroes
; /* --disassemble-zeroes */
99 static bfd_boolean formats_info
; /* -i */
100 static int wide_output
; /* -w */
101 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
102 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
103 static int dump_debugging
; /* --debugging */
104 static int dump_debugging_tags
; /* --debugging-tags */
105 static int dump_special_syms
= 0; /* --special-syms */
106 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
107 static int file_start_context
= 0; /* --file-start-context */
109 /* Pointer to an array of section names provided by
110 one or more "-j secname" command line options. */
112 /* The total number of slots in the only[] array. */
113 static size_t only_size
= 0;
114 /* The number of occupied slots in the only[] array. */
115 static size_t only_used
= 0;
117 /* Variables for handling include file path table. */
118 static const char **include_paths
;
119 static int include_path_count
;
121 /* Extra info to pass to the section disassembler and address printing
123 struct objdump_disasm_info
127 bfd_boolean require_sec
;
128 arelent
** dynrelbuf
;
130 disassembler_ftype disassemble_fn
;
131 #ifdef DISASSEMBLER_NEEDS_RELOCS
136 /* Architecture to disassemble for, or default if NULL. */
137 static char *machine
= NULL
;
139 /* Target specific options to the disassembler. */
140 static char *disassembler_options
= NULL
;
142 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
143 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
145 /* The symbol table. */
146 static asymbol
**syms
;
148 /* Number of symbols in `syms'. */
149 static long symcount
= 0;
151 /* The sorted symbol table. */
152 static asymbol
**sorted_syms
;
154 /* Number of symbols in `sorted_syms'. */
155 static long sorted_symcount
= 0;
157 /* The dynamic symbol table. */
158 static asymbol
**dynsyms
;
160 /* The synthetic symbol table. */
161 static asymbol
*synthsyms
;
162 static long synthcount
= 0;
164 /* Number of symbols in `dynsyms'. */
165 static long dynsymcount
= 0;
167 static bfd_byte
*stabs
;
168 static bfd_size_type stab_size
;
171 static bfd_size_type stabstr_size
;
174 usage (FILE *stream
, int status
)
176 fprintf (stream
, _("Usage: %s <option(s)> <file(s)>\n"), program_name
);
177 fprintf (stream
, _(" Display information from object <file(s)>.\n"));
178 fprintf (stream
, _(" At least one of the following switches must be given:\n"));
179 fprintf (stream
, _("\
180 -a, --archive-headers Display archive header information\n\
181 -f, --file-headers Display the contents of the overall file header\n\
182 -p, --private-headers Display object format specific file header contents\n\
183 -h, --[section-]headers Display the contents of the section headers\n\
184 -x, --all-headers Display the contents of all headers\n\
185 -d, --disassemble Display assembler contents of executable sections\n\
186 -D, --disassemble-all Display assembler contents of all sections\n\
187 -S, --source Intermix source code with disassembly\n\
188 -s, --full-contents Display the full contents of all sections requested\n\
189 -g, --debugging Display debug information in object file\n\
190 -e, --debugging-tags Display debug information using ctags style\n\
191 -G, --stabs Display (in raw form) any STABS info in the file\n\
192 -t, --syms Display the contents of the symbol table(s)\n\
193 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
194 -r, --reloc Display the relocation entries in the file\n\
195 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
196 -v, --version Display this program's version number\n\
197 -i, --info List object formats and architectures supported\n\
198 -H, --help Display this information\n\
202 fprintf (stream
, _("\n The following switches are optional:\n"));
203 fprintf (stream
, _("\
204 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
205 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
206 -j, --section=NAME Only display information for section NAME\n\
207 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
208 -EB --endian=big Assume big endian format when disassembling\n\
209 -EL --endian=little Assume little endian format when disassembling\n\
210 --file-start-context Include context from start of file (with -S)\n\
211 -I, --include=DIR Add DIR to search list for source files\n\
212 -l, --line-numbers Include line numbers and filenames in output\n\
213 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
214 The STYLE, if specified, can be `auto', `gnu',\n\
215 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
217 -w, --wide Format output for more than 80 columns\n\
218 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
219 --start-address=ADDR Only process data whose address is >= ADDR\n\
220 --stop-address=ADDR Only process data whose address is <= ADDR\n\
221 --prefix-addresses Print complete address alongside disassembly\n\
222 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
223 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
224 --special-syms Include special symbols in symbol dumps\n\
226 list_supported_targets (program_name
, stream
);
227 list_supported_architectures (program_name
, stream
);
229 disassembler_usage (stream
);
232 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
236 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
240 OPTION_START_ADDRESS
,
245 static struct option long_options
[]=
247 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
248 {"all-headers", no_argument
, NULL
, 'x'},
249 {"private-headers", no_argument
, NULL
, 'p'},
250 {"architecture", required_argument
, NULL
, 'm'},
251 {"archive-headers", no_argument
, NULL
, 'a'},
252 {"debugging", no_argument
, NULL
, 'g'},
253 {"debugging-tags", no_argument
, NULL
, 'e'},
254 {"demangle", optional_argument
, NULL
, 'C'},
255 {"disassemble", no_argument
, NULL
, 'd'},
256 {"disassemble-all", no_argument
, NULL
, 'D'},
257 {"disassembler-options", required_argument
, NULL
, 'M'},
258 {"disassemble-zeroes", no_argument
, NULL
, 'z'},
259 {"dynamic-reloc", no_argument
, NULL
, 'R'},
260 {"dynamic-syms", no_argument
, NULL
, 'T'},
261 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
262 {"file-headers", no_argument
, NULL
, 'f'},
263 {"file-start-context", no_argument
, &file_start_context
, 1},
264 {"full-contents", no_argument
, NULL
, 's'},
265 {"headers", no_argument
, NULL
, 'h'},
266 {"help", no_argument
, NULL
, 'H'},
267 {"info", no_argument
, NULL
, 'i'},
268 {"line-numbers", no_argument
, NULL
, 'l'},
269 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
270 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
271 {"reloc", no_argument
, NULL
, 'r'},
272 {"section", required_argument
, NULL
, 'j'},
273 {"section-headers", no_argument
, NULL
, 'h'},
274 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
275 {"source", no_argument
, NULL
, 'S'},
276 {"special-syms", no_argument
, &dump_special_syms
, 1},
277 {"include", required_argument
, NULL
, 'I'},
278 {"stabs", no_argument
, NULL
, 'G'},
279 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
280 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
281 {"syms", no_argument
, NULL
, 't'},
282 {"target", required_argument
, NULL
, 'b'},
283 {"version", no_argument
, NULL
, 'V'},
284 {"wide", no_argument
, NULL
, 'w'},
285 {0, no_argument
, 0, 0}
289 nonfatal (const char *msg
)
296 dump_section_header (bfd
*abfd
, asection
*section
,
297 void *ignored ATTRIBUTE_UNUSED
)
300 unsigned int opb
= bfd_octets_per_byte (abfd
);
302 printf ("%3d %-13s %08lx ", section
->index
,
303 bfd_get_section_name (abfd
, section
),
304 (unsigned long) bfd_section_size (abfd
, section
) / opb
);
305 bfd_printf_vma (abfd
, bfd_get_section_vma (abfd
, section
));
307 bfd_printf_vma (abfd
, section
->lma
);
308 printf (" %08lx 2**%u", (unsigned long) section
->filepos
,
309 bfd_get_section_alignment (abfd
, section
));
315 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
317 PF (SEC_HAS_CONTENTS
, "CONTENTS");
318 PF (SEC_ALLOC
, "ALLOC");
319 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
320 PF (SEC_LOAD
, "LOAD");
321 PF (SEC_RELOC
, "RELOC");
322 PF (SEC_READONLY
, "READONLY");
323 PF (SEC_CODE
, "CODE");
324 PF (SEC_DATA
, "DATA");
326 PF (SEC_DEBUGGING
, "DEBUGGING");
327 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
328 PF (SEC_EXCLUDE
, "EXCLUDE");
329 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
330 if (bfd_get_arch (abfd
) == bfd_arch_tic54x
)
332 PF (SEC_TIC54X_BLOCK
, "BLOCK");
333 PF (SEC_TIC54X_CLINK
, "CLINK");
335 PF (SEC_SMALL_DATA
, "SMALL_DATA");
336 if (bfd_get_flavour (abfd
) == bfd_target_coff_flavour
)
337 PF (SEC_COFF_SHARED
, "SHARED");
338 PF (SEC_THREAD_LOCAL
, "THREAD_LOCAL");
340 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
343 struct coff_comdat_info
*comdat
;
345 switch (section
->flags
& SEC_LINK_DUPLICATES
)
349 case SEC_LINK_DUPLICATES_DISCARD
:
350 ls
= "LINK_ONCE_DISCARD";
352 case SEC_LINK_DUPLICATES_ONE_ONLY
:
353 ls
= "LINK_ONCE_ONE_ONLY";
355 case SEC_LINK_DUPLICATES_SAME_SIZE
:
356 ls
= "LINK_ONCE_SAME_SIZE";
358 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
359 ls
= "LINK_ONCE_SAME_CONTENTS";
362 printf ("%s%s", comma
, ls
);
364 comdat
= bfd_coff_get_comdat_section (abfd
, section
);
366 printf (" (COMDAT %s %ld)", comdat
->name
, comdat
->symbol
);
376 dump_headers (bfd
*abfd
)
378 printf (_("Sections:\n"));
381 printf (_("Idx Name Size VMA LMA File off Algn"));
383 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
384 if (bfd_get_arch_size (abfd
) == 32)
385 printf (_("Idx Name Size VMA LMA File off Algn"));
387 printf (_("Idx Name Size VMA LMA File off Algn"));
391 printf (_(" Flags"));
392 if (abfd
->flags
& HAS_LOAD_PAGE
)
396 bfd_map_over_sections (abfd
, dump_section_header
, NULL
);
400 slurp_symtab (bfd
*abfd
)
405 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
411 storage
= bfd_get_symtab_upper_bound (abfd
);
413 bfd_fatal (bfd_get_filename (abfd
));
415 sy
= xmalloc (storage
);
417 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
419 bfd_fatal (bfd_get_filename (abfd
));
423 /* Read in the dynamic symbols. */
426 slurp_dynamic_symtab (bfd
*abfd
)
431 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
434 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
436 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd
));
441 bfd_fatal (bfd_get_filename (abfd
));
444 sy
= xmalloc (storage
);
446 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
448 bfd_fatal (bfd_get_filename (abfd
));
452 /* Filter out (in place) symbols that are useless for disassembly.
453 COUNT is the number of elements in SYMBOLS.
454 Return the number of useful symbols. */
457 remove_useless_symbols (asymbol
**symbols
, long count
)
459 asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
463 asymbol
*sym
= *in_ptr
++;
465 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
467 if (sym
->flags
& (BSF_DEBUGGING
| BSF_SECTION_SYM
))
469 if (bfd_is_und_section (sym
->section
)
470 || bfd_is_com_section (sym
->section
))
475 return out_ptr
- symbols
;
478 /* Sort symbols into value order. */
481 compare_symbols (const void *ap
, const void *bp
)
483 const asymbol
*a
= * (const asymbol
**) ap
;
484 const asymbol
*b
= * (const asymbol
**) bp
;
494 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
496 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
499 if (a
->section
> b
->section
)
501 else if (a
->section
< b
->section
)
504 an
= bfd_asymbol_name (a
);
505 bn
= bfd_asymbol_name (b
);
509 /* The symbols gnu_compiled and gcc2_compiled convey no real
510 information, so put them after other symbols with the same value. */
511 af
= (strstr (an
, "gnu_compiled") != NULL
512 || strstr (an
, "gcc2_compiled") != NULL
);
513 bf
= (strstr (bn
, "gnu_compiled") != NULL
514 || strstr (bn
, "gcc2_compiled") != NULL
);
521 /* We use a heuristic for the file name, to try to sort it after
522 more useful symbols. It may not work on non Unix systems, but it
523 doesn't really matter; the only difference is precisely which
524 symbol names get printed. */
526 #define file_symbol(s, sn, snl) \
527 (((s)->flags & BSF_FILE) != 0 \
528 || ((sn)[(snl) - 2] == '.' \
529 && ((sn)[(snl) - 1] == 'o' \
530 || (sn)[(snl) - 1] == 'a')))
532 af
= file_symbol (a
, an
, anl
);
533 bf
= file_symbol (b
, bn
, bnl
);
540 /* Try to sort global symbols before local symbols before function
541 symbols before debugging symbols. */
546 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
548 if ((aflags
& BSF_DEBUGGING
) != 0)
553 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
555 if ((aflags
& BSF_FUNCTION
) != 0)
560 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
562 if ((aflags
& BSF_LOCAL
) != 0)
567 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
569 if ((aflags
& BSF_GLOBAL
) != 0)
575 /* Symbols that start with '.' might be section names, so sort them
576 after symbols that don't start with '.'. */
577 if (an
[0] == '.' && bn
[0] != '.')
579 if (an
[0] != '.' && bn
[0] == '.')
582 /* Finally, if we can't distinguish them in any other way, try to
583 get consistent results by sorting the symbols by name. */
584 return strcmp (an
, bn
);
587 /* Sort relocs into address order. */
590 compare_relocs (const void *ap
, const void *bp
)
592 const arelent
*a
= * (const arelent
**) ap
;
593 const arelent
*b
= * (const arelent
**) bp
;
595 if (a
->address
> b
->address
)
597 else if (a
->address
< b
->address
)
600 /* So that associated relocations tied to the same address show up
601 in the correct order, we don't do any further sorting. */
610 /* Print an address (VMA) to the output stream in INFO.
611 If SKIP_ZEROES is TRUE, omit leading zeroes. */
614 objdump_print_value (bfd_vma vma
, struct disassemble_info
*info
,
615 bfd_boolean skip_zeroes
)
619 struct objdump_disasm_info
*aux
;
621 aux
= (struct objdump_disasm_info
*) info
->application_data
;
622 bfd_sprintf_vma (aux
->abfd
, buf
, vma
);
627 for (p
= buf
; *p
== '0'; ++p
)
632 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
635 /* Print the name of a symbol. */
638 objdump_print_symname (bfd
*abfd
, struct disassemble_info
*info
,
645 name
= bfd_asymbol_name (sym
);
646 if (do_demangle
&& name
[0] != '\0')
648 /* Demangle the name. */
649 alloc
= demangle (abfd
, name
);
654 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
662 /* Locate a symbol given a bfd and a section (from INFO->application_data),
663 and a VMA. If INFO->application_data->require_sec is TRUE, then always
664 require the symbol to be in the section. Returns NULL if there is no
665 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
666 of the symbol in sorted_syms. */
669 find_symbol_for_address (bfd_vma vma
,
670 struct disassemble_info
*info
,
673 /* @@ Would it speed things up to cache the last two symbols returned,
674 and maybe their address ranges? For many processors, only one memory
675 operand can be present at a time, so the 2-entry cache wouldn't be
676 constantly churned by code doing heavy memory accesses. */
678 /* Indices in `sorted_syms'. */
680 long max
= sorted_symcount
;
682 struct objdump_disasm_info
*aux
;
687 if (sorted_symcount
< 1)
690 aux
= (struct objdump_disasm_info
*) info
->application_data
;
693 opb
= bfd_octets_per_byte (abfd
);
695 /* Perform a binary search looking for the closest symbol to the
696 required value. We are searching the range (min, max]. */
697 while (min
+ 1 < max
)
701 thisplace
= (max
+ min
) / 2;
702 sym
= sorted_syms
[thisplace
];
704 if (bfd_asymbol_value (sym
) > vma
)
706 else if (bfd_asymbol_value (sym
) < vma
)
715 /* The symbol we want is now in min, the low end of the range we
716 were searching. If there are several symbols with the same
717 value, we want the first one. */
720 && (bfd_asymbol_value (sorted_syms
[thisplace
])
721 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
724 /* If the file is relocatable, and the symbol could be from this
725 section, prefer a symbol from this section over symbols from
726 others, even if the other symbol's value might be closer.
728 Note that this may be wrong for some symbol references if the
729 sections have overlapping memory ranges, but in that case there's
730 no way to tell what's desired without looking at the relocation
732 if (sorted_syms
[thisplace
]->section
!= sec
734 || ((abfd
->flags
& HAS_RELOC
) != 0
735 && vma
>= bfd_get_section_vma (abfd
, sec
)
736 && vma
< (bfd_get_section_vma (abfd
, sec
)
737 + bfd_section_size (abfd
, sec
) / opb
))))
741 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
743 if (bfd_asymbol_value (sorted_syms
[i
])
744 != bfd_asymbol_value (sorted_syms
[thisplace
]))
752 if (sorted_syms
[i
]->section
== sec
754 || sorted_syms
[i
- 1]->section
!= sec
755 || (bfd_asymbol_value (sorted_syms
[i
])
756 != bfd_asymbol_value (sorted_syms
[i
- 1]))))
763 if (sorted_syms
[thisplace
]->section
!= sec
)
765 /* We didn't find a good symbol with a smaller value.
766 Look for one with a larger value. */
767 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
769 if (sorted_syms
[i
]->section
== sec
)
777 if (sorted_syms
[thisplace
]->section
!= sec
779 || ((abfd
->flags
& HAS_RELOC
) != 0
780 && vma
>= bfd_get_section_vma (abfd
, sec
)
781 && vma
< (bfd_get_section_vma (abfd
, sec
)
782 + bfd_section_size (abfd
, sec
)))))
783 /* There is no suitable symbol. */
787 /* Give the target a chance to reject the symbol. */
788 while (! info
->symbol_is_valid (sorted_syms
[thisplace
], info
))
791 if (thisplace
>= sorted_symcount
792 || bfd_asymbol_value (sorted_syms
[thisplace
]) > vma
)
799 return sorted_syms
[thisplace
];
802 /* Print an address and the offset to the nearest symbol. */
805 objdump_print_addr_with_sym (bfd
*abfd
, asection
*sec
, asymbol
*sym
,
806 bfd_vma vma
, struct disassemble_info
*info
,
807 bfd_boolean skip_zeroes
)
809 objdump_print_value (vma
, info
, skip_zeroes
);
815 (*info
->fprintf_func
) (info
->stream
, " <%s",
816 bfd_get_section_name (abfd
, sec
));
817 secaddr
= bfd_get_section_vma (abfd
, sec
);
820 (*info
->fprintf_func
) (info
->stream
, "-0x");
821 objdump_print_value (secaddr
- vma
, info
, TRUE
);
823 else if (vma
> secaddr
)
825 (*info
->fprintf_func
) (info
->stream
, "+0x");
826 objdump_print_value (vma
- secaddr
, info
, TRUE
);
828 (*info
->fprintf_func
) (info
->stream
, ">");
832 (*info
->fprintf_func
) (info
->stream
, " <");
833 objdump_print_symname (abfd
, info
, sym
);
834 if (bfd_asymbol_value (sym
) > vma
)
836 (*info
->fprintf_func
) (info
->stream
, "-0x");
837 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, TRUE
);
839 else if (vma
> bfd_asymbol_value (sym
))
841 (*info
->fprintf_func
) (info
->stream
, "+0x");
842 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, TRUE
);
844 (*info
->fprintf_func
) (info
->stream
, ">");
848 /* Print an address (VMA), symbolically if possible.
849 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
852 objdump_print_addr (bfd_vma vma
,
853 struct disassemble_info
*info
,
854 bfd_boolean skip_zeroes
)
856 struct objdump_disasm_info
*aux
;
857 asymbol
*sym
= NULL
; /* Initialize to avoid compiler warning. */
858 #ifdef DISASSEMBLER_NEEDS_RELOCS
859 bfd_boolean skip_find
= FALSE
;
862 if (sorted_symcount
< 1)
864 (*info
->fprintf_func
) (info
->stream
, "0x");
865 objdump_print_value (vma
, info
, skip_zeroes
);
869 aux
= (struct objdump_disasm_info
*) info
->application_data
;
871 #ifdef DISASSEMBLER_NEEDS_RELOCS
872 if (aux
->reloc
!= NULL
873 && aux
->reloc
->sym_ptr_ptr
!= NULL
874 && * aux
->reloc
->sym_ptr_ptr
!= NULL
)
876 sym
= * aux
->reloc
->sym_ptr_ptr
;
878 /* Adjust the vma to the reloc. */
879 vma
+= bfd_asymbol_value (sym
);
881 if (bfd_is_und_section (bfd_get_section (sym
)))
887 sym
= find_symbol_for_address (vma
, info
, NULL
);
889 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
893 /* Print VMA to INFO. This function is passed to the disassembler
897 objdump_print_address (bfd_vma vma
, struct disassemble_info
*info
)
899 objdump_print_addr (vma
, info
, ! prefix_addresses
);
902 /* Determine of the given address has a symbol associated with it. */
905 objdump_symbol_at_address (bfd_vma vma
, struct disassemble_info
* info
)
909 sym
= find_symbol_for_address (vma
, info
, NULL
);
911 return (sym
!= NULL
&& (bfd_asymbol_value (sym
) == vma
));
914 /* Hold the last function name and the last line number we displayed
917 static char *prev_functionname
;
918 static unsigned int prev_line
;
920 /* We keep a list of all files that we have seen when doing a
921 disassembly with source, so that we know how much of the file to
922 display. This can be important for inlined functions. */
924 struct print_file_list
926 struct print_file_list
*next
;
927 const char *filename
;
933 static struct print_file_list
*print_files
;
935 /* The number of preceding context lines to show when we start
936 displaying a file for the first time. */
938 #define SHOW_PRECEDING_CONTEXT_LINES (5)
940 /* Tries to open MODNAME, and if successful adds a node to print_files
941 linked list and returns that node. Returns NULL on failure. */
943 static struct print_file_list
*
944 try_print_file_open (const char *origname
, const char *modname
)
946 struct print_file_list
*p
;
949 f
= fopen (modname
, "r");
953 if (print_files
!= NULL
&& print_files
->f
!= NULL
)
955 fclose (print_files
->f
);
956 print_files
->f
= NULL
;
959 p
= xmalloc (sizeof (struct print_file_list
));
960 p
->filename
= origname
;
961 p
->modname
= modname
;
964 p
->next
= print_files
;
969 /* If the the source file, as described in the symtab, is not found
970 try to locate it in one of the paths specified with -I
971 If found, add location to print_files linked list. */
973 static struct print_file_list
*
974 update_source_path (const char *filename
)
976 struct print_file_list
*p
;
980 if (filename
== NULL
)
983 p
= try_print_file_open (filename
, filename
);
987 if (include_path_count
== 0)
990 /* Get the name of the file. */
991 fname
= strrchr (filename
, '/');
992 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
994 /* We could have a mixed forward/back slash case. */
995 char *backslash
= strrchr (filename
, '\\');
996 if (fname
== NULL
|| (backslash
!= NULL
&& backslash
> fname
))
998 if (fname
== NULL
&& filename
[0] != '\0' && filename
[1] == ':')
999 fname
= filename
+ 1;
1007 /* If file exists under a new path, we need to add it to the list
1008 so that show_line knows about it. */
1009 for (i
= 0; i
< include_path_count
; i
++)
1011 char *modname
= concat (include_paths
[i
], "/", fname
, (const char *) 0);
1013 p
= try_print_file_open (filename
, modname
);
1023 /* Skip ahead to a given line in a file, optionally printing each
1027 skip_to_line (struct print_file_list
*p
, unsigned int line
,
1030 while (p
->line
< line
)
1034 if (fgets (buf
, sizeof buf
, p
->f
) == NULL
)
1044 if (strchr (buf
, '\n') != NULL
)
1049 /* Show the line number, or the source line, in a disassembly
1053 show_line (bfd
*abfd
, asection
*section
, bfd_vma addr_offset
)
1055 const char *filename
;
1056 const char *functionname
;
1059 if (! with_line_numbers
&& ! with_source_code
)
1062 if (! bfd_find_nearest_line (abfd
, section
, syms
, addr_offset
, &filename
,
1063 &functionname
, &line
))
1066 if (filename
!= NULL
&& *filename
== '\0')
1068 if (functionname
!= NULL
&& *functionname
== '\0')
1069 functionname
= NULL
;
1071 if (with_line_numbers
)
1073 if (functionname
!= NULL
1074 && (prev_functionname
== NULL
1075 || strcmp (functionname
, prev_functionname
) != 0))
1076 printf ("%s():\n", functionname
);
1077 if (line
> 0 && line
!= prev_line
)
1078 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
1081 if (with_source_code
1085 struct print_file_list
**pp
, *p
;
1087 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1088 if (strcmp ((*pp
)->filename
, filename
) == 0)
1094 if (p
!= print_files
)
1098 /* We have reencountered a file name which we saw
1099 earlier. This implies that either we are dumping out
1100 code from an included file, or the same file was
1101 linked in more than once. There are two common cases
1102 of an included file: inline functions in a header
1103 file, and a bison or flex skeleton file. In the
1104 former case we want to just start printing (but we
1105 back up a few lines to give context); in the latter
1106 case we want to continue from where we left off. I
1107 can't think of a good way to distinguish the cases,
1108 so I used a heuristic based on the file name. */
1109 if (strcmp (p
->filename
+ strlen (p
->filename
) - 2, ".h") != 0)
1113 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1120 p
->f
= fopen (p
->modname
, "r");
1124 skip_to_line (p
, l
, FALSE
);
1126 if (print_files
->f
!= NULL
)
1128 fclose (print_files
->f
);
1129 print_files
->f
= NULL
;
1135 skip_to_line (p
, line
, TRUE
);
1137 p
->next
= print_files
;
1143 p
= update_source_path (filename
);
1149 if (file_start_context
)
1152 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1155 skip_to_line (p
, l
, FALSE
);
1157 skip_to_line (p
, line
, TRUE
);
1162 if (functionname
!= NULL
1163 && (prev_functionname
== NULL
1164 || strcmp (functionname
, prev_functionname
) != 0))
1166 if (prev_functionname
!= NULL
)
1167 free (prev_functionname
);
1168 prev_functionname
= xmalloc (strlen (functionname
) + 1);
1169 strcpy (prev_functionname
, functionname
);
1172 if (line
> 0 && line
!= prev_line
)
1176 /* Pseudo FILE object for strings. */
1184 /* sprintf to a "stream". */
1187 objdump_sprintf (SFILE
*f
, const char *format
, ...)
1194 size_t space
= f
->alloc
- f
->pos
;
1196 va_start (args
, format
);
1197 n
= vsnprintf (f
->buffer
+ f
->pos
, space
, format
, args
);
1203 f
->alloc
= (f
->alloc
+ n
) * 2;
1204 f
->buffer
= xrealloc (f
->buffer
, f
->alloc
);
1211 /* Returns TRUE if the specified section should be dumped. */
1214 process_section_p (asection
* section
)
1221 for (i
= 0; i
< only_used
; i
++)
1222 if (strcmp (only
[i
], section
->name
) == 0)
1229 /* The number of zeroes we want to see before we start skipping them.
1230 The number is arbitrarily chosen. */
1232 #define DEFAULT_SKIP_ZEROES 8
1234 /* The number of zeroes to skip at the end of a section. If the
1235 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1236 SKIP_ZEROES, they will be disassembled. If there are fewer than
1237 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1238 attempt to avoid disassembling zeroes inserted by section
1241 #define DEFAULT_SKIP_ZEROES_AT_END 3
1243 /* Disassemble some data in memory between given values. */
1246 disassemble_bytes (struct disassemble_info
* info
,
1247 disassembler_ftype disassemble_fn
,
1250 bfd_vma start_offset
,
1251 bfd_vma stop_offset
,
1254 arelent
** relppend
)
1256 struct objdump_disasm_info
*aux
;
1258 int octets_per_line
;
1259 bfd_boolean done_dot
;
1260 int skip_addr_chars
;
1261 bfd_vma addr_offset
;
1262 unsigned int opb
= info
->octets_per_byte
;
1263 unsigned int skip_zeroes
= info
->skip_zeroes
;
1264 unsigned int skip_zeroes_at_end
= info
->skip_zeroes_at_end
;
1268 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1272 sfile
.buffer
= xmalloc (sfile
.alloc
);
1276 octets_per_line
= 4;
1278 octets_per_line
= 16;
1280 /* Figure out how many characters to skip at the start of an
1281 address, to make the disassembly look nicer. We discard leading
1282 zeroes in chunks of 4, ensuring that there is always a leading
1284 skip_addr_chars
= 0;
1285 if (! prefix_addresses
)
1293 + bfd_section_size (section
->owner
, section
) / opb
));
1295 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1298 skip_addr_chars
+= 4;
1303 info
->insn_info_valid
= 0;
1306 addr_offset
= start_offset
;
1307 while (addr_offset
< stop_offset
)
1310 bfd_boolean need_nl
= FALSE
;
1311 #ifdef DISASSEMBLER_NEEDS_RELOCS
1312 int previous_octets
;
1314 /* Remember the length of the previous instruction. */
1315 previous_octets
= octets
;
1319 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1321 for (z
= addr_offset
* opb
; z
< stop_offset
* opb
; z
++)
1324 if (! disassemble_zeroes
1325 && (info
->insn_info_valid
== 0
1326 || info
->branch_delay_insns
== 0)
1327 && (z
- addr_offset
* opb
>= skip_zeroes
1328 || (z
== stop_offset
* opb
&&
1329 z
- addr_offset
* opb
< skip_zeroes_at_end
)))
1333 /* If there are more nonzero octets to follow, we only skip
1334 zeroes in multiples of 4, to try to avoid running over
1335 the start of an instruction which happens to start with
1337 if (z
!= stop_offset
* opb
)
1338 z
= addr_offset
* opb
+ ((z
- addr_offset
* opb
) &~ 3);
1340 octets
= z
- addr_offset
* opb
;
1350 if (with_line_numbers
|| with_source_code
)
1351 /* The line number tables will refer to unadjusted
1352 section VMAs, so we must undo any VMA modifications
1353 when calling show_line. */
1354 show_line (aux
->abfd
, section
, addr_offset
- adjust_section_vma
);
1356 if (! prefix_addresses
)
1360 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ addr_offset
);
1361 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1365 printf ("%s:\t", buf
+ skip_addr_chars
);
1369 aux
->require_sec
= TRUE
;
1370 objdump_print_address (section
->vma
+ addr_offset
, info
);
1371 aux
->require_sec
= FALSE
;
1378 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1379 info
->stream
= &sfile
;
1380 info
->bytes_per_line
= 0;
1381 info
->bytes_per_chunk
= 0;
1384 #ifdef DISASSEMBLER_NEEDS_RELOCS
1385 if (*relppp
< relppend
)
1387 bfd_signed_vma distance_to_rel
;
1389 distance_to_rel
= (**relppp
)->address
1390 - (rel_offset
+ addr_offset
);
1392 /* Check to see if the current reloc is associated with
1393 the instruction that we are about to disassemble. */
1394 if (distance_to_rel
== 0
1395 /* FIXME: This is wrong. We are trying to catch
1396 relocs that are addressed part way through the
1397 current instruction, as might happen with a packed
1398 VLIW instruction. Unfortunately we do not know the
1399 length of the current instruction since we have not
1400 disassembled it yet. Instead we take a guess based
1401 upon the length of the previous instruction. The
1402 proper solution is to have a new target-specific
1403 disassembler function which just returns the length
1404 of an instruction at a given address without trying
1405 to display its disassembly. */
1406 || (distance_to_rel
> 0
1407 && distance_to_rel
< (bfd_signed_vma
) (previous_octets
/ opb
)))
1409 info
->flags
= INSN_HAS_RELOC
;
1410 aux
->reloc
= **relppp
;
1416 octets
= (*disassemble_fn
) (section
->vma
+ addr_offset
, info
);
1417 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1418 info
->stream
= stdout
;
1419 if (info
->bytes_per_line
!= 0)
1420 octets_per_line
= info
->bytes_per_line
;
1424 printf ("%s\n", sfile
.buffer
);
1432 octets
= octets_per_line
;
1433 if (addr_offset
+ octets
/ opb
> stop_offset
)
1434 octets
= (stop_offset
- addr_offset
) * opb
;
1436 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ octets
; ++j
)
1438 if (ISPRINT (data
[j
]))
1439 buf
[j
- addr_offset
* opb
] = data
[j
];
1441 buf
[j
- addr_offset
* opb
] = '.';
1443 buf
[j
- addr_offset
* opb
] = '\0';
1446 if (prefix_addresses
1448 : show_raw_insn
>= 0)
1452 /* If ! prefix_addresses and ! wide_output, we print
1453 octets_per_line octets per line. */
1455 if (pb
> octets_per_line
&& ! prefix_addresses
&& ! wide_output
)
1456 pb
= octets_per_line
;
1458 if (info
->bytes_per_chunk
)
1459 bpc
= info
->bytes_per_chunk
;
1463 for (j
= addr_offset
* opb
; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1467 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1469 for (k
= bpc
- 1; k
>= 0; k
--)
1470 printf ("%02x", (unsigned) data
[j
+ k
]);
1475 for (k
= 0; k
< bpc
; k
++)
1476 printf ("%02x", (unsigned) data
[j
+ k
]);
1481 for (; pb
< octets_per_line
; pb
+= bpc
)
1485 for (k
= 0; k
< bpc
; k
++)
1490 /* Separate raw data from instruction by extra space. */
1500 printf ("%s", sfile
.buffer
);
1502 if (prefix_addresses
1504 : show_raw_insn
>= 0)
1512 j
= addr_offset
* opb
+ pb
;
1514 bfd_sprintf_vma (aux
->abfd
, buf
, section
->vma
+ j
/ opb
);
1515 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1519 printf ("%s:\t", buf
+ skip_addr_chars
);
1521 pb
+= octets_per_line
;
1524 for (; j
< addr_offset
* opb
+ pb
; j
+= bpc
)
1528 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1530 for (k
= bpc
- 1; k
>= 0; k
--)
1531 printf ("%02x", (unsigned) data
[j
+ k
]);
1536 for (k
= 0; k
< bpc
; k
++)
1537 printf ("%02x", (unsigned) data
[j
+ k
]);
1550 while ((*relppp
) < relppend
1551 && (**relppp
)->address
< rel_offset
+ addr_offset
+ octets
/ opb
)
1553 if (dump_reloc_info
|| dump_dynamic_reloc_info
)
1564 objdump_print_value (section
->vma
- rel_offset
+ q
->address
,
1567 printf (": %s\t", q
->howto
->name
);
1569 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
1570 printf ("*unknown*");
1573 const char *sym_name
;
1575 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1576 if (sym_name
!= NULL
&& *sym_name
!= '\0')
1577 objdump_print_symname (aux
->abfd
, info
, *q
->sym_ptr_ptr
);
1582 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1583 sym_name
= bfd_get_section_name (aux
->abfd
, sym_sec
);
1584 if (sym_name
== NULL
|| *sym_name
== '\0')
1585 sym_name
= "*unknown*";
1586 printf ("%s", sym_name
);
1593 objdump_print_value (q
->addend
, info
, TRUE
);
1605 addr_offset
+= octets
/ opb
;
1608 free (sfile
.buffer
);
1612 disassemble_section (bfd
*abfd
, asection
*section
, void *info
)
1614 struct disassemble_info
* pinfo
= (struct disassemble_info
*) info
;
1615 struct objdump_disasm_info
* paux
;
1616 unsigned int opb
= pinfo
->octets_per_byte
;
1617 bfd_byte
* data
= NULL
;
1618 bfd_size_type datasize
= 0;
1619 arelent
** rel_pp
= NULL
;
1620 arelent
** rel_ppstart
= NULL
;
1621 arelent
** rel_ppend
;
1622 unsigned long stop_offset
;
1623 asymbol
* sym
= NULL
;
1627 unsigned long addr_offset
;
1629 /* Sections that do not contain machine
1630 code are not normally disassembled. */
1631 if (! disassemble_all
1633 && ((section
->flags
& (SEC_CODE
| SEC_HAS_CONTENTS
))
1634 != (SEC_CODE
| SEC_HAS_CONTENTS
)))
1637 if (! process_section_p (section
))
1640 datasize
= bfd_get_section_size (section
);
1644 /* Decide which set of relocs to use. Load them if necessary. */
1645 paux
= (struct objdump_disasm_info
*) pinfo
->application_data
;
1646 if (paux
->dynrelbuf
)
1648 rel_pp
= paux
->dynrelbuf
;
1649 rel_count
= paux
->dynrelcount
;
1650 /* Dynamic reloc addresses are absolute, non-dynamic are section
1651 relative. REL_OFFSET specifies the reloc address corresponding
1652 to the start of this section. */
1653 rel_offset
= section
->vma
;
1661 if ((section
->flags
& SEC_RELOC
) != 0
1662 #ifndef DISASSEMBLER_NEEDS_RELOCS
1669 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1671 bfd_fatal (bfd_get_filename (abfd
));
1675 rel_ppstart
= rel_pp
= xmalloc (relsize
);
1676 rel_count
= bfd_canonicalize_reloc (abfd
, section
, rel_pp
, syms
);
1678 bfd_fatal (bfd_get_filename (abfd
));
1680 /* Sort the relocs by address. */
1681 qsort (rel_pp
, rel_count
, sizeof (arelent
*), compare_relocs
);
1686 rel_ppend
= rel_pp
+ rel_count
;
1688 data
= xmalloc (datasize
);
1690 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1692 paux
->sec
= section
;
1693 pinfo
->buffer
= data
;
1694 pinfo
->buffer_vma
= section
->vma
;
1695 pinfo
->buffer_length
= datasize
;
1696 pinfo
->section
= section
;
1698 if (start_address
== (bfd_vma
) -1
1699 || start_address
< pinfo
->buffer_vma
)
1702 addr_offset
= start_address
- pinfo
->buffer_vma
;
1704 if (stop_address
== (bfd_vma
) -1)
1705 stop_offset
= datasize
/ opb
;
1708 if (stop_address
< pinfo
->buffer_vma
)
1711 stop_offset
= stop_address
- pinfo
->buffer_vma
;
1712 if (stop_offset
> pinfo
->buffer_length
/ opb
)
1713 stop_offset
= pinfo
->buffer_length
/ opb
;
1716 /* Skip over the relocs belonging to addresses below the
1718 while (rel_pp
< rel_ppend
1719 && (*rel_pp
)->address
< rel_offset
+ addr_offset
)
1722 printf (_("Disassembly of section %s:\n"), section
->name
);
1724 /* Find the nearest symbol forwards from our current position. */
1725 paux
->require_sec
= TRUE
;
1726 sym
= find_symbol_for_address (section
->vma
+ addr_offset
, info
, &place
);
1727 paux
->require_sec
= FALSE
;
1729 /* Disassemble a block of instructions up to the address associated with
1730 the symbol we have just found. Then print the symbol and find the
1731 next symbol on. Repeat until we have disassembled the entire section
1732 or we have reached the end of the address range we are interested in. */
1733 while (addr_offset
< stop_offset
)
1737 unsigned long nextstop_offset
;
1740 addr
= section
->vma
+ addr_offset
;
1742 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= addr
)
1747 (x
< sorted_symcount
1748 && (bfd_asymbol_value (sorted_syms
[x
]) <= addr
));
1752 pinfo
->symbols
= sorted_syms
+ place
;
1753 pinfo
->num_symbols
= x
- place
;
1757 pinfo
->symbols
= NULL
;
1758 pinfo
->num_symbols
= 0;
1761 if (! prefix_addresses
)
1763 pinfo
->fprintf_func (pinfo
->stream
, "\n");
1764 objdump_print_addr_with_sym (abfd
, section
, sym
, addr
,
1766 pinfo
->fprintf_func (pinfo
->stream
, ":\n");
1769 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
1771 else if (sym
== NULL
)
1775 #define is_valid_next_sym(SYM) \
1776 ((SYM)->section == section \
1777 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1778 && pinfo->symbol_is_valid (SYM, pinfo))
1780 /* Search forward for the next appropriate symbol in
1781 SECTION. Note that all the symbols are sorted
1782 together into one big array, and that some sections
1783 may have overlapping addresses. */
1784 while (place
< sorted_symcount
1785 && ! is_valid_next_sym (sorted_syms
[place
]))
1788 if (place
>= sorted_symcount
)
1791 nextsym
= sorted_syms
[place
];
1794 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > addr
)
1795 nextstop_offset
= bfd_asymbol_value (sym
) - section
->vma
;
1796 else if (nextsym
== NULL
)
1797 nextstop_offset
= stop_offset
;
1799 nextstop_offset
= bfd_asymbol_value (nextsym
) - section
->vma
;
1801 if (nextstop_offset
> stop_offset
)
1802 nextstop_offset
= stop_offset
;
1804 /* If a symbol is explicitly marked as being an object
1805 rather than a function, just dump the bytes without
1806 disassembling them. */
1809 || bfd_asymbol_value (sym
) > addr
1810 || ((sym
->flags
& BSF_OBJECT
) == 0
1811 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1813 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1815 || (sym
->flags
& BSF_FUNCTION
) != 0)
1820 disassemble_bytes (pinfo
, paux
->disassemble_fn
, insns
, data
,
1821 addr_offset
, nextstop_offset
,
1822 rel_offset
, &rel_pp
, rel_ppend
);
1824 addr_offset
= nextstop_offset
;
1830 if (rel_ppstart
!= NULL
)
1834 /* Disassemble the contents of an object file. */
1837 disassemble_data (bfd
*abfd
)
1839 struct disassemble_info disasm_info
;
1840 struct objdump_disasm_info aux
;
1844 prev_functionname
= NULL
;
1847 /* We make a copy of syms to sort. We don't want to sort syms
1848 because that will screw up the relocs. */
1849 sorted_symcount
= symcount
? symcount
: dynsymcount
;
1850 sorted_syms
= xmalloc ((sorted_symcount
+ synthcount
) * sizeof (asymbol
*));
1851 memcpy (sorted_syms
, symcount
? syms
: dynsyms
,
1852 sorted_symcount
* sizeof (asymbol
*));
1854 sorted_symcount
= remove_useless_symbols (sorted_syms
, sorted_symcount
);
1856 for (i
= 0; i
< synthcount
; ++i
)
1858 sorted_syms
[sorted_symcount
] = synthsyms
+ i
;
1862 /* Sort the symbols into section and symbol order. */
1863 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1865 init_disassemble_info (&disasm_info
, stdout
, (fprintf_ftype
) fprintf
);
1867 disasm_info
.application_data
= (void *) &aux
;
1869 aux
.require_sec
= FALSE
;
1870 aux
.dynrelbuf
= NULL
;
1871 aux
.dynrelcount
= 0;
1872 #ifdef DISASSEMBLER_NEEDS_RELOCS
1876 disasm_info
.print_address_func
= objdump_print_address
;
1877 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
1879 if (machine
!= NULL
)
1881 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1884 fatal (_("Can't use supplied machine %s"), machine
);
1886 abfd
->arch_info
= info
;
1889 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1891 struct bfd_target
*xvec
;
1893 xvec
= xmalloc (sizeof (struct bfd_target
));
1894 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1895 xvec
->byteorder
= endian
;
1899 /* Use libopcodes to locate a suitable disassembler. */
1900 aux
.disassemble_fn
= disassembler (abfd
);
1901 if (!aux
.disassemble_fn
)
1903 non_fatal (_("Can't disassemble for architecture %s\n"),
1904 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1909 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1910 disasm_info
.arch
= bfd_get_arch (abfd
);
1911 disasm_info
.mach
= bfd_get_mach (abfd
);
1912 disasm_info
.disassembler_options
= disassembler_options
;
1913 disasm_info
.octets_per_byte
= bfd_octets_per_byte (abfd
);
1914 disasm_info
.skip_zeroes
= DEFAULT_SKIP_ZEROES
;
1915 disasm_info
.skip_zeroes_at_end
= DEFAULT_SKIP_ZEROES_AT_END
;
1917 if (bfd_big_endian (abfd
))
1918 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
1919 else if (bfd_little_endian (abfd
))
1920 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1922 /* ??? Aborting here seems too drastic. We could default to big or little
1924 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1926 /* Allow the target to customize the info structure. */
1927 disassemble_init_for_target (& disasm_info
);
1929 /* Pre-load the dynamic relocs if we are going
1930 to be dumping them along with the disassembly. */
1931 if (dump_dynamic_reloc_info
)
1933 long relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
1936 bfd_fatal (bfd_get_filename (abfd
));
1940 aux
.dynrelbuf
= xmalloc (relsize
);
1941 aux
.dynrelcount
= bfd_canonicalize_dynamic_reloc (abfd
,
1944 if (aux
.dynrelcount
< 0)
1945 bfd_fatal (bfd_get_filename (abfd
));
1947 /* Sort the relocs by address. */
1948 qsort (aux
.dynrelbuf
, aux
.dynrelcount
, sizeof (arelent
*),
1953 bfd_map_over_sections (abfd
, disassemble_section
, & disasm_info
);
1955 if (aux
.dynrelbuf
!= NULL
)
1956 free (aux
.dynrelbuf
);
1960 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
1961 it. Return NULL on failure. */
1964 read_section_stabs (bfd
*abfd
, const char *sect_name
, bfd_size_type
*size_ptr
)
1970 stabsect
= bfd_get_section_by_name (abfd
, sect_name
);
1971 if (stabsect
== NULL
)
1973 printf (_("No %s section present\n\n"), sect_name
);
1977 size
= bfd_section_size (abfd
, stabsect
);
1978 contents
= xmalloc (size
);
1980 if (! bfd_get_section_contents (abfd
, stabsect
, contents
, 0, size
))
1982 non_fatal (_("Reading %s section of %s failed: %s"),
1983 sect_name
, bfd_get_filename (abfd
),
1984 bfd_errmsg (bfd_get_error ()));
1995 /* Stabs entries use a 12 byte format:
1996 4 byte string table index
1998 1 byte stab other field
1999 2 byte stab desc field
2001 FIXME: This will have to change for a 64 bit object format. */
2003 #define STRDXOFF (0)
2005 #define OTHEROFF (5)
2008 #define STABSIZE (12)
2010 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2011 using string table section STRSECT_NAME (in `strtab'). */
2014 print_section_stabs (bfd
*abfd
,
2015 const char *stabsect_name
,
2016 unsigned *string_offset_ptr
)
2019 unsigned file_string_table_offset
= 0;
2020 unsigned next_file_string_table_offset
= *string_offset_ptr
;
2021 bfd_byte
*stabp
, *stabs_end
;
2024 stabs_end
= stabp
+ stab_size
;
2026 printf (_("Contents of %s section:\n\n"), stabsect_name
);
2027 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2029 /* Loop through all symbols and print them.
2031 We start the index at -1 because there is a dummy symbol on
2032 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2033 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
2037 unsigned char type
, other
;
2038 unsigned short desc
;
2041 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
2042 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
2043 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
2044 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
2045 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
2047 printf ("\n%-6d ", i
);
2048 /* Either print the stab name, or, if unnamed, print its number
2049 again (makes consistent formatting for tools like awk). */
2050 name
= bfd_get_stab_name (type
);
2052 printf ("%-6s", name
);
2053 else if (type
== N_UNDF
)
2056 printf ("%-6d", type
);
2057 printf (" %-6d %-6d ", other
, desc
);
2058 bfd_printf_vma (abfd
, value
);
2059 printf (" %-6lu", strx
);
2061 /* Symbols with type == 0 (N_UNDF) specify the length of the
2062 string table associated with this file. We use that info
2063 to know how to relocate the *next* file's string table indices. */
2066 file_string_table_offset
= next_file_string_table_offset
;
2067 next_file_string_table_offset
+= value
;
2071 /* Using the (possibly updated) string table offset, print the
2072 string (if any) associated with this symbol. */
2073 if ((strx
+ file_string_table_offset
) < stabstr_size
)
2074 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
2080 *string_offset_ptr
= next_file_string_table_offset
;
2085 const char * section_name
;
2086 const char * string_section_name
;
2087 unsigned string_offset
;
2092 find_stabs_section (bfd
*abfd
, asection
*section
, void *names
)
2095 stab_section_names
* sought
= (stab_section_names
*) names
;
2097 /* Check for section names for which stabsect_name is a prefix, to
2098 handle .stab.N, etc. */
2099 len
= strlen (sought
->section_name
);
2101 /* If the prefix matches, and the files section name ends with a
2102 nul or a digit, then we match. I.e., we want either an exact
2103 match or a section followed by a number. */
2104 if (strncmp (sought
->section_name
, section
->name
, len
) == 0
2105 && (section
->name
[len
] == 0
2106 || (section
->name
[len
] == '.' && ISDIGIT (section
->name
[len
+ 1]))))
2109 strtab
= read_section_stabs (abfd
, sought
->string_section_name
,
2114 stabs
= (bfd_byte
*) read_section_stabs (abfd
, section
->name
,
2117 print_section_stabs (abfd
, section
->name
, &sought
->string_offset
);
2123 dump_stabs_section (bfd
*abfd
, char *stabsect_name
, char *strsect_name
)
2125 stab_section_names s
;
2127 s
.section_name
= stabsect_name
;
2128 s
.string_section_name
= strsect_name
;
2129 s
.string_offset
= 0;
2131 bfd_map_over_sections (abfd
, find_stabs_section
, & s
);
2137 /* Dump the any sections containing stabs debugging information. */
2140 dump_stabs (bfd
*abfd
)
2142 dump_stabs_section (abfd
, ".stab", ".stabstr");
2143 dump_stabs_section (abfd
, ".stab.excl", ".stab.exclstr");
2144 dump_stabs_section (abfd
, ".stab.index", ".stab.indexstr");
2145 dump_stabs_section (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2149 dump_bfd_header (bfd
*abfd
)
2153 printf (_("architecture: %s, "),
2154 bfd_printable_arch_mach (bfd_get_arch (abfd
),
2155 bfd_get_mach (abfd
)));
2156 printf (_("flags 0x%08x:\n"), abfd
->flags
);
2158 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2159 PF (HAS_RELOC
, "HAS_RELOC");
2160 PF (EXEC_P
, "EXEC_P");
2161 PF (HAS_LINENO
, "HAS_LINENO");
2162 PF (HAS_DEBUG
, "HAS_DEBUG");
2163 PF (HAS_SYMS
, "HAS_SYMS");
2164 PF (HAS_LOCALS
, "HAS_LOCALS");
2165 PF (DYNAMIC
, "DYNAMIC");
2166 PF (WP_TEXT
, "WP_TEXT");
2167 PF (D_PAGED
, "D_PAGED");
2168 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
2169 PF (HAS_LOAD_PAGE
, "HAS_LOAD_PAGE");
2170 printf (_("\nstart address 0x"));
2171 bfd_printf_vma (abfd
, abfd
->start_address
);
2177 dump_bfd_private_header (bfd
*abfd
)
2179 bfd_print_private_bfd_data (abfd
, stdout
);
2183 /* Display a section in hexadecimal format with associated characters.
2184 Each line prefixed by the zero padded address. */
2187 dump_section (bfd
*abfd
, asection
*section
, void *dummy ATTRIBUTE_UNUSED
)
2190 bfd_size_type datasize
;
2191 bfd_size_type addr_offset
;
2192 bfd_size_type start_offset
;
2193 bfd_size_type stop_offset
;
2194 unsigned int opb
= bfd_octets_per_byte (abfd
);
2195 /* Bytes per line. */
2196 const int onaline
= 16;
2201 if ((section
->flags
& SEC_HAS_CONTENTS
) == 0)
2204 if (! process_section_p (section
))
2207 if ((datasize
= bfd_section_size (abfd
, section
)) == 0)
2210 printf (_("Contents of section %s:\n"), section
->name
);
2212 data
= xmalloc (datasize
);
2214 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
2216 /* Compute the address range to display. */
2217 if (start_address
== (bfd_vma
) -1
2218 || start_address
< section
->vma
)
2221 start_offset
= start_address
- section
->vma
;
2223 if (stop_address
== (bfd_vma
) -1)
2224 stop_offset
= datasize
/ opb
;
2227 if (stop_address
< section
->vma
)
2230 stop_offset
= stop_address
- section
->vma
;
2232 if (stop_offset
> datasize
/ opb
)
2233 stop_offset
= datasize
/ opb
;
2238 bfd_sprintf_vma (abfd
, buf
, start_offset
+ section
->vma
);
2239 if (strlen (buf
) >= sizeof (buf
))
2243 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
2245 count
= strlen (buf
) - count
;
2249 bfd_sprintf_vma (abfd
, buf
, stop_offset
+ section
->vma
- 1);
2250 if (strlen (buf
) >= sizeof (buf
))
2254 while (buf
[count
] == '0' && buf
[count
+1] != '\0')
2256 count
= strlen (buf
) - count
;
2260 for (addr_offset
= start_offset
;
2261 addr_offset
< stop_offset
; addr_offset
+= onaline
/ opb
)
2265 bfd_sprintf_vma (abfd
, buf
, (addr_offset
+ section
->vma
));
2266 count
= strlen (buf
);
2267 if ((size_t) count
>= sizeof (buf
))
2271 while (count
< width
)
2276 fputs (buf
+ count
- width
, stdout
);
2279 for (j
= addr_offset
* opb
;
2280 j
< addr_offset
* opb
+ onaline
; j
++)
2282 if (j
< stop_offset
* opb
)
2283 printf ("%02x", (unsigned) (data
[j
]));
2291 for (j
= addr_offset
* opb
;
2292 j
< addr_offset
* opb
+ onaline
; j
++)
2294 if (j
>= stop_offset
* opb
)
2297 printf ("%c", ISPRINT (data
[j
]) ? data
[j
] : '.');
2304 /* Actually display the various requested regions. */
2307 dump_data (bfd
*abfd
)
2309 bfd_map_over_sections (abfd
, dump_section
, NULL
);
2312 /* Should perhaps share code and display with nm? */
2315 dump_symbols (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_boolean dynamic
)
2325 printf ("DYNAMIC SYMBOL TABLE:\n");
2331 printf ("SYMBOL TABLE:\n");
2335 printf (_("no symbols\n"));
2337 for (count
= 0; count
< max
; count
++)
2341 if (*current
== NULL
)
2342 printf (_("no information for symbol number %ld\n"), count
);
2344 else if ((cur_bfd
= bfd_asymbol_bfd (*current
)) == NULL
)
2345 printf (_("could not determine the type of symbol number %ld\n"),
2348 else if (process_section_p ((* current
)->section
)
2349 && (dump_special_syms
2350 || !bfd_is_target_special_symbol (cur_bfd
, *current
)))
2352 const char *name
= (*current
)->name
;
2354 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
2358 /* If we want to demangle the name, we demangle it
2359 here, and temporarily clobber it while calling
2360 bfd_print_symbol. FIXME: This is a gross hack. */
2361 alloc
= demangle (cur_bfd
, name
);
2362 (*current
)->name
= alloc
;
2363 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2364 bfd_print_symbol_all
);
2365 (*current
)->name
= name
;
2369 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2370 bfd_print_symbol_all
);
2380 dump_reloc_set (bfd
*abfd
, asection
*sec
, arelent
**relpp
, long relcount
)
2383 char *last_filename
, *last_functionname
;
2384 unsigned int last_line
;
2386 /* Get column headers lined up reasonably. */
2394 bfd_sprintf_vma (abfd
, buf
, (bfd_vma
) -1);
2395 width
= strlen (buf
) - 7;
2397 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2400 last_filename
= NULL
;
2401 last_functionname
= NULL
;
2404 for (p
= relpp
; relcount
&& *p
!= NULL
; p
++, relcount
--)
2407 const char *filename
, *functionname
;
2409 const char *sym_name
;
2410 const char *section_name
;
2412 if (start_address
!= (bfd_vma
) -1
2413 && q
->address
< start_address
)
2415 if (stop_address
!= (bfd_vma
) -1
2416 && q
->address
> stop_address
)
2419 if (with_line_numbers
2421 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2422 &filename
, &functionname
, &line
))
2424 if (functionname
!= NULL
2425 && (last_functionname
== NULL
2426 || strcmp (functionname
, last_functionname
) != 0))
2428 printf ("%s():\n", functionname
);
2429 if (last_functionname
!= NULL
)
2430 free (last_functionname
);
2431 last_functionname
= xstrdup (functionname
);
2435 && (line
!= last_line
2436 || (filename
!= NULL
2437 && last_filename
!= NULL
2438 && strcmp (filename
, last_filename
) != 0)))
2440 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2442 if (last_filename
!= NULL
)
2443 free (last_filename
);
2444 if (filename
== NULL
)
2445 last_filename
= NULL
;
2447 last_filename
= xstrdup (filename
);
2451 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2453 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2454 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2459 section_name
= NULL
;
2464 bfd_printf_vma (abfd
, q
->address
);
2466 printf (" %-16s ", q
->howto
->name
);
2468 printf (" %-16d ", q
->howto
->type
);
2469 objdump_print_symname (abfd
, NULL
, *q
->sym_ptr_ptr
);
2473 if (section_name
== NULL
)
2474 section_name
= "*unknown*";
2475 bfd_printf_vma (abfd
, q
->address
);
2476 printf (" %-16s [%s]",
2484 bfd_printf_vma (abfd
, q
->addend
);
2492 dump_relocs_in_section (bfd
*abfd
,
2494 void *dummy ATTRIBUTE_UNUSED
)
2500 if ( bfd_is_abs_section (section
)
2501 || bfd_is_und_section (section
)
2502 || bfd_is_com_section (section
)
2503 || (! process_section_p (section
))
2504 || ((section
->flags
& SEC_RELOC
) == 0))
2507 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
2509 bfd_fatal (bfd_get_filename (abfd
));
2511 printf ("RELOCATION RECORDS FOR [%s]:", section
->name
);
2515 printf (" (none)\n\n");
2519 relpp
= xmalloc (relsize
);
2520 relcount
= bfd_canonicalize_reloc (abfd
, section
, relpp
, syms
);
2523 bfd_fatal (bfd_get_filename (abfd
));
2524 else if (relcount
== 0)
2525 printf (" (none)\n\n");
2529 dump_reloc_set (abfd
, section
, relpp
, relcount
);
2536 dump_relocs (bfd
*abfd
)
2538 bfd_map_over_sections (abfd
, dump_relocs_in_section
, NULL
);
2542 dump_dynamic_relocs (bfd
*abfd
)
2548 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2550 bfd_fatal (bfd_get_filename (abfd
));
2552 printf ("DYNAMIC RELOCATION RECORDS");
2555 printf (" (none)\n\n");
2558 relpp
= xmalloc (relsize
);
2559 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2562 bfd_fatal (bfd_get_filename (abfd
));
2563 else if (relcount
== 0)
2564 printf (" (none)\n\n");
2568 dump_reloc_set (abfd
, NULL
, relpp
, relcount
);
2575 /* Creates a table of paths, to search for source files. */
2578 add_include_path (const char *path
)
2582 include_path_count
++;
2583 include_paths
= xrealloc (include_paths
,
2584 include_path_count
* sizeof (*include_paths
));
2585 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2586 if (path
[1] == ':' && path
[2] == 0)
2587 path
= concat (path
, ".", (const char *) 0);
2589 include_paths
[include_path_count
- 1] = path
;
2593 adjust_addresses (bfd
*abfd ATTRIBUTE_UNUSED
,
2595 void *dummy ATTRIBUTE_UNUSED
)
2597 section
->vma
+= adjust_section_vma
;
2598 section
->lma
+= adjust_section_vma
;
2601 /* Dump selected contents of ABFD. */
2604 dump_bfd (bfd
*abfd
)
2606 /* If we are adjusting section VMA's, change them all now. Changing
2607 the BFD information is a hack. However, we must do it, or
2608 bfd_find_nearest_line will not do the right thing. */
2609 if (adjust_section_vma
!= 0)
2610 bfd_map_over_sections (abfd
, adjust_addresses
, NULL
);
2612 if (! dump_debugging_tags
)
2613 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd
),
2616 print_arelt_descr (stdout
, abfd
, TRUE
);
2617 if (dump_file_header
)
2618 dump_bfd_header (abfd
);
2619 if (dump_private_headers
)
2620 dump_bfd_private_header (abfd
);
2621 if (! dump_debugging_tags
)
2623 if (dump_section_headers
)
2624 dump_headers (abfd
);
2626 if (dump_symtab
|| dump_reloc_info
|| disassemble
|| dump_debugging
)
2627 syms
= slurp_symtab (abfd
);
2628 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
2629 || (disassemble
&& bfd_get_dynamic_symtab_upper_bound (abfd
) > 0))
2630 dynsyms
= slurp_dynamic_symtab (abfd
);
2633 synthcount
= bfd_get_synthetic_symtab (abfd
, symcount
, syms
,
2634 dynsymcount
, dynsyms
, &synthsyms
);
2640 dump_symbols (abfd
, FALSE
);
2641 if (dump_dynamic_symtab
)
2642 dump_symbols (abfd
, TRUE
);
2643 if (dump_stab_section_info
)
2645 if (dump_reloc_info
&& ! disassemble
)
2647 if (dump_dynamic_reloc_info
&& ! disassemble
)
2648 dump_dynamic_relocs (abfd
);
2649 if (dump_section_contents
)
2652 disassemble_data (abfd
);
2658 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
2659 if (dhandle
!= NULL
)
2661 if (! print_debugging_info (stdout
, dhandle
, abfd
, syms
, demangle
,
2662 dump_debugging_tags
? TRUE
: FALSE
))
2664 non_fatal (_("%s: printing debugging information failed"),
2665 bfd_get_filename (abfd
));
2695 display_bfd (bfd
*abfd
)
2699 if (bfd_check_format_matches (abfd
, bfd_object
, &matching
))
2705 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2707 nonfatal (bfd_get_filename (abfd
));
2708 list_matching_formats (matching
);
2713 if (bfd_get_error () != bfd_error_file_not_recognized
)
2715 nonfatal (bfd_get_filename (abfd
));
2719 if (bfd_check_format_matches (abfd
, bfd_core
, &matching
))
2725 nonfatal (bfd_get_filename (abfd
));
2727 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2729 list_matching_formats (matching
);
2735 display_file (char *filename
, char *target
)
2740 if (get_file_size (filename
) < 1)
2743 file
= bfd_openr (filename
, target
);
2746 nonfatal (filename
);
2750 /* If the file is an archive, process all of its elements. */
2751 if (bfd_check_format (file
, bfd_archive
))
2753 bfd
*last_arfile
= NULL
;
2755 printf (_("In archive %s:\n"), bfd_get_filename (file
));
2758 bfd_set_error (bfd_error_no_error
);
2760 arfile
= bfd_openr_next_archived_file (file
, arfile
);
2763 if (bfd_get_error () != bfd_error_no_more_archived_files
)
2764 nonfatal (bfd_get_filename (file
));
2768 display_bfd (arfile
);
2770 if (last_arfile
!= NULL
)
2771 bfd_close (last_arfile
);
2772 last_arfile
= arfile
;
2775 if (last_arfile
!= NULL
)
2776 bfd_close (last_arfile
);
2785 main (int argc
, char **argv
)
2788 char *target
= default_target
;
2789 bfd_boolean seenflag
= FALSE
;
2791 #if defined (HAVE_SETLOCALE)
2792 #if defined (HAVE_LC_MESSAGES)
2793 setlocale (LC_MESSAGES
, "");
2795 setlocale (LC_CTYPE
, "");
2798 bindtextdomain (PACKAGE
, LOCALEDIR
);
2799 textdomain (PACKAGE
);
2801 program_name
= *argv
;
2802 xmalloc_set_program_name (program_name
);
2804 START_PROGRESS (program_name
, 0);
2807 set_default_bfd_target ();
2809 while ((c
= getopt_long (argc
, argv
, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeG",
2810 long_options
, (int *) 0))
2816 break; /* We've been given a long option. */
2821 if (disassembler_options
)
2822 /* Ignore potential memory leak for now. */
2823 disassembler_options
= concat (disassembler_options
, ",",
2826 disassembler_options
= optarg
;
2829 if (only_used
== only_size
)
2832 only
= xrealloc (only
, only_size
* sizeof (char *));
2834 only
[only_used
++] = optarg
;
2837 with_line_numbers
= TRUE
;
2846 enum demangling_styles style
;
2848 style
= cplus_demangle_name_to_style (optarg
);
2849 if (style
== unknown_demangling
)
2850 fatal (_("unknown demangling style `%s'"),
2853 cplus_demangle_set_style (style
);
2859 case OPTION_ADJUST_VMA
:
2860 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
2862 case OPTION_START_ADDRESS
:
2863 start_address
= parse_vma (optarg
, "--start-address");
2865 case OPTION_STOP_ADDRESS
:
2866 stop_address
= parse_vma (optarg
, "--stop-address");
2869 if (strcmp (optarg
, "B") == 0)
2870 endian
= BFD_ENDIAN_BIG
;
2871 else if (strcmp (optarg
, "L") == 0)
2872 endian
= BFD_ENDIAN_LITTLE
;
2875 non_fatal (_("unrecognized -E option"));
2880 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
2881 endian
= BFD_ENDIAN_BIG
;
2882 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
2883 endian
= BFD_ENDIAN_LITTLE
;
2886 non_fatal (_("unrecognized --endian type `%s'"), optarg
);
2892 dump_file_header
= TRUE
;
2896 formats_info
= TRUE
;
2900 add_include_path (optarg
);
2903 dump_private_headers
= TRUE
;
2907 dump_private_headers
= TRUE
;
2909 dump_reloc_info
= TRUE
;
2910 dump_file_header
= TRUE
;
2911 dump_ar_hdrs
= TRUE
;
2912 dump_section_headers
= TRUE
;
2920 dump_dynamic_symtab
= TRUE
;
2928 disassemble_zeroes
= TRUE
;
2932 disassemble_all
= TRUE
;
2937 with_source_code
= TRUE
;
2946 dump_debugging_tags
= 1;
2951 dump_stab_section_info
= TRUE
;
2955 dump_section_contents
= TRUE
;
2959 dump_reloc_info
= TRUE
;
2963 dump_dynamic_reloc_info
= TRUE
;
2967 dump_ar_hdrs
= TRUE
;
2971 dump_section_headers
= TRUE
;
2979 show_version
= TRUE
;
2989 print_version ("objdump");
2995 exit_status
= display_info ();
2999 display_file ("a.out", target
);
3001 for (; optind
< argc
;)
3002 display_file (argv
[optind
++], target
);
3005 END_PROGRESS (program_name
);