2002-06-07 H.J. Lu <hjl@gnu.org>
[binutils.git] / binutils / objdump.c
blob59a173161cc2352341cb07dd0705f97c9c2cc44f
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "bfd.h"
23 #include "progress.h"
24 #include "bucomm.h"
25 #include "getopt.h"
26 #include "safe-ctype.h"
27 #include "dis-asm.h"
28 #include "libiberty.h"
29 #include "demangle.h"
30 #include "debug.h"
31 #include "budbg.h"
33 /* Internal headers for the ELF .stab-dump code - sorry. */
34 #define BYTES_IN_WORD 32
35 #include "aout/aout64.h"
37 #ifdef NEED_DECLARATION_FPRINTF
38 /* This is needed by INIT_DISASSEMBLE_INFO. */
39 extern int fprintf PARAMS ((FILE *, const char *, ...));
40 #endif
42 /* Exit status. */
43 static int exit_status = 0;
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 int do_demangle; /* -C, --demangle */
63 static boolean disassemble; /* -d */
64 static boolean disassemble_all; /* -D */
65 static int disassemble_zeroes; /* --disassemble-zeroes */
66 static boolean formats_info; /* -i */
67 static char *only; /* -j secname */
68 static int wide_output; /* -w */
69 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
70 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
71 static int dump_debugging; /* --debugging */
72 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
73 static int file_start_context = 0; /* --file-start-context */
75 /* Extra info to pass to the disassembler address printing function. */
76 struct objdump_disasm_info {
77 bfd *abfd;
78 asection *sec;
79 boolean require_sec;
82 /* Architecture to disassemble for, or default if NULL. */
83 static char *machine = (char *) NULL;
85 /* Target specific options to the disassembler. */
86 static char *disassembler_options = (char *) NULL;
88 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
89 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
91 /* The symbol table. */
92 static asymbol **syms;
94 /* Number of symbols in `syms'. */
95 static long symcount = 0;
97 /* The sorted symbol table. */
98 static asymbol **sorted_syms;
100 /* Number of symbols in `sorted_syms'. */
101 static long sorted_symcount = 0;
103 /* The dynamic symbol table. */
104 static asymbol **dynsyms;
106 /* Number of symbols in `dynsyms'. */
107 static long dynsymcount = 0;
109 /* Static declarations. */
111 static void usage PARAMS ((FILE *, int));
112 static void nonfatal PARAMS ((const char *));
113 static void display_file PARAMS ((char *filename, char *target));
114 static void dump_section_header PARAMS ((bfd *, asection *, PTR));
115 static void dump_headers PARAMS ((bfd *));
116 static void dump_data PARAMS ((bfd *abfd));
117 static void dump_relocs PARAMS ((bfd *abfd));
118 static void dump_dynamic_relocs PARAMS ((bfd * abfd));
119 static void dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
120 static void dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
121 static void dump_bfd_header PARAMS ((bfd *));
122 static void dump_bfd_private_header PARAMS ((bfd *));
123 static void dump_bfd PARAMS ((bfd *));
124 static void display_bfd PARAMS ((bfd *abfd));
125 static void display_target_list PARAMS ((void));
126 static void display_info_table PARAMS ((int, int));
127 static void display_target_tables PARAMS ((void));
128 static void display_info PARAMS ((void));
129 static void objdump_print_value
130 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
131 static void objdump_print_symname
132 PARAMS ((bfd *, struct disassemble_info *, asymbol *));
133 static asymbol *find_symbol_for_address
134 PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
135 static void objdump_print_addr_with_sym
136 PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
137 struct disassemble_info *, boolean));
138 static void objdump_print_addr
139 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
140 static void objdump_print_address
141 PARAMS ((bfd_vma, struct disassemble_info *));
142 static int objdump_symbol_at_address
143 PARAMS ((bfd_vma, struct disassemble_info *));
144 static void show_line PARAMS ((bfd *, asection *, bfd_vma));
145 static void disassemble_bytes
146 PARAMS ((struct disassemble_info *, disassembler_ftype, boolean,
147 bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
148 static void disassemble_data PARAMS ((bfd *));
149 static const char *endian_string PARAMS ((enum bfd_endian));
150 static asymbol ** slurp_symtab PARAMS ((bfd *));
151 static asymbol ** slurp_dynamic_symtab PARAMS ((bfd *));
152 static long remove_useless_symbols PARAMS ((asymbol **, long));
153 static int compare_symbols PARAMS ((const PTR, const PTR));
154 static int compare_relocs PARAMS ((const PTR, const PTR));
155 static void dump_stabs PARAMS ((bfd *));
156 static boolean read_section_stabs PARAMS ((bfd *, const char *, const char *));
157 static void print_section_stabs PARAMS ((bfd *, const char *, const char *));
159 static void
160 usage (stream, status)
161 FILE *stream;
162 int status;
164 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
165 fprintf (stream, _(" Display information from object <file(s)>.\n"));
166 fprintf (stream, _(" At least one of the following switches must be given:\n"));
167 fprintf (stream, _("\
168 -a, --archive-headers Display archive header information\n\
169 -f, --file-headers Display the contents of the overall file header\n\
170 -p, --private-headers Display object format specific file header contents\n\
171 -h, --[section-]headers Display the contents of the section headers\n\
172 -x, --all-headers Display the contents of all headers\n\
173 -d, --disassemble Display assembler contents of executable sections\n\
174 -D, --disassemble-all Display assembler contents of all sections\n\
175 -S, --source Intermix source code with disassembly\n\
176 -s, --full-contents Display the full contents of all sections requested\n\
177 -g, --debugging Display debug information in object file\n\
178 -G, --stabs Display (in raw form) any STABS info in the file\n\
179 -t, --syms Display the contents of the symbol table(s)\n\
180 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
181 -r, --reloc Display the relocation entries in the file\n\
182 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
183 -v, --version Display this program's version number\n\
184 -i, --info List object formats and architectures supported\n\
185 -H, --help Display this information\n\
186 "));
187 if (status != 2)
189 fprintf (stream, _("\n The following switches are optional:\n"));
190 fprintf (stream, _("\
191 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
192 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
193 -j, --section=NAME Only display information for section NAME\n\
194 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
195 -EB --endian=big Assume big endian format when disassembling\n\
196 -EL --endian=little Assume little endian format when disassembling\n\
197 --file-start-context Include context from start of file (with -S)\n\
198 -l, --line-numbers Include line numbers and filenames in output\n\
199 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
200 The STYLE, if specified, can be `auto', 'gnu',\n\
201 'lucid', 'arm', 'hp', 'edg', or 'gnu-new-abi'\n\
202 -w, --wide Format output for more than 80 columns\n\
203 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
204 --start-address=ADDR Only process data whoes address is >= ADDR\n\
205 --stop-address=ADDR Only process data whoes address is <= ADDR\n\
206 --prefix-addresses Print complete address alongside disassembly\n\
207 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
208 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
209 \n"));
210 list_supported_targets (program_name, stream);
211 list_supported_architectures (program_name, stream);
213 disassembler_usage (stream);
215 if (status == 0)
216 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
217 exit (status);
220 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
222 #define OPTION_ENDIAN (150)
223 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
224 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
225 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
227 static struct option long_options[]=
229 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
230 {"all-headers", no_argument, NULL, 'x'},
231 {"private-headers", no_argument, NULL, 'p'},
232 {"architecture", required_argument, NULL, 'm'},
233 {"archive-headers", no_argument, NULL, 'a'},
234 {"debugging", no_argument, NULL, 'g'},
235 {"demangle", optional_argument, NULL, 'C'},
236 {"disassemble", no_argument, NULL, 'd'},
237 {"disassemble-all", no_argument, NULL, 'D'},
238 {"disassembler-options", required_argument, NULL, 'M'},
239 {"disassemble-zeroes", no_argument, NULL, 'z'},
240 {"dynamic-reloc", no_argument, NULL, 'R'},
241 {"dynamic-syms", no_argument, NULL, 'T'},
242 {"endian", required_argument, NULL, OPTION_ENDIAN},
243 {"file-headers", no_argument, NULL, 'f'},
244 {"file-start-context", no_argument, &file_start_context, 1},
245 {"full-contents", no_argument, NULL, 's'},
246 {"headers", no_argument, NULL, 'h'},
247 {"help", no_argument, NULL, 'H'},
248 {"info", no_argument, NULL, 'i'},
249 {"line-numbers", no_argument, NULL, 'l'},
250 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
251 {"prefix-addresses", no_argument, &prefix_addresses, 1},
252 {"reloc", no_argument, NULL, 'r'},
253 {"section", required_argument, NULL, 'j'},
254 {"section-headers", no_argument, NULL, 'h'},
255 {"show-raw-insn", no_argument, &show_raw_insn, 1},
256 {"source", no_argument, NULL, 'S'},
257 {"stabs", no_argument, NULL, 'G'},
258 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
259 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
260 {"syms", no_argument, NULL, 't'},
261 {"target", required_argument, NULL, 'b'},
262 {"version", no_argument, NULL, 'V'},
263 {"wide", no_argument, NULL, 'w'},
264 {0, no_argument, 0, 0}
267 static void
268 nonfatal (msg)
269 const char *msg;
271 bfd_nonfatal (msg);
272 exit_status = 1;
275 static void
276 dump_section_header (abfd, section, ignored)
277 bfd *abfd ATTRIBUTE_UNUSED;
278 asection *section;
279 PTR ignored ATTRIBUTE_UNUSED;
281 char *comma = "";
282 unsigned int opb = bfd_octets_per_byte (abfd);
284 printf ("%3d %-13s %08lx ", section->index,
285 bfd_get_section_name (abfd, section),
286 (unsigned long) bfd_section_size (abfd, section) / opb);
287 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
288 printf (" ");
289 bfd_printf_vma (abfd, section->lma);
290 printf (" %08lx 2**%u", (unsigned long) section->filepos,
291 bfd_get_section_alignment (abfd, section));
292 if (! wide_output)
293 printf ("\n ");
294 printf (" ");
296 #define PF(x, y) \
297 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
299 PF (SEC_HAS_CONTENTS, "CONTENTS");
300 PF (SEC_ALLOC, "ALLOC");
301 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
302 PF (SEC_LOAD, "LOAD");
303 PF (SEC_RELOC, "RELOC");
304 PF (SEC_READONLY, "READONLY");
305 PF (SEC_CODE, "CODE");
306 PF (SEC_DATA, "DATA");
307 PF (SEC_ROM, "ROM");
308 PF (SEC_DEBUGGING, "DEBUGGING");
309 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
310 PF (SEC_EXCLUDE, "EXCLUDE");
311 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
312 PF (SEC_BLOCK, "BLOCK");
313 PF (SEC_CLINK, "CLINK");
314 PF (SEC_SMALL_DATA, "SMALL_DATA");
315 PF (SEC_SHARED, "SHARED");
316 PF (SEC_ARCH_BIT_0, "ARCH_BIT_0");
317 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
319 if ((section->flags & SEC_LINK_ONCE) != 0)
321 const char *ls;
323 switch (section->flags & SEC_LINK_DUPLICATES)
325 default:
326 abort ();
327 case SEC_LINK_DUPLICATES_DISCARD:
328 ls = "LINK_ONCE_DISCARD";
329 break;
330 case SEC_LINK_DUPLICATES_ONE_ONLY:
331 ls = "LINK_ONCE_ONE_ONLY";
332 break;
333 case SEC_LINK_DUPLICATES_SAME_SIZE:
334 ls = "LINK_ONCE_SAME_SIZE";
335 break;
336 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
337 ls = "LINK_ONCE_SAME_CONTENTS";
338 break;
340 printf ("%s%s", comma, ls);
342 if (section->comdat != NULL)
343 printf (" (COMDAT %s %ld)", section->comdat->name,
344 section->comdat->symbol);
346 comma = ", ";
349 printf ("\n");
350 #undef PF
353 static void
354 dump_headers (abfd)
355 bfd *abfd;
357 printf (_("Sections:\n"));
359 #ifndef BFD64
360 printf (_("Idx Name Size VMA LMA File off Algn"));
361 #else
362 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
363 if (bfd_get_arch_size (abfd) == 32)
364 printf (_("Idx Name Size VMA LMA File off Algn"));
365 else
366 printf (_("Idx Name Size VMA LMA File off Algn"));
367 #endif
369 if (wide_output)
370 printf (_(" Flags"));
371 printf ("\n");
373 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
376 static asymbol **
377 slurp_symtab (abfd)
378 bfd *abfd;
380 asymbol **sy = (asymbol **) NULL;
381 long storage;
383 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
385 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
386 symcount = 0;
387 return NULL;
390 storage = bfd_get_symtab_upper_bound (abfd);
391 if (storage < 0)
392 bfd_fatal (bfd_get_filename (abfd));
393 if (storage)
394 sy = (asymbol **) xmalloc (storage);
396 symcount = bfd_canonicalize_symtab (abfd, sy);
397 if (symcount < 0)
398 bfd_fatal (bfd_get_filename (abfd));
399 if (symcount == 0)
400 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
401 return sy;
404 /* Read in the dynamic symbols. */
406 static asymbol **
407 slurp_dynamic_symtab (abfd)
408 bfd *abfd;
410 asymbol **sy = (asymbol **) NULL;
411 long storage;
413 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
414 if (storage < 0)
416 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
418 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
419 dynsymcount = 0;
420 return NULL;
423 bfd_fatal (bfd_get_filename (abfd));
425 if (storage)
426 sy = (asymbol **) xmalloc (storage);
428 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
429 if (dynsymcount < 0)
430 bfd_fatal (bfd_get_filename (abfd));
431 if (dynsymcount == 0)
432 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
433 return sy;
436 /* Filter out (in place) symbols that are useless for disassembly.
437 COUNT is the number of elements in SYMBOLS.
438 Return the number of useful symbols. */
440 static long
441 remove_useless_symbols (symbols, count)
442 asymbol **symbols;
443 long count;
445 register asymbol **in_ptr = symbols, **out_ptr = symbols;
447 while (--count >= 0)
449 asymbol *sym = *in_ptr++;
451 if (sym->name == NULL || sym->name[0] == '\0')
452 continue;
453 if (sym->flags & (BSF_DEBUGGING))
454 continue;
455 if (bfd_is_und_section (sym->section)
456 || bfd_is_com_section (sym->section))
457 continue;
459 *out_ptr++ = sym;
461 return out_ptr - symbols;
464 /* Sort symbols into value order. */
466 static int
467 compare_symbols (ap, bp)
468 const PTR ap;
469 const PTR bp;
471 const asymbol *a = *(const asymbol **)ap;
472 const asymbol *b = *(const asymbol **)bp;
473 const char *an, *bn;
474 size_t anl, bnl;
475 boolean af, bf;
476 flagword aflags, bflags;
478 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
479 return 1;
480 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
481 return -1;
483 if (a->section > b->section)
484 return 1;
485 else if (a->section < b->section)
486 return -1;
488 an = bfd_asymbol_name (a);
489 bn = bfd_asymbol_name (b);
490 anl = strlen (an);
491 bnl = strlen (bn);
493 /* The symbols gnu_compiled and gcc2_compiled convey no real
494 information, so put them after other symbols with the same value. */
496 af = (strstr (an, "gnu_compiled") != NULL
497 || strstr (an, "gcc2_compiled") != NULL);
498 bf = (strstr (bn, "gnu_compiled") != NULL
499 || strstr (bn, "gcc2_compiled") != NULL);
501 if (af && ! bf)
502 return 1;
503 if (! af && bf)
504 return -1;
506 /* We use a heuristic for the file name, to try to sort it after
507 more useful symbols. It may not work on non Unix systems, but it
508 doesn't really matter; the only difference is precisely which
509 symbol names get printed. */
511 #define file_symbol(s, sn, snl) \
512 (((s)->flags & BSF_FILE) != 0 \
513 || ((sn)[(snl) - 2] == '.' \
514 && ((sn)[(snl) - 1] == 'o' \
515 || (sn)[(snl) - 1] == 'a')))
517 af = file_symbol (a, an, anl);
518 bf = file_symbol (b, bn, bnl);
520 if (af && ! bf)
521 return 1;
522 if (! af && bf)
523 return -1;
525 /* Try to sort global symbols before local symbols before function
526 symbols before debugging symbols. */
528 aflags = a->flags;
529 bflags = b->flags;
531 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
533 if ((aflags & BSF_DEBUGGING) != 0)
534 return 1;
535 else
536 return -1;
538 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
540 if ((aflags & BSF_FUNCTION) != 0)
541 return -1;
542 else
543 return 1;
545 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
547 if ((aflags & BSF_LOCAL) != 0)
548 return 1;
549 else
550 return -1;
552 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
554 if ((aflags & BSF_GLOBAL) != 0)
555 return -1;
556 else
557 return 1;
560 /* Symbols that start with '.' might be section names, so sort them
561 after symbols that don't start with '.'. */
562 if (an[0] == '.' && bn[0] != '.')
563 return 1;
564 if (an[0] != '.' && bn[0] == '.')
565 return -1;
567 /* Finally, if we can't distinguish them in any other way, try to
568 get consistent results by sorting the symbols by name. */
569 return strcmp (an, bn);
572 /* Sort relocs into address order. */
574 static int
575 compare_relocs (ap, bp)
576 const PTR ap;
577 const PTR bp;
579 const arelent *a = *(const arelent **)ap;
580 const arelent *b = *(const arelent **)bp;
582 if (a->address > b->address)
583 return 1;
584 else if (a->address < b->address)
585 return -1;
587 /* So that associated relocations tied to the same address show up
588 in the correct order, we don't do any further sorting. */
589 if (a > b)
590 return 1;
591 else if (a < b)
592 return -1;
593 else
594 return 0;
597 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
599 static void
600 objdump_print_value (vma, info, skip_zeroes)
601 bfd_vma vma;
602 struct disassemble_info *info;
603 boolean skip_zeroes;
605 char buf[30];
606 char *p;
607 struct objdump_disasm_info *aux
608 = (struct objdump_disasm_info *) info->application_data;
610 bfd_sprintf_vma (aux->abfd, buf, vma);
611 if (! skip_zeroes)
612 p = buf;
613 else
615 for (p = buf; *p == '0'; ++p)
617 if (*p == '\0')
618 --p;
620 (*info->fprintf_func) (info->stream, "%s", p);
623 /* Print the name of a symbol. */
625 static void
626 objdump_print_symname (abfd, info, sym)
627 bfd *abfd;
628 struct disassemble_info *info;
629 asymbol *sym;
631 char *alloc;
632 const char *name;
633 const char *print;
635 alloc = NULL;
636 name = bfd_asymbol_name (sym);
637 if (! do_demangle || name[0] == '\0')
638 print = name;
639 else
641 /* Demangle the name. */
642 if (bfd_get_symbol_leading_char (abfd) == name[0])
643 ++name;
645 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
646 if (alloc == NULL)
647 print = name;
648 else
649 print = alloc;
652 if (info != NULL)
653 (*info->fprintf_func) (info->stream, "%s", print);
654 else
655 printf ("%s", print);
657 if (alloc != NULL)
658 free (alloc);
661 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
662 is true, then always require the symbol to be in the section. This
663 returns NULL if there is no suitable symbol. If PLACE is not NULL,
664 then *PLACE is set to the index of the symbol in sorted_syms. */
666 static asymbol *
667 find_symbol_for_address (abfd, sec, vma, require_sec, place)
668 bfd *abfd;
669 asection *sec;
670 bfd_vma vma;
671 boolean require_sec;
672 long *place;
674 /* @@ Would it speed things up to cache the last two symbols returned,
675 and maybe their address ranges? For many processors, only one memory
676 operand can be present at a time, so the 2-entry cache wouldn't be
677 constantly churned by code doing heavy memory accesses. */
679 /* Indices in `sorted_syms'. */
680 long min = 0;
681 long max = sorted_symcount;
682 long thisplace;
683 unsigned int opb = bfd_octets_per_byte (abfd);
685 if (sorted_symcount < 1)
686 return NULL;
688 /* Perform a binary search looking for the closest symbol to the
689 required value. We are searching the range (min, max]. */
690 while (min + 1 < max)
692 asymbol *sym;
694 thisplace = (max + min) / 2;
695 sym = sorted_syms[thisplace];
697 if (bfd_asymbol_value (sym) > vma)
698 max = thisplace;
699 else if (bfd_asymbol_value (sym) < vma)
700 min = thisplace;
701 else
703 min = thisplace;
704 break;
708 /* The symbol we want is now in min, the low end of the range we
709 were searching. If there are several symbols with the same
710 value, we want the first one. */
711 thisplace = min;
712 while (thisplace > 0
713 && (bfd_asymbol_value (sorted_syms[thisplace])
714 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
715 --thisplace;
717 /* If the file is relocateable, and the symbol could be from this
718 section, prefer a symbol from this section over symbols from
719 others, even if the other symbol's value might be closer.
721 Note that this may be wrong for some symbol references if the
722 sections have overlapping memory ranges, but in that case there's
723 no way to tell what's desired without looking at the relocation
724 table. */
726 if (sorted_syms[thisplace]->section != sec
727 && (require_sec
728 || ((abfd->flags & HAS_RELOC) != 0
729 && vma >= bfd_get_section_vma (abfd, sec)
730 && vma < (bfd_get_section_vma (abfd, sec)
731 + bfd_section_size (abfd, sec) / opb))))
733 long i;
735 for (i = thisplace + 1; i < sorted_symcount; i++)
737 if (bfd_asymbol_value (sorted_syms[i])
738 != bfd_asymbol_value (sorted_syms[thisplace]))
739 break;
741 --i;
742 for (; i >= 0; i--)
744 if (sorted_syms[i]->section == sec
745 && (i == 0
746 || sorted_syms[i - 1]->section != sec
747 || (bfd_asymbol_value (sorted_syms[i])
748 != bfd_asymbol_value (sorted_syms[i - 1]))))
750 thisplace = i;
751 break;
755 if (sorted_syms[thisplace]->section != sec)
757 /* We didn't find a good symbol with a smaller value.
758 Look for one with a larger value. */
759 for (i = thisplace + 1; i < sorted_symcount; i++)
761 if (sorted_syms[i]->section == sec)
763 thisplace = i;
764 break;
769 if (sorted_syms[thisplace]->section != sec
770 && (require_sec
771 || ((abfd->flags & HAS_RELOC) != 0
772 && vma >= bfd_get_section_vma (abfd, sec)
773 && vma < (bfd_get_section_vma (abfd, sec)
774 + bfd_section_size (abfd, sec)))))
776 /* There is no suitable symbol. */
777 return NULL;
781 if (place != NULL)
782 *place = thisplace;
784 return sorted_syms[thisplace];
787 /* Print an address to INFO symbolically. */
789 static void
790 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
791 bfd *abfd;
792 asection *sec;
793 asymbol *sym;
794 bfd_vma vma;
795 struct disassemble_info *info;
796 boolean skip_zeroes;
798 objdump_print_value (vma, info, skip_zeroes);
800 if (sym == NULL)
802 bfd_vma secaddr;
804 (*info->fprintf_func) (info->stream, " <%s",
805 bfd_get_section_name (abfd, sec));
806 secaddr = bfd_get_section_vma (abfd, sec);
807 if (vma < secaddr)
809 (*info->fprintf_func) (info->stream, "-0x");
810 objdump_print_value (secaddr - vma, info, true);
812 else if (vma > secaddr)
814 (*info->fprintf_func) (info->stream, "+0x");
815 objdump_print_value (vma - secaddr, info, true);
817 (*info->fprintf_func) (info->stream, ">");
819 else
821 (*info->fprintf_func) (info->stream, " <");
822 objdump_print_symname (abfd, info, sym);
823 if (bfd_asymbol_value (sym) > vma)
825 (*info->fprintf_func) (info->stream, "-0x");
826 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
828 else if (vma > bfd_asymbol_value (sym))
830 (*info->fprintf_func) (info->stream, "+0x");
831 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
833 (*info->fprintf_func) (info->stream, ">");
837 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
838 true, don't output leading zeroes. */
840 static void
841 objdump_print_addr (vma, info, skip_zeroes)
842 bfd_vma vma;
843 struct disassemble_info *info;
844 boolean skip_zeroes;
846 struct objdump_disasm_info *aux;
847 asymbol *sym;
849 if (sorted_symcount < 1)
851 (*info->fprintf_func) (info->stream, "0x");
852 objdump_print_value (vma, info, skip_zeroes);
853 return;
856 aux = (struct objdump_disasm_info *) info->application_data;
857 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
858 (long *) NULL);
859 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
860 skip_zeroes);
863 /* Print VMA to INFO. This function is passed to the disassembler
864 routine. */
866 static void
867 objdump_print_address (vma, info)
868 bfd_vma vma;
869 struct disassemble_info *info;
871 objdump_print_addr (vma, info, ! prefix_addresses);
874 /* Determine of the given address has a symbol associated with it. */
876 static int
877 objdump_symbol_at_address (vma, info)
878 bfd_vma vma;
879 struct disassemble_info * info;
881 struct objdump_disasm_info * aux;
882 asymbol * sym;
884 /* No symbols - do not bother checking. */
885 if (sorted_symcount < 1)
886 return 0;
888 aux = (struct objdump_disasm_info *) info->application_data;
889 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
890 (long *) NULL);
892 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
895 /* Hold the last function name and the last line number we displayed
896 in a disassembly. */
898 static char *prev_functionname;
899 static unsigned int prev_line;
901 /* We keep a list of all files that we have seen when doing a
902 dissassembly with source, so that we know how much of the file to
903 display. This can be important for inlined functions. */
905 struct print_file_list
907 struct print_file_list *next;
908 char *filename;
909 unsigned int line;
910 FILE *f;
913 static struct print_file_list *print_files;
915 /* The number of preceding context lines to show when we start
916 displaying a file for the first time. */
918 #define SHOW_PRECEDING_CONTEXT_LINES (5)
920 /* Skip ahead to a given line in a file, optionally printing each
921 line. */
923 static void
924 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
926 static void
927 skip_to_line (p, line, show)
928 struct print_file_list *p;
929 unsigned int line;
930 boolean show;
932 while (p->line < line)
934 char buf[100];
936 if (fgets (buf, sizeof buf, p->f) == NULL)
938 fclose (p->f);
939 p->f = NULL;
940 break;
943 if (show)
944 printf ("%s", buf);
946 if (strchr (buf, '\n') != NULL)
947 ++p->line;
951 /* Show the line number, or the source line, in a dissassembly
952 listing. */
954 static void
955 show_line (abfd, section, addr_offset)
956 bfd *abfd;
957 asection *section;
958 bfd_vma addr_offset;
960 CONST char *filename;
961 CONST char *functionname;
962 unsigned int line;
964 if (! with_line_numbers && ! with_source_code)
965 return;
967 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
968 &functionname, &line))
969 return;
971 if (filename != NULL && *filename == '\0')
972 filename = NULL;
973 if (functionname != NULL && *functionname == '\0')
974 functionname = NULL;
976 if (with_line_numbers)
978 if (functionname != NULL
979 && (prev_functionname == NULL
980 || strcmp (functionname, prev_functionname) != 0))
981 printf ("%s():\n", functionname);
982 if (line > 0 && line != prev_line)
983 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
986 if (with_source_code
987 && filename != NULL
988 && line > 0)
990 struct print_file_list **pp, *p;
992 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
993 if (strcmp ((*pp)->filename, filename) == 0)
994 break;
995 p = *pp;
997 if (p != NULL)
999 if (p != print_files)
1001 int l;
1003 /* We have reencountered a file name which we saw
1004 earlier. This implies that either we are dumping out
1005 code from an included file, or the same file was
1006 linked in more than once. There are two common cases
1007 of an included file: inline functions in a header
1008 file, and a bison or flex skeleton file. In the
1009 former case we want to just start printing (but we
1010 back up a few lines to give context); in the latter
1011 case we want to continue from where we left off. I
1012 can't think of a good way to distinguish the cases,
1013 so I used a heuristic based on the file name. */
1014 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1015 l = p->line;
1016 else
1018 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1019 if (l < 0)
1020 l = 0;
1023 if (p->f == NULL)
1025 p->f = fopen (p->filename, "r");
1026 p->line = 0;
1028 if (p->f != NULL)
1029 skip_to_line (p, l, false);
1031 if (print_files->f != NULL)
1033 fclose (print_files->f);
1034 print_files->f = NULL;
1038 if (p->f != NULL)
1040 skip_to_line (p, line, true);
1041 *pp = p->next;
1042 p->next = print_files;
1043 print_files = p;
1046 else
1048 FILE *f;
1050 f = fopen (filename, "r");
1051 if (f != NULL)
1053 int l;
1055 p = ((struct print_file_list *)
1056 xmalloc (sizeof (struct print_file_list)));
1057 p->filename = xmalloc (strlen (filename) + 1);
1058 strcpy (p->filename, filename);
1059 p->line = 0;
1060 p->f = f;
1062 if (print_files != NULL && print_files->f != NULL)
1064 fclose (print_files->f);
1065 print_files->f = NULL;
1067 p->next = print_files;
1068 print_files = p;
1070 if (file_start_context)
1071 l = 0;
1072 else
1073 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1074 if (l < 0)
1075 l = 0;
1076 skip_to_line (p, l, false);
1077 if (p->f != NULL)
1078 skip_to_line (p, line, true);
1083 if (functionname != NULL
1084 && (prev_functionname == NULL
1085 || strcmp (functionname, prev_functionname) != 0))
1087 if (prev_functionname != NULL)
1088 free (prev_functionname);
1089 prev_functionname = xmalloc (strlen (functionname) + 1);
1090 strcpy (prev_functionname, functionname);
1093 if (line > 0 && line != prev_line)
1094 prev_line = line;
1097 /* Pseudo FILE object for strings. */
1098 typedef struct
1100 char *buffer;
1101 size_t size;
1102 char *current;
1103 } SFILE;
1105 /* sprintf to a "stream" */
1107 static int
1108 objdump_sprintf VPARAMS ((SFILE *f, const char *format, ...))
1110 char *buf;
1111 size_t n;
1113 VA_OPEN (args, format);
1114 VA_FIXEDARG (args, SFILE *, f);
1115 VA_FIXEDARG (args, const char *, format);
1117 vasprintf (&buf, format, args);
1119 if (buf == NULL)
1121 va_end (args);
1122 fatal (_("Out of virtual memory"));
1125 n = strlen (buf);
1127 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1129 size_t curroff;
1131 curroff = f->current - f->buffer;
1132 f->size *= 2;
1133 f->buffer = xrealloc (f->buffer, f->size);
1134 f->current = f->buffer + curroff;
1137 memcpy (f->current, buf, n);
1138 f->current += n;
1139 f->current[0] = '\0';
1141 free (buf);
1143 VA_CLOSE (args);
1144 return n;
1147 /* The number of zeroes we want to see before we start skipping them.
1148 The number is arbitrarily chosen. */
1150 #ifndef SKIP_ZEROES
1151 #define SKIP_ZEROES (8)
1152 #endif
1154 /* The number of zeroes to skip at the end of a section. If the
1155 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1156 SKIP_ZEROES, they will be disassembled. If there are fewer than
1157 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1158 attempt to avoid disassembling zeroes inserted by section
1159 alignment. */
1161 #ifndef SKIP_ZEROES_AT_END
1162 #define SKIP_ZEROES_AT_END (3)
1163 #endif
1165 /* Disassemble some data in memory between given values. */
1167 static void
1168 disassemble_bytes (info, disassemble_fn, insns, data,
1169 start_offset, stop_offset, relppp,
1170 relppend)
1171 struct disassemble_info *info;
1172 disassembler_ftype disassemble_fn;
1173 boolean insns;
1174 bfd_byte *data;
1175 bfd_vma start_offset;
1176 bfd_vma stop_offset;
1177 arelent ***relppp;
1178 arelent **relppend;
1180 struct objdump_disasm_info *aux;
1181 asection *section;
1182 int octets_per_line;
1183 boolean done_dot;
1184 int skip_addr_chars;
1185 bfd_vma addr_offset;
1186 int opb = info->octets_per_byte;
1188 aux = (struct objdump_disasm_info *) info->application_data;
1189 section = aux->sec;
1191 if (insns)
1192 octets_per_line = 4;
1193 else
1194 octets_per_line = 16;
1196 /* Figure out how many characters to skip at the start of an
1197 address, to make the disassembly look nicer. We discard leading
1198 zeroes in chunks of 4, ensuring that there is always a leading
1199 zero remaining. */
1200 skip_addr_chars = 0;
1201 if (! prefix_addresses)
1203 char buf[30];
1204 char *s;
1206 bfd_sprintf_vma
1207 (aux->abfd, buf,
1208 (section->vma
1209 + bfd_section_size (section->owner, section) / opb));
1210 s = buf;
1211 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1212 && s[4] == '0')
1214 skip_addr_chars += 4;
1215 s += 4;
1219 info->insn_info_valid = 0;
1221 done_dot = false;
1222 addr_offset = start_offset;
1223 while (addr_offset < stop_offset)
1225 bfd_vma z;
1226 int octets = 0;
1227 boolean need_nl = false;
1229 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1230 print `...'. */
1231 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1232 if (data[z] != 0)
1233 break;
1234 if (! disassemble_zeroes
1235 && (info->insn_info_valid == 0
1236 || info->branch_delay_insns == 0)
1237 && (z - addr_offset * opb >= SKIP_ZEROES
1238 || (z == stop_offset * opb &&
1239 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1241 printf ("\t...\n");
1243 /* If there are more nonzero octets to follow, we only skip
1244 zeroes in multiples of 4, to try to avoid running over
1245 the start of an instruction which happens to start with
1246 zero. */
1247 if (z != stop_offset * opb)
1248 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1250 octets = z - addr_offset * opb;
1252 else
1254 char buf[50];
1255 SFILE sfile;
1256 int bpc = 0;
1257 int pb = 0;
1259 done_dot = false;
1261 if (with_line_numbers || with_source_code)
1262 /* The line number tables will refer to unadjusted
1263 section VMAs, so we must undo any VMA modifications
1264 when calling show_line. */
1265 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
1267 if (! prefix_addresses)
1269 char *s;
1271 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1272 for (s = buf + skip_addr_chars; *s == '0'; s++)
1273 *s = ' ';
1274 if (*s == '\0')
1275 *--s = '0';
1276 printf ("%s:\t", buf + skip_addr_chars);
1278 else
1280 aux->require_sec = true;
1281 objdump_print_address (section->vma + addr_offset, info);
1282 aux->require_sec = false;
1283 putchar (' ');
1286 if (insns)
1288 sfile.size = 120;
1289 sfile.buffer = xmalloc (sfile.size);
1290 sfile.current = sfile.buffer;
1291 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1292 info->stream = (FILE *) &sfile;
1293 info->bytes_per_line = 0;
1294 info->bytes_per_chunk = 0;
1296 #ifdef DISASSEMBLER_NEEDS_RELOCS
1297 /* FIXME: This is wrong. It tests the number of octets
1298 in the last instruction, not the current one. */
1299 if (*relppp < relppend
1300 && (**relppp)->address >= addr_offset
1301 && (**relppp)->address <= addr_offset + octets / opb)
1302 info->flags = INSN_HAS_RELOC;
1303 else
1304 #endif
1305 info->flags = 0;
1307 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1308 info->fprintf_func = (fprintf_ftype) fprintf;
1309 info->stream = stdout;
1310 if (info->bytes_per_line != 0)
1311 octets_per_line = info->bytes_per_line;
1312 if (octets < 0)
1314 if (sfile.current != sfile.buffer)
1315 printf ("%s\n", sfile.buffer);
1316 free (sfile.buffer);
1317 break;
1320 else
1322 bfd_vma j;
1324 octets = octets_per_line;
1325 if (addr_offset + octets / opb > stop_offset)
1326 octets = (stop_offset - addr_offset) * opb;
1328 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1330 if (ISPRINT (data[j]))
1331 buf[j - addr_offset * opb] = data[j];
1332 else
1333 buf[j - addr_offset * opb] = '.';
1335 buf[j - addr_offset * opb] = '\0';
1338 if (prefix_addresses
1339 ? show_raw_insn > 0
1340 : show_raw_insn >= 0)
1342 bfd_vma j;
1344 /* If ! prefix_addresses and ! wide_output, we print
1345 octets_per_line octets per line. */
1346 pb = octets;
1347 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1348 pb = octets_per_line;
1350 if (info->bytes_per_chunk)
1351 bpc = info->bytes_per_chunk;
1352 else
1353 bpc = 1;
1355 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1357 int k;
1358 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1360 for (k = bpc - 1; k >= 0; k--)
1361 printf ("%02x", (unsigned) data[j + k]);
1362 putchar (' ');
1364 else
1366 for (k = 0; k < bpc; k++)
1367 printf ("%02x", (unsigned) data[j + k]);
1368 putchar (' ');
1372 for (; pb < octets_per_line; pb += bpc)
1374 int k;
1376 for (k = 0; k < bpc; k++)
1377 printf (" ");
1378 putchar (' ');
1381 /* Separate raw data from instruction by extra space. */
1382 if (insns)
1383 putchar ('\t');
1384 else
1385 printf (" ");
1388 if (! insns)
1389 printf ("%s", buf);
1390 else
1392 printf ("%s", sfile.buffer);
1393 free (sfile.buffer);
1396 if (prefix_addresses
1397 ? show_raw_insn > 0
1398 : show_raw_insn >= 0)
1400 while (pb < octets)
1402 bfd_vma j;
1403 char *s;
1405 putchar ('\n');
1406 j = addr_offset * opb + pb;
1408 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1409 for (s = buf + skip_addr_chars; *s == '0'; s++)
1410 *s = ' ';
1411 if (*s == '\0')
1412 *--s = '0';
1413 printf ("%s:\t", buf + skip_addr_chars);
1415 pb += octets_per_line;
1416 if (pb > octets)
1417 pb = octets;
1418 for (; j < addr_offset * opb + pb; j += bpc)
1420 int k;
1422 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1424 for (k = bpc - 1; k >= 0; k--)
1425 printf ("%02x", (unsigned) data[j + k]);
1426 putchar (' ');
1428 else
1430 for (k = 0; k < bpc; k++)
1431 printf ("%02x", (unsigned) data[j + k]);
1432 putchar (' ');
1438 if (!wide_output)
1439 putchar ('\n');
1440 else
1441 need_nl = true;
1444 if ((section->flags & SEC_RELOC) != 0
1445 #ifndef DISASSEMBLER_NEEDS_RELOCS
1446 && dump_reloc_info
1447 #endif
1450 while ((*relppp) < relppend
1451 && ((**relppp)->address >= (bfd_vma) addr_offset
1452 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1453 #ifdef DISASSEMBLER_NEEDS_RELOCS
1454 if (! dump_reloc_info)
1455 ++(*relppp);
1456 else
1457 #endif
1459 arelent *q;
1461 q = **relppp;
1463 if (wide_output)
1464 putchar ('\t');
1465 else
1466 printf ("\t\t\t");
1468 objdump_print_value (section->vma + q->address, info, true);
1470 printf (": %s\t", q->howto->name);
1472 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1473 printf ("*unknown*");
1474 else
1476 const char *sym_name;
1478 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1479 if (sym_name != NULL && *sym_name != '\0')
1480 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1481 else
1483 asection *sym_sec;
1485 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1486 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1487 if (sym_name == NULL || *sym_name == '\0')
1488 sym_name = "*unknown*";
1489 printf ("%s", sym_name);
1493 if (q->addend)
1495 printf ("+0x");
1496 objdump_print_value (q->addend, info, true);
1499 printf ("\n");
1500 need_nl = false;
1501 ++(*relppp);
1505 if (need_nl)
1506 printf ("\n");
1508 addr_offset += octets / opb;
1512 /* Disassemble the contents of an object file. */
1514 static void
1515 disassemble_data (abfd)
1516 bfd *abfd;
1518 unsigned long addr_offset;
1519 disassembler_ftype disassemble_fn;
1520 struct disassemble_info disasm_info;
1521 struct objdump_disasm_info aux;
1522 asection *section;
1523 unsigned int opb;
1525 print_files = NULL;
1526 prev_functionname = NULL;
1527 prev_line = -1;
1529 /* We make a copy of syms to sort. We don't want to sort syms
1530 because that will screw up the relocs. */
1531 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1532 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1534 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1536 /* Sort the symbols into section and symbol order */
1537 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1539 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1540 disasm_info.application_data = (PTR) &aux;
1541 aux.abfd = abfd;
1542 aux.require_sec = false;
1543 disasm_info.print_address_func = objdump_print_address;
1544 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1546 if (machine != (char *) NULL)
1548 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1549 if (info == NULL)
1551 fatal (_("Can't use supplied machine %s"), machine);
1553 abfd->arch_info = info;
1556 if (endian != BFD_ENDIAN_UNKNOWN)
1558 struct bfd_target *xvec;
1560 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1561 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1562 xvec->byteorder = endian;
1563 abfd->xvec = xvec;
1566 disassemble_fn = disassembler (abfd);
1567 if (!disassemble_fn)
1569 non_fatal (_("Can't disassemble for architecture %s\n"),
1570 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1571 exit_status = 1;
1572 return;
1575 opb = bfd_octets_per_byte (abfd);
1577 disasm_info.flavour = bfd_get_flavour (abfd);
1578 disasm_info.arch = bfd_get_arch (abfd);
1579 disasm_info.mach = bfd_get_mach (abfd);
1580 disasm_info.disassembler_options = disassembler_options;
1581 disasm_info.octets_per_byte = opb;
1583 if (bfd_big_endian (abfd))
1584 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1585 else if (bfd_little_endian (abfd))
1586 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1587 else
1588 /* ??? Aborting here seems too drastic. We could default to big or little
1589 instead. */
1590 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1592 for (section = abfd->sections;
1593 section != (asection *) NULL;
1594 section = section->next)
1596 bfd_byte *data = NULL;
1597 bfd_size_type datasize = 0;
1598 arelent **relbuf = NULL;
1599 arelent **relpp = NULL;
1600 arelent **relppend = NULL;
1601 unsigned long stop_offset;
1602 asymbol *sym = NULL;
1603 long place = 0;
1605 if ((section->flags & SEC_LOAD) == 0
1606 || (! disassemble_all
1607 && only == NULL
1608 && (section->flags & SEC_CODE) == 0))
1609 continue;
1610 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1611 continue;
1613 if ((section->flags & SEC_RELOC) != 0
1614 #ifndef DISASSEMBLER_NEEDS_RELOCS
1615 && dump_reloc_info
1616 #endif
1619 long relsize;
1621 relsize = bfd_get_reloc_upper_bound (abfd, section);
1622 if (relsize < 0)
1623 bfd_fatal (bfd_get_filename (abfd));
1625 if (relsize > 0)
1627 long relcount;
1629 relbuf = (arelent **) xmalloc (relsize);
1630 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1631 if (relcount < 0)
1632 bfd_fatal (bfd_get_filename (abfd));
1634 /* Sort the relocs by address. */
1635 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1637 relpp = relbuf;
1638 relppend = relpp + relcount;
1640 /* Skip over the relocs belonging to addresses below the
1641 start address. */
1642 if (start_address != (bfd_vma) -1)
1644 while (relpp < relppend
1645 && (*relpp)->address < start_address)
1646 ++relpp;
1651 printf (_("Disassembly of section %s:\n"), section->name);
1653 datasize = bfd_get_section_size_before_reloc (section);
1654 if (datasize == 0)
1655 continue;
1657 data = (bfd_byte *) xmalloc ((size_t) datasize);
1659 bfd_get_section_contents (abfd, section, data, 0, datasize);
1661 aux.sec = section;
1662 disasm_info.buffer = data;
1663 disasm_info.buffer_vma = section->vma;
1664 disasm_info.buffer_length = datasize;
1665 disasm_info.section = section;
1666 if (start_address == (bfd_vma) -1
1667 || start_address < disasm_info.buffer_vma)
1668 addr_offset = 0;
1669 else
1670 addr_offset = start_address - disasm_info.buffer_vma;
1671 if (stop_address == (bfd_vma) -1)
1672 stop_offset = datasize / opb;
1673 else
1675 if (stop_address < disasm_info.buffer_vma)
1676 stop_offset = 0;
1677 else
1678 stop_offset = stop_address - disasm_info.buffer_vma;
1679 if (stop_offset > disasm_info.buffer_length / opb)
1680 stop_offset = disasm_info.buffer_length / opb;
1683 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1684 true, &place);
1686 while (addr_offset < stop_offset)
1688 asymbol *nextsym;
1689 unsigned long nextstop_offset;
1690 boolean insns;
1692 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1694 int x;
1696 for (x = place;
1697 (x < sorted_symcount
1698 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1699 ++x)
1700 continue;
1701 disasm_info.symbols = & sorted_syms[place];
1702 disasm_info.num_symbols = x - place;
1704 else
1705 disasm_info.symbols = NULL;
1707 if (! prefix_addresses)
1709 printf ("\n");
1710 objdump_print_addr_with_sym (abfd, section, sym,
1711 section->vma + addr_offset,
1712 &disasm_info,
1713 false);
1714 printf (":\n");
1717 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1718 nextsym = sym;
1719 else if (sym == NULL)
1720 nextsym = NULL;
1721 else
1723 /* Search forward for the next appropriate symbol in
1724 SECTION. Note that all the symbols are sorted
1725 together into one big array, and that some sections
1726 may have overlapping addresses. */
1727 while (place < sorted_symcount
1728 && (sorted_syms[place]->section != section
1729 || (bfd_asymbol_value (sorted_syms[place])
1730 <= bfd_asymbol_value (sym))))
1731 ++place;
1732 if (place >= sorted_symcount)
1733 nextsym = NULL;
1734 else
1735 nextsym = sorted_syms[place];
1738 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1740 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1741 if (nextstop_offset > stop_offset)
1742 nextstop_offset = stop_offset;
1744 else if (nextsym == NULL)
1745 nextstop_offset = stop_offset;
1746 else
1748 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1749 if (nextstop_offset > stop_offset)
1750 nextstop_offset = stop_offset;
1753 /* If a symbol is explicitly marked as being an object
1754 rather than a function, just dump the bytes without
1755 disassembling them. */
1756 if (disassemble_all
1757 || sym == NULL
1758 || bfd_asymbol_value (sym) > section->vma + addr_offset
1759 || ((sym->flags & BSF_OBJECT) == 0
1760 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1761 == NULL)
1762 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1763 == NULL))
1764 || (sym->flags & BSF_FUNCTION) != 0)
1765 insns = true;
1766 else
1767 insns = false;
1769 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1770 addr_offset, nextstop_offset, &relpp, relppend);
1772 addr_offset = nextstop_offset;
1773 sym = nextsym;
1776 free (data);
1777 if (relbuf != NULL)
1778 free (relbuf);
1780 free (sorted_syms);
1784 /* Define a table of stab values and print-strings. We wish the initializer
1785 could be a direct-mapped table, but instead we build one the first
1786 time we need it. */
1788 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1789 char *strsect_name));
1791 /* Dump the stabs sections from an object file that has a section that
1792 uses Sun stabs encoding. */
1794 static void
1795 dump_stabs (abfd)
1796 bfd *abfd;
1798 dump_section_stabs (abfd, ".stab", ".stabstr");
1799 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1800 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1801 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1804 static bfd_byte *stabs;
1805 static bfd_size_type stab_size;
1807 static char *strtab;
1808 static bfd_size_type stabstr_size;
1810 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1811 and string table section STRSECT_NAME into `strtab'.
1812 If the section exists and was read, allocate the space and return true.
1813 Otherwise return false. */
1815 static boolean
1816 read_section_stabs (abfd, stabsect_name, strsect_name)
1817 bfd *abfd;
1818 const char *stabsect_name;
1819 const char *strsect_name;
1821 asection *stabsect, *stabstrsect;
1823 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1824 if (0 == stabsect)
1826 printf (_("No %s section present\n\n"), stabsect_name);
1827 return false;
1830 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1831 if (0 == stabstrsect)
1833 non_fatal (_("%s has no %s section"),
1834 bfd_get_filename (abfd), strsect_name);
1835 exit_status = 1;
1836 return false;
1839 stab_size = bfd_section_size (abfd, stabsect);
1840 stabstr_size = bfd_section_size (abfd, stabstrsect);
1842 stabs = (bfd_byte *) xmalloc (stab_size);
1843 strtab = (char *) xmalloc (stabstr_size);
1845 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1847 non_fatal (_("Reading %s section of %s failed: %s"),
1848 stabsect_name, bfd_get_filename (abfd),
1849 bfd_errmsg (bfd_get_error ()));
1850 free (stabs);
1851 free (strtab);
1852 exit_status = 1;
1853 return false;
1856 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1857 stabstr_size))
1859 non_fatal (_("Reading %s section of %s failed: %s\n"),
1860 strsect_name, bfd_get_filename (abfd),
1861 bfd_errmsg (bfd_get_error ()));
1862 free (stabs);
1863 free (strtab);
1864 exit_status = 1;
1865 return false;
1868 return true;
1871 /* Stabs entries use a 12 byte format:
1872 4 byte string table index
1873 1 byte stab type
1874 1 byte stab other field
1875 2 byte stab desc field
1876 4 byte stab value
1877 FIXME: This will have to change for a 64 bit object format. */
1879 #define STRDXOFF (0)
1880 #define TYPEOFF (4)
1881 #define OTHEROFF (5)
1882 #define DESCOFF (6)
1883 #define VALOFF (8)
1884 #define STABSIZE (12)
1886 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1887 using string table section STRSECT_NAME (in `strtab'). */
1889 static void
1890 print_section_stabs (abfd, stabsect_name, strsect_name)
1891 bfd *abfd;
1892 const char *stabsect_name;
1893 const char *strsect_name ATTRIBUTE_UNUSED;
1895 int i;
1896 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1897 bfd_byte *stabp, *stabs_end;
1899 stabp = stabs;
1900 stabs_end = stabp + stab_size;
1902 printf (_("Contents of %s section:\n\n"), stabsect_name);
1903 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1905 /* Loop through all symbols and print them.
1907 We start the index at -1 because there is a dummy symbol on
1908 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1910 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1912 const char *name;
1913 unsigned long strx;
1914 unsigned char type, other;
1915 unsigned short desc;
1916 bfd_vma value;
1918 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1919 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1920 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1921 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1922 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1924 printf ("\n%-6d ", i);
1925 /* Either print the stab name, or, if unnamed, print its number
1926 again (makes consistent formatting for tools like awk). */
1927 name = bfd_get_stab_name (type);
1928 if (name != NULL)
1929 printf ("%-6s", name);
1930 else if (type == N_UNDF)
1931 printf ("HdrSym");
1932 else
1933 printf ("%-6d", type);
1934 printf (" %-6d %-6d ", other, desc);
1935 bfd_printf_vma (abfd, value);
1936 printf (" %-6lu", strx);
1938 /* Symbols with type == 0 (N_UNDF) specify the length of the
1939 string table associated with this file. We use that info
1940 to know how to relocate the *next* file's string table indices. */
1942 if (type == N_UNDF)
1944 file_string_table_offset = next_file_string_table_offset;
1945 next_file_string_table_offset += value;
1947 else
1949 /* Using the (possibly updated) string table offset, print the
1950 string (if any) associated with this symbol. */
1952 if ((strx + file_string_table_offset) < stabstr_size)
1953 printf (" %s", &strtab[strx + file_string_table_offset]);
1954 else
1955 printf (" *");
1958 printf ("\n\n");
1961 static void
1962 dump_section_stabs (abfd, stabsect_name, strsect_name)
1963 bfd *abfd;
1964 char *stabsect_name;
1965 char *strsect_name;
1967 asection *s;
1969 /* Check for section names for which stabsect_name is a prefix, to
1970 handle .stab0, etc. */
1971 for (s = abfd->sections;
1972 s != NULL;
1973 s = s->next)
1975 int len;
1977 len = strlen (stabsect_name);
1979 /* If the prefix matches, and the files section name ends with a
1980 nul or a digit, then we match. I.e., we want either an exact
1981 match or a section followed by a number. */
1982 if (strncmp (stabsect_name, s->name, len) == 0
1983 && (s->name[len] == '\000'
1984 || ISDIGIT (s->name[len])))
1986 if (read_section_stabs (abfd, s->name, strsect_name))
1988 print_section_stabs (abfd, s->name, strsect_name);
1989 free (stabs);
1990 free (strtab);
1996 static void
1997 dump_bfd_header (abfd)
1998 bfd *abfd;
2000 char *comma = "";
2002 printf (_("architecture: %s, "),
2003 bfd_printable_arch_mach (bfd_get_arch (abfd),
2004 bfd_get_mach (abfd)));
2005 printf (_("flags 0x%08x:\n"), abfd->flags);
2007 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2008 PF (HAS_RELOC, "HAS_RELOC");
2009 PF (EXEC_P, "EXEC_P");
2010 PF (HAS_LINENO, "HAS_LINENO");
2011 PF (HAS_DEBUG, "HAS_DEBUG");
2012 PF (HAS_SYMS, "HAS_SYMS");
2013 PF (HAS_LOCALS, "HAS_LOCALS");
2014 PF (DYNAMIC, "DYNAMIC");
2015 PF (WP_TEXT, "WP_TEXT");
2016 PF (D_PAGED, "D_PAGED");
2017 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2018 printf (_("\nstart address 0x"));
2019 bfd_printf_vma (abfd, abfd->start_address);
2020 printf ("\n");
2023 static void
2024 dump_bfd_private_header (abfd)
2025 bfd *abfd;
2027 bfd_print_private_bfd_data (abfd, stdout);
2030 /* Dump selected contents of ABFD */
2032 static void
2033 dump_bfd (abfd)
2034 bfd *abfd;
2036 /* If we are adjusting section VMA's, change them all now. Changing
2037 the BFD information is a hack. However, we must do it, or
2038 bfd_find_nearest_line will not do the right thing. */
2039 if (adjust_section_vma != 0)
2041 asection *s;
2043 for (s = abfd->sections; s != NULL; s = s->next)
2045 s->vma += adjust_section_vma;
2046 s->lma += adjust_section_vma;
2050 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2051 abfd->xvec->name);
2052 if (dump_ar_hdrs)
2053 print_arelt_descr (stdout, abfd, true);
2054 if (dump_file_header)
2055 dump_bfd_header (abfd);
2056 if (dump_private_headers)
2057 dump_bfd_private_header (abfd);
2058 putchar ('\n');
2059 if (dump_section_headers)
2060 dump_headers (abfd);
2061 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2063 syms = slurp_symtab (abfd);
2065 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2067 dynsyms = slurp_dynamic_symtab (abfd);
2069 if (dump_symtab)
2070 dump_symbols (abfd, false);
2071 if (dump_dynamic_symtab)
2072 dump_symbols (abfd, true);
2073 if (dump_stab_section_info)
2074 dump_stabs (abfd);
2075 if (dump_reloc_info && ! disassemble)
2076 dump_relocs (abfd);
2077 if (dump_dynamic_reloc_info)
2078 dump_dynamic_relocs (abfd);
2079 if (dump_section_contents)
2080 dump_data (abfd);
2081 if (disassemble)
2082 disassemble_data (abfd);
2083 if (dump_debugging)
2085 PTR dhandle;
2087 dhandle = read_debugging_info (abfd, syms, symcount);
2088 if (dhandle != NULL)
2090 if (! print_debugging_info (stdout, dhandle))
2092 non_fatal (_("%s: printing debugging information failed"),
2093 bfd_get_filename (abfd));
2094 exit_status = 1;
2098 if (syms)
2100 free (syms);
2101 syms = NULL;
2103 if (dynsyms)
2105 free (dynsyms);
2106 dynsyms = NULL;
2110 static void
2111 display_bfd (abfd)
2112 bfd *abfd;
2114 char **matching;
2116 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2118 dump_bfd (abfd);
2119 return;
2122 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2124 nonfatal (bfd_get_filename (abfd));
2125 list_matching_formats (matching);
2126 free (matching);
2127 return;
2130 if (bfd_get_error () != bfd_error_file_not_recognized)
2132 nonfatal (bfd_get_filename (abfd));
2133 return;
2136 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2138 dump_bfd (abfd);
2139 return;
2142 nonfatal (bfd_get_filename (abfd));
2144 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2146 list_matching_formats (matching);
2147 free (matching);
2151 static void
2152 display_file (filename, target)
2153 char *filename;
2154 char *target;
2156 bfd *file, *arfile = (bfd *) NULL;
2158 file = bfd_openr (filename, target);
2159 if (file == NULL)
2161 nonfatal (filename);
2162 return;
2165 if (bfd_check_format (file, bfd_archive) == true)
2167 bfd *last_arfile = NULL;
2169 printf (_("In archive %s:\n"), bfd_get_filename (file));
2170 for (;;)
2172 bfd_set_error (bfd_error_no_error);
2174 arfile = bfd_openr_next_archived_file (file, arfile);
2175 if (arfile == NULL)
2177 if (bfd_get_error () != bfd_error_no_more_archived_files)
2178 nonfatal (bfd_get_filename (file));
2179 break;
2182 display_bfd (arfile);
2184 if (last_arfile != NULL)
2185 bfd_close (last_arfile);
2186 last_arfile = arfile;
2189 if (last_arfile != NULL)
2190 bfd_close (last_arfile);
2192 else
2193 display_bfd (file);
2195 bfd_close (file);
2198 /* Actually display the various requested regions */
2200 static void
2201 dump_data (abfd)
2202 bfd *abfd;
2204 asection *section;
2205 bfd_byte *data = 0;
2206 bfd_size_type datasize = 0;
2207 bfd_size_type addr_offset;
2208 bfd_size_type start_offset, stop_offset;
2209 unsigned int opb = bfd_octets_per_byte (abfd);
2211 for (section = abfd->sections; section != NULL; section =
2212 section->next)
2214 int onaline = 16;
2216 if (only == (char *) NULL ||
2217 strcmp (only, section->name) == 0)
2219 if (section->flags & SEC_HAS_CONTENTS)
2221 printf (_("Contents of section %s:\n"), section->name);
2223 if (bfd_section_size (abfd, section) == 0)
2224 continue;
2225 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2226 datasize = bfd_section_size (abfd, section);
2229 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2231 if (start_address == (bfd_vma) -1
2232 || start_address < section->vma)
2233 start_offset = 0;
2234 else
2235 start_offset = start_address - section->vma;
2236 if (stop_address == (bfd_vma) -1)
2237 stop_offset = bfd_section_size (abfd, section) / opb;
2238 else
2240 if (stop_address < section->vma)
2241 stop_offset = 0;
2242 else
2243 stop_offset = stop_address - section->vma;
2244 if (stop_offset > bfd_section_size (abfd, section) / opb)
2245 stop_offset = bfd_section_size (abfd, section) / opb;
2247 for (addr_offset = start_offset;
2248 addr_offset < stop_offset; addr_offset += onaline)
2250 bfd_size_type j;
2252 printf (" %04lx ", (unsigned long int)
2253 (addr_offset + section->vma));
2254 for (j = addr_offset * opb;
2255 j < addr_offset * opb + onaline; j++)
2257 if (j < stop_offset * opb)
2258 printf ("%02x", (unsigned) (data[j]));
2259 else
2260 printf (" ");
2261 if ((j & 3) == 3)
2262 printf (" ");
2265 printf (" ");
2266 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2268 if (j >= stop_offset * opb)
2269 printf (" ");
2270 else
2271 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2273 putchar ('\n');
2275 free (data);
2281 /* Should perhaps share code and display with nm? */
2282 static void
2283 dump_symbols (abfd, dynamic)
2284 bfd *abfd ATTRIBUTE_UNUSED;
2285 boolean dynamic;
2287 asymbol **current;
2288 long max;
2289 long count;
2291 if (dynamic)
2293 current = dynsyms;
2294 max = dynsymcount;
2295 if (max == 0)
2296 return;
2297 printf ("DYNAMIC SYMBOL TABLE:\n");
2299 else
2301 current = syms;
2302 max = symcount;
2303 if (max == 0)
2304 return;
2305 printf ("SYMBOL TABLE:\n");
2308 for (count = 0; count < max; count++)
2310 if (*current)
2312 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2314 if (cur_bfd != NULL)
2316 const char *name;
2317 char *alloc;
2319 name = bfd_asymbol_name (*current);
2320 alloc = NULL;
2321 if (do_demangle && name != NULL && *name != '\0')
2323 const char *n;
2325 /* If we want to demangle the name, we demangle it
2326 here, and temporarily clobber it while calling
2327 bfd_print_symbol. FIXME: This is a gross hack. */
2329 n = name;
2330 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2331 ++n;
2332 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2333 if (alloc != NULL)
2334 (*current)->name = alloc;
2335 else
2336 (*current)->name = n;
2339 bfd_print_symbol (cur_bfd, stdout, *current,
2340 bfd_print_symbol_all);
2342 (*current)->name = name;
2343 if (alloc != NULL)
2344 free (alloc);
2346 printf ("\n");
2349 current++;
2351 printf ("\n");
2352 printf ("\n");
2355 static void
2356 dump_relocs (abfd)
2357 bfd *abfd;
2359 arelent **relpp;
2360 long relcount;
2361 asection *a;
2363 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2365 long relsize;
2367 if (bfd_is_abs_section (a))
2368 continue;
2369 if (bfd_is_und_section (a))
2370 continue;
2371 if (bfd_is_com_section (a))
2372 continue;
2374 if (only)
2376 if (strcmp (only, a->name))
2377 continue;
2379 else if ((a->flags & SEC_RELOC) == 0)
2380 continue;
2382 relsize = bfd_get_reloc_upper_bound (abfd, a);
2383 if (relsize < 0)
2384 bfd_fatal (bfd_get_filename (abfd));
2386 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2388 if (relsize == 0)
2390 printf (" (none)\n\n");
2392 else
2394 relpp = (arelent **) xmalloc (relsize);
2395 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2396 if (relcount < 0)
2397 bfd_fatal (bfd_get_filename (abfd));
2398 else if (relcount == 0)
2400 printf (" (none)\n\n");
2402 else
2404 printf ("\n");
2405 dump_reloc_set (abfd, a, relpp, relcount);
2406 printf ("\n\n");
2408 free (relpp);
2413 static void
2414 dump_dynamic_relocs (abfd)
2415 bfd *abfd;
2417 long relsize;
2418 arelent **relpp;
2419 long relcount;
2421 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2422 if (relsize < 0)
2423 bfd_fatal (bfd_get_filename (abfd));
2425 printf ("DYNAMIC RELOCATION RECORDS");
2427 if (relsize == 0)
2429 printf (" (none)\n\n");
2431 else
2433 relpp = (arelent **) xmalloc (relsize);
2434 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2435 if (relcount < 0)
2436 bfd_fatal (bfd_get_filename (abfd));
2437 else if (relcount == 0)
2439 printf (" (none)\n\n");
2441 else
2443 printf ("\n");
2444 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2445 printf ("\n\n");
2447 free (relpp);
2451 static void
2452 dump_reloc_set (abfd, sec, relpp, relcount)
2453 bfd *abfd;
2454 asection *sec;
2455 arelent **relpp;
2456 long relcount;
2458 arelent **p;
2459 char *last_filename, *last_functionname;
2460 unsigned int last_line;
2462 /* Get column headers lined up reasonably. */
2464 static int width;
2465 if (width == 0)
2467 char buf[30];
2468 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2469 width = strlen (buf) - 7;
2471 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2474 last_filename = NULL;
2475 last_functionname = NULL;
2476 last_line = 0;
2478 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2480 arelent *q = *p;
2481 const char *filename, *functionname;
2482 unsigned int line;
2483 const char *sym_name;
2484 const char *section_name;
2486 if (start_address != (bfd_vma) -1
2487 && q->address < start_address)
2488 continue;
2489 if (stop_address != (bfd_vma) -1
2490 && q->address > stop_address)
2491 continue;
2493 if (with_line_numbers
2494 && sec != NULL
2495 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2496 &filename, &functionname, &line))
2498 if (functionname != NULL
2499 && (last_functionname == NULL
2500 || strcmp (functionname, last_functionname) != 0))
2502 printf ("%s():\n", functionname);
2503 if (last_functionname != NULL)
2504 free (last_functionname);
2505 last_functionname = xstrdup (functionname);
2507 if (line > 0
2508 && (line != last_line
2509 || (filename != NULL
2510 && last_filename != NULL
2511 && strcmp (filename, last_filename) != 0)))
2513 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2514 last_line = line;
2515 if (last_filename != NULL)
2516 free (last_filename);
2517 if (filename == NULL)
2518 last_filename = NULL;
2519 else
2520 last_filename = xstrdup (filename);
2524 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2526 sym_name = (*(q->sym_ptr_ptr))->name;
2527 section_name = (*(q->sym_ptr_ptr))->section->name;
2529 else
2531 sym_name = NULL;
2532 section_name = NULL;
2534 if (sym_name)
2536 bfd_printf_vma (abfd, q->address);
2537 if (q->howto->name)
2538 printf (" %-16s ", q->howto->name);
2539 else
2540 printf (" %-16d ", q->howto->type);
2541 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2542 *q->sym_ptr_ptr);
2544 else
2546 if (section_name == (CONST char *) NULL)
2547 section_name = "*unknown*";
2548 bfd_printf_vma (abfd, q->address);
2549 printf (" %-16s [%s]",
2550 q->howto->name,
2551 section_name);
2553 if (q->addend)
2555 printf ("+0x");
2556 bfd_printf_vma (abfd, q->addend);
2558 printf ("\n");
2562 /* The length of the longest architecture name + 1. */
2563 #define LONGEST_ARCH sizeof("powerpc:common")
2565 static const char *
2566 endian_string (endian)
2567 enum bfd_endian endian;
2569 if (endian == BFD_ENDIAN_BIG)
2570 return "big endian";
2571 else if (endian == BFD_ENDIAN_LITTLE)
2572 return "little endian";
2573 else
2574 return "endianness unknown";
2577 /* List the targets that BFD is configured to support, each followed
2578 by its endianness and the architectures it supports. */
2580 static void
2581 display_target_list ()
2583 extern const bfd_target *const *bfd_target_vector;
2584 char *dummy_name;
2585 int t;
2587 dummy_name = make_temp_file (NULL);
2588 for (t = 0; bfd_target_vector[t]; t++)
2590 const bfd_target *p = bfd_target_vector[t];
2591 bfd *abfd = bfd_openw (dummy_name, p->name);
2592 int a;
2594 printf ("%s\n (header %s, data %s)\n", p->name,
2595 endian_string (p->header_byteorder),
2596 endian_string (p->byteorder));
2598 if (abfd == NULL)
2600 nonfatal (dummy_name);
2601 continue;
2604 if (! bfd_set_format (abfd, bfd_object))
2606 if (bfd_get_error () != bfd_error_invalid_operation)
2607 nonfatal (p->name);
2608 bfd_close_all_done (abfd);
2609 continue;
2612 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2613 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2614 printf (" %s\n",
2615 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2616 bfd_close_all_done (abfd);
2618 unlink (dummy_name);
2619 free (dummy_name);
2622 /* Print a table showing which architectures are supported for entries
2623 FIRST through LAST-1 of bfd_target_vector (targets across,
2624 architectures down). */
2626 static void
2627 display_info_table (first, last)
2628 int first;
2629 int last;
2631 extern const bfd_target *const *bfd_target_vector;
2632 int t, a;
2633 char *dummy_name;
2635 /* Print heading of target names. */
2636 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2637 for (t = first; t < last && bfd_target_vector[t]; t++)
2638 printf ("%s ", bfd_target_vector[t]->name);
2639 putchar ('\n');
2641 dummy_name = make_temp_file (NULL);
2642 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2643 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2645 printf ("%*s ", (int) LONGEST_ARCH - 1,
2646 bfd_printable_arch_mach (a, 0));
2647 for (t = first; t < last && bfd_target_vector[t]; t++)
2649 const bfd_target *p = bfd_target_vector[t];
2650 boolean ok = true;
2651 bfd *abfd = bfd_openw (dummy_name, p->name);
2653 if (abfd == NULL)
2655 nonfatal (p->name);
2656 ok = false;
2659 if (ok)
2661 if (! bfd_set_format (abfd, bfd_object))
2663 if (bfd_get_error () != bfd_error_invalid_operation)
2664 nonfatal (p->name);
2665 ok = false;
2669 if (ok)
2671 if (! bfd_set_arch_mach (abfd, a, 0))
2672 ok = false;
2675 if (ok)
2676 printf ("%s ", p->name);
2677 else
2679 int l = strlen (p->name);
2680 while (l--)
2681 putchar ('-');
2682 putchar (' ');
2684 if (abfd != NULL)
2685 bfd_close_all_done (abfd);
2687 putchar ('\n');
2689 unlink (dummy_name);
2690 free (dummy_name);
2693 /* Print tables of all the target-architecture combinations that
2694 BFD has been configured to support. */
2696 static void
2697 display_target_tables ()
2699 int t, columns;
2700 extern const bfd_target *const *bfd_target_vector;
2701 char *colum;
2703 columns = 0;
2704 colum = getenv ("COLUMNS");
2705 if (colum != NULL)
2706 columns = atoi (colum);
2707 if (columns == 0)
2708 columns = 80;
2710 t = 0;
2711 while (bfd_target_vector[t] != NULL)
2713 int oldt = t, wid;
2715 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2716 ++t;
2717 while (wid < columns && bfd_target_vector[t] != NULL)
2719 int newwid;
2721 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2722 if (newwid >= columns)
2723 break;
2724 wid = newwid;
2725 ++t;
2727 display_info_table (oldt, t);
2731 static void
2732 display_info ()
2734 printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
2735 display_target_list ();
2736 display_target_tables ();
2739 int main PARAMS ((int, char **));
2742 main (argc, argv)
2743 int argc;
2744 char **argv;
2746 int c;
2747 char *target = default_target;
2748 boolean seenflag = false;
2750 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2751 setlocale (LC_MESSAGES, "");
2752 #endif
2753 #if defined (HAVE_SETLOCALE)
2754 setlocale (LC_CTYPE, "");
2755 #endif
2756 bindtextdomain (PACKAGE, LOCALEDIR);
2757 textdomain (PACKAGE);
2759 program_name = *argv;
2760 xmalloc_set_program_name (program_name);
2762 START_PROGRESS (program_name, 0);
2764 bfd_init ();
2765 set_default_bfd_target ();
2767 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSj:wE:zgG",
2768 long_options, (int *) 0))
2769 != EOF)
2771 switch (c)
2773 case 0:
2774 break; /* We've been given a long option. */
2775 case 'm':
2776 machine = optarg;
2777 break;
2778 case 'M':
2779 disassembler_options = optarg;
2780 break;
2781 case 'j':
2782 only = optarg;
2783 break;
2784 case 'l':
2785 with_line_numbers = true;
2786 break;
2787 case 'b':
2788 target = optarg;
2789 break;
2790 case 'C':
2791 do_demangle = true;
2792 if (optarg != NULL)
2794 enum demangling_styles style;
2796 style = cplus_demangle_name_to_style (optarg);
2797 if (style == unknown_demangling)
2798 fatal (_("unknown demangling style `%s'"),
2799 optarg);
2801 cplus_demangle_set_style (style);
2803 break;
2804 case 'w':
2805 wide_output = true;
2806 break;
2807 case OPTION_ADJUST_VMA:
2808 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2809 break;
2810 case OPTION_START_ADDRESS:
2811 start_address = parse_vma (optarg, "--start-address");
2812 break;
2813 case OPTION_STOP_ADDRESS:
2814 stop_address = parse_vma (optarg, "--stop-address");
2815 break;
2816 case 'E':
2817 if (strcmp (optarg, "B") == 0)
2818 endian = BFD_ENDIAN_BIG;
2819 else if (strcmp (optarg, "L") == 0)
2820 endian = BFD_ENDIAN_LITTLE;
2821 else
2823 non_fatal (_("unrecognized -E option"));
2824 usage (stderr, 1);
2826 break;
2827 case OPTION_ENDIAN:
2828 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2829 endian = BFD_ENDIAN_BIG;
2830 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2831 endian = BFD_ENDIAN_LITTLE;
2832 else
2834 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2835 usage (stderr, 1);
2837 break;
2839 case 'f':
2840 dump_file_header = true;
2841 seenflag = true;
2842 break;
2843 case 'i':
2844 formats_info = true;
2845 seenflag = true;
2846 break;
2847 case 'p':
2848 dump_private_headers = true;
2849 seenflag = true;
2850 break;
2851 case 'x':
2852 dump_private_headers = true;
2853 dump_symtab = true;
2854 dump_reloc_info = true;
2855 dump_file_header = true;
2856 dump_ar_hdrs = true;
2857 dump_section_headers = true;
2858 seenflag = true;
2859 break;
2860 case 't':
2861 dump_symtab = true;
2862 seenflag = true;
2863 break;
2864 case 'T':
2865 dump_dynamic_symtab = true;
2866 seenflag = true;
2867 break;
2868 case 'd':
2869 disassemble = true;
2870 seenflag = true;
2871 break;
2872 case 'z':
2873 disassemble_zeroes = true;
2874 break;
2875 case 'D':
2876 disassemble = true;
2877 disassemble_all = true;
2878 seenflag = true;
2879 break;
2880 case 'S':
2881 disassemble = true;
2882 with_source_code = true;
2883 seenflag = true;
2884 break;
2885 case 'g':
2886 dump_debugging = 1;
2887 seenflag = true;
2888 break;
2889 case 'G':
2890 dump_stab_section_info = true;
2891 seenflag = true;
2892 break;
2893 case 's':
2894 dump_section_contents = true;
2895 seenflag = true;
2896 break;
2897 case 'r':
2898 dump_reloc_info = true;
2899 seenflag = true;
2900 break;
2901 case 'R':
2902 dump_dynamic_reloc_info = true;
2903 seenflag = true;
2904 break;
2905 case 'a':
2906 dump_ar_hdrs = true;
2907 seenflag = true;
2908 break;
2909 case 'h':
2910 dump_section_headers = true;
2911 seenflag = true;
2912 break;
2913 case 'H':
2914 usage (stdout, 0);
2915 seenflag = true;
2916 case 'v':
2917 case 'V':
2918 show_version = true;
2919 seenflag = true;
2920 break;
2922 default:
2923 usage (stderr, 1);
2927 if (show_version)
2928 print_version ("objdump");
2930 if (seenflag == false)
2931 usage (stderr, 2);
2933 if (formats_info)
2934 display_info ();
2935 else
2937 if (optind == argc)
2938 display_file ("a.out", target);
2939 else
2940 for (; optind < argc;)
2941 display_file (argv[optind++], target);
2944 END_PROGRESS (program_name);
2946 return exit_status;