1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 #include "libiberty.h"
30 #ifdef ANSI_PROTOTYPES
36 /* Internal headers for the ELF .stab-dump code - sorry. */
37 #define BYTES_IN_WORD 32
38 #include "aout/aout64.h"
40 #ifdef NEED_DECLARATION_FPRINTF
41 /* This is needed by INIT_DISASSEMBLE_INFO. */
42 extern int fprintf
PARAMS ((FILE *, const char *, ...));
45 static char *default_target
= NULL
; /* default at runtime */
47 static int show_version
= 0; /* show the version number */
48 static int dump_section_contents
; /* -s */
49 static int dump_section_headers
; /* -h */
50 static boolean dump_file_header
; /* -f */
51 static int dump_symtab
; /* -t */
52 static int dump_dynamic_symtab
; /* -T */
53 static int dump_reloc_info
; /* -r */
54 static int dump_dynamic_reloc_info
; /* -R */
55 static int dump_ar_hdrs
; /* -a */
56 static int dump_private_headers
; /* -p */
57 static int prefix_addresses
; /* --prefix-addresses */
58 static int with_line_numbers
; /* -l */
59 static boolean with_source_code
; /* -S */
60 static int show_raw_insn
; /* --show-raw-insn */
61 static int dump_stab_section_info
; /* --stabs */
62 static boolean disassemble
; /* -d */
63 static boolean disassemble_all
; /* -D */
64 static int disassemble_zeroes
; /* --disassemble-zeroes */
65 static boolean formats_info
; /* -i */
66 static char *only
; /* -j secname */
67 static int wide_output
; /* -w */
68 static bfd_vma start_address
= (bfd_vma
) -1; /* --start-address */
69 static bfd_vma stop_address
= (bfd_vma
) -1; /* --stop-address */
70 static int dump_debugging
; /* --debugging */
72 /* Extra info to pass to the disassembler address printing function. */
73 struct objdump_disasm_info
{
79 /* Architecture to disassemble for, or default if NULL. */
80 static char *machine
= (char *) NULL
;
82 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
83 static enum bfd_endian endian
= BFD_ENDIAN_UNKNOWN
;
85 /* The symbol table. */
86 static asymbol
**syms
;
88 /* Number of symbols in `syms'. */
89 static long symcount
= 0;
91 /* The sorted symbol table. */
92 static asymbol
**sorted_syms
;
94 /* Number of symbols in `sorted_syms'. */
95 static long sorted_symcount
= 0;
97 /* The dynamic symbol table. */
98 static asymbol
**dynsyms
;
100 /* Number of symbols in `dynsyms'. */
101 static long dynsymcount
= 0;
103 /* Forward declarations. */
106 display_file
PARAMS ((char *filename
, char *target
));
109 dump_data
PARAMS ((bfd
*abfd
));
112 dump_relocs
PARAMS ((bfd
*abfd
));
115 dump_dynamic_relocs
PARAMS ((bfd
* abfd
));
118 dump_reloc_set
PARAMS ((bfd
*, asection
*, arelent
**, long));
121 dump_symbols
PARAMS ((bfd
*abfd
, boolean dynamic
));
124 display_bfd
PARAMS ((bfd
*abfd
));
127 objdump_print_value
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
130 find_symbol_for_address
PARAMS ((bfd
*, asection
*, bfd_vma
, boolean
, long *));
133 objdump_print_addr_with_sym
PARAMS ((bfd
*, asection
*, asymbol
*, bfd_vma
,
134 struct disassemble_info
*, boolean
));
137 objdump_print_addr
PARAMS ((bfd_vma
, struct disassemble_info
*, boolean
));
140 objdump_print_address
PARAMS ((bfd_vma
, struct disassemble_info
*));
143 show_line
PARAMS ((bfd
*, asection
*, bfd_vma
));
146 disassemble_bytes
PARAMS ((struct disassemble_info
*, disassembler_ftype
,
147 boolean
, bfd_byte
*, long, long, arelent
***,
151 disassemble_data
PARAMS ((bfd
*));
154 endian_string
PARAMS ((enum bfd_endian
));
157 usage (stream
, status
)
162 Usage: %s [-ahifdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\
163 [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
164 [--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\
165 [--section-headers] [--headers]\n\
166 [--info] [--section=section-name] [--line-numbers] [--source]\n",
169 [--architecture=machine] [--reloc] [--full-contents] [--stabs]\n\
170 [--syms] [--all-headers] [--dynamic-syms] [--dynamic-reloc]\n\
171 [--wide] [--version] [--help] [--private-headers]\n\
172 [--start-address=addr] [--stop-address=addr]\n\
173 [--prefix-addresses] [--show-raw-insn]\n\
174 [-EB|-EL] [--endian={big|little}] objfile...\n\
175 at least one option besides -l (--line-numbers) must be given\n");
176 list_supported_targets (program_name
, stream
);
178 fprintf (stream
, "Report bugs to bug-gnu-utils@prep.ai.mit.edu\n");
182 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
184 #define OPTION_ENDIAN (150)
185 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
186 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
188 static struct option long_options
[]=
190 {"all-headers", no_argument
, NULL
, 'x'},
191 {"private-headers", no_argument
, NULL
, 'p'},
192 {"architecture", required_argument
, NULL
, 'm'},
193 {"archive-headers", no_argument
, NULL
, 'a'},
194 {"debugging", no_argument
, &dump_debugging
, 1},
195 {"disassemble", no_argument
, NULL
, 'd'},
196 {"disassemble-all", no_argument
, NULL
, 'D'},
197 {"disassemble-zeroes", no_argument
, &disassemble_zeroes
, 1},
198 {"dynamic-reloc", no_argument
, NULL
, 'R'},
199 {"dynamic-syms", no_argument
, NULL
, 'T'},
200 {"endian", required_argument
, NULL
, OPTION_ENDIAN
},
201 {"file-headers", no_argument
, NULL
, 'f'},
202 {"full-contents", no_argument
, NULL
, 's'},
203 {"headers", no_argument
, NULL
, 'h'},
204 {"help", no_argument
, NULL
, 'H'},
205 {"info", no_argument
, NULL
, 'i'},
206 {"line-numbers", no_argument
, NULL
, 'l'},
207 {"prefix-addresses", no_argument
, &prefix_addresses
, 1},
208 {"reloc", no_argument
, NULL
, 'r'},
209 {"section", required_argument
, NULL
, 'j'},
210 {"section-headers", no_argument
, NULL
, 'h'},
211 {"show-raw-insn", no_argument
, &show_raw_insn
, 1},
212 {"source", no_argument
, NULL
, 'S'},
213 {"stabs", no_argument
, &dump_stab_section_info
, 1},
214 {"start-address", required_argument
, NULL
, OPTION_START_ADDRESS
},
215 {"stop-address", required_argument
, NULL
, OPTION_STOP_ADDRESS
},
216 {"syms", no_argument
, NULL
, 't'},
217 {"target", required_argument
, NULL
, 'b'},
218 {"version", no_argument
, &show_version
, 1},
219 {"wide", no_argument
, &wide_output
, 'w'},
220 {0, no_argument
, 0, 0}
224 dump_section_header (abfd
, section
, ignored
)
231 printf ("%3d %-13s %08lx ", section
->index
,
232 bfd_get_section_name (abfd
, section
),
233 (unsigned long) bfd_section_size (abfd
, section
));
234 printf_vma (bfd_get_section_vma (abfd
, section
));
236 printf_vma (section
->lma
);
237 printf (" %08lx 2**%u", section
->filepos
,
238 bfd_get_section_alignment (abfd
, section
));
244 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
246 PF (SEC_HAS_CONTENTS
, "CONTENTS");
247 PF (SEC_ALLOC
, "ALLOC");
248 PF (SEC_CONSTRUCTOR
, "CONSTRUCTOR");
249 PF (SEC_CONSTRUCTOR_TEXT
, "CONSTRUCTOR TEXT");
250 PF (SEC_CONSTRUCTOR_DATA
, "CONSTRUCTOR DATA");
251 PF (SEC_CONSTRUCTOR_BSS
, "CONSTRUCTOR BSS");
252 PF (SEC_LOAD
, "LOAD");
253 PF (SEC_RELOC
, "RELOC");
255 PF (SEC_BALIGN
, "BALIGN");
257 PF (SEC_READONLY
, "READONLY");
258 PF (SEC_CODE
, "CODE");
259 PF (SEC_DATA
, "DATA");
261 PF (SEC_DEBUGGING
, "DEBUGGING");
262 PF (SEC_NEVER_LOAD
, "NEVER_LOAD");
263 PF (SEC_EXCLUDE
, "EXCLUDE");
264 PF (SEC_SORT_ENTRIES
, "SORT_ENTRIES");
266 if ((section
->flags
& SEC_LINK_ONCE
) != 0)
270 switch (section
->flags
& SEC_LINK_DUPLICATES
)
274 case SEC_LINK_DUPLICATES_DISCARD
:
275 ls
= "LINK_ONCE_DISCARD";
277 case SEC_LINK_DUPLICATES_ONE_ONLY
:
278 ls
= "LINK_ONCE_ONE_ONLY";
280 case SEC_LINK_DUPLICATES_SAME_SIZE
:
281 ls
= "LINK_ONCE_SAME_SIZE";
283 case SEC_LINK_DUPLICATES_SAME_CONTENTS
:
284 ls
= "LINK_ONCE_SAME_CONTENTS";
287 printf ("%s%s", comma
, ls
);
299 printf ("Sections:\n");
301 printf ("Idx Name Size VMA LMA File off Algn\n");
303 printf ("Idx Name Size VMA LMA File off Algn\n");
305 bfd_map_over_sections (abfd
, dump_section_header
, (PTR
) NULL
);
312 asymbol
**sy
= (asymbol
**) NULL
;
315 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
317 printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd
));
322 storage
= bfd_get_symtab_upper_bound (abfd
);
324 bfd_fatal (bfd_get_filename (abfd
));
328 sy
= (asymbol
**) xmalloc (storage
);
330 symcount
= bfd_canonicalize_symtab (abfd
, sy
);
332 bfd_fatal (bfd_get_filename (abfd
));
334 fprintf (stderr
, "%s: %s: No symbols\n",
335 program_name
, bfd_get_filename (abfd
));
339 /* Read in the dynamic symbols. */
342 slurp_dynamic_symtab (abfd
)
345 asymbol
**sy
= (asymbol
**) NULL
;
348 storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
351 if (!(bfd_get_file_flags (abfd
) & DYNAMIC
))
353 fprintf (stderr
, "%s: %s: not a dynamic object\n",
354 program_name
, bfd_get_filename (abfd
));
359 bfd_fatal (bfd_get_filename (abfd
));
364 sy
= (asymbol
**) xmalloc (storage
);
366 dynsymcount
= bfd_canonicalize_dynamic_symtab (abfd
, sy
);
368 bfd_fatal (bfd_get_filename (abfd
));
369 if (dynsymcount
== 0)
370 fprintf (stderr
, "%s: %s: No dynamic symbols\n",
371 program_name
, bfd_get_filename (abfd
));
375 /* Filter out (in place) symbols that are useless for disassembly.
376 COUNT is the number of elements in SYMBOLS.
377 Return the number of useful symbols. */
380 remove_useless_symbols (symbols
, count
)
384 register asymbol
**in_ptr
= symbols
, **out_ptr
= symbols
;
388 asymbol
*sym
= *in_ptr
++;
390 if (sym
->name
== NULL
|| sym
->name
[0] == '\0')
392 if (sym
->flags
& (BSF_DEBUGGING
))
394 if (bfd_is_und_section (sym
->section
)
395 || bfd_is_com_section (sym
->section
))
400 return out_ptr
- symbols
;
403 /* Sort symbols into value order. */
406 compare_symbols (ap
, bp
)
410 const asymbol
*a
= *(const asymbol
**)ap
;
411 const asymbol
*b
= *(const asymbol
**)bp
;
415 flagword aflags
, bflags
;
417 if (bfd_asymbol_value (a
) > bfd_asymbol_value (b
))
419 else if (bfd_asymbol_value (a
) < bfd_asymbol_value (b
))
422 if (a
->section
> b
->section
)
424 else if (a
->section
< b
->section
)
427 an
= bfd_asymbol_name (a
);
428 bn
= bfd_asymbol_name (b
);
432 /* The symbols gnu_compiled and gcc2_compiled convey no real
433 information, so put them after other symbols with the same value. */
435 af
= (strstr (an
, "gnu_compiled") != NULL
436 || strstr (an
, "gcc2_compiled") != NULL
);
437 bf
= (strstr (bn
, "gnu_compiled") != NULL
438 || strstr (bn
, "gcc2_compiled") != NULL
);
445 /* We use a heuristic for the file name, to try to sort it after
446 more useful symbols. It may not work on non Unix systems, but it
447 doesn't really matter; the only difference is precisely which
448 symbol names get printed. */
450 #define file_symbol(s, sn, snl) \
451 (((s)->flags & BSF_FILE) != 0 \
452 || ((sn)[(snl) - 2] == '.' \
453 && ((sn)[(snl) - 1] == 'o' \
454 || (sn)[(snl) - 1] == 'a')))
456 af
= file_symbol (a
, an
, anl
);
457 bf
= file_symbol (b
, bn
, bnl
);
464 /* Try to sort global symbols before local symbols before function
465 symbols before debugging symbols. */
470 if ((aflags
& BSF_DEBUGGING
) != (bflags
& BSF_DEBUGGING
))
472 if ((aflags
& BSF_DEBUGGING
) != 0)
477 if ((aflags
& BSF_FUNCTION
) != (bflags
& BSF_FUNCTION
))
479 if ((aflags
& BSF_FUNCTION
) != 0)
484 if ((aflags
& BSF_LOCAL
) != (bflags
& BSF_LOCAL
))
486 if ((aflags
& BSF_LOCAL
) != 0)
491 if ((aflags
& BSF_GLOBAL
) != (bflags
& BSF_GLOBAL
))
493 if ((aflags
& BSF_GLOBAL
) != 0)
499 /* Symbols that start with '.' might be section names, so sort them
500 after symbols that don't start with '.'. */
501 if (an
[0] == '.' && bn
[0] != '.')
503 if (an
[0] != '.' && bn
[0] == '.')
506 /* Finally, if we can't distinguish them in any other way, try to
507 get consistent results by sorting the symbols by name. */
508 return strcmp (an
, bn
);
511 /* Sort relocs into address order. */
514 compare_relocs (ap
, bp
)
518 const arelent
*a
= *(const arelent
**)ap
;
519 const arelent
*b
= *(const arelent
**)bp
;
521 if (a
->address
> b
->address
)
523 else if (a
->address
< b
->address
)
526 /* So that associated relocations tied to the same address show up
527 in the correct order, we don't do any further sorting. */
536 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
539 objdump_print_value (vma
, info
, skip_zeroes
)
541 struct disassemble_info
*info
;
547 sprintf_vma (buf
, vma
);
552 for (p
= buf
; *p
== '0'; ++p
)
557 (*info
->fprintf_func
) (info
->stream
, "%s", p
);
560 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
561 is true, then always require the symbol to be in the section. This
562 returns NULL if there is no suitable symbol. If PLACE is not NULL,
563 then *PLACE is set to the index of the symbol in sorted_syms. */
566 find_symbol_for_address (abfd
, sec
, vma
, require_sec
, place
)
573 /* @@ Would it speed things up to cache the last two symbols returned,
574 and maybe their address ranges? For many processors, only one memory
575 operand can be present at a time, so the 2-entry cache wouldn't be
576 constantly churned by code doing heavy memory accesses. */
578 /* Indices in `sorted_syms'. */
580 long max
= sorted_symcount
;
583 if (sorted_symcount
< 1)
586 /* Perform a binary search looking for the closest symbol to the
587 required value. We are searching the range (min, max]. */
588 while (min
+ 1 < max
)
592 thisplace
= (max
+ min
) / 2;
593 sym
= sorted_syms
[thisplace
];
595 if (bfd_asymbol_value (sym
) > vma
)
597 else if (bfd_asymbol_value (sym
) < vma
)
606 /* The symbol we want is now in min, the low end of the range we
607 were searching. If there are several symbols with the same
608 value, we want the first one. */
611 && (bfd_asymbol_value (sorted_syms
[thisplace
])
612 == bfd_asymbol_value (sorted_syms
[thisplace
- 1])))
615 /* If the file is relocateable, and the symbol could be from this
616 section, prefer a symbol from this section over symbols from
617 others, even if the other symbol's value might be closer.
619 Note that this may be wrong for some symbol references if the
620 sections have overlapping memory ranges, but in that case there's
621 no way to tell what's desired without looking at the relocation
624 if (sorted_syms
[thisplace
]->section
!= sec
626 || ((abfd
->flags
& HAS_RELOC
) != 0
627 && vma
>= bfd_get_section_vma (abfd
, sec
)
628 && vma
< (bfd_get_section_vma (abfd
, sec
)
629 + bfd_section_size (abfd
, sec
)))))
633 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
635 if (bfd_asymbol_value (sorted_syms
[i
])
636 != bfd_asymbol_value (sorted_syms
[thisplace
]))
642 if (sorted_syms
[i
]->section
== sec
644 || sorted_syms
[i
- 1]->section
!= sec
645 || (bfd_asymbol_value (sorted_syms
[i
])
646 != bfd_asymbol_value (sorted_syms
[i
- 1]))))
653 if (sorted_syms
[thisplace
]->section
!= sec
)
655 /* We didn't find a good symbol with a smaller value.
656 Look for one with a larger value. */
657 for (i
= thisplace
+ 1; i
< sorted_symcount
; i
++)
659 if (sorted_syms
[i
]->section
== sec
)
667 if (sorted_syms
[thisplace
]->section
!= sec
669 || ((abfd
->flags
& HAS_RELOC
) != 0
670 && vma
>= bfd_get_section_vma (abfd
, sec
)
671 && vma
< (bfd_get_section_vma (abfd
, sec
)
672 + bfd_section_size (abfd
, sec
)))))
674 /* There is no suitable symbol. */
682 return sorted_syms
[thisplace
];
685 /* Print an address to INFO symbolically. */
688 objdump_print_addr_with_sym (abfd
, sec
, sym
, vma
, info
, skip_zeroes
)
693 struct disassemble_info
*info
;
696 objdump_print_value (vma
, info
, skip_zeroes
);
702 (*info
->fprintf_func
) (info
->stream
, " <%s",
703 bfd_get_section_name (abfd
, sec
));
704 secaddr
= bfd_get_section_vma (abfd
, sec
);
707 (*info
->fprintf_func
) (info
->stream
, "-");
708 objdump_print_value (secaddr
- vma
, info
, true);
710 else if (vma
> secaddr
)
712 (*info
->fprintf_func
) (info
->stream
, "+");
713 objdump_print_value (vma
- secaddr
, info
, true);
715 (*info
->fprintf_func
) (info
->stream
, ">");
719 (*info
->fprintf_func
) (info
->stream
, " <%s", sym
->name
);
720 if (bfd_asymbol_value (sym
) > vma
)
722 (*info
->fprintf_func
) (info
->stream
, "-");
723 objdump_print_value (bfd_asymbol_value (sym
) - vma
, info
, true);
725 else if (vma
> bfd_asymbol_value (sym
))
727 (*info
->fprintf_func
) (info
->stream
, "+");
728 objdump_print_value (vma
- bfd_asymbol_value (sym
), info
, true);
730 (*info
->fprintf_func
) (info
->stream
, ">");
734 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
735 true, don't output leading zeroes. */
738 objdump_print_addr (vma
, info
, skip_zeroes
)
740 struct disassemble_info
*info
;
743 struct objdump_disasm_info
*aux
;
746 if (sorted_symcount
< 1)
748 objdump_print_value (vma
, info
, skip_zeroes
);
752 aux
= (struct objdump_disasm_info
*) info
->application_data
;
753 sym
= find_symbol_for_address (aux
->abfd
, aux
->sec
, vma
, aux
->require_sec
,
755 objdump_print_addr_with_sym (aux
->abfd
, aux
->sec
, sym
, vma
, info
,
759 /* Print VMA to INFO. This function is passed to the disassembler
763 objdump_print_address (vma
, info
)
765 struct disassemble_info
*info
;
767 objdump_print_addr (vma
, info
, ! prefix_addresses
);
770 /* Hold the last function name and the last line number we displayed
773 static char *prev_functionname
;
774 static unsigned int prev_line
;
776 /* We keep a list of all files that we have seen when doing a
777 dissassembly with source, so that we know how much of the file to
778 display. This can be important for inlined functions. */
780 struct print_file_list
782 struct print_file_list
*next
;
788 static struct print_file_list
*print_files
;
790 /* The number of preceding context lines to show when we start
791 displaying a file for the first time. */
793 #define SHOW_PRECEDING_CONTEXT_LINES (5)
795 /* Skip ahead to a given line in a file, optionally printing each
799 skip_to_line
PARAMS ((struct print_file_list
*, unsigned int, boolean
));
802 skip_to_line (p
, line
, show
)
803 struct print_file_list
*p
;
807 while (p
->line
< line
)
811 if (fgets (buf
, sizeof buf
, p
->f
) == NULL
)
821 if (strchr (buf
, '\n') != NULL
)
826 /* Show the line number, or the source line, in a dissassembly
830 show_line (abfd
, section
, off
)
835 CONST
char *filename
;
836 CONST
char *functionname
;
839 if (! with_line_numbers
&& ! with_source_code
)
842 if (! bfd_find_nearest_line (abfd
, section
, syms
, off
, &filename
,
843 &functionname
, &line
))
846 if (filename
!= NULL
&& *filename
== '\0')
848 if (functionname
!= NULL
&& *functionname
== '\0')
851 if (with_line_numbers
)
853 if (functionname
!= NULL
854 && (prev_functionname
== NULL
855 || strcmp (functionname
, prev_functionname
) != 0))
856 printf ("%s():\n", functionname
);
857 if (line
> 0 && line
!= prev_line
)
858 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
865 struct print_file_list
**pp
, *p
;
867 for (pp
= &print_files
; *pp
!= NULL
; pp
= &(*pp
)->next
)
868 if (strcmp ((*pp
)->filename
, filename
) == 0)
874 if (p
!= print_files
)
878 /* We have reencountered a file name which we saw
879 earlier. This implies that either we are dumping out
880 code from an included file, or the same file was
881 linked in more than once. There are two common cases
882 of an included file: inline functions in a header
883 file, and a bison or flex skeleton file. In the
884 former case we want to just start printing (but we
885 back up a few lines to give context); in the latter
886 case we want to continue from where we left off. I
887 can't think of a good way to distinguish the cases,
888 so I used a heuristic based on the file name. */
889 if (strcmp (p
->filename
+ strlen (p
->filename
) - 2, ".h") != 0)
893 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
900 p
->f
= fopen (p
->filename
, "r");
904 skip_to_line (p
, l
, false);
906 if (print_files
->f
!= NULL
)
908 fclose (print_files
->f
);
909 print_files
->f
= NULL
;
915 skip_to_line (p
, line
, true);
917 p
->next
= print_files
;
925 f
= fopen (filename
, "r");
930 p
= ((struct print_file_list
*)
931 xmalloc (sizeof (struct print_file_list
)));
932 p
->filename
= xmalloc (strlen (filename
) + 1);
933 strcpy (p
->filename
, filename
);
937 if (print_files
!= NULL
&& print_files
->f
!= NULL
)
939 fclose (print_files
->f
);
940 print_files
->f
= NULL
;
942 p
->next
= print_files
;
945 l
= line
- SHOW_PRECEDING_CONTEXT_LINES
;
948 skip_to_line (p
, l
, false);
950 skip_to_line (p
, line
, true);
955 if (functionname
!= NULL
956 && (prev_functionname
== NULL
957 || strcmp (functionname
, prev_functionname
) != 0))
959 if (prev_functionname
!= NULL
)
960 free (prev_functionname
);
961 prev_functionname
= xmalloc (strlen (functionname
) + 1);
962 strcpy (prev_functionname
, functionname
);
965 if (line
> 0 && line
!= prev_line
)
969 /* Pseudo FILE object for strings. */
975 /* sprintf to a "stream" */
977 #ifdef ANSI_PROTOTYPES
979 objdump_sprintf (SFILE
*f
, const char *format
, ...)
984 va_start (args
, format
);
985 vsprintf (f
->current
, format
, args
);
986 f
->current
+= n
= strlen (f
->current
);
992 objdump_sprintf (va_alist
)
1001 f
= va_arg (args
, SFILE
*);
1002 format
= va_arg (args
, const char *);
1003 vsprintf (f
->current
, format
, args
);
1004 f
->current
+= n
= strlen (f
->current
);
1010 /* The number of zeroes we want to see before we start skipping them.
1011 The number is arbitrarily chosen. */
1013 #define SKIP_ZEROES (8)
1015 /* The number of zeroes to skip at the end of a section. If the
1016 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1017 SKIP_ZEROES, they will be disassembled. If there are fewer than
1018 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1019 attempt to avoid disassembling zeroes inserted by section
1022 #define SKIP_ZEROES_AT_END (3)
1024 /* Disassemble some data in memory between given values. */
1027 disassemble_bytes (info
, disassemble_fn
, insns
, data
, start
, stop
, relppp
,
1029 struct disassemble_info
*info
;
1030 disassembler_ftype disassemble_fn
;
1038 struct objdump_disasm_info
*aux
;
1042 int skip_addr_chars
;
1045 aux
= (struct objdump_disasm_info
*) info
->application_data
;
1051 bytes_per_line
= 16;
1053 /* Figure out how many characters to skip at the start of an
1054 address, to make the disassembly look nicer. We discard leading
1055 zeroes in chunks of 4, ensuring that there is always a leading
1057 skip_addr_chars
= 0;
1058 if (! prefix_addresses
)
1064 section
->vma
+ bfd_section_size (section
->owner
, section
));
1066 while (s
[0] == '0' && s
[1] == '0' && s
[2] == '0' && s
[3] == '0'
1069 skip_addr_chars
+= 4;
1074 info
->insn_info_valid
= 0;
1082 boolean need_nl
= false;
1084 /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1086 for (z
= i
; z
< stop
; z
++)
1089 if (! disassemble_zeroes
1090 && (info
->insn_info_valid
== 0
1091 || info
->branch_delay_insns
== 0)
1092 && (z
- i
>= SKIP_ZEROES
1093 || (z
== stop
&& z
- i
< SKIP_ZEROES_AT_END
)))
1097 /* If there are more nonzero bytes to follow, we only skip
1098 zeroes in multiples of 4, to try to avoid running over
1099 the start of an instruction which happens to start with
1102 z
= i
+ ((z
- i
) &~ 3);
1114 if (with_line_numbers
|| with_source_code
)
1115 show_line (aux
->abfd
, section
, i
);
1117 if (! prefix_addresses
)
1121 sprintf_vma (buf
, section
->vma
+ i
);
1122 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1126 printf ("%s:\t", buf
+ skip_addr_chars
);
1130 aux
->require_sec
= true;
1131 objdump_print_address (section
->vma
+ i
, info
);
1132 aux
->require_sec
= false;
1138 sfile
.buffer
= sfile
.current
= buf
;
1139 info
->fprintf_func
= (fprintf_ftype
) objdump_sprintf
;
1140 info
->stream
= (FILE *) &sfile
;
1141 info
->bytes_per_line
= 0;
1142 info
->bytes_per_chunk
= 0;
1143 bytes
= (*disassemble_fn
) (section
->vma
+ i
, info
);
1144 info
->fprintf_func
= (fprintf_ftype
) fprintf
;
1145 info
->stream
= stdout
;
1146 if (info
->bytes_per_line
!= 0)
1147 bytes_per_line
= info
->bytes_per_line
;
1155 bytes
= bytes_per_line
;
1156 if (i
+ bytes
> stop
)
1159 for (j
= i
; j
< i
+ bytes
; ++j
)
1161 if (isprint (data
[j
]))
1162 buf
[j
- i
] = data
[j
];
1169 if (! prefix_addresses
|| show_raw_insn
)
1173 /* If ! prefix_addresses and ! wide_output, we print
1174 bytes_per_line bytes per line. */
1176 if (pb
> bytes_per_line
&& ! prefix_addresses
&& ! wide_output
)
1177 pb
= bytes_per_line
;
1179 if (info
->bytes_per_chunk
)
1180 bpc
= info
->bytes_per_chunk
;
1184 for (j
= i
; j
< i
+ pb
; j
+= bpc
)
1187 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1189 for (k
= bpc
- 1; k
>= 0; k
--)
1190 printf ("%02x", (unsigned) data
[j
+ k
]);
1195 for (k
= 0; k
< bpc
; k
++)
1196 printf ("%02x", (unsigned) data
[j
+ k
]);
1201 for (; pb
< bytes_per_line
; pb
+= bpc
)
1205 for (k
= 0; k
< bpc
; k
++)
1210 /* Separate raw data from instruction by extra space. */
1219 if (! prefix_addresses
|| show_raw_insn
)
1229 sprintf_vma (buf
, section
->vma
+ j
);
1230 for (s
= buf
+ skip_addr_chars
; *s
== '0'; s
++)
1234 printf ("%s:\t", buf
+ skip_addr_chars
);
1236 pb
+= bytes_per_line
;
1239 for (; j
< i
+ pb
; j
+= bpc
)
1243 if (bpc
> 1 && info
->display_endian
== BFD_ENDIAN_LITTLE
)
1245 for (k
= bpc
- 1; k
>= 0; k
--)
1246 printf ("%02x", (unsigned) data
[j
+ k
]);
1251 for (k
= 0; k
< bpc
; k
++)
1252 printf ("%02x", (unsigned) data
[j
+ k
]);
1266 && (section
->flags
& SEC_RELOC
) != 0)
1268 while ((*relppp
) < relppend
1269 && ((**relppp
)->address
>= (bfd_vma
) i
1270 && (**relppp
)->address
< (bfd_vma
) i
+ bytes
))
1273 const char *sym_name
;
1282 objdump_print_value (section
->vma
+ q
->address
, info
, true);
1284 printf (": %s\t", q
->howto
->name
);
1286 if (q
->sym_ptr_ptr
!= NULL
1287 && *q
->sym_ptr_ptr
!= NULL
)
1289 sym_name
= bfd_asymbol_name (*q
->sym_ptr_ptr
);
1290 if (sym_name
== NULL
|| *sym_name
== '\0')
1294 sym_sec
= bfd_get_section (*q
->sym_ptr_ptr
);
1295 sym_name
= bfd_get_section_name (abfd
, sym_sec
);
1296 if (sym_name
== NULL
|| *sym_name
== '\0')
1297 sym_name
= "*unknown*";
1301 sym_name
= "*unknown*";
1303 printf ("%s", sym_name
);
1308 objdump_print_value (q
->addend
, info
, true);
1324 /* Disassemble the contents of an object file. */
1327 disassemble_data (abfd
)
1331 disassembler_ftype disassemble_fn
;
1332 struct disassemble_info disasm_info
;
1333 struct objdump_disasm_info aux
;
1337 prev_functionname
= NULL
;
1340 /* We make a copy of syms to sort. We don't want to sort syms
1341 because that will screw up the relocs. */
1342 sorted_syms
= (asymbol
**) xmalloc (symcount
* sizeof (asymbol
*));
1343 memcpy (sorted_syms
, syms
, symcount
* sizeof (asymbol
*));
1345 sorted_symcount
= remove_useless_symbols (sorted_syms
, symcount
);
1347 /* Sort the symbols into section and symbol order */
1348 qsort (sorted_syms
, sorted_symcount
, sizeof (asymbol
*), compare_symbols
);
1350 INIT_DISASSEMBLE_INFO(disasm_info
, stdout
, fprintf
);
1351 disasm_info
.application_data
= (PTR
) &aux
;
1353 aux
.require_sec
= false;
1354 disasm_info
.print_address_func
= objdump_print_address
;
1356 if (machine
!= (char *) NULL
)
1358 const bfd_arch_info_type
*info
= bfd_scan_arch (machine
);
1361 fprintf (stderr
, "%s: Can't use supplied machine %s\n",
1366 abfd
->arch_info
= info
;
1369 if (endian
!= BFD_ENDIAN_UNKNOWN
)
1371 struct bfd_target
*xvec
;
1373 xvec
= (struct bfd_target
*) xmalloc (sizeof (struct bfd_target
));
1374 memcpy (xvec
, abfd
->xvec
, sizeof (struct bfd_target
));
1375 xvec
->byteorder
= endian
;
1379 disassemble_fn
= disassembler (abfd
);
1380 if (!disassemble_fn
)
1382 fprintf (stderr
, "%s: Can't disassemble for architecture %s\n",
1384 bfd_printable_arch_mach (bfd_get_arch (abfd
), 0));
1388 disasm_info
.flavour
= bfd_get_flavour (abfd
);
1389 disasm_info
.arch
= bfd_get_arch (abfd
);
1390 disasm_info
.mach
= bfd_get_mach (abfd
);
1391 if (bfd_big_endian (abfd
))
1392 disasm_info
.endian
= BFD_ENDIAN_BIG
;
1393 else if (bfd_little_endian (abfd
))
1394 disasm_info
.endian
= BFD_ENDIAN_LITTLE
;
1396 /* ??? Aborting here seems too drastic. We could default to big or little
1398 disasm_info
.endian
= BFD_ENDIAN_UNKNOWN
;
1400 for (section
= abfd
->sections
;
1401 section
!= (asection
*) NULL
;
1402 section
= section
->next
)
1404 bfd_byte
*data
= NULL
;
1405 bfd_size_type datasize
= 0;
1406 arelent
**relbuf
= NULL
;
1407 arelent
**relpp
= NULL
;
1408 arelent
**relppend
= NULL
;
1411 if ((section
->flags
& SEC_LOAD
) == 0
1412 || (! disassemble_all
1414 && (section
->flags
& SEC_CODE
) == 0))
1416 if (only
!= (char *) NULL
&& strcmp (only
, section
->name
) != 0)
1420 && (section
->flags
& SEC_RELOC
) != 0)
1424 relsize
= bfd_get_reloc_upper_bound (abfd
, section
);
1426 bfd_fatal (bfd_get_filename (abfd
));
1432 relbuf
= (arelent
**) xmalloc (relsize
);
1433 relcount
= bfd_canonicalize_reloc (abfd
, section
, relbuf
, syms
);
1435 bfd_fatal (bfd_get_filename (abfd
));
1437 /* Sort the relocs by address. */
1438 qsort (relbuf
, relcount
, sizeof (arelent
*), compare_relocs
);
1441 relppend
= relpp
+ relcount
;
1445 printf ("Disassembly of section %s:\n", section
->name
);
1447 datasize
= bfd_get_section_size_before_reloc (section
);
1451 data
= (bfd_byte
*) xmalloc ((size_t) datasize
);
1453 bfd_get_section_contents (abfd
, section
, data
, 0, datasize
);
1456 disasm_info
.buffer
= data
;
1457 disasm_info
.buffer_vma
= section
->vma
;
1458 disasm_info
.buffer_length
= datasize
;
1459 if (start_address
== (bfd_vma
) -1
1460 || start_address
< disasm_info
.buffer_vma
)
1463 i
= start_address
- disasm_info
.buffer_vma
;
1464 if (stop_address
== (bfd_vma
) -1)
1468 if (stop_address
< disasm_info
.buffer_vma
)
1471 stop
= stop_address
- disasm_info
.buffer_vma
;
1472 if (stop
> disasm_info
.buffer_length
)
1473 stop
= disasm_info
.buffer_length
;
1476 if (prefix_addresses
)
1477 disassemble_bytes (&disasm_info
, disassemble_fn
, true, data
, i
, stop
,
1484 sym
= find_symbol_for_address (abfd
, section
, i
, true, &place
);
1492 disasm_info
.symbol
= sym
;
1495 objdump_print_addr_with_sym (abfd
, section
, sym
,
1505 while (place
< sorted_symcount
1506 && (sorted_syms
[place
]->section
!= section
1507 || (bfd_asymbol_value (sorted_syms
[place
])
1508 <= bfd_asymbol_value (sym
))))
1510 if (place
>= sorted_symcount
)
1513 nextsym
= sorted_syms
[place
];
1516 if (nextsym
== NULL
)
1520 nextstop
= bfd_asymbol_value (nextsym
) - section
->vma
;
1521 if (nextstop
> stop
)
1525 /* If a symbol is explicitly marked as being an object
1526 rather than a function, just dump the bytes without
1527 disassembling them. */
1530 || ((sym
->flags
& BSF_OBJECT
) == 0
1531 && (strstr (bfd_asymbol_name (sym
), "gnu_compiled")
1533 && (strstr (bfd_asymbol_name (sym
), "gcc2_compiled")
1535 || (sym
->flags
& BSF_FUNCTION
) != 0)
1540 disassemble_bytes (&disasm_info
, disassemble_fn
, insns
, data
, i
,
1541 nextstop
, &relpp
, relppend
);
1556 /* Define a table of stab values and print-strings. We wish the initializer
1557 could be a direct-mapped table, but instead we build one the first
1560 static void dump_section_stabs
PARAMS ((bfd
*abfd
, char *stabsect_name
,
1561 char *strsect_name
));
1563 /* Dump the stabs sections from an object file that has a section that
1564 uses Sun stabs encoding. */
1570 dump_section_stabs (abfd
, ".stab", ".stabstr");
1571 dump_section_stabs (abfd
, ".stab.excl", ".stab.exclstr");
1572 dump_section_stabs (abfd
, ".stab.index", ".stab.indexstr");
1573 dump_section_stabs (abfd
, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1576 static bfd_byte
*stabs
;
1577 static bfd_size_type stab_size
;
1579 static char *strtab
;
1580 static bfd_size_type stabstr_size
;
1582 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1583 and string table section STRSECT_NAME into `strtab'.
1584 If the section exists and was read, allocate the space and return true.
1585 Otherwise return false. */
1588 read_section_stabs (abfd
, stabsect_name
, strsect_name
)
1590 char *stabsect_name
;
1593 asection
*stabsect
, *stabstrsect
;
1595 stabsect
= bfd_get_section_by_name (abfd
, stabsect_name
);
1598 printf ("No %s section present\n\n", stabsect_name
);
1602 stabstrsect
= bfd_get_section_by_name (abfd
, strsect_name
);
1603 if (0 == stabstrsect
)
1605 fprintf (stderr
, "%s: %s has no %s section\n", program_name
,
1606 bfd_get_filename (abfd
), strsect_name
);
1610 stab_size
= bfd_section_size (abfd
, stabsect
);
1611 stabstr_size
= bfd_section_size (abfd
, stabstrsect
);
1613 stabs
= (bfd_byte
*) xmalloc (stab_size
);
1614 strtab
= (char *) xmalloc (stabstr_size
);
1616 if (! bfd_get_section_contents (abfd
, stabsect
, (PTR
) stabs
, 0, stab_size
))
1618 fprintf (stderr
, "%s: Reading %s section of %s failed: %s\n",
1619 program_name
, stabsect_name
, bfd_get_filename (abfd
),
1620 bfd_errmsg (bfd_get_error ()));
1626 if (! bfd_get_section_contents (abfd
, stabstrsect
, (PTR
) strtab
, 0,
1629 fprintf (stderr
, "%s: Reading %s section of %s failed: %s\n",
1630 program_name
, strsect_name
, bfd_get_filename (abfd
),
1631 bfd_errmsg (bfd_get_error ()));
1640 /* Stabs entries use a 12 byte format:
1641 4 byte string table index
1643 1 byte stab other field
1644 2 byte stab desc field
1646 FIXME: This will have to change for a 64 bit object format. */
1648 #define STRDXOFF (0)
1650 #define OTHEROFF (5)
1653 #define STABSIZE (12)
1655 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1656 using string table section STRSECT_NAME (in `strtab'). */
1659 print_section_stabs (abfd
, stabsect_name
, strsect_name
)
1661 char *stabsect_name
;
1665 unsigned file_string_table_offset
= 0, next_file_string_table_offset
= 0;
1666 bfd_byte
*stabp
, *stabs_end
;
1669 stabs_end
= stabp
+ stab_size
;
1671 printf ("Contents of %s section:\n\n", stabsect_name
);
1672 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1674 /* Loop through all symbols and print them.
1676 We start the index at -1 because there is a dummy symbol on
1677 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1679 for (i
= -1; stabp
< stabs_end
; stabp
+= STABSIZE
, i
++)
1683 unsigned char type
, other
;
1684 unsigned short desc
;
1687 strx
= bfd_h_get_32 (abfd
, stabp
+ STRDXOFF
);
1688 type
= bfd_h_get_8 (abfd
, stabp
+ TYPEOFF
);
1689 other
= bfd_h_get_8 (abfd
, stabp
+ OTHEROFF
);
1690 desc
= bfd_h_get_16 (abfd
, stabp
+ DESCOFF
);
1691 value
= bfd_h_get_32 (abfd
, stabp
+ VALOFF
);
1693 printf ("\n%-6d ", i
);
1694 /* Either print the stab name, or, if unnamed, print its number
1695 again (makes consistent formatting for tools like awk). */
1696 name
= bfd_get_stab_name (type
);
1698 printf ("%-6s", name
);
1699 else if (type
== N_UNDF
)
1702 printf ("%-6d", type
);
1703 printf (" %-6d %-6d ", other
, desc
);
1705 printf (" %-6lu", strx
);
1707 /* Symbols with type == 0 (N_UNDF) specify the length of the
1708 string table associated with this file. We use that info
1709 to know how to relocate the *next* file's string table indices. */
1713 file_string_table_offset
= next_file_string_table_offset
;
1714 next_file_string_table_offset
+= value
;
1718 /* Using the (possibly updated) string table offset, print the
1719 string (if any) associated with this symbol. */
1721 if ((strx
+ file_string_table_offset
) < stabstr_size
)
1722 printf (" %s", &strtab
[strx
+ file_string_table_offset
]);
1731 dump_section_stabs (abfd
, stabsect_name
, strsect_name
)
1733 char *stabsect_name
;
1738 /* Check for section names for which stabsect_name is a prefix, to
1739 handle .stab0, etc. */
1740 for (s
= abfd
->sections
;
1746 len
= strlen (stabsect_name
);
1748 /* If the prefix matches, and the files section name ends with a nul or a digit,
1749 then we match. Ie: we want either an exact match or a a section followed by
1751 if (strncmp (stabsect_name
, s
->name
, len
) == 0
1752 && (s
->name
[len
] == '\000' || isdigit (s
->name
[len
])))
1754 if (read_section_stabs (abfd
, s
->name
, strsect_name
))
1756 print_section_stabs (abfd
, s
->name
, strsect_name
);
1765 dump_bfd_header (abfd
)
1770 printf ("architecture: %s, ",
1771 bfd_printable_arch_mach (bfd_get_arch (abfd
),
1772 bfd_get_mach (abfd
)));
1773 printf ("flags 0x%08x:\n", abfd
->flags
);
1775 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1776 PF (HAS_RELOC
, "HAS_RELOC");
1777 PF (EXEC_P
, "EXEC_P");
1778 PF (HAS_LINENO
, "HAS_LINENO");
1779 PF (HAS_DEBUG
, "HAS_DEBUG");
1780 PF (HAS_SYMS
, "HAS_SYMS");
1781 PF (HAS_LOCALS
, "HAS_LOCALS");
1782 PF (DYNAMIC
, "DYNAMIC");
1783 PF (WP_TEXT
, "WP_TEXT");
1784 PF (D_PAGED
, "D_PAGED");
1785 PF (BFD_IS_RELAXABLE
, "BFD_IS_RELAXABLE");
1786 printf ("\nstart address 0x");
1787 printf_vma (abfd
->start_address
);
1792 dump_bfd_private_header (abfd
)
1795 bfd_print_private_bfd_data (abfd
, stdout
);
1804 if (!bfd_check_format_matches (abfd
, bfd_object
, &matching
))
1806 bfd_nonfatal (bfd_get_filename (abfd
));
1807 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1809 list_matching_formats (matching
);
1815 printf ("\n%s: file format %s\n", bfd_get_filename (abfd
),
1818 print_arelt_descr (stdout
, abfd
, true);
1819 if (dump_file_header
)
1820 dump_bfd_header (abfd
);
1821 if (dump_private_headers
)
1822 dump_bfd_private_header (abfd
);
1824 if (dump_section_headers
)
1825 dump_headers (abfd
);
1826 if (dump_symtab
|| dump_reloc_info
|| disassemble
|| dump_debugging
)
1828 syms
= slurp_symtab (abfd
);
1830 if (dump_dynamic_symtab
|| dump_dynamic_reloc_info
)
1832 dynsyms
= slurp_dynamic_symtab (abfd
);
1835 dump_symbols (abfd
, false);
1836 if (dump_dynamic_symtab
)
1837 dump_symbols (abfd
, true);
1838 if (dump_stab_section_info
)
1840 if (dump_reloc_info
&& ! disassemble
)
1842 if (dump_dynamic_reloc_info
)
1843 dump_dynamic_relocs (abfd
);
1844 if (dump_section_contents
)
1847 disassemble_data (abfd
);
1852 dhandle
= read_debugging_info (abfd
, syms
, symcount
);
1853 if (dhandle
!= NULL
)
1855 if (! print_debugging_info (stdout
, dhandle
))
1856 fprintf (stderr
, "%s: printing debugging information failed\n",
1857 bfd_get_filename (abfd
));
1873 display_file (filename
, target
)
1877 bfd
*file
, *arfile
= (bfd
*) NULL
;
1879 file
= bfd_openr (filename
, target
);
1882 bfd_nonfatal (filename
);
1886 if (bfd_check_format (file
, bfd_archive
) == true)
1888 bfd
*last_arfile
= NULL
;
1890 printf ("In archive %s:\n", bfd_get_filename (file
));
1893 bfd_set_error (bfd_error_no_error
);
1895 arfile
= bfd_openr_next_archived_file (file
, arfile
);
1898 if (bfd_get_error () != bfd_error_no_more_archived_files
)
1900 bfd_nonfatal (bfd_get_filename (file
));
1905 display_bfd (arfile
);
1907 if (last_arfile
!= NULL
)
1908 bfd_close (last_arfile
);
1909 last_arfile
= arfile
;
1912 if (last_arfile
!= NULL
)
1913 bfd_close (last_arfile
);
1921 /* Actually display the various requested regions */
1929 bfd_size_type datasize
= 0;
1931 bfd_size_type start
, stop
;
1933 for (section
= abfd
->sections
; section
!= NULL
; section
=
1938 if (only
== (char *) NULL
||
1939 strcmp (only
, section
->name
) == 0)
1941 if (section
->flags
& SEC_HAS_CONTENTS
)
1943 printf ("Contents of section %s:\n", section
->name
);
1945 if (bfd_section_size (abfd
, section
) == 0)
1947 data
= (bfd_byte
*) xmalloc ((size_t) bfd_section_size (abfd
, section
));
1948 datasize
= bfd_section_size (abfd
, section
);
1951 bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, bfd_section_size (abfd
, section
));
1953 if (start_address
== (bfd_vma
) -1
1954 || start_address
< section
->vma
)
1957 start
= start_address
- section
->vma
;
1958 if (stop_address
== (bfd_vma
) -1)
1959 stop
= bfd_section_size (abfd
, section
);
1962 if (stop_address
< section
->vma
)
1965 stop
= stop_address
- section
->vma
;
1966 if (stop
> bfd_section_size (abfd
, section
))
1967 stop
= bfd_section_size (abfd
, section
);
1969 for (i
= start
; i
< stop
; i
+= onaline
)
1973 printf (" %04lx ", (unsigned long int) (i
+ section
->vma
));
1974 for (j
= i
; j
< i
+ onaline
; j
++)
1977 printf ("%02x", (unsigned) (data
[j
]));
1985 for (j
= i
; j
< i
+ onaline
; j
++)
1990 printf ("%c", isprint (data
[j
]) ? data
[j
] : '.');
2000 /* Should perhaps share code and display with nm? */
2002 dump_symbols (abfd
, dynamic
)
2016 printf ("DYNAMIC SYMBOL TABLE:\n");
2024 printf ("SYMBOL TABLE:\n");
2027 for (count
= 0; count
< max
; count
++)
2031 bfd
*cur_bfd
= bfd_asymbol_bfd(*current
);
2034 bfd_print_symbol (cur_bfd
,
2036 *current
, bfd_print_symbol_all
);
2054 for (a
= abfd
->sections
; a
!= (asection
*) NULL
; a
= a
->next
)
2058 if (bfd_is_abs_section (a
))
2060 if (bfd_is_und_section (a
))
2062 if (bfd_is_com_section (a
))
2067 if (strcmp (only
, a
->name
))
2070 else if ((a
->flags
& SEC_RELOC
) == 0)
2073 relsize
= bfd_get_reloc_upper_bound (abfd
, a
);
2075 bfd_fatal (bfd_get_filename (abfd
));
2077 printf ("RELOCATION RECORDS FOR [%s]:", a
->name
);
2081 printf (" (none)\n\n");
2085 relpp
= (arelent
**) xmalloc (relsize
);
2086 relcount
= bfd_canonicalize_reloc (abfd
, a
, relpp
, syms
);
2088 bfd_fatal (bfd_get_filename (abfd
));
2089 else if (relcount
== 0)
2091 printf (" (none)\n\n");
2096 dump_reloc_set (abfd
, a
, relpp
, relcount
);
2105 dump_dynamic_relocs (abfd
)
2112 relsize
= bfd_get_dynamic_reloc_upper_bound (abfd
);
2114 bfd_fatal (bfd_get_filename (abfd
));
2116 printf ("DYNAMIC RELOCATION RECORDS");
2120 printf (" (none)\n\n");
2124 relpp
= (arelent
**) xmalloc (relsize
);
2125 relcount
= bfd_canonicalize_dynamic_reloc (abfd
, relpp
, dynsyms
);
2127 bfd_fatal (bfd_get_filename (abfd
));
2128 else if (relcount
== 0)
2130 printf (" (none)\n\n");
2135 dump_reloc_set (abfd
, (asection
*) NULL
, relpp
, relcount
);
2143 dump_reloc_set (abfd
, sec
, relpp
, relcount
)
2150 char *last_filename
, *last_functionname
;
2151 unsigned int last_line
;
2153 /* Get column headers lined up reasonably. */
2159 sprintf_vma (buf
, (bfd_vma
) -1);
2160 width
= strlen (buf
) - 7;
2162 printf ("OFFSET %*s TYPE %*s VALUE \n", width
, "", 12, "");
2165 last_filename
= NULL
;
2166 last_functionname
= NULL
;
2169 for (p
= relpp
; relcount
&& *p
!= (arelent
*) NULL
; p
++, relcount
--)
2172 const char *filename
, *functionname
;
2174 const char *sym_name
;
2175 const char *section_name
;
2177 if (start_address
!= (bfd_vma
) -1
2178 && q
->address
< start_address
)
2180 if (stop_address
!= (bfd_vma
) -1
2181 && q
->address
> stop_address
)
2184 if (with_line_numbers
2186 && bfd_find_nearest_line (abfd
, sec
, syms
, q
->address
,
2187 &filename
, &functionname
, &line
))
2189 if (functionname
!= NULL
2190 && (last_functionname
== NULL
2191 || strcmp (functionname
, last_functionname
) != 0))
2193 printf ("%s():\n", functionname
);
2194 if (last_functionname
!= NULL
)
2195 free (last_functionname
);
2196 last_functionname
= xstrdup (functionname
);
2199 && (line
!= last_line
2200 || (filename
!= NULL
2201 && last_filename
!= NULL
2202 && strcmp (filename
, last_filename
) != 0)))
2204 printf ("%s:%u\n", filename
== NULL
? "???" : filename
, line
);
2206 if (last_filename
!= NULL
)
2207 free (last_filename
);
2208 if (filename
== NULL
)
2209 last_filename
= NULL
;
2211 last_filename
= xstrdup (filename
);
2215 if (q
->sym_ptr_ptr
&& *q
->sym_ptr_ptr
)
2217 sym_name
= (*(q
->sym_ptr_ptr
))->name
;
2218 section_name
= (*(q
->sym_ptr_ptr
))->section
->name
;
2223 section_name
= NULL
;
2227 printf_vma (q
->address
);
2228 printf (" %-16s %s",
2234 if (section_name
== (CONST
char *) NULL
)
2235 section_name
= "*unknown*";
2236 printf_vma (q
->address
);
2237 printf (" %-16s [%s]",
2244 printf_vma (q
->addend
);
2250 /* The length of the longest architecture name + 1. */
2251 #define LONGEST_ARCH sizeof("rs6000:6000")
2254 endian_string (endian
)
2255 enum bfd_endian endian
;
2257 if (endian
== BFD_ENDIAN_BIG
)
2258 return "big endian";
2259 else if (endian
== BFD_ENDIAN_LITTLE
)
2260 return "little endian";
2262 return "endianness unknown";
2265 /* List the targets that BFD is configured to support, each followed
2266 by its endianness and the architectures it supports. */
2269 display_target_list ()
2271 extern bfd_target
*bfd_target_vector
[];
2275 dummy_name
= choose_temp_base ();
2276 for (t
= 0; bfd_target_vector
[t
]; t
++)
2278 bfd_target
*p
= bfd_target_vector
[t
];
2279 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2282 printf ("%s\n (header %s, data %s)\n", p
->name
,
2283 endian_string (p
->header_byteorder
),
2284 endian_string (p
->byteorder
));
2288 bfd_nonfatal (dummy_name
);
2292 if (! bfd_set_format (abfd
, bfd_object
))
2294 if (bfd_get_error () != bfd_error_invalid_operation
)
2295 bfd_nonfatal (p
->name
);
2299 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2300 if (bfd_set_arch_mach (abfd
, (enum bfd_architecture
) a
, 0))
2302 bfd_printable_arch_mach ((enum bfd_architecture
) a
, 0));
2304 unlink (dummy_name
);
2308 /* Print a table showing which architectures are supported for entries
2309 FIRST through LAST-1 of bfd_target_vector (targets across,
2310 architectures down). */
2313 display_info_table (first
, last
)
2317 extern bfd_target
*bfd_target_vector
[];
2321 /* Print heading of target names. */
2322 printf ("\n%*s", (int) LONGEST_ARCH
, " ");
2323 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2324 printf ("%s ", bfd_target_vector
[t
]->name
);
2327 dummy_name
= choose_temp_base ();
2328 for (a
= (int) bfd_arch_obscure
+ 1; a
< (int) bfd_arch_last
; a
++)
2329 if (strcmp (bfd_printable_arch_mach (a
, 0), "UNKNOWN!") != 0)
2331 printf ("%*s ", (int) LONGEST_ARCH
- 1,
2332 bfd_printable_arch_mach (a
, 0));
2333 for (t
= first
; t
< last
&& bfd_target_vector
[t
]; t
++)
2335 bfd_target
*p
= bfd_target_vector
[t
];
2337 bfd
*abfd
= bfd_openw (dummy_name
, p
->name
);
2341 bfd_nonfatal (p
->name
);
2347 if (! bfd_set_format (abfd
, bfd_object
))
2349 if (bfd_get_error () != bfd_error_invalid_operation
)
2350 bfd_nonfatal (p
->name
);
2357 if (! bfd_set_arch_mach (abfd
, a
, 0))
2362 printf ("%s ", p
->name
);
2365 int l
= strlen (p
->name
);
2373 unlink (dummy_name
);
2377 /* Print tables of all the target-architecture combinations that
2378 BFD has been configured to support. */
2381 display_target_tables ()
2384 extern bfd_target
*bfd_target_vector
[];
2386 extern char *getenv ();
2389 colum
= getenv ("COLUMNS");
2391 columns
= atoi (colum
);
2396 while (bfd_target_vector
[t
] != NULL
)
2400 wid
= LONGEST_ARCH
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2402 while (wid
< columns
&& bfd_target_vector
[t
] != NULL
)
2406 newwid
= wid
+ strlen (bfd_target_vector
[t
]->name
) + 1;
2407 if (newwid
>= columns
)
2412 display_info_table (oldt
, t
);
2419 printf ("BFD header file version %s\n", BFD_VERSION
);
2420 display_target_list ();
2421 display_target_tables ();
2430 char *target
= default_target
;
2431 boolean seenflag
= false;
2433 program_name
= *argv
;
2434 xmalloc_set_program_name (program_name
);
2436 START_PROGRESS (program_name
, 0);
2440 while ((c
= getopt_long (argc
, argv
, "pib:m:VdDlfahrRtTxsSj:wE:",
2441 long_options
, (int *) 0))
2444 if (c
!= 'l' && c
!= OPTION_START_ADDRESS
&& c
!= OPTION_STOP_ADDRESS
)
2449 break; /* we've been given a long option */
2457 with_line_numbers
= 1;
2463 dump_file_header
= true;
2466 formats_info
= true;
2469 dump_private_headers
= 1;
2472 dump_private_headers
= 1;
2474 dump_reloc_info
= 1;
2475 dump_file_header
= true;
2477 dump_section_headers
= 1;
2483 dump_dynamic_symtab
= 1;
2489 disassemble
= disassemble_all
= true;
2493 with_source_code
= true;
2496 dump_section_contents
= 1;
2499 dump_reloc_info
= 1;
2502 dump_dynamic_reloc_info
= 1;
2508 dump_section_headers
= 1;
2518 case OPTION_START_ADDRESS
:
2519 start_address
= parse_vma (optarg
, "--start-address");
2521 case OPTION_STOP_ADDRESS
:
2522 stop_address
= parse_vma (optarg
, "--stop-address");
2525 if (strcmp (optarg
, "B") == 0)
2526 endian
= BFD_ENDIAN_BIG
;
2527 else if (strcmp (optarg
, "L") == 0)
2528 endian
= BFD_ENDIAN_LITTLE
;
2531 fprintf (stderr
, "%s: unrecognized -E option\n", program_name
);
2536 if (strncmp (optarg
, "big", strlen (optarg
)) == 0)
2537 endian
= BFD_ENDIAN_BIG
;
2538 else if (strncmp (optarg
, "little", strlen (optarg
)) == 0)
2539 endian
= BFD_ENDIAN_LITTLE
;
2542 fprintf (stderr
, "%s: unrecognized --endian type `%s'\n",
2543 program_name
, optarg
);
2553 print_version ("objdump");
2555 if (seenflag
== false)
2565 display_file ("a.out", target
);
2567 for (; optind
< argc
;)
2568 display_file (argv
[optind
++], target
);
2571 END_PROGRESS (program_name
);