1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 #include "libiberty.h"
32 #ifdef ANSI_PROTOTYPES
38 /* Internal headers for the ELF .stab-dump code - sorry. */
39 #define BYTES_IN_WORD 32
40 #include "aout/aout64.h"
42 #ifdef NEED_DECLARATION_FPRINTF
43 /* This is needed by INIT_DISASSEMBLE_INFO. */
44 extern int fprintf
PARAMS ((FILE *, const char *, ...));
48 static int exit_status
= 0;
50 static char *default_target
= NULL
; /* default at runtime */
52 static int show_version
= 0; /* show the version number */
53 static int dump_section_contents
; /* -s */
54 static int dump_section_headers
; /* -h */
55 static boolean dump_file_header
; /* -f */
56 static int dump_symtab
; /* -t */
57 static int dump_dynamic_symtab
; /* -T */
58 static int dump_reloc_info
; /* -r */
59 static int dump_dynamic_reloc_info
; /* -R */
60 static int dump_ar_hdrs
; /* -a */
61 static int dump_private_headers
; /* -p */
62 static int prefix_addresses
; /* --prefix-addresses */
63 static int with_line_numbers
; /* -l */
64 static boolean with_source_code
; /* -S */
65 static int show_raw_insn
; /* --show-raw-insn */
66 static int dump_stab_section_info
; /* --stabs */
67 static int do_demangle
; /* -C, --demangle */
68 static boolean disassemble
; /* -d */
69 static boolean disassemble_all
; /* -D */
70 static int disassemble_zeroes
; /* --disassemble-zeroes */
71 static boolean formats_info
; /* -i */
72 static char *only
; /* -j secname */
73 static int wide_output
; /* -w */
74 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
75 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
76 static int dump_debugging
; /* --debugging */
77 static bfd_vma adjust_section_vma
= 0; /* --adjust-vma */
79 /* Extra info to pass to the disassembler address printing function. */
80 struct objdump_disasm_info
{
86 /* Architecture to disassemble for, or default if NULL. */
87 static char *machine
= (char *) NULL
;
89 /* Target specific options to the disassembler. */
90 static char *disassembler_options
= (char *) NULL
;
92 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
93 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
95 /* The symbol table. */
96 static asymbol
**syms
;
98 /* Number of symbols in `syms'. */
99 static long symcount
= 0;
101 /* The sorted symbol table. */
102 static asymbol
**sorted_syms
;
104 /* Number of symbols in `sorted_syms'. */
105 static long sorted_symcount
= 0;
107 /* The dynamic symbol table. */
108 static asymbol
**dynsyms
;
110 /* Number of symbols in `dynsyms'. */
111 static long dynsymcount
= 0;
113 /* Static declarations. */
116 usage
PARAMS ((FILE *, int));
119 nonfatal
PARAMS ((const char *));
122 display_file
PARAMS ((char *filename
, char *target
));
125 dump_section_header
PARAMS ((bfd
*, asection
*, PTR
));
128 dump_headers
PARAMS ((bfd
*));
131 dump_data
PARAMS ((bfd
*abfd
));
134 dump_relocs
PARAMS ((bfd
*abfd
));
137 dump_dynamic_relocs
PARAMS ((bfd
* abfd
));
140 dump_reloc_set
PARAMS ((bfd
*, asection
*, arelent
**, long));
143 dump_symbols
PARAMS ((bfd
*abfd
, boolean dynamic
));
146 dump_bfd_header
PARAMS ((bfd
*));
149 dump_bfd_private_header
PARAMS ((bfd
*));
152 display_bfd
PARAMS ((bfd
*abfd
));
155 display_target_list
PARAMS ((void));
158 display_info_table
PARAMS ((int, int));
161 display_target_tables
PARAMS ((void));
164 display_info
PARAMS ((void));
167 objdump_print_value
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
170 objdump_print_symname
PARAMS ((bfd
*, struct disassemble_info
*, asymbol
*));
173 find_symbol_for_address
PARAMS ((bfd
*, asection
*, bfd_vma
, boolean
, long *));
176 objdump_print_addr_with_sym
PARAMS ((bfd
*, asection
*, asymbol
*, bfd_vma
,
177 struct disassemble_info
*, boolean
));
180 objdump_print_addr
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
183 objdump_print_address
PARAMS ((bfd_vma
, struct disassemble_info
*));
186 show_line
PARAMS ((bfd
*, asection
*, bfd_vma
));
189 disassemble_bytes
PARAMS ((struct disassemble_info
*, disassembler_ftype
,
190 boolean
, bfd_byte
*, bfd_vma
, bfd_vma
,
191 arelent
***, arelent
**));
194 disassemble_data
PARAMS ((bfd
*));
197 endian_string
PARAMS ((enum bfd_endian
));
200 slurp_symtab
PARAMS ((bfd
*));
203 slurp_dynamic_symtab
PARAMS ((bfd
*));
206 remove_useless_symbols
PARAMS ((asymbol
**, long));
209 compare_symbols
PARAMS ((const PTR
, const PTR
));
212 compare_relocs
PARAMS ((const PTR
, const PTR
));
215 dump_stabs
PARAMS ((bfd
*));
218 read_section_stabs
PARAMS ((bfd
*, const char *, const char *));
221 print_section_stabs
PARAMS ((bfd
*, const char *, const char *));
224 usage (stream
, status
)
228 fprintf (stream
, _("\
229 Usage: %s [-ahifCdDprRtTxsSlw] [-b bfdname] [-m machine] \n\
230 [-j section-name] [-M disassembler-options]\n\
231 [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
232 [--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\
233 [--section-headers] [--headers]\n\
234 [--info] [--section=section-name] [--line-numbers] [--source]\n"),
236 fprintf (stream
, _("\
237 [--architecture=machine] [--reloc] [--full-contents] [--stabs]\n\
238 [--syms] [--all-headers] [--dynamic-syms] [--dynamic-reloc]\n\
239 [--wide] [--version] [--help] [--private-headers]\n\
240 [--start-address=addr] [--stop-address=addr]\n\
241 [--prefix-addresses] [--[no-]show-raw-insn] [--demangle]\n\
242 [--adjust-vma=offset] [-EB|-EL] [--endian={big|little}] objfile...\n\
243 at least one option besides -l (--line-numbers) must be given\n"));
244 list_supported_targets (program_name
, stream
);
246 fprintf (stream
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
250 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
252 #define OPTION_ENDIAN (150)
253 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
254 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
255 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
257 static struct option long_options
[]=
259 {"adjust-vma", required_argument
, NULL
, OPTION_ADJUST_VMA
},
260 {"all-headers", no_argument
, NULL
, 'x'},
261 {"private-headers", no_argument
, NULL
, 'p'},
262 {"architecture", required_argument
, NULL
, 'm'},
263 {"archive-headers", no_argument
, NULL
, 'a'},
264 {"debugging", no_argument
, &dump_debugging
, 1},
265 {"demangle", no_argument
, &do_demangle
, 1},
266 {"disassemble", no_argument
, NULL
, 'd'},
267 {"disassemble-all", no_argument
, NULL
, 'D'},
268 {"disassembler-options", required_argument
, NULL
, 'M'},
269 {"disassemble-zeroes", no_argument
, &disassemble_zeroes
, 1},
270 {"dynamic-reloc", no_argument
, NULL
, 'R'},
271 {"dynamic-syms", no_argument
, NULL
, 'T'},
272 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
273 {"file-headers", no_argument
, NULL
, 'f'},
274 {"full-contents", no_argument
, NULL
, 's'},
275 {"headers", no_argument
, NULL
, 'h'},
276 {"help", no_argument
, NULL
, 'H'},
277 {"info", no_argument
, NULL
, 'i'},
278 {"line-numbers", no_argument
, NULL
, 'l'},
279 {"no-show-raw-insn", no_argument
, &show_raw_insn
, -1},
280 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
281 {"reloc", no_argument
, NULL
, 'r'},
282 {"section", required_argument
, NULL
, 'j'},
283 {"section-headers", no_argument
, NULL
, 'h'},
284 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
285 {"source", no_argument
, NULL
, 'S'},
286 {"stabs", no_argument
, &dump_stab_section_info
, 1},
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
, &show_version
, 1},
292 {"wide", no_argument
, &wide_output
, 'w'},
293 {0, no_argument
, 0, 0}
305 dump_section_header (abfd
, section
, ignored
)
306 bfd
*abfd ATTRIBUTE_UNUSED
;
308 PTR ignored ATTRIBUTE_UNUSED
;
312 printf ("%3d %-13s %08lx ", section
->index
,
313 bfd_get_section_name (abfd
, section
),
314 (unsigned long) bfd_section_size (abfd
, section
));
315 printf_vma (bfd_get_section_vma (abfd
, section
));
317 printf_vma (section
->lma
);
318 printf (" %08lx 2**%u", section
->filepos
,
319 bfd_get_section_alignment (abfd
, section
));
325 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
327 PF (SEC_HAS_CONTENTS
, "CONTENTS");
328 PF (SEC_ALLOC
, "ALLOC");
329 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
330 PF (SEC_CONSTRUCTOR_TEXT
, "CONSTRUCTOR TEXT");
331 PF (SEC_CONSTRUCTOR_DATA
, "CONSTRUCTOR DATA");
332 PF (SEC_CONSTRUCTOR_BSS
, "CONSTRUCTOR BSS");
333 PF (SEC_LOAD
, "LOAD");
334 PF (SEC_RELOC
, "RELOC");
336 PF (SEC_BALIGN
, "BALIGN");
338 PF (SEC_READONLY
, "READONLY");
339 PF (SEC_CODE
, "CODE");
340 PF (SEC_DATA
, "DATA");
342 PF (SEC_DEBUGGING
, "DEBUGGING");
343 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
344 PF (SEC_EXCLUDE
, "EXCLUDE");
345 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
346 PF (SEC_SMALL_DATA
, "SMALL_DATA");
347 PF (SEC_SHARED
, "SHARED");
349 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
353 switch (section
->flags
& SEC_LINK_DUPLICATES
)
357 case SEC_LINK_DUPLICATES_DISCARD
:
358 ls
= "LINK_ONCE_DISCARD";
360 case SEC_LINK_DUPLICATES_ONE_ONLY
:
361 ls
= "LINK_ONCE_ONE_ONLY";
363 case SEC_LINK_DUPLICATES_SAME_SIZE
:
364 ls
= "LINK_ONCE_SAME_SIZE";
366 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
367 ls
= "LINK_ONCE_SAME_CONTENTS";
370 printf ("%s%s", comma
, ls
);
372 if (section
->comdat
!= NULL
)
373 printf (" (COMDAT %s %ld)", section
->comdat
->name
,
374 section
->comdat
->symbol
);
387 printf (_("Sections:\n"));
389 printf (_("Idx Name Size VMA LMA File off Algn\n"));
391 printf (_("Idx Name Size VMA LMA File off Algn\n"));
393 bfd_map_over_sections (abfd
, dump_section_header
, (PTR
) NULL
);
400 asymbol
**sy
= (asymbol
**) NULL
;
403 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
405 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
410 storage
= bfd_get_symtab_upper_bound (abfd
);
412 bfd_fatal (bfd_get_filename (abfd
));
416 sy
= (asymbol
**) xmalloc (storage
);
418 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
420 bfd_fatal (bfd_get_filename (abfd
));
422 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
426 /* Read in the dynamic symbols. */
429 slurp_dynamic_symtab (abfd
)
432 asymbol
**sy
= (asymbol
**) NULL
;
435 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
438 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
440 fprintf (stderr
, _("%s: %s: not a dynamic object\n"),
441 program_name
, bfd_get_filename (abfd
));
446 bfd_fatal (bfd_get_filename (abfd
));
451 sy
= (asymbol
**) xmalloc (storage
);
453 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
455 bfd_fatal (bfd_get_filename (abfd
));
456 if (dynsymcount
== 0)
457 fprintf (stderr
, _("%s: %s: No dynamic symbols\n"),
458 program_name
, bfd_get_filename (abfd
));
462 /* Filter out (in place) symbols that are useless for disassembly.
463 COUNT is the number of elements in SYMBOLS.
464 Return the number of useful symbols. */
467 remove_useless_symbols (symbols
, count
)
471 register asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
475 asymbol
*sym
= *in_ptr
++;
477 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
479 if (sym
->flags
& (BSF_DEBUGGING
))
481 if (bfd_is_und_section (sym
->section
)
482 || bfd_is_com_section (sym
->section
))
487 return out_ptr
- symbols
;
490 /* Sort symbols into value order. */
493 compare_symbols (ap
, bp
)
497 const asymbol
*a
= *(const asymbol
**)ap
;
498 const asymbol
*b
= *(const asymbol
**)bp
;
502 flagword aflags
, bflags
;
504 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
506 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
509 if (a
->section
> b
->section
)
511 else if (a
->section
< b
->section
)
514 an
= bfd_asymbol_name (a
);
515 bn
= bfd_asymbol_name (b
);
519 /* The symbols gnu_compiled and gcc2_compiled convey no real
520 information, so put them after other symbols with the same value. */
522 af
= (strstr (an
, "gnu_compiled") != NULL
523 || strstr (an
, "gcc2_compiled") != NULL
);
524 bf
= (strstr (bn
, "gnu_compiled") != NULL
525 || strstr (bn
, "gcc2_compiled") != NULL
);
532 /* We use a heuristic for the file name, to try to sort it after
533 more useful symbols. It may not work on non Unix systems, but it
534 doesn't really matter; the only difference is precisely which
535 symbol names get printed. */
537 #define file_symbol(s, sn, snl) \
538 (((s)->flags & BSF_FILE) != 0 \
539 || ((sn)[(snl) - 2] == '.' \
540 && ((sn)[(snl) - 1] == 'o' \
541 || (sn)[(snl) - 1] == 'a')))
543 af
= file_symbol (a
, an
, anl
);
544 bf
= file_symbol (b
, bn
, bnl
);
551 /* Try to sort global symbols before local symbols before function
552 symbols before debugging symbols. */
557 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
559 if ((aflags
& BSF_DEBUGGING
) != 0)
564 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
566 if ((aflags
& BSF_FUNCTION
) != 0)
571 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
573 if ((aflags
& BSF_LOCAL
) != 0)
578 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
580 if ((aflags
& BSF_GLOBAL
) != 0)
586 /* Symbols that start with '.' might be section names, so sort them
587 after symbols that don't start with '.'. */
588 if (an
[0] == '.' && bn
[0] != '.')
590 if (an
[0] != '.' && bn
[0] == '.')
593 /* Finally, if we can't distinguish them in any other way, try to
594 get consistent results by sorting the symbols by name. */
595 return strcmp (an
, bn
);
598 /* Sort relocs into address order. */
601 compare_relocs (ap
, bp
)
605 const arelent
*a
= *(const arelent
**)ap
;
606 const arelent
*b
= *(const arelent
**)bp
;
608 if (a
->address
> b
->address
)
610 else if (a
->address
< b
->address
)
613 /* So that associated relocations tied to the same address show up
614 in the correct order, we don't do any further sorting. */
623 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
626 objdump_print_value (vma
, info
, skip_zeroes
)
628 struct disassemble_info
*info
;
634 sprintf_vma (buf
, vma
);
639 for (p
= buf
; *p
== '0'; ++p
)
644 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
647 /* Print the name of a symbol. */
650 objdump_print_symname (abfd
, info
, sym
)
652 struct disassemble_info
*info
;
660 name
= bfd_asymbol_name (sym
);
661 if (! do_demangle
|| name
[0] == '\0')
665 /* Demangle the name. */
666 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
669 alloc
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
677 (*info
->fprintf_func
) (info
->stream
, "%s", print
);
679 printf ("%s", print
);
685 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
686 is true, then always require the symbol to be in the section. This
687 returns NULL if there is no suitable symbol. If PLACE is not NULL,
688 then *PLACE is set to the index of the symbol in sorted_syms. */
691 find_symbol_for_address (abfd
, sec
, vma
, require_sec
, place
)
698 /* @@ Would it speed things up to cache the last two symbols returned,
699 and maybe their address ranges? For many processors, only one memory
700 operand can be present at a time, so the 2-entry cache wouldn't be
701 constantly churned by code doing heavy memory accesses. */
703 /* Indices in `sorted_syms'. */
705 long max
= sorted_symcount
;
708 if (sorted_symcount
< 1)
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 relocateable, 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 if (sorted_syms
[thisplace
]->section
!= 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
)))))
758 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
760 if (bfd_asymbol_value (sorted_syms
[i
])
761 != bfd_asymbol_value (sorted_syms
[thisplace
]))
767 if (sorted_syms
[i
]->section
== sec
769 || sorted_syms
[i
- 1]->section
!= sec
770 || (bfd_asymbol_value (sorted_syms
[i
])
771 != bfd_asymbol_value (sorted_syms
[i
- 1]))))
778 if (sorted_syms
[thisplace
]->section
!= sec
)
780 /* We didn't find a good symbol with a smaller value.
781 Look for one with a larger value. */
782 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
784 if (sorted_syms
[i
]->section
== sec
)
792 if (sorted_syms
[thisplace
]->section
!= sec
794 || ((abfd
->flags
& HAS_RELOC
) != 0
795 && vma
>= bfd_get_section_vma (abfd
, sec
)
796 && vma
< (bfd_get_section_vma (abfd
, sec
)
797 + bfd_section_size (abfd
, sec
)))))
799 /* There is no suitable symbol. */
807 return sorted_syms
[thisplace
];
810 /* Print an address to INFO symbolically. */
813 objdump_print_addr_with_sym (abfd
, sec
, sym
, vma
, info
, skip_zeroes
)
818 struct disassemble_info
*info
;
821 objdump_print_value (vma
, info
, skip_zeroes
);
827 (*info
->fprintf_func
) (info
->stream
, " <%s",
828 bfd_get_section_name (abfd
, sec
));
829 secaddr
= bfd_get_section_vma (abfd
, sec
);
832 (*info
->fprintf_func
) (info
->stream
, "-0x");
833 objdump_print_value (secaddr
- vma
, info
, true);
835 else if (vma
> secaddr
)
837 (*info
->fprintf_func
) (info
->stream
, "+0x");
838 objdump_print_value (vma
- secaddr
, info
, true);
840 (*info
->fprintf_func
) (info
->stream
, ">");
844 (*info
->fprintf_func
) (info
->stream
, " <");
845 objdump_print_symname (abfd
, info
, sym
);
846 if (bfd_asymbol_value (sym
) > vma
)
848 (*info
->fprintf_func
) (info
->stream
, "-0x");
849 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, true);
851 else if (vma
> bfd_asymbol_value (sym
))
853 (*info
->fprintf_func
) (info
->stream
, "+0x");
854 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, true);
856 (*info
->fprintf_func
) (info
->stream
, ">");
860 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
861 true, don't output leading zeroes. */
864 objdump_print_addr (vma
, info
, skip_zeroes
)
866 struct disassemble_info
*info
;
869 struct objdump_disasm_info
*aux
;
872 if (sorted_symcount
< 1)
874 (*info
->fprintf_func
) (info
->stream
, "0x");
875 objdump_print_value (vma
, info
, skip_zeroes
);
879 aux
= (struct objdump_disasm_info
*) info
->application_data
;
880 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
882 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
886 /* Print VMA to INFO. This function is passed to the disassembler
890 objdump_print_address (vma
, info
)
892 struct disassemble_info
*info
;
894 objdump_print_addr (vma
, info
, ! prefix_addresses
);
897 /* Determine of the given address has a symbol associated with it. */
900 objdump_symbol_at_address (vma
, info
)
902 struct disassemble_info
* info
;
904 struct objdump_disasm_info
* aux
;
907 /* No symbols - do not bother checking. */
908 if (sorted_symcount
< 1)
911 aux
= (struct objdump_disasm_info
*) info
->application_data
;
912 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
915 return (sym
!= NULL
&& (bfd_asymbol_value (sym
) == vma
));
918 /* Hold the last function name and the last line number we displayed
921 static char *prev_functionname
;
922 static unsigned int prev_line
;
924 /* We keep a list of all files that we have seen when doing a
925 dissassembly with source, so that we know how much of the file to
926 display. This can be important for inlined functions. */
928 struct print_file_list
930 struct print_file_list
*next
;
936 static struct print_file_list
*print_files
;
938 /* The number of preceding context lines to show when we start
939 displaying a file for the first time. */
941 #define SHOW_PRECEDING_CONTEXT_LINES (5)
943 /* Skip ahead to a given line in a file, optionally printing each
947 skip_to_line
PARAMS ((struct print_file_list
*, unsigned int, boolean
));
950 skip_to_line (p
, line
, show
)
951 struct print_file_list
*p
;
955 while (p
->line
< line
)
959 if (fgets (buf
, sizeof buf
, p
->f
) == NULL
)
969 if (strchr (buf
, '\n') != NULL
)
974 /* Show the line number, or the source line, in a dissassembly
978 show_line (abfd
, section
, off
)
983 CONST
char *filename
;
984 CONST
char *functionname
;
987 if (! with_line_numbers
&& ! with_source_code
)
990 if (! bfd_find_nearest_line (abfd
, section
, syms
, off
, &filename
,
991 &functionname
, &line
))
994 if (filename
!= NULL
&& *filename
== '\0')
996 if (functionname
!= NULL
&& *functionname
== '\0')
999 if (with_line_numbers
)
1001 if (functionname
!= NULL
1002 && (prev_functionname
== NULL
1003 || strcmp (functionname
, prev_functionname
) != 0))
1004 printf ("%s():\n", functionname
);
1005 if (line
> 0 && line
!= prev_line
)
1006 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
1009 if (with_source_code
1013 struct print_file_list
**pp
, *p
;
1015 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
1016 if (strcmp ((*pp
)->filename
, filename
) == 0)
1022 if (p
!= print_files
)
1026 /* We have reencountered a file name which we saw
1027 earlier. This implies that either we are dumping out
1028 code from an included file, or the same file was
1029 linked in more than once. There are two common cases
1030 of an included file: inline functions in a header
1031 file, and a bison or flex skeleton file. In the
1032 former case we want to just start printing (but we
1033 back up a few lines to give context); in the latter
1034 case we want to continue from where we left off. I
1035 can't think of a good way to distinguish the cases,
1036 so I used a heuristic based on the file name. */
1037 if (strcmp (p
->filename
+ strlen (p
->filename
) - 2, ".h") != 0)
1041 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1048 p
->f
= fopen (p
->filename
, "r");
1052 skip_to_line (p
, l
, false);
1054 if (print_files
->f
!= NULL
)
1056 fclose (print_files
->f
);
1057 print_files
->f
= NULL
;
1063 skip_to_line (p
, line
, true);
1065 p
->next
= print_files
;
1073 f
= fopen (filename
, "r");
1078 p
= ((struct print_file_list
*)
1079 xmalloc (sizeof (struct print_file_list
)));
1080 p
->filename
= xmalloc (strlen (filename
) + 1);
1081 strcpy (p
->filename
, filename
);
1085 if (print_files
!= NULL
&& print_files
->f
!= NULL
)
1087 fclose (print_files
->f
);
1088 print_files
->f
= NULL
;
1090 p
->next
= print_files
;
1093 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
1096 skip_to_line (p
, l
, false);
1098 skip_to_line (p
, line
, true);
1103 if (functionname
!= NULL
1104 && (prev_functionname
== NULL
1105 || strcmp (functionname
, prev_functionname
) != 0))
1107 if (prev_functionname
!= NULL
)
1108 free (prev_functionname
);
1109 prev_functionname
= xmalloc (strlen (functionname
) + 1);
1110 strcpy (prev_functionname
, functionname
);
1113 if (line
> 0 && line
!= prev_line
)
1117 /* Pseudo FILE object for strings. */
1125 /* sprintf to a "stream" */
1128 #ifdef ANSI_PROTOTYPES
1129 objdump_sprintf (SFILE
*f
, const char *format
, ...)
1131 objdump_sprintf (va_alist
)
1135 #ifndef ANSI_PROTOTYPES
1143 #ifdef ANSI_PROTOTYPES
1144 va_start (args
, format
);
1147 f
= va_arg (args
, SFILE
*);
1148 format
= va_arg (args
, const char *);
1151 vasprintf (&buf
, format
, args
);
1157 fprintf (stderr
, _("Out of virtual memory\n"));
1163 while ((size_t) ((f
->buffer
+ f
->size
) - f
->current
) < n
+ 1)
1167 curroff
= f
->current
- f
->buffer
;
1169 f
->buffer
= xrealloc (f
->buffer
, f
->size
);
1170 f
->current
= f
->buffer
+ curroff
;
1173 memcpy (f
->current
, buf
, n
);
1175 f
->current
[0] = '\0';
1182 /* The number of zeroes we want to see before we start skipping them.
1183 The number is arbitrarily chosen. */
1185 #define SKIP_ZEROES (8)
1187 /* The number of zeroes to skip at the end of a section. If the
1188 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1189 SKIP_ZEROES, they will be disassembled. If there are fewer than
1190 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1191 attempt to avoid disassembling zeroes inserted by section
1194 #define SKIP_ZEROES_AT_END (3)
1196 /* Disassemble some data in memory between given values. */
1199 disassemble_bytes (info
, disassemble_fn
, insns
, data
, start
, stop
, relppp
,
1201 struct disassemble_info
*info
;
1202 disassembler_ftype disassemble_fn
;
1210 struct objdump_disasm_info
*aux
;
1214 int skip_addr_chars
;
1217 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1223 bytes_per_line
= 16;
1225 /* Figure out how many characters to skip at the start of an
1226 address, to make the disassembly look nicer. We discard leading
1227 zeroes in chunks of 4, ensuring that there is always a leading
1229 skip_addr_chars
= 0;
1230 if (! prefix_addresses
)
1236 section
->vma
+ bfd_section_size (section
->owner
, section
));
1238 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1241 skip_addr_chars
+= 4;
1246 info
->insn_info_valid
= 0;
1254 boolean need_nl
= false;
1256 /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1258 for (z
= i
; z
< stop
; z
++)
1261 if (! disassemble_zeroes
1262 && (info
->insn_info_valid
== 0
1263 || info
->branch_delay_insns
== 0)
1264 && (z
- i
>= SKIP_ZEROES
1265 || (z
== stop
&& z
- i
< SKIP_ZEROES_AT_END
)))
1269 /* If there are more nonzero bytes to follow, we only skip
1270 zeroes in multiples of 4, to try to avoid running over
1271 the start of an instruction which happens to start with
1274 z
= i
+ ((z
- i
) &~ 3);
1287 if (with_line_numbers
|| with_source_code
)
1288 show_line (aux
->abfd
, section
, i
);
1290 if (! prefix_addresses
)
1294 sprintf_vma (buf
, section
->vma
+ i
);
1295 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1299 printf ("%s:\t", buf
+ skip_addr_chars
);
1303 aux
->require_sec
= true;
1304 objdump_print_address (section
->vma
+ i
, info
);
1305 aux
->require_sec
= false;
1312 sfile
.buffer
= xmalloc (sfile
.size
);
1313 sfile
.current
= sfile
.buffer
;
1314 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1315 info
->stream
= (FILE *) &sfile
;
1316 info
->bytes_per_line
= 0;
1317 info
->bytes_per_chunk
= 0;
1319 /* FIXME: This is wrong. It tests the number of bytes
1320 in the last instruction, not the current one. */
1321 if (*relppp
< relppend
1322 && (**relppp
)->address
>= i
1323 && (**relppp
)->address
< i
+ bytes
)
1324 info
->flags
= INSN_HAS_RELOC
;
1328 bytes
= (*disassemble_fn
) (section
->vma
+ i
, info
);
1329 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1330 info
->stream
= stdout
;
1331 if (info
->bytes_per_line
!= 0)
1332 bytes_per_line
= info
->bytes_per_line
;
1335 if (sfile
.current
!= sfile
.buffer
)
1336 printf ("%s\n", sfile
.buffer
);
1337 free (sfile
.buffer
);
1345 bytes
= bytes_per_line
;
1346 if (i
+ bytes
> stop
)
1349 for (j
= i
; j
< i
+ bytes
; ++j
)
1351 if (isprint (data
[j
]))
1352 buf
[j
- i
] = data
[j
];
1359 if (prefix_addresses
1361 : show_raw_insn
>= 0)
1365 /* If ! prefix_addresses and ! wide_output, we print
1366 bytes_per_line bytes per line. */
1368 if (pb
> bytes_per_line
&& ! prefix_addresses
&& ! wide_output
)
1369 pb
= bytes_per_line
;
1371 if (info
->bytes_per_chunk
)
1372 bpc
= info
->bytes_per_chunk
;
1376 for (j
= i
; j
< i
+ pb
; j
+= bpc
)
1379 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1381 for (k
= bpc
- 1; k
>= 0; k
--)
1382 printf ("%02x", (unsigned) data
[j
+ k
]);
1387 for (k
= 0; k
< bpc
; k
++)
1388 printf ("%02x", (unsigned) data
[j
+ k
]);
1393 for (; pb
< bytes_per_line
; pb
+= bpc
)
1397 for (k
= 0; k
< bpc
; k
++)
1402 /* Separate raw data from instruction by extra space. */
1413 printf ("%s", sfile
.buffer
);
1414 free (sfile
.buffer
);
1417 if (prefix_addresses
1419 : show_raw_insn
>= 0)
1429 sprintf_vma (buf
, section
->vma
+ j
);
1430 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1434 printf ("%s:\t", buf
+ skip_addr_chars
);
1436 pb
+= bytes_per_line
;
1439 for (; j
< i
+ pb
; j
+= bpc
)
1443 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1445 for (k
= bpc
- 1; k
>= 0; k
--)
1446 printf ("%02x", (unsigned) data
[j
+ k
]);
1451 for (k
= 0; k
< bpc
; k
++)
1452 printf ("%02x", (unsigned) data
[j
+ k
]);
1466 && (section
->flags
& SEC_RELOC
) != 0)
1468 while ((*relppp
) < relppend
1469 && ((**relppp
)->address
>= (bfd_vma
) i
1470 && (**relppp
)->address
< (bfd_vma
) i
+ bytes
))
1481 objdump_print_value (section
->vma
+ q
->address
, info
, true);
1483 printf (": %s\t", q
->howto
->name
);
1485 if (q
->sym_ptr_ptr
== NULL
|| *q
->sym_ptr_ptr
== NULL
)
1486 printf ("*unknown*");
1489 const char *sym_name
;
1491 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1492 if (sym_name
!= NULL
&& *sym_name
!= '\0')
1493 objdump_print_symname (aux
->abfd
, info
, *q
->sym_ptr_ptr
);
1498 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1499 sym_name
= bfd_get_section_name (aux
->abfd
, sym_sec
);
1500 if (sym_name
== NULL
|| *sym_name
== '\0')
1501 sym_name
= "*unknown*";
1502 printf ("%s", sym_name
);
1509 objdump_print_value (q
->addend
, info
, true);
1525 /* Disassemble the contents of an object file. */
1528 disassemble_data (abfd
)
1532 disassembler_ftype disassemble_fn
;
1533 struct disassemble_info disasm_info
;
1534 struct objdump_disasm_info aux
;
1538 prev_functionname
= NULL
;
1541 /* We make a copy of syms to sort. We don't want to sort syms
1542 because that will screw up the relocs. */
1543 sorted_syms
= (asymbol
**) xmalloc (symcount
* sizeof (asymbol
*));
1544 memcpy (sorted_syms
, syms
, symcount
* sizeof (asymbol
*));
1546 sorted_symcount
= remove_useless_symbols (sorted_syms
, symcount
);
1548 /* Sort the symbols into section and symbol order */
1549 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1551 INIT_DISASSEMBLE_INFO(disasm_info
, stdout
, fprintf
);
1552 disasm_info
.application_data
= (PTR
) &aux
;
1554 aux
.require_sec
= false;
1555 disasm_info
.print_address_func
= objdump_print_address
;
1556 disasm_info
.symbol_at_address_func
= objdump_symbol_at_address
;
1558 if (machine
!= (char *) NULL
)
1560 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1563 fprintf (stderr
, _("%s: Can't use supplied machine %s\n"),
1568 abfd
->arch_info
= info
;
1571 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1573 struct bfd_target
*xvec
;
1575 xvec
= (struct bfd_target
*) xmalloc (sizeof (struct bfd_target
));
1576 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1577 xvec
->byteorder
= endian
;
1581 disassemble_fn
= disassembler (abfd
);
1582 if (!disassemble_fn
)
1584 fprintf (stderr
, _("%s: Can't disassemble for architecture %s\n"),
1586 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1591 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1592 disasm_info
.arch
= bfd_get_arch (abfd
);
1593 disasm_info
.mach
= bfd_get_mach (abfd
);
1594 disasm_info
.disassembler_options
= disassembler_options
;
1596 if (bfd_big_endian (abfd
))
1597 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_BIG
;
1598 else if (bfd_little_endian (abfd
))
1599 disasm_info
.display_endian
= disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1601 /* ??? Aborting here seems too drastic. We could default to big or little
1603 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1605 for (section
= abfd
->sections
;
1606 section
!= (asection
*) NULL
;
1607 section
= section
->next
)
1609 bfd_byte
*data
= NULL
;
1610 bfd_size_type datasize
= 0;
1611 arelent
**relbuf
= NULL
;
1612 arelent
**relpp
= NULL
;
1613 arelent
**relppend
= NULL
;
1615 asymbol
*sym
= NULL
;
1618 if ((section
->flags
& SEC_LOAD
) == 0
1619 || (! disassemble_all
1621 && (section
->flags
& SEC_CODE
) == 0))
1623 if (only
!= (char *) NULL
&& strcmp (only
, section
->name
) != 0)
1627 && (section
->flags
& SEC_RELOC
) != 0)
1631 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1633 bfd_fatal (bfd_get_filename (abfd
));
1639 relbuf
= (arelent
**) xmalloc (relsize
);
1640 relcount
= bfd_canonicalize_reloc (abfd
, section
, relbuf
, syms
);
1642 bfd_fatal (bfd_get_filename (abfd
));
1644 /* Sort the relocs by address. */
1645 qsort (relbuf
, relcount
, sizeof (arelent
*), compare_relocs
);
1648 relppend
= relpp
+ relcount
;
1650 /* Skip over the relocs belonging to addresses below the
1652 if (start_address
!= (bfd_vma
) -1)
1654 while (relpp
< relppend
1655 && (*relpp
)->address
< start_address
)
1661 printf (_("Disassembly of section %s:\n"), section
->name
);
1663 datasize
= bfd_get_section_size_before_reloc (section
);
1667 data
= (bfd_byte
*) xmalloc ((size_t) datasize
);
1669 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1672 disasm_info
.buffer
= data
;
1673 disasm_info
.buffer_vma
= section
->vma
;
1674 disasm_info
.buffer_length
= datasize
;
1675 if (start_address
== (bfd_vma
) -1
1676 || start_address
< disasm_info
.buffer_vma
)
1679 i
= start_address
- disasm_info
.buffer_vma
;
1680 if (stop_address
== (bfd_vma
) -1)
1684 if (stop_address
< disasm_info
.buffer_vma
)
1687 stop
= stop_address
- disasm_info
.buffer_vma
;
1688 if (stop
> disasm_info
.buffer_length
)
1689 stop
= disasm_info
.buffer_length
;
1692 sym
= find_symbol_for_address (abfd
, section
, section
->vma
+ i
,
1701 if (sym
!= NULL
&& bfd_asymbol_value (sym
) <= section
->vma
+ i
)
1706 (x
< sorted_symcount
1707 && bfd_asymbol_value (sorted_syms
[x
]) <= section
->vma
+ i
);
1710 disasm_info
.symbols
= & sorted_syms
[place
];
1711 disasm_info
.num_symbols
= x
- place
;
1714 disasm_info
.symbols
= NULL
;
1716 if (! prefix_addresses
)
1719 objdump_print_addr_with_sym (abfd
, section
, sym
,
1726 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ i
)
1728 else if (sym
== NULL
)
1732 while (place
< sorted_symcount
1733 /* ??? Why the test for != section? */
1734 && (sorted_syms
[place
]->section
!= section
1735 || (bfd_asymbol_value (sorted_syms
[place
])
1736 <= bfd_asymbol_value (sym
))))
1738 if (place
>= sorted_symcount
)
1741 nextsym
= sorted_syms
[place
];
1744 if (sym
!= NULL
&& bfd_asymbol_value (sym
) > section
->vma
+ i
)
1746 nextstop
= bfd_asymbol_value (sym
) - section
->vma
;
1747 if (nextstop
> stop
)
1750 else if (nextsym
== NULL
)
1754 nextstop
= bfd_asymbol_value (nextsym
) - section
->vma
;
1755 if (nextstop
> stop
)
1759 /* If a symbol is explicitly marked as being an object
1760 rather than a function, just dump the bytes without
1761 disassembling them. */
1764 || bfd_asymbol_value (sym
) > section
->vma
+ i
1765 || ((sym
->flags
& BSF_OBJECT
) == 0
1766 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1768 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1770 || (sym
->flags
& BSF_FUNCTION
) != 0)
1775 disassemble_bytes (&disasm_info
, disassemble_fn
, insns
, data
, i
,
1776 nextstop
, &relpp
, relppend
);
1790 /* Define a table of stab values and print-strings. We wish the initializer
1791 could be a direct-mapped table, but instead we build one the first
1794 static void dump_section_stabs
PARAMS ((bfd
*abfd
, char *stabsect_name
,
1795 char *strsect_name
));
1797 /* Dump the stabs sections from an object file that has a section that
1798 uses Sun stabs encoding. */
1804 dump_section_stabs (abfd
, ".stab", ".stabstr");
1805 dump_section_stabs (abfd
, ".stab.excl", ".stab.exclstr");
1806 dump_section_stabs (abfd
, ".stab.index", ".stab.indexstr");
1807 dump_section_stabs (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1810 static bfd_byte
*stabs
;
1811 static bfd_size_type stab_size
;
1813 static char *strtab
;
1814 static bfd_size_type stabstr_size
;
1816 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1817 and string table section STRSECT_NAME into `strtab'.
1818 If the section exists and was read, allocate the space and return true.
1819 Otherwise return false. */
1822 read_section_stabs (abfd
, stabsect_name
, strsect_name
)
1824 const char *stabsect_name
;
1825 const char *strsect_name
;
1827 asection
*stabsect
, *stabstrsect
;
1829 stabsect
= bfd_get_section_by_name (abfd
, stabsect_name
);
1832 printf (_("No %s section present\n\n"), stabsect_name
);
1836 stabstrsect
= bfd_get_section_by_name (abfd
, strsect_name
);
1837 if (0 == stabstrsect
)
1839 fprintf (stderr
, _("%s: %s has no %s section\n"), program_name
,
1840 bfd_get_filename (abfd
), strsect_name
);
1845 stab_size
= bfd_section_size (abfd
, stabsect
);
1846 stabstr_size
= bfd_section_size (abfd
, stabstrsect
);
1848 stabs
= (bfd_byte
*) xmalloc (stab_size
);
1849 strtab
= (char *) xmalloc (stabstr_size
);
1851 if (! bfd_get_section_contents (abfd
, stabsect
, (PTR
) stabs
, 0, stab_size
))
1853 fprintf (stderr
, _("%s: Reading %s section of %s failed: %s\n"),
1854 program_name
, stabsect_name
, bfd_get_filename (abfd
),
1855 bfd_errmsg (bfd_get_error ()));
1862 if (! bfd_get_section_contents (abfd
, stabstrsect
, (PTR
) strtab
, 0,
1865 fprintf (stderr
, _("%s: Reading %s section of %s failed: %s\n"),
1866 program_name
, strsect_name
, bfd_get_filename (abfd
),
1867 bfd_errmsg (bfd_get_error ()));
1877 /* Stabs entries use a 12 byte format:
1878 4 byte string table index
1880 1 byte stab other field
1881 2 byte stab desc field
1883 FIXME: This will have to change for a 64 bit object format. */
1885 #define STRDXOFF (0)
1887 #define OTHEROFF (5)
1890 #define STABSIZE (12)
1892 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1893 using string table section STRSECT_NAME (in `strtab'). */
1896 print_section_stabs (abfd
, stabsect_name
, strsect_name
)
1898 const char *stabsect_name
;
1899 const char *strsect_name ATTRIBUTE_UNUSED
;
1902 unsigned file_string_table_offset
= 0, next_file_string_table_offset
= 0;
1903 bfd_byte
*stabp
, *stabs_end
;
1906 stabs_end
= stabp
+ stab_size
;
1908 printf (_("Contents of %s section:\n\n"), stabsect_name
);
1909 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1911 /* Loop through all symbols and print them.
1913 We start the index at -1 because there is a dummy symbol on
1914 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1916 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
1920 unsigned char type
, other
;
1921 unsigned short desc
;
1924 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1925 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1926 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1927 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1928 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1930 printf ("\n%-6d ", i
);
1931 /* Either print the stab name, or, if unnamed, print its number
1932 again (makes consistent formatting for tools like awk). */
1933 name
= bfd_get_stab_name (type
);
1935 printf ("%-6s", name
);
1936 else if (type
== N_UNDF
)
1939 printf ("%-6d", type
);
1940 printf (" %-6d %-6d ", other
, desc
);
1942 printf (" %-6lu", strx
);
1944 /* Symbols with type == 0 (N_UNDF) specify the length of the
1945 string table associated with this file. We use that info
1946 to know how to relocate the *next* file's string table indices. */
1950 file_string_table_offset
= next_file_string_table_offset
;
1951 next_file_string_table_offset
+= value
;
1955 /* Using the (possibly updated) string table offset, print the
1956 string (if any) associated with this symbol. */
1958 if ((strx
+ file_string_table_offset
) < stabstr_size
)
1959 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
1968 dump_section_stabs (abfd
, stabsect_name
, strsect_name
)
1970 char *stabsect_name
;
1975 /* Check for section names for which stabsect_name is a prefix, to
1976 handle .stab0, etc. */
1977 for (s
= abfd
->sections
;
1983 len
= strlen (stabsect_name
);
1985 /* If the prefix matches, and the files section name ends with a
1986 nul or a digit, then we match. I.e., we want either an exact
1987 match or a section followed by a number. */
1988 if (strncmp (stabsect_name
, s
->name
, len
) == 0
1989 && (s
->name
[len
] == '\000'
1990 || isdigit ((unsigned char) s
->name
[len
])))
1992 if (read_section_stabs (abfd
, s
->name
, strsect_name
))
1994 print_section_stabs (abfd
, s
->name
, strsect_name
);
2003 dump_bfd_header (abfd
)
2008 printf (_("architecture: %s, "),
2009 bfd_printable_arch_mach (bfd_get_arch (abfd
),
2010 bfd_get_mach (abfd
)));
2011 printf (_("flags 0x%08x:\n"), abfd
->flags
);
2013 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2014 PF (HAS_RELOC
, "HAS_RELOC");
2015 PF (EXEC_P
, "EXEC_P");
2016 PF (HAS_LINENO
, "HAS_LINENO");
2017 PF (HAS_DEBUG
, "HAS_DEBUG");
2018 PF (HAS_SYMS
, "HAS_SYMS");
2019 PF (HAS_LOCALS
, "HAS_LOCALS");
2020 PF (DYNAMIC
, "DYNAMIC");
2021 PF (WP_TEXT
, "WP_TEXT");
2022 PF (D_PAGED
, "D_PAGED");
2023 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
2024 printf (_("\nstart address 0x"));
2025 printf_vma (abfd
->start_address
);
2030 dump_bfd_private_header (abfd
)
2033 bfd_print_private_bfd_data (abfd
, stdout
);
2042 if (!bfd_check_format_matches (abfd
, bfd_object
, &matching
))
2044 nonfatal (bfd_get_filename (abfd
));
2045 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
2047 list_matching_formats (matching
);
2053 /* If we are adjusting section VMA's, change them all now. Changing
2054 the BFD information is a hack. However, we must do it, or
2055 bfd_find_nearest_line will not do the right thing. */
2056 if (adjust_section_vma
!= 0)
2060 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
2062 s
->vma
+= adjust_section_vma
;
2063 s
->lma
+= adjust_section_vma
;
2067 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd
),
2070 print_arelt_descr (stdout
, abfd
, true);
2071 if (dump_file_header
)
2072 dump_bfd_header (abfd
);
2073 if (dump_private_headers
)
2074 dump_bfd_private_header (abfd
);
2076 if (dump_section_headers
)
2077 dump_headers (abfd
);
2078 if (dump_symtab
|| dump_reloc_info
|| disassemble
|| dump_debugging
)
2080 syms
= slurp_symtab (abfd
);
2082 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
)
2084 dynsyms
= slurp_dynamic_symtab (abfd
);
2087 dump_symbols (abfd
, false);
2088 if (dump_dynamic_symtab
)
2089 dump_symbols (abfd
, true);
2090 if (dump_stab_section_info
)
2092 if (dump_reloc_info
&& ! disassemble
)
2094 if (dump_dynamic_reloc_info
)
2095 dump_dynamic_relocs (abfd
);
2096 if (dump_section_contents
)
2099 disassemble_data (abfd
);
2104 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
2105 if (dhandle
!= NULL
)
2107 if (! print_debugging_info (stdout
, dhandle
))
2110 _("%s: printing debugging information failed\n"),
2111 bfd_get_filename (abfd
));
2129 display_file (filename
, target
)
2133 bfd
*file
, *arfile
= (bfd
*) NULL
;
2135 file
= bfd_openr (filename
, target
);
2138 nonfatal (filename
);
2142 if (bfd_check_format (file
, bfd_archive
) == true)
2144 bfd
*last_arfile
= NULL
;
2146 printf (_("In archive %s:\n"), bfd_get_filename (file
));
2149 bfd_set_error (bfd_error_no_error
);
2151 arfile
= bfd_openr_next_archived_file (file
, arfile
);
2154 if (bfd_get_error () != bfd_error_no_more_archived_files
)
2155 nonfatal (bfd_get_filename (file
));
2159 display_bfd (arfile
);
2161 if (last_arfile
!= NULL
)
2162 bfd_close (last_arfile
);
2163 last_arfile
= arfile
;
2166 if (last_arfile
!= NULL
)
2167 bfd_close (last_arfile
);
2175 /* Actually display the various requested regions */
2183 bfd_size_type datasize
= 0;
2185 bfd_size_type start
, stop
;
2187 for (section
= abfd
->sections
; section
!= NULL
; section
=
2192 if (only
== (char *) NULL
||
2193 strcmp (only
, section
->name
) == 0)
2195 if (section
->flags
& SEC_HAS_CONTENTS
)
2197 printf (_("Contents of section %s:\n"), section
->name
);
2199 if (bfd_section_size (abfd
, section
) == 0)
2201 data
= (bfd_byte
*) xmalloc ((size_t) bfd_section_size (abfd
, section
));
2202 datasize
= bfd_section_size (abfd
, section
);
2205 bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, bfd_section_size (abfd
, section
));
2207 if (start_address
== (bfd_vma
) -1
2208 || start_address
< section
->vma
)
2211 start
= start_address
- section
->vma
;
2212 if (stop_address
== (bfd_vma
) -1)
2213 stop
= bfd_section_size (abfd
, section
);
2216 if (stop_address
< section
->vma
)
2219 stop
= stop_address
- section
->vma
;
2220 if (stop
> bfd_section_size (abfd
, section
))
2221 stop
= bfd_section_size (abfd
, section
);
2223 for (i
= start
; i
< stop
; i
+= onaline
)
2227 printf (" %04lx ", (unsigned long int) (i
+ section
->vma
));
2228 for (j
= i
; j
< i
+ onaline
; j
++)
2231 printf ("%02x", (unsigned) (data
[j
]));
2239 for (j
= i
; j
< i
+ onaline
; j
++)
2244 printf ("%c", isprint (data
[j
]) ? data
[j
] : '.');
2254 /* Should perhaps share code and display with nm? */
2256 dump_symbols (abfd
, dynamic
)
2257 bfd
*abfd ATTRIBUTE_UNUSED
;
2270 printf ("DYNAMIC SYMBOL TABLE:\n");
2278 printf ("SYMBOL TABLE:\n");
2281 for (count
= 0; count
< max
; count
++)
2285 bfd
*cur_bfd
= bfd_asymbol_bfd (*current
);
2287 if (cur_bfd
!= NULL
)
2292 name
= bfd_asymbol_name (*current
);
2294 if (do_demangle
&& name
!= NULL
&& *name
!= '\0')
2298 /* If we want to demangle the name, we demangle it
2299 here, and temporarily clobber it while calling
2300 bfd_print_symbol. FIXME: This is a gross hack. */
2303 if (bfd_get_symbol_leading_char (cur_bfd
) == *n
)
2305 alloc
= cplus_demangle (n
, DMGL_ANSI
| DMGL_PARAMS
);
2307 (*current
)->name
= alloc
;
2309 (*current
)->name
= n
;
2312 bfd_print_symbol (cur_bfd
, stdout
, *current
,
2313 bfd_print_symbol_all
);
2315 (*current
)->name
= name
;
2336 for (a
= abfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
2340 if (bfd_is_abs_section (a
))
2342 if (bfd_is_und_section (a
))
2344 if (bfd_is_com_section (a
))
2349 if (strcmp (only
, a
->name
))
2352 else if ((a
->flags
& SEC_RELOC
) == 0)
2355 relsize
= bfd_get_reloc_upper_bound (abfd
, a
);
2357 bfd_fatal (bfd_get_filename (abfd
));
2359 printf ("RELOCATION RECORDS FOR [%s]:", a
->name
);
2363 printf (" (none)\n\n");
2367 relpp
= (arelent
**) xmalloc (relsize
);
2368 relcount
= bfd_canonicalize_reloc (abfd
, a
, relpp
, syms
);
2370 bfd_fatal (bfd_get_filename (abfd
));
2371 else if (relcount
== 0)
2373 printf (" (none)\n\n");
2378 dump_reloc_set (abfd
, a
, relpp
, relcount
);
2387 dump_dynamic_relocs (abfd
)
2394 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2396 bfd_fatal (bfd_get_filename (abfd
));
2398 printf ("DYNAMIC RELOCATION RECORDS");
2402 printf (" (none)\n\n");
2406 relpp
= (arelent
**) xmalloc (relsize
);
2407 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2409 bfd_fatal (bfd_get_filename (abfd
));
2410 else if (relcount
== 0)
2412 printf (" (none)\n\n");
2417 dump_reloc_set (abfd
, (asection
*) NULL
, relpp
, relcount
);
2425 dump_reloc_set (abfd
, sec
, relpp
, relcount
)
2432 char *last_filename
, *last_functionname
;
2433 unsigned int last_line
;
2435 /* Get column headers lined up reasonably. */
2441 sprintf_vma (buf
, (bfd_vma
) -1);
2442 width
= strlen (buf
) - 7;
2444 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2447 last_filename
= NULL
;
2448 last_functionname
= NULL
;
2451 for (p
= relpp
; relcount
&& *p
!= (arelent
*) NULL
; p
++, relcount
--)
2454 const char *filename
, *functionname
;
2456 const char *sym_name
;
2457 const char *section_name
;
2459 if (start_address
!= (bfd_vma
) -1
2460 && q
->address
< start_address
)
2462 if (stop_address
!= (bfd_vma
) -1
2463 && q
->address
> stop_address
)
2466 if (with_line_numbers
2468 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2469 &filename
, &functionname
, &line
))
2471 if (functionname
!= NULL
2472 && (last_functionname
== NULL
2473 || strcmp (functionname
, last_functionname
) != 0))
2475 printf ("%s():\n", functionname
);
2476 if (last_functionname
!= NULL
)
2477 free (last_functionname
);
2478 last_functionname
= xstrdup (functionname
);
2481 && (line
!= last_line
2482 || (filename
!= NULL
2483 && last_filename
!= NULL
2484 && strcmp (filename
, last_filename
) != 0)))
2486 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2488 if (last_filename
!= NULL
)
2489 free (last_filename
);
2490 if (filename
== NULL
)
2491 last_filename
= NULL
;
2493 last_filename
= xstrdup (filename
);
2497 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2499 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2500 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2505 section_name
= NULL
;
2509 printf_vma (q
->address
);
2511 printf (" %-16s ", q
->howto
->name
);
2513 printf (" %-16d ", q
->howto
->type
);
2514 objdump_print_symname (abfd
, (struct disassemble_info
*) NULL
,
2519 if (section_name
== (CONST
char *) NULL
)
2520 section_name
= "*unknown*";
2521 printf_vma (q
->address
);
2522 printf (" %-16s [%s]",
2529 printf_vma (q
->addend
);
2535 /* The length of the longest architecture name + 1. */
2536 #define LONGEST_ARCH sizeof("rs6000:6000")
2539 endian_string (endian
)
2540 enum bfd_endian endian
;
2542 if (endian
== BFD_ENDIAN_BIG
)
2543 return "big endian";
2544 else if (endian
== BFD_ENDIAN_LITTLE
)
2545 return "little endian";
2547 return "endianness unknown";
2550 /* List the targets that BFD is configured to support, each followed
2551 by its endianness and the architectures it supports. */
2554 display_target_list ()
2556 extern bfd_target
*bfd_target_vector
[];
2560 dummy_name
= choose_temp_base ();
2561 for (t
= 0; bfd_target_vector
[t
]; t
++)
2563 bfd_target
*p
= bfd_target_vector
[t
];
2564 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2567 printf ("%s\n (header %s, data %s)\n", p
->name
,
2568 endian_string (p
->header_byteorder
),
2569 endian_string (p
->byteorder
));
2573 nonfatal (dummy_name
);
2577 if (! bfd_set_format (abfd
, bfd_object
))
2579 if (bfd_get_error () != bfd_error_invalid_operation
)
2584 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2585 if (bfd_set_arch_mach (abfd
, (enum bfd_architecture
) a
, 0))
2587 bfd_printable_arch_mach ((enum bfd_architecture
) a
, 0));
2589 unlink (dummy_name
);
2593 /* Print a table showing which architectures are supported for entries
2594 FIRST through LAST-1 of bfd_target_vector (targets across,
2595 architectures down). */
2598 display_info_table (first
, last
)
2602 extern bfd_target
*bfd_target_vector
[];
2606 /* Print heading of target names. */
2607 printf ("\n%*s", (int) LONGEST_ARCH
, " ");
2608 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2609 printf ("%s ", bfd_target_vector
[t
]->name
);
2612 dummy_name
= choose_temp_base ();
2613 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2614 if (strcmp (bfd_printable_arch_mach (a
, 0), "UNKNOWN!") != 0)
2616 printf ("%*s ", (int) LONGEST_ARCH
- 1,
2617 bfd_printable_arch_mach (a
, 0));
2618 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2620 bfd_target
*p
= bfd_target_vector
[t
];
2622 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2632 if (! bfd_set_format (abfd
, bfd_object
))
2634 if (bfd_get_error () != bfd_error_invalid_operation
)
2642 if (! bfd_set_arch_mach (abfd
, a
, 0))
2647 printf ("%s ", p
->name
);
2650 int l
= strlen (p
->name
);
2658 unlink (dummy_name
);
2662 /* Print tables of all the target-architecture combinations that
2663 BFD has been configured to support. */
2666 display_target_tables ()
2669 extern bfd_target
*bfd_target_vector
[];
2673 colum
= getenv ("COLUMNS");
2675 columns
= atoi (colum
);
2680 while (bfd_target_vector
[t
] != NULL
)
2684 wid
= LONGEST_ARCH
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2686 while (wid
< columns
&& bfd_target_vector
[t
] != NULL
)
2690 newwid
= wid
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2691 if (newwid
>= columns
)
2696 display_info_table (oldt
, t
);
2703 printf (_("BFD header file version %s\n"), BFD_VERSION
);
2704 display_target_list ();
2705 display_target_tables ();
2714 char *target
= default_target
;
2715 boolean seenflag
= false;
2717 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2718 setlocale (LC_MESSAGES
, "");
2720 bindtextdomain (PACKAGE
, LOCALEDIR
);
2721 textdomain (PACKAGE
);
2723 program_name
= *argv
;
2724 xmalloc_set_program_name (program_name
);
2726 START_PROGRESS (program_name
, 0);
2729 set_default_bfd_target ();
2731 while ((c
= getopt_long (argc
, argv
, "pib:m:M:VCdDlfahrRtTxsSj:wE:",
2732 long_options
, (int *) 0))
2735 if (c
!= 'l' && c
!= OPTION_START_ADDRESS
&& c
!= OPTION_STOP_ADDRESS
)
2740 break; /* we've been given a long option */
2745 disassembler_options
= optarg
;
2751 with_line_numbers
= 1;
2757 dump_file_header
= true;
2760 formats_info
= true;
2763 dump_private_headers
= 1;
2766 dump_private_headers
= 1;
2768 dump_reloc_info
= 1;
2769 dump_file_header
= true;
2771 dump_section_headers
= 1;
2777 dump_dynamic_symtab
= 1;
2786 disassemble
= disassemble_all
= true;
2790 with_source_code
= true;
2793 dump_section_contents
= 1;
2796 dump_reloc_info
= 1;
2799 dump_dynamic_reloc_info
= 1;
2805 dump_section_headers
= 1;
2815 case OPTION_ADJUST_VMA
:
2816 adjust_section_vma
= parse_vma (optarg
, "--adjust-vma");
2818 case OPTION_START_ADDRESS
:
2819 start_address
= parse_vma (optarg
, "--start-address");
2821 case OPTION_STOP_ADDRESS
:
2822 stop_address
= parse_vma (optarg
, "--stop-address");
2825 if (strcmp (optarg
, "B") == 0)
2826 endian
= BFD_ENDIAN_BIG
;
2827 else if (strcmp (optarg
, "L") == 0)
2828 endian
= BFD_ENDIAN_LITTLE
;
2831 fprintf (stderr
, _("%s: unrecognized -E option\n"),
2837 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
2838 endian
= BFD_ENDIAN_BIG
;
2839 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
2840 endian
= BFD_ENDIAN_LITTLE
;
2843 fprintf (stderr
, _("%s: unrecognized --endian type `%s'\n"),
2844 program_name
, optarg
);
2854 print_version ("objdump");
2856 if (seenflag
== false)
2866 display_file ("a.out", target
);
2868 for (; optind
< argc
;)
2869 display_file (argv
[optind
++], target
);
2872 END_PROGRESS (program_name
);