2001-08-03 John Healy <jhealy@redhat.com>
[deliverable/binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
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.
12
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.
17
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. */
21
22 #include "bfd.h"
23 #include "getopt.h"
24 #include "progress.h"
25 #include "bucomm.h"
26 #include <ctype.h>
27 #include "dis-asm.h"
28 #include "libiberty.h"
29 #include "demangle.h"
30 #include "debug.h"
31 #include "budbg.h"
32
33 /* Internal headers for the ELF .stab-dump code - sorry. */
34 #define BYTES_IN_WORD 32
35 #include "aout/aout64.h"
36
37 #ifdef NEED_DECLARATION_FPRINTF
38 /* This is needed by INIT_DISASSEMBLE_INFO. */
39 extern int fprintf PARAMS ((FILE *, const char *, ...));
40 #endif
41
42 /* Exit status. */
43 static int exit_status = 0;
44
45 static char *default_target = NULL; /* default at runtime */
46
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 */
74
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;
80 };
81
82 /* Architecture to disassemble for, or default if NULL. */
83 static char *machine = (char *) NULL;
84
85 /* Target specific options to the disassembler. */
86 static char *disassembler_options = (char *) NULL;
87
88 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
89 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
90
91 /* The symbol table. */
92 static asymbol **syms;
93
94 /* Number of symbols in `syms'. */
95 static long symcount = 0;
96
97 /* The sorted symbol table. */
98 static asymbol **sorted_syms;
99
100 /* Number of symbols in `sorted_syms'. */
101 static long sorted_symcount = 0;
102
103 /* The dynamic symbol table. */
104 static asymbol **dynsyms;
105
106 /* Number of symbols in `dynsyms'. */
107 static long dynsymcount = 0;
108
109 /* Static declarations. */
110
111 static void
112 usage PARAMS ((FILE *, int));
113
114 static void
115 nonfatal PARAMS ((const char *));
116
117 static void
118 display_file PARAMS ((char *filename, char *target));
119
120 static void
121 dump_section_header PARAMS ((bfd *, asection *, PTR));
122
123 static void
124 dump_headers PARAMS ((bfd *));
125
126 static void
127 dump_data PARAMS ((bfd *abfd));
128
129 static void
130 dump_relocs PARAMS ((bfd *abfd));
131
132 static void
133 dump_dynamic_relocs PARAMS ((bfd * abfd));
134
135 static void
136 dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
137
138 static void
139 dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
140
141 static void
142 dump_bfd_header PARAMS ((bfd *));
143
144 static void
145 dump_bfd_private_header PARAMS ((bfd *));
146
147 static void
148 display_bfd PARAMS ((bfd *abfd));
149
150 static void
151 display_target_list PARAMS ((void));
152
153 static void
154 display_info_table PARAMS ((int, int));
155
156 static void
157 display_target_tables PARAMS ((void));
158
159 static void
160 display_info PARAMS ((void));
161
162 static void
163 objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
164
165 static void
166 objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *));
167
168 static asymbol *
169 find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
170
171 static void
172 objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
173 struct disassemble_info *, boolean));
174
175 static void
176 objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
177
178 static void
179 objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
180
181 static void
182 show_line PARAMS ((bfd *, asection *, bfd_vma));
183
184 static void
185 disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
186 boolean, bfd_byte *, bfd_vma, bfd_vma,
187 arelent ***, arelent **));
188
189 static void
190 disassemble_data PARAMS ((bfd *));
191
192 static const char *
193 endian_string PARAMS ((enum bfd_endian));
194
195 static asymbol **
196 slurp_symtab PARAMS ((bfd *));
197
198 static asymbol **
199 slurp_dynamic_symtab PARAMS ((bfd *));
200
201 static long
202 remove_useless_symbols PARAMS ((asymbol **, long));
203
204 static int
205 compare_symbols PARAMS ((const PTR, const PTR));
206
207 static int
208 compare_relocs PARAMS ((const PTR, const PTR));
209
210 static void
211 dump_stabs PARAMS ((bfd *));
212
213 static boolean
214 read_section_stabs PARAMS ((bfd *, const char *, const char *));
215
216 static void
217 print_section_stabs PARAMS ((bfd *, const char *, const char *));
218 \f
219 static void
220 usage (stream, status)
221 FILE *stream;
222 int status;
223 {
224 fprintf (stream, _("Usage: %s OPTION... FILE...\n"), program_name);
225 fprintf (stream, _("Display information from object FILE.\n"));
226 fprintf (stream, _("\n At least one of the following switches must be given:\n"));
227 fprintf (stream, _("\
228 -a, --archive-headers Display archive header information\n\
229 -f, --file-headers Display the contents of the overall file header\n\
230 -p, --private-headers Display object format specific file header contents\n\
231 -h, --[section-]headers Display the contents of the section headers\n\
232 -x, --all-headers Display the contents of all headers\n\
233 -d, --disassemble Display assembler contents of executable sections\n\
234 -D, --disassemble-all Display assembler contents of all sections\n\
235 -S, --source Intermix source code with disassembly\n\
236 -s, --full-contents Display the full contents of all sections requested\n\
237 -g, --debugging Display debug information in object file\n\
238 -G, --stabs Display (in raw form) any STABS info in the file\n\
239 -t, --syms Display the contents of the symbol table(s)\n\
240 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
241 -r, --reloc Display the relocation entries in the file\n\
242 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
243 -V, --version Display this program's version number\n\
244 -i, --info List object formats and architectures supported\n\
245 -H, --help Display this information\n\
246 "));
247 if (status != 2)
248 {
249 fprintf (stream, _("\n The following switches are optional:\n"));
250 fprintf (stream, _("\
251 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
252 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
253 -j, --section=NAME Only display information for section NAME\n\
254 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
255 -EB --endian=big Assume big endian format when disassembling\n\
256 -EL --endian=little Assume little endian format when disassembling\n\
257 --file-start-context Include context from start of file (with -S)\n\
258 -l, --line-numbers Include line numbers and filenames in output\n\
259 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
260 The STYLE, if specified, can be `auto', 'gnu',\n\
261 'lucid', 'arm', 'hp', 'edg', or 'gnu-new-abi'\n\
262 -w, --wide Format output for more than 80 columns\n\
263 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
264 --start-address=ADDR Only process data whoes address is >= ADDR\n\
265 --stop-address=ADDR Only process data whoes address is <= ADDR\n\
266 --prefix-addresses Print complete address alongside disassembly\n\
267 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
268 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
269 \n"));
270 list_supported_targets (program_name, stream);
271 list_supported_architectures (program_name, stream);
272
273 disassembler_usage (stream);
274 }
275 if (status == 0)
276 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
277 exit (status);
278 }
279
280 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
281
282 #define OPTION_ENDIAN (150)
283 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
284 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
285 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
286
287 static struct option long_options[]=
288 {
289 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
290 {"all-headers", no_argument, NULL, 'x'},
291 {"private-headers", no_argument, NULL, 'p'},
292 {"architecture", required_argument, NULL, 'm'},
293 {"archive-headers", no_argument, NULL, 'a'},
294 {"debugging", no_argument, NULL, 'g'},
295 {"demangle", optional_argument, NULL, 'C'},
296 {"disassemble", no_argument, NULL, 'd'},
297 {"disassemble-all", no_argument, NULL, 'D'},
298 {"disassembler-options", required_argument, NULL, 'M'},
299 {"disassemble-zeroes", no_argument, NULL, 'z'},
300 {"dynamic-reloc", no_argument, NULL, 'R'},
301 {"dynamic-syms", no_argument, NULL, 'T'},
302 {"endian", required_argument, NULL, OPTION_ENDIAN},
303 {"file-headers", no_argument, NULL, 'f'},
304 {"file-start-context", no_argument, &file_start_context, 1},
305 {"full-contents", no_argument, NULL, 's'},
306 {"headers", no_argument, NULL, 'h'},
307 {"help", no_argument, NULL, 'H'},
308 {"info", no_argument, NULL, 'i'},
309 {"line-numbers", no_argument, NULL, 'l'},
310 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
311 {"prefix-addresses", no_argument, &prefix_addresses, 1},
312 {"reloc", no_argument, NULL, 'r'},
313 {"section", required_argument, NULL, 'j'},
314 {"section-headers", no_argument, NULL, 'h'},
315 {"show-raw-insn", no_argument, &show_raw_insn, 1},
316 {"source", no_argument, NULL, 'S'},
317 {"stabs", no_argument, NULL, 'G'},
318 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
319 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
320 {"syms", no_argument, NULL, 't'},
321 {"target", required_argument, NULL, 'b'},
322 {"version", no_argument, NULL, 'V'},
323 {"wide", no_argument, NULL, 'w'},
324 {0, no_argument, 0, 0}
325 };
326 \f
327 static void
328 nonfatal (msg)
329 const char *msg;
330 {
331 bfd_nonfatal (msg);
332 exit_status = 1;
333 }
334 \f
335 static void
336 dump_section_header (abfd, section, ignored)
337 bfd *abfd ATTRIBUTE_UNUSED;
338 asection *section;
339 PTR ignored ATTRIBUTE_UNUSED;
340 {
341 char *comma = "";
342 unsigned int opb = bfd_octets_per_byte (abfd);
343
344 printf ("%3d %-13s %08lx ", section->index,
345 bfd_get_section_name (abfd, section),
346 (unsigned long) bfd_section_size (abfd, section) / opb);
347 printf_vma (bfd_get_section_vma (abfd, section));
348 printf (" ");
349 printf_vma (section->lma);
350 printf (" %08lx 2**%u", section->filepos,
351 bfd_get_section_alignment (abfd, section));
352 if (! wide_output)
353 printf ("\n ");
354 printf (" ");
355
356 #define PF(x, y) \
357 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
358
359 PF (SEC_HAS_CONTENTS, "CONTENTS");
360 PF (SEC_ALLOC, "ALLOC");
361 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
362 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
363 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
364 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
365 PF (SEC_LOAD, "LOAD");
366 PF (SEC_RELOC, "RELOC");
367 #ifdef SEC_BALIGN
368 PF (SEC_BALIGN, "BALIGN");
369 #endif
370 PF (SEC_READONLY, "READONLY");
371 PF (SEC_CODE, "CODE");
372 PF (SEC_DATA, "DATA");
373 PF (SEC_ROM, "ROM");
374 PF (SEC_DEBUGGING, "DEBUGGING");
375 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
376 PF (SEC_EXCLUDE, "EXCLUDE");
377 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
378 PF (SEC_BLOCK, "BLOCK");
379 PF (SEC_CLINK, "CLINK");
380 PF (SEC_SMALL_DATA, "SMALL_DATA");
381 PF (SEC_SHARED, "SHARED");
382
383 if ((section->flags & SEC_LINK_ONCE) != 0)
384 {
385 const char *ls;
386
387 switch (section->flags & SEC_LINK_DUPLICATES)
388 {
389 default:
390 abort ();
391 case SEC_LINK_DUPLICATES_DISCARD:
392 ls = "LINK_ONCE_DISCARD";
393 break;
394 case SEC_LINK_DUPLICATES_ONE_ONLY:
395 ls = "LINK_ONCE_ONE_ONLY";
396 break;
397 case SEC_LINK_DUPLICATES_SAME_SIZE:
398 ls = "LINK_ONCE_SAME_SIZE";
399 break;
400 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
401 ls = "LINK_ONCE_SAME_CONTENTS";
402 break;
403 }
404 printf ("%s%s", comma, ls);
405
406 if (section->comdat != NULL)
407 printf (" (COMDAT %s %ld)", section->comdat->name,
408 section->comdat->symbol);
409
410 comma = ", ";
411 }
412
413 printf ("\n");
414 #undef PF
415 }
416
417 static void
418 dump_headers (abfd)
419 bfd *abfd;
420 {
421 printf (_("Sections:\n"));
422
423 #ifndef BFD64
424 printf (_("Idx Name Size VMA LMA File off Algn"));
425 #else
426 printf (_("Idx Name Size VMA LMA File off Algn"));
427 #endif
428
429 if (wide_output)
430 printf (_(" Flags"));
431 printf ("\n");
432
433 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
434 }
435 \f
436 static asymbol **
437 slurp_symtab (abfd)
438 bfd *abfd;
439 {
440 asymbol **sy = (asymbol **) NULL;
441 long storage;
442
443 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
444 {
445 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
446 symcount = 0;
447 return NULL;
448 }
449
450 storage = bfd_get_symtab_upper_bound (abfd);
451 if (storage < 0)
452 bfd_fatal (bfd_get_filename (abfd));
453
454 if (storage)
455 {
456 sy = (asymbol **) xmalloc (storage);
457 }
458 symcount = bfd_canonicalize_symtab (abfd, sy);
459 if (symcount < 0)
460 bfd_fatal (bfd_get_filename (abfd));
461 if (symcount == 0)
462 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
463 return sy;
464 }
465
466 /* Read in the dynamic symbols. */
467
468 static asymbol **
469 slurp_dynamic_symtab (abfd)
470 bfd *abfd;
471 {
472 asymbol **sy = (asymbol **) NULL;
473 long storage;
474
475 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
476 if (storage < 0)
477 {
478 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
479 {
480 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
481 dynsymcount = 0;
482 return NULL;
483 }
484
485 bfd_fatal (bfd_get_filename (abfd));
486 }
487
488 if (storage)
489 {
490 sy = (asymbol **) xmalloc (storage);
491 }
492 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
493 if (dynsymcount < 0)
494 bfd_fatal (bfd_get_filename (abfd));
495 if (dynsymcount == 0)
496 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
497 return sy;
498 }
499
500 /* Filter out (in place) symbols that are useless for disassembly.
501 COUNT is the number of elements in SYMBOLS.
502 Return the number of useful symbols. */
503
504 static long
505 remove_useless_symbols (symbols, count)
506 asymbol **symbols;
507 long count;
508 {
509 register asymbol **in_ptr = symbols, **out_ptr = symbols;
510
511 while (--count >= 0)
512 {
513 asymbol *sym = *in_ptr++;
514
515 if (sym->name == NULL || sym->name[0] == '\0')
516 continue;
517 if (sym->flags & (BSF_DEBUGGING))
518 continue;
519 if (bfd_is_und_section (sym->section)
520 || bfd_is_com_section (sym->section))
521 continue;
522
523 *out_ptr++ = sym;
524 }
525 return out_ptr - symbols;
526 }
527
528 /* Sort symbols into value order. */
529
530 static int
531 compare_symbols (ap, bp)
532 const PTR ap;
533 const PTR bp;
534 {
535 const asymbol *a = *(const asymbol **)ap;
536 const asymbol *b = *(const asymbol **)bp;
537 const char *an, *bn;
538 size_t anl, bnl;
539 boolean af, bf;
540 flagword aflags, bflags;
541
542 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
543 return 1;
544 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
545 return -1;
546
547 if (a->section > b->section)
548 return 1;
549 else if (a->section < b->section)
550 return -1;
551
552 an = bfd_asymbol_name (a);
553 bn = bfd_asymbol_name (b);
554 anl = strlen (an);
555 bnl = strlen (bn);
556
557 /* The symbols gnu_compiled and gcc2_compiled convey no real
558 information, so put them after other symbols with the same value. */
559
560 af = (strstr (an, "gnu_compiled") != NULL
561 || strstr (an, "gcc2_compiled") != NULL);
562 bf = (strstr (bn, "gnu_compiled") != NULL
563 || strstr (bn, "gcc2_compiled") != NULL);
564
565 if (af && ! bf)
566 return 1;
567 if (! af && bf)
568 return -1;
569
570 /* We use a heuristic for the file name, to try to sort it after
571 more useful symbols. It may not work on non Unix systems, but it
572 doesn't really matter; the only difference is precisely which
573 symbol names get printed. */
574
575 #define file_symbol(s, sn, snl) \
576 (((s)->flags & BSF_FILE) != 0 \
577 || ((sn)[(snl) - 2] == '.' \
578 && ((sn)[(snl) - 1] == 'o' \
579 || (sn)[(snl) - 1] == 'a')))
580
581 af = file_symbol (a, an, anl);
582 bf = file_symbol (b, bn, bnl);
583
584 if (af && ! bf)
585 return 1;
586 if (! af && bf)
587 return -1;
588
589 /* Try to sort global symbols before local symbols before function
590 symbols before debugging symbols. */
591
592 aflags = a->flags;
593 bflags = b->flags;
594
595 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
596 {
597 if ((aflags & BSF_DEBUGGING) != 0)
598 return 1;
599 else
600 return -1;
601 }
602 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
603 {
604 if ((aflags & BSF_FUNCTION) != 0)
605 return -1;
606 else
607 return 1;
608 }
609 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
610 {
611 if ((aflags & BSF_LOCAL) != 0)
612 return 1;
613 else
614 return -1;
615 }
616 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
617 {
618 if ((aflags & BSF_GLOBAL) != 0)
619 return -1;
620 else
621 return 1;
622 }
623
624 /* Symbols that start with '.' might be section names, so sort them
625 after symbols that don't start with '.'. */
626 if (an[0] == '.' && bn[0] != '.')
627 return 1;
628 if (an[0] != '.' && bn[0] == '.')
629 return -1;
630
631 /* Finally, if we can't distinguish them in any other way, try to
632 get consistent results by sorting the symbols by name. */
633 return strcmp (an, bn);
634 }
635
636 /* Sort relocs into address order. */
637
638 static int
639 compare_relocs (ap, bp)
640 const PTR ap;
641 const PTR bp;
642 {
643 const arelent *a = *(const arelent **)ap;
644 const arelent *b = *(const arelent **)bp;
645
646 if (a->address > b->address)
647 return 1;
648 else if (a->address < b->address)
649 return -1;
650
651 /* So that associated relocations tied to the same address show up
652 in the correct order, we don't do any further sorting. */
653 if (a > b)
654 return 1;
655 else if (a < b)
656 return -1;
657 else
658 return 0;
659 }
660
661 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
662
663 static void
664 objdump_print_value (vma, info, skip_zeroes)
665 bfd_vma vma;
666 struct disassemble_info *info;
667 boolean skip_zeroes;
668 {
669 char buf[30];
670 char *p;
671
672 sprintf_vma (buf, vma);
673 if (! skip_zeroes)
674 p = buf;
675 else
676 {
677 for (p = buf; *p == '0'; ++p)
678 ;
679 if (*p == '\0')
680 --p;
681 }
682 (*info->fprintf_func) (info->stream, "%s", p);
683 }
684
685 /* Print the name of a symbol. */
686
687 static void
688 objdump_print_symname (abfd, info, sym)
689 bfd *abfd;
690 struct disassemble_info *info;
691 asymbol *sym;
692 {
693 char *alloc;
694 const char *name;
695 const char *print;
696
697 alloc = NULL;
698 name = bfd_asymbol_name (sym);
699 if (! do_demangle || name[0] == '\0')
700 print = name;
701 else
702 {
703 /* Demangle the name. */
704 if (bfd_get_symbol_leading_char (abfd) == name[0])
705 ++name;
706
707 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
708 if (alloc == NULL)
709 print = name;
710 else
711 print = alloc;
712 }
713
714 if (info != NULL)
715 (*info->fprintf_func) (info->stream, "%s", print);
716 else
717 printf ("%s", print);
718
719 if (alloc != NULL)
720 free (alloc);
721 }
722
723 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
724 is true, then always require the symbol to be in the section. This
725 returns NULL if there is no suitable symbol. If PLACE is not NULL,
726 then *PLACE is set to the index of the symbol in sorted_syms. */
727
728 static asymbol *
729 find_symbol_for_address (abfd, sec, vma, require_sec, place)
730 bfd *abfd;
731 asection *sec;
732 bfd_vma vma;
733 boolean require_sec;
734 long *place;
735 {
736 /* @@ Would it speed things up to cache the last two symbols returned,
737 and maybe their address ranges? For many processors, only one memory
738 operand can be present at a time, so the 2-entry cache wouldn't be
739 constantly churned by code doing heavy memory accesses. */
740
741 /* Indices in `sorted_syms'. */
742 long min = 0;
743 long max = sorted_symcount;
744 long thisplace;
745 unsigned int opb = bfd_octets_per_byte (abfd);
746
747 if (sorted_symcount < 1)
748 return NULL;
749
750 /* Perform a binary search looking for the closest symbol to the
751 required value. We are searching the range (min, max]. */
752 while (min + 1 < max)
753 {
754 asymbol *sym;
755
756 thisplace = (max + min) / 2;
757 sym = sorted_syms[thisplace];
758
759 if (bfd_asymbol_value (sym) > vma)
760 max = thisplace;
761 else if (bfd_asymbol_value (sym) < vma)
762 min = thisplace;
763 else
764 {
765 min = thisplace;
766 break;
767 }
768 }
769
770 /* The symbol we want is now in min, the low end of the range we
771 were searching. If there are several symbols with the same
772 value, we want the first one. */
773 thisplace = min;
774 while (thisplace > 0
775 && (bfd_asymbol_value (sorted_syms[thisplace])
776 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
777 --thisplace;
778
779 /* If the file is relocateable, and the symbol could be from this
780 section, prefer a symbol from this section over symbols from
781 others, even if the other symbol's value might be closer.
782
783 Note that this may be wrong for some symbol references if the
784 sections have overlapping memory ranges, but in that case there's
785 no way to tell what's desired without looking at the relocation
786 table. */
787
788 if (sorted_syms[thisplace]->section != sec
789 && (require_sec
790 || ((abfd->flags & HAS_RELOC) != 0
791 && vma >= bfd_get_section_vma (abfd, sec)
792 && vma < (bfd_get_section_vma (abfd, sec)
793 + bfd_section_size (abfd, sec) / opb))))
794 {
795 long i;
796
797 for (i = thisplace + 1; i < sorted_symcount; i++)
798 {
799 if (bfd_asymbol_value (sorted_syms[i])
800 != bfd_asymbol_value (sorted_syms[thisplace]))
801 break;
802 }
803 --i;
804 for (; i >= 0; i--)
805 {
806 if (sorted_syms[i]->section == sec
807 && (i == 0
808 || sorted_syms[i - 1]->section != sec
809 || (bfd_asymbol_value (sorted_syms[i])
810 != bfd_asymbol_value (sorted_syms[i - 1]))))
811 {
812 thisplace = i;
813 break;
814 }
815 }
816
817 if (sorted_syms[thisplace]->section != sec)
818 {
819 /* We didn't find a good symbol with a smaller value.
820 Look for one with a larger value. */
821 for (i = thisplace + 1; i < sorted_symcount; i++)
822 {
823 if (sorted_syms[i]->section == sec)
824 {
825 thisplace = i;
826 break;
827 }
828 }
829 }
830
831 if (sorted_syms[thisplace]->section != sec
832 && (require_sec
833 || ((abfd->flags & HAS_RELOC) != 0
834 && vma >= bfd_get_section_vma (abfd, sec)
835 && vma < (bfd_get_section_vma (abfd, sec)
836 + bfd_section_size (abfd, sec)))))
837 {
838 /* There is no suitable symbol. */
839 return NULL;
840 }
841 }
842
843 if (place != NULL)
844 *place = thisplace;
845
846 return sorted_syms[thisplace];
847 }
848
849 /* Print an address to INFO symbolically. */
850
851 static void
852 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
853 bfd *abfd;
854 asection *sec;
855 asymbol *sym;
856 bfd_vma vma;
857 struct disassemble_info *info;
858 boolean skip_zeroes;
859 {
860 objdump_print_value (vma, info, skip_zeroes);
861
862 if (sym == NULL)
863 {
864 bfd_vma secaddr;
865
866 (*info->fprintf_func) (info->stream, " <%s",
867 bfd_get_section_name (abfd, sec));
868 secaddr = bfd_get_section_vma (abfd, sec);
869 if (vma < secaddr)
870 {
871 (*info->fprintf_func) (info->stream, "-0x");
872 objdump_print_value (secaddr - vma, info, true);
873 }
874 else if (vma > secaddr)
875 {
876 (*info->fprintf_func) (info->stream, "+0x");
877 objdump_print_value (vma - secaddr, info, true);
878 }
879 (*info->fprintf_func) (info->stream, ">");
880 }
881 else
882 {
883 (*info->fprintf_func) (info->stream, " <");
884 objdump_print_symname (abfd, info, sym);
885 if (bfd_asymbol_value (sym) > vma)
886 {
887 (*info->fprintf_func) (info->stream, "-0x");
888 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
889 }
890 else if (vma > bfd_asymbol_value (sym))
891 {
892 (*info->fprintf_func) (info->stream, "+0x");
893 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
894 }
895 (*info->fprintf_func) (info->stream, ">");
896 }
897 }
898
899 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
900 true, don't output leading zeroes. */
901
902 static void
903 objdump_print_addr (vma, info, skip_zeroes)
904 bfd_vma vma;
905 struct disassemble_info *info;
906 boolean skip_zeroes;
907 {
908 struct objdump_disasm_info *aux;
909 asymbol *sym;
910
911 if (sorted_symcount < 1)
912 {
913 (*info->fprintf_func) (info->stream, "0x");
914 objdump_print_value (vma, info, skip_zeroes);
915 return;
916 }
917
918 aux = (struct objdump_disasm_info *) info->application_data;
919 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
920 (long *) NULL);
921 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
922 skip_zeroes);
923 }
924
925 /* Print VMA to INFO. This function is passed to the disassembler
926 routine. */
927
928 static void
929 objdump_print_address (vma, info)
930 bfd_vma vma;
931 struct disassemble_info *info;
932 {
933 objdump_print_addr (vma, info, ! prefix_addresses);
934 }
935
936 /* Determine of the given address has a symbol associated with it. */
937
938 static int
939 objdump_symbol_at_address (vma, info)
940 bfd_vma vma;
941 struct disassemble_info * info;
942 {
943 struct objdump_disasm_info * aux;
944 asymbol * sym;
945
946 /* No symbols - do not bother checking. */
947 if (sorted_symcount < 1)
948 return 0;
949
950 aux = (struct objdump_disasm_info *) info->application_data;
951 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
952 (long *) NULL);
953
954 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
955 }
956
957 /* Hold the last function name and the last line number we displayed
958 in a disassembly. */
959
960 static char *prev_functionname;
961 static unsigned int prev_line;
962
963 /* We keep a list of all files that we have seen when doing a
964 dissassembly with source, so that we know how much of the file to
965 display. This can be important for inlined functions. */
966
967 struct print_file_list
968 {
969 struct print_file_list *next;
970 char *filename;
971 unsigned int line;
972 FILE *f;
973 };
974
975 static struct print_file_list *print_files;
976
977 /* The number of preceding context lines to show when we start
978 displaying a file for the first time. */
979
980 #define SHOW_PRECEDING_CONTEXT_LINES (5)
981
982 /* Skip ahead to a given line in a file, optionally printing each
983 line. */
984
985 static void
986 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
987
988 static void
989 skip_to_line (p, line, show)
990 struct print_file_list *p;
991 unsigned int line;
992 boolean show;
993 {
994 while (p->line < line)
995 {
996 char buf[100];
997
998 if (fgets (buf, sizeof buf, p->f) == NULL)
999 {
1000 fclose (p->f);
1001 p->f = NULL;
1002 break;
1003 }
1004
1005 if (show)
1006 printf ("%s", buf);
1007
1008 if (strchr (buf, '\n') != NULL)
1009 ++p->line;
1010 }
1011 }
1012
1013 /* Show the line number, or the source line, in a dissassembly
1014 listing. */
1015
1016 static void
1017 show_line (abfd, section, addr_offset)
1018 bfd *abfd;
1019 asection *section;
1020 bfd_vma addr_offset;
1021 {
1022 CONST char *filename;
1023 CONST char *functionname;
1024 unsigned int line;
1025
1026 if (! with_line_numbers && ! with_source_code)
1027 return;
1028
1029 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1030 &functionname, &line))
1031 return;
1032
1033 if (filename != NULL && *filename == '\0')
1034 filename = NULL;
1035 if (functionname != NULL && *functionname == '\0')
1036 functionname = NULL;
1037
1038 if (with_line_numbers)
1039 {
1040 if (functionname != NULL
1041 && (prev_functionname == NULL
1042 || strcmp (functionname, prev_functionname) != 0))
1043 printf ("%s():\n", functionname);
1044 if (line > 0 && line != prev_line)
1045 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1046 }
1047
1048 if (with_source_code
1049 && filename != NULL
1050 && line > 0)
1051 {
1052 struct print_file_list **pp, *p;
1053
1054 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1055 if (strcmp ((*pp)->filename, filename) == 0)
1056 break;
1057 p = *pp;
1058
1059 if (p != NULL)
1060 {
1061 if (p != print_files)
1062 {
1063 int l;
1064
1065 /* We have reencountered a file name which we saw
1066 earlier. This implies that either we are dumping out
1067 code from an included file, or the same file was
1068 linked in more than once. There are two common cases
1069 of an included file: inline functions in a header
1070 file, and a bison or flex skeleton file. In the
1071 former case we want to just start printing (but we
1072 back up a few lines to give context); in the latter
1073 case we want to continue from where we left off. I
1074 can't think of a good way to distinguish the cases,
1075 so I used a heuristic based on the file name. */
1076 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1077 l = p->line;
1078 else
1079 {
1080 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1081 if (l < 0)
1082 l = 0;
1083 }
1084
1085 if (p->f == NULL)
1086 {
1087 p->f = fopen (p->filename, "r");
1088 p->line = 0;
1089 }
1090 if (p->f != NULL)
1091 skip_to_line (p, l, false);
1092
1093 if (print_files->f != NULL)
1094 {
1095 fclose (print_files->f);
1096 print_files->f = NULL;
1097 }
1098 }
1099
1100 if (p->f != NULL)
1101 {
1102 skip_to_line (p, line, true);
1103 *pp = p->next;
1104 p->next = print_files;
1105 print_files = p;
1106 }
1107 }
1108 else
1109 {
1110 FILE *f;
1111
1112 f = fopen (filename, "r");
1113 if (f != NULL)
1114 {
1115 int l;
1116
1117 p = ((struct print_file_list *)
1118 xmalloc (sizeof (struct print_file_list)));
1119 p->filename = xmalloc (strlen (filename) + 1);
1120 strcpy (p->filename, filename);
1121 p->line = 0;
1122 p->f = f;
1123
1124 if (print_files != NULL && print_files->f != NULL)
1125 {
1126 fclose (print_files->f);
1127 print_files->f = NULL;
1128 }
1129 p->next = print_files;
1130 print_files = p;
1131
1132 if (file_start_context)
1133 l = 0;
1134 else
1135 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1136 if (l < 0)
1137 l = 0;
1138 skip_to_line (p, l, false);
1139 if (p->f != NULL)
1140 skip_to_line (p, line, true);
1141 }
1142 }
1143 }
1144
1145 if (functionname != NULL
1146 && (prev_functionname == NULL
1147 || strcmp (functionname, prev_functionname) != 0))
1148 {
1149 if (prev_functionname != NULL)
1150 free (prev_functionname);
1151 prev_functionname = xmalloc (strlen (functionname) + 1);
1152 strcpy (prev_functionname, functionname);
1153 }
1154
1155 if (line > 0 && line != prev_line)
1156 prev_line = line;
1157 }
1158
1159 /* Pseudo FILE object for strings. */
1160 typedef struct
1161 {
1162 char *buffer;
1163 size_t size;
1164 char *current;
1165 } SFILE;
1166
1167 /* sprintf to a "stream" */
1168
1169 static int
1170 #ifdef ANSI_PROTOTYPES
1171 objdump_sprintf (SFILE *f, const char *format, ...)
1172 #else
1173 objdump_sprintf (va_alist)
1174 va_dcl
1175 #endif
1176 {
1177 #ifndef ANSI_PROTOTYPES
1178 SFILE *f;
1179 const char *format;
1180 #endif
1181 char *buf;
1182 va_list args;
1183 size_t n;
1184
1185 #ifdef ANSI_PROTOTYPES
1186 va_start (args, format);
1187 #else
1188 va_start (args);
1189 f = va_arg (args, SFILE *);
1190 format = va_arg (args, const char *);
1191 #endif
1192
1193 vasprintf (&buf, format, args);
1194
1195 va_end (args);
1196
1197 if (buf == NULL)
1198 {
1199 fatal (_("Out of virtual memory"));
1200 }
1201
1202 n = strlen (buf);
1203
1204 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1205 {
1206 size_t curroff;
1207
1208 curroff = f->current - f->buffer;
1209 f->size *= 2;
1210 f->buffer = xrealloc (f->buffer, f->size);
1211 f->current = f->buffer + curroff;
1212 }
1213
1214 memcpy (f->current, buf, n);
1215 f->current += n;
1216 f->current[0] = '\0';
1217
1218 free (buf);
1219
1220 return n;
1221 }
1222
1223 /* The number of zeroes we want to see before we start skipping them.
1224 The number is arbitrarily chosen. */
1225
1226 #ifndef SKIP_ZEROES
1227 #define SKIP_ZEROES (8)
1228 #endif
1229
1230 /* The number of zeroes to skip at the end of a section. If the
1231 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1232 SKIP_ZEROES, they will be disassembled. If there are fewer than
1233 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1234 attempt to avoid disassembling zeroes inserted by section
1235 alignment. */
1236
1237 #ifndef SKIP_ZEROES_AT_END
1238 #define SKIP_ZEROES_AT_END (3)
1239 #endif
1240
1241 /* Disassemble some data in memory between given values. */
1242
1243 static void
1244 disassemble_bytes (info, disassemble_fn, insns, data,
1245 start_offset, stop_offset, relppp,
1246 relppend)
1247 struct disassemble_info *info;
1248 disassembler_ftype disassemble_fn;
1249 boolean insns;
1250 bfd_byte *data;
1251 bfd_vma start_offset;
1252 bfd_vma stop_offset;
1253 arelent ***relppp;
1254 arelent **relppend;
1255 {
1256 struct objdump_disasm_info *aux;
1257 asection *section;
1258 int octets_per_line;
1259 boolean done_dot;
1260 int skip_addr_chars;
1261 bfd_vma addr_offset;
1262 int opb = info->octets_per_byte;
1263
1264 aux = (struct objdump_disasm_info *) info->application_data;
1265 section = aux->sec;
1266
1267 if (insns)
1268 octets_per_line = 4;
1269 else
1270 octets_per_line = 16;
1271
1272 /* Figure out how many characters to skip at the start of an
1273 address, to make the disassembly look nicer. We discard leading
1274 zeroes in chunks of 4, ensuring that there is always a leading
1275 zero remaining. */
1276 skip_addr_chars = 0;
1277 if (! prefix_addresses)
1278 {
1279 char buf[30];
1280 char *s;
1281
1282 sprintf_vma (buf, section->vma +
1283 bfd_section_size (section->owner, section) / opb);
1284 s = buf;
1285 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1286 && s[4] == '0')
1287 {
1288 skip_addr_chars += 4;
1289 s += 4;
1290 }
1291 }
1292
1293 info->insn_info_valid = 0;
1294
1295 done_dot = false;
1296 addr_offset = start_offset;
1297 while (addr_offset < stop_offset)
1298 {
1299 bfd_vma z;
1300 int octets = 0;
1301 boolean need_nl = false;
1302
1303 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1304 print `...'. */
1305 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1306 if (data[z] != 0)
1307 break;
1308 if (! disassemble_zeroes
1309 && (info->insn_info_valid == 0
1310 || info->branch_delay_insns == 0)
1311 && (z - addr_offset * opb >= SKIP_ZEROES
1312 || (z == stop_offset * opb &&
1313 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1314 {
1315 printf ("\t...\n");
1316
1317 /* If there are more nonzero octets to follow, we only skip
1318 zeroes in multiples of 4, to try to avoid running over
1319 the start of an instruction which happens to start with
1320 zero. */
1321 if (z != stop_offset * opb)
1322 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1323
1324 octets = z - addr_offset * opb;
1325 }
1326 else
1327 {
1328 char buf[50];
1329 SFILE sfile;
1330 int bpc = 0;
1331 int pb = 0;
1332
1333 done_dot = false;
1334
1335 if (with_line_numbers || with_source_code)
1336 /* The line number tables will refer to unadjusted
1337 section VMAs, so we must undo any VMA modifications
1338 when calling show_line. */
1339 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
1340
1341 if (! prefix_addresses)
1342 {
1343 char *s;
1344
1345 sprintf_vma (buf, section->vma + addr_offset);
1346 for (s = buf + skip_addr_chars; *s == '0'; s++)
1347 *s = ' ';
1348 if (*s == '\0')
1349 *--s = '0';
1350 printf ("%s:\t", buf + skip_addr_chars);
1351 }
1352 else
1353 {
1354 aux->require_sec = true;
1355 objdump_print_address (section->vma + addr_offset, info);
1356 aux->require_sec = false;
1357 putchar (' ');
1358 }
1359
1360 if (insns)
1361 {
1362 sfile.size = 120;
1363 sfile.buffer = xmalloc (sfile.size);
1364 sfile.current = sfile.buffer;
1365 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1366 info->stream = (FILE *) &sfile;
1367 info->bytes_per_line = 0;
1368 info->bytes_per_chunk = 0;
1369
1370 #ifdef DISASSEMBLER_NEEDS_RELOCS
1371 /* FIXME: This is wrong. It tests the number of octets
1372 in the last instruction, not the current one. */
1373 if (*relppp < relppend
1374 && (**relppp)->address >= addr_offset
1375 && (**relppp)->address <= addr_offset + octets / opb)
1376 info->flags = INSN_HAS_RELOC;
1377 else
1378 #endif
1379 info->flags = 0;
1380
1381 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1382 info->fprintf_func = (fprintf_ftype) fprintf;
1383 info->stream = stdout;
1384 if (info->bytes_per_line != 0)
1385 octets_per_line = info->bytes_per_line;
1386 if (octets < 0)
1387 {
1388 if (sfile.current != sfile.buffer)
1389 printf ("%s\n", sfile.buffer);
1390 free (sfile.buffer);
1391 break;
1392 }
1393 }
1394 else
1395 {
1396 bfd_vma j;
1397
1398 octets = octets_per_line;
1399 if (addr_offset + octets / opb > stop_offset)
1400 octets = (stop_offset - addr_offset) * opb;
1401
1402 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1403 {
1404 if (isprint (data[j]))
1405 buf[j - addr_offset * opb] = data[j];
1406 else
1407 buf[j - addr_offset * opb] = '.';
1408 }
1409 buf[j - addr_offset * opb] = '\0';
1410 }
1411
1412 if (prefix_addresses
1413 ? show_raw_insn > 0
1414 : show_raw_insn >= 0)
1415 {
1416 bfd_vma j;
1417
1418 /* If ! prefix_addresses and ! wide_output, we print
1419 octets_per_line octets per line. */
1420 pb = octets;
1421 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1422 pb = octets_per_line;
1423
1424 if (info->bytes_per_chunk)
1425 bpc = info->bytes_per_chunk;
1426 else
1427 bpc = 1;
1428
1429 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1430 {
1431 int k;
1432 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1433 {
1434 for (k = bpc - 1; k >= 0; k--)
1435 printf ("%02x", (unsigned) data[j + k]);
1436 putchar (' ');
1437 }
1438 else
1439 {
1440 for (k = 0; k < bpc; k++)
1441 printf ("%02x", (unsigned) data[j + k]);
1442 putchar (' ');
1443 }
1444 }
1445
1446 for (; pb < octets_per_line; pb += bpc)
1447 {
1448 int k;
1449
1450 for (k = 0; k < bpc; k++)
1451 printf (" ");
1452 putchar (' ');
1453 }
1454
1455 /* Separate raw data from instruction by extra space. */
1456 if (insns)
1457 putchar ('\t');
1458 else
1459 printf (" ");
1460 }
1461
1462 if (! insns)
1463 printf ("%s", buf);
1464 else
1465 {
1466 printf ("%s", sfile.buffer);
1467 free (sfile.buffer);
1468 }
1469
1470 if (prefix_addresses
1471 ? show_raw_insn > 0
1472 : show_raw_insn >= 0)
1473 {
1474 while (pb < octets)
1475 {
1476 bfd_vma j;
1477 char *s;
1478
1479 putchar ('\n');
1480 j = addr_offset * opb + pb;
1481
1482 sprintf_vma (buf, section->vma + j / opb);
1483 for (s = buf + skip_addr_chars; *s == '0'; s++)
1484 *s = ' ';
1485 if (*s == '\0')
1486 *--s = '0';
1487 printf ("%s:\t", buf + skip_addr_chars);
1488
1489 pb += octets_per_line;
1490 if (pb > octets)
1491 pb = octets;
1492 for (; j < addr_offset * opb + pb; j += bpc)
1493 {
1494 int k;
1495
1496 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1497 {
1498 for (k = bpc - 1; k >= 0; k--)
1499 printf ("%02x", (unsigned) data[j + k]);
1500 putchar (' ');
1501 }
1502 else
1503 {
1504 for (k = 0; k < bpc; k++)
1505 printf ("%02x", (unsigned) data[j + k]);
1506 putchar (' ');
1507 }
1508 }
1509 }
1510 }
1511
1512 if (!wide_output)
1513 putchar ('\n');
1514 else
1515 need_nl = true;
1516 }
1517
1518 if ((section->flags & SEC_RELOC) != 0
1519 #ifndef DISASSEMBLER_NEEDS_RELOCS
1520 && dump_reloc_info
1521 #endif
1522 )
1523 {
1524 while ((*relppp) < relppend
1525 && ((**relppp)->address >= (bfd_vma) addr_offset
1526 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1527 #ifdef DISASSEMBLER_NEEDS_RELOCS
1528 if (! dump_reloc_info)
1529 ++(*relppp);
1530 else
1531 #endif
1532 {
1533 arelent *q;
1534
1535 q = **relppp;
1536
1537 if (wide_output)
1538 putchar ('\t');
1539 else
1540 printf ("\t\t\t");
1541
1542 objdump_print_value (section->vma + q->address, info, true);
1543
1544 printf (": %s\t", q->howto->name);
1545
1546 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1547 printf ("*unknown*");
1548 else
1549 {
1550 const char *sym_name;
1551
1552 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1553 if (sym_name != NULL && *sym_name != '\0')
1554 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1555 else
1556 {
1557 asection *sym_sec;
1558
1559 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1560 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1561 if (sym_name == NULL || *sym_name == '\0')
1562 sym_name = "*unknown*";
1563 printf ("%s", sym_name);
1564 }
1565 }
1566
1567 if (q->addend)
1568 {
1569 printf ("+0x");
1570 objdump_print_value (q->addend, info, true);
1571 }
1572
1573 printf ("\n");
1574 need_nl = false;
1575 ++(*relppp);
1576 }
1577 }
1578
1579 if (need_nl)
1580 printf ("\n");
1581
1582 addr_offset += octets / opb;
1583 }
1584 }
1585
1586 /* Disassemble the contents of an object file. */
1587
1588 static void
1589 disassemble_data (abfd)
1590 bfd *abfd;
1591 {
1592 unsigned long addr_offset;
1593 disassembler_ftype disassemble_fn;
1594 struct disassemble_info disasm_info;
1595 struct objdump_disasm_info aux;
1596 asection *section;
1597 unsigned int opb;
1598
1599 print_files = NULL;
1600 prev_functionname = NULL;
1601 prev_line = -1;
1602
1603 /* We make a copy of syms to sort. We don't want to sort syms
1604 because that will screw up the relocs. */
1605 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1606 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1607
1608 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1609
1610 /* Sort the symbols into section and symbol order */
1611 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1612
1613 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1614 disasm_info.application_data = (PTR) &aux;
1615 aux.abfd = abfd;
1616 aux.require_sec = false;
1617 disasm_info.print_address_func = objdump_print_address;
1618 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1619
1620 if (machine != (char *) NULL)
1621 {
1622 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1623 if (info == NULL)
1624 {
1625 fatal (_("Can't use supplied machine %s"), machine);
1626 }
1627 abfd->arch_info = info;
1628 }
1629
1630 if (endian != BFD_ENDIAN_UNKNOWN)
1631 {
1632 struct bfd_target *xvec;
1633
1634 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1635 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1636 xvec->byteorder = endian;
1637 abfd->xvec = xvec;
1638 }
1639
1640 disassemble_fn = disassembler (abfd);
1641 if (!disassemble_fn)
1642 {
1643 non_fatal (_("Can't disassemble for architecture %s\n"),
1644 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1645 exit_status = 1;
1646 return;
1647 }
1648
1649 opb = bfd_octets_per_byte (abfd);
1650
1651 disasm_info.flavour = bfd_get_flavour (abfd);
1652 disasm_info.arch = bfd_get_arch (abfd);
1653 disasm_info.mach = bfd_get_mach (abfd);
1654 disasm_info.disassembler_options = disassembler_options;
1655 disasm_info.octets_per_byte = opb;
1656
1657 if (bfd_big_endian (abfd))
1658 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1659 else if (bfd_little_endian (abfd))
1660 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1661 else
1662 /* ??? Aborting here seems too drastic. We could default to big or little
1663 instead. */
1664 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1665
1666 for (section = abfd->sections;
1667 section != (asection *) NULL;
1668 section = section->next)
1669 {
1670 bfd_byte *data = NULL;
1671 bfd_size_type datasize = 0;
1672 arelent **relbuf = NULL;
1673 arelent **relpp = NULL;
1674 arelent **relppend = NULL;
1675 unsigned long stop_offset;
1676 asymbol *sym = NULL;
1677 long place = 0;
1678
1679 if ((section->flags & SEC_LOAD) == 0
1680 || (! disassemble_all
1681 && only == NULL
1682 && (section->flags & SEC_CODE) == 0))
1683 continue;
1684 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1685 continue;
1686
1687 if ((section->flags & SEC_RELOC) != 0
1688 #ifndef DISASSEMBLER_NEEDS_RELOCS
1689 && dump_reloc_info
1690 #endif
1691 )
1692 {
1693 long relsize;
1694
1695 relsize = bfd_get_reloc_upper_bound (abfd, section);
1696 if (relsize < 0)
1697 bfd_fatal (bfd_get_filename (abfd));
1698
1699 if (relsize > 0)
1700 {
1701 long relcount;
1702
1703 relbuf = (arelent **) xmalloc (relsize);
1704 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1705 if (relcount < 0)
1706 bfd_fatal (bfd_get_filename (abfd));
1707
1708 /* Sort the relocs by address. */
1709 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1710
1711 relpp = relbuf;
1712 relppend = relpp + relcount;
1713
1714 /* Skip over the relocs belonging to addresses below the
1715 start address. */
1716 if (start_address != (bfd_vma) -1)
1717 {
1718 while (relpp < relppend
1719 && (*relpp)->address < start_address)
1720 ++relpp;
1721 }
1722 }
1723 }
1724
1725 printf (_("Disassembly of section %s:\n"), section->name);
1726
1727 datasize = bfd_get_section_size_before_reloc (section);
1728 if (datasize == 0)
1729 continue;
1730
1731 data = (bfd_byte *) xmalloc ((size_t) datasize);
1732
1733 bfd_get_section_contents (abfd, section, data, 0, datasize);
1734
1735 aux.sec = section;
1736 disasm_info.buffer = data;
1737 disasm_info.buffer_vma = section->vma;
1738 disasm_info.buffer_length = datasize;
1739 disasm_info.section = section;
1740 if (start_address == (bfd_vma) -1
1741 || start_address < disasm_info.buffer_vma)
1742 addr_offset = 0;
1743 else
1744 addr_offset = start_address - disasm_info.buffer_vma;
1745 if (stop_address == (bfd_vma) -1)
1746 stop_offset = datasize / opb;
1747 else
1748 {
1749 if (stop_address < disasm_info.buffer_vma)
1750 stop_offset = 0;
1751 else
1752 stop_offset = stop_address - disasm_info.buffer_vma;
1753 if (stop_offset > disasm_info.buffer_length / opb)
1754 stop_offset = disasm_info.buffer_length / opb;
1755 }
1756
1757 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1758 true, &place);
1759
1760 while (addr_offset < stop_offset)
1761 {
1762 asymbol *nextsym;
1763 unsigned long nextstop_offset;
1764 boolean insns;
1765
1766 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1767 {
1768 int x;
1769
1770 for (x = place;
1771 (x < sorted_symcount
1772 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1773 ++x)
1774 continue;
1775 disasm_info.symbols = & sorted_syms[place];
1776 disasm_info.num_symbols = x - place;
1777 }
1778 else
1779 disasm_info.symbols = NULL;
1780
1781 if (! prefix_addresses)
1782 {
1783 printf ("\n");
1784 objdump_print_addr_with_sym (abfd, section, sym,
1785 section->vma + addr_offset,
1786 &disasm_info,
1787 false);
1788 printf (":\n");
1789 }
1790
1791 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1792 nextsym = sym;
1793 else if (sym == NULL)
1794 nextsym = NULL;
1795 else
1796 {
1797 /* Search forward for the next appropriate symbol in
1798 SECTION. Note that all the symbols are sorted
1799 together into one big array, and that some sections
1800 may have overlapping addresses. */
1801 while (place < sorted_symcount
1802 && (sorted_syms[place]->section != section
1803 || (bfd_asymbol_value (sorted_syms[place])
1804 <= bfd_asymbol_value (sym))))
1805 ++place;
1806 if (place >= sorted_symcount)
1807 nextsym = NULL;
1808 else
1809 nextsym = sorted_syms[place];
1810 }
1811
1812 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1813 {
1814 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1815 if (nextstop_offset > stop_offset)
1816 nextstop_offset = stop_offset;
1817 }
1818 else if (nextsym == NULL)
1819 nextstop_offset = stop_offset;
1820 else
1821 {
1822 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1823 if (nextstop_offset > stop_offset)
1824 nextstop_offset = stop_offset;
1825 }
1826
1827 /* If a symbol is explicitly marked as being an object
1828 rather than a function, just dump the bytes without
1829 disassembling them. */
1830 if (disassemble_all
1831 || sym == NULL
1832 || bfd_asymbol_value (sym) > section->vma + addr_offset
1833 || ((sym->flags & BSF_OBJECT) == 0
1834 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1835 == NULL)
1836 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1837 == NULL))
1838 || (sym->flags & BSF_FUNCTION) != 0)
1839 insns = true;
1840 else
1841 insns = false;
1842
1843 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1844 addr_offset, nextstop_offset, &relpp, relppend);
1845
1846 addr_offset = nextstop_offset;
1847 sym = nextsym;
1848 }
1849
1850 free (data);
1851 if (relbuf != NULL)
1852 free (relbuf);
1853 }
1854 free (sorted_syms);
1855 }
1856 \f
1857
1858 /* Define a table of stab values and print-strings. We wish the initializer
1859 could be a direct-mapped table, but instead we build one the first
1860 time we need it. */
1861
1862 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1863 char *strsect_name));
1864
1865 /* Dump the stabs sections from an object file that has a section that
1866 uses Sun stabs encoding. */
1867
1868 static void
1869 dump_stabs (abfd)
1870 bfd *abfd;
1871 {
1872 dump_section_stabs (abfd, ".stab", ".stabstr");
1873 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1874 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1875 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1876 }
1877
1878 static bfd_byte *stabs;
1879 static bfd_size_type stab_size;
1880
1881 static char *strtab;
1882 static bfd_size_type stabstr_size;
1883
1884 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1885 and string table section STRSECT_NAME into `strtab'.
1886 If the section exists and was read, allocate the space and return true.
1887 Otherwise return false. */
1888
1889 static boolean
1890 read_section_stabs (abfd, stabsect_name, strsect_name)
1891 bfd *abfd;
1892 const char *stabsect_name;
1893 const char *strsect_name;
1894 {
1895 asection *stabsect, *stabstrsect;
1896
1897 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1898 if (0 == stabsect)
1899 {
1900 printf (_("No %s section present\n\n"), stabsect_name);
1901 return false;
1902 }
1903
1904 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1905 if (0 == stabstrsect)
1906 {
1907 non_fatal (_("%s has no %s section"),
1908 bfd_get_filename (abfd), strsect_name);
1909 exit_status = 1;
1910 return false;
1911 }
1912
1913 stab_size = bfd_section_size (abfd, stabsect);
1914 stabstr_size = bfd_section_size (abfd, stabstrsect);
1915
1916 stabs = (bfd_byte *) xmalloc (stab_size);
1917 strtab = (char *) xmalloc (stabstr_size);
1918
1919 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1920 {
1921 non_fatal (_("Reading %s section of %s failed: %s"),
1922 stabsect_name, bfd_get_filename (abfd),
1923 bfd_errmsg (bfd_get_error ()));
1924 free (stabs);
1925 free (strtab);
1926 exit_status = 1;
1927 return false;
1928 }
1929
1930 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1931 stabstr_size))
1932 {
1933 non_fatal (_("Reading %s section of %s failed: %s\n"),
1934 strsect_name, bfd_get_filename (abfd),
1935 bfd_errmsg (bfd_get_error ()));
1936 free (stabs);
1937 free (strtab);
1938 exit_status = 1;
1939 return false;
1940 }
1941
1942 return true;
1943 }
1944
1945 /* Stabs entries use a 12 byte format:
1946 4 byte string table index
1947 1 byte stab type
1948 1 byte stab other field
1949 2 byte stab desc field
1950 4 byte stab value
1951 FIXME: This will have to change for a 64 bit object format. */
1952
1953 #define STRDXOFF (0)
1954 #define TYPEOFF (4)
1955 #define OTHEROFF (5)
1956 #define DESCOFF (6)
1957 #define VALOFF (8)
1958 #define STABSIZE (12)
1959
1960 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1961 using string table section STRSECT_NAME (in `strtab'). */
1962
1963 static void
1964 print_section_stabs (abfd, stabsect_name, strsect_name)
1965 bfd *abfd;
1966 const char *stabsect_name;
1967 const char *strsect_name ATTRIBUTE_UNUSED;
1968 {
1969 int i;
1970 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1971 bfd_byte *stabp, *stabs_end;
1972
1973 stabp = stabs;
1974 stabs_end = stabp + stab_size;
1975
1976 printf (_("Contents of %s section:\n\n"), stabsect_name);
1977 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1978
1979 /* Loop through all symbols and print them.
1980
1981 We start the index at -1 because there is a dummy symbol on
1982 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1983
1984 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1985 {
1986 const char *name;
1987 unsigned long strx;
1988 unsigned char type, other;
1989 unsigned short desc;
1990 bfd_vma value;
1991
1992 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1993 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1994 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1995 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1996 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1997
1998 printf ("\n%-6d ", i);
1999 /* Either print the stab name, or, if unnamed, print its number
2000 again (makes consistent formatting for tools like awk). */
2001 name = bfd_get_stab_name (type);
2002 if (name != NULL)
2003 printf ("%-6s", name);
2004 else if (type == N_UNDF)
2005 printf ("HdrSym");
2006 else
2007 printf ("%-6d", type);
2008 printf (" %-6d %-6d ", other, desc);
2009 printf_vma (value);
2010 printf (" %-6lu", strx);
2011
2012 /* Symbols with type == 0 (N_UNDF) specify the length of the
2013 string table associated with this file. We use that info
2014 to know how to relocate the *next* file's string table indices. */
2015
2016 if (type == N_UNDF)
2017 {
2018 file_string_table_offset = next_file_string_table_offset;
2019 next_file_string_table_offset += value;
2020 }
2021 else
2022 {
2023 /* Using the (possibly updated) string table offset, print the
2024 string (if any) associated with this symbol. */
2025
2026 if ((strx + file_string_table_offset) < stabstr_size)
2027 printf (" %s", &strtab[strx + file_string_table_offset]);
2028 else
2029 printf (" *");
2030 }
2031 }
2032 printf ("\n\n");
2033 }
2034
2035 static void
2036 dump_section_stabs (abfd, stabsect_name, strsect_name)
2037 bfd *abfd;
2038 char *stabsect_name;
2039 char *strsect_name;
2040 {
2041 asection *s;
2042
2043 /* Check for section names for which stabsect_name is a prefix, to
2044 handle .stab0, etc. */
2045 for (s = abfd->sections;
2046 s != NULL;
2047 s = s->next)
2048 {
2049 int len;
2050
2051 len = strlen (stabsect_name);
2052
2053 /* If the prefix matches, and the files section name ends with a
2054 nul or a digit, then we match. I.e., we want either an exact
2055 match or a section followed by a number. */
2056 if (strncmp (stabsect_name, s->name, len) == 0
2057 && (s->name[len] == '\000'
2058 || isdigit ((unsigned char) s->name[len])))
2059 {
2060 if (read_section_stabs (abfd, s->name, strsect_name))
2061 {
2062 print_section_stabs (abfd, s->name, strsect_name);
2063 free (stabs);
2064 free (strtab);
2065 }
2066 }
2067 }
2068 }
2069 \f
2070 static void
2071 dump_bfd_header (abfd)
2072 bfd *abfd;
2073 {
2074 char *comma = "";
2075
2076 printf (_("architecture: %s, "),
2077 bfd_printable_arch_mach (bfd_get_arch (abfd),
2078 bfd_get_mach (abfd)));
2079 printf (_("flags 0x%08x:\n"), abfd->flags);
2080
2081 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2082 PF (HAS_RELOC, "HAS_RELOC");
2083 PF (EXEC_P, "EXEC_P");
2084 PF (HAS_LINENO, "HAS_LINENO");
2085 PF (HAS_DEBUG, "HAS_DEBUG");
2086 PF (HAS_SYMS, "HAS_SYMS");
2087 PF (HAS_LOCALS, "HAS_LOCALS");
2088 PF (DYNAMIC, "DYNAMIC");
2089 PF (WP_TEXT, "WP_TEXT");
2090 PF (D_PAGED, "D_PAGED");
2091 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2092 printf (_("\nstart address 0x"));
2093 printf_vma (abfd->start_address);
2094 printf ("\n");
2095 }
2096 \f
2097 static void
2098 dump_bfd_private_header (abfd)
2099 bfd *abfd;
2100 {
2101 bfd_print_private_bfd_data (abfd, stdout);
2102 }
2103
2104 /* Dump selected contents of ABFD */
2105
2106 static void
2107 dump_bfd (abfd)
2108 bfd *abfd;
2109 {
2110 /* If we are adjusting section VMA's, change them all now. Changing
2111 the BFD information is a hack. However, we must do it, or
2112 bfd_find_nearest_line will not do the right thing. */
2113 if (adjust_section_vma != 0)
2114 {
2115 asection *s;
2116
2117 for (s = abfd->sections; s != NULL; s = s->next)
2118 {
2119 s->vma += adjust_section_vma;
2120 s->lma += adjust_section_vma;
2121 }
2122 }
2123
2124 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2125 abfd->xvec->name);
2126 if (dump_ar_hdrs)
2127 print_arelt_descr (stdout, abfd, true);
2128 if (dump_file_header)
2129 dump_bfd_header (abfd);
2130 if (dump_private_headers)
2131 dump_bfd_private_header (abfd);
2132 putchar ('\n');
2133 if (dump_section_headers)
2134 dump_headers (abfd);
2135 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2136 {
2137 syms = slurp_symtab (abfd);
2138 }
2139 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2140 {
2141 dynsyms = slurp_dynamic_symtab (abfd);
2142 }
2143 if (dump_symtab)
2144 dump_symbols (abfd, false);
2145 if (dump_dynamic_symtab)
2146 dump_symbols (abfd, true);
2147 if (dump_stab_section_info)
2148 dump_stabs (abfd);
2149 if (dump_reloc_info && ! disassemble)
2150 dump_relocs (abfd);
2151 if (dump_dynamic_reloc_info)
2152 dump_dynamic_relocs (abfd);
2153 if (dump_section_contents)
2154 dump_data (abfd);
2155 if (disassemble)
2156 disassemble_data (abfd);
2157 if (dump_debugging)
2158 {
2159 PTR dhandle;
2160
2161 dhandle = read_debugging_info (abfd, syms, symcount);
2162 if (dhandle != NULL)
2163 {
2164 if (! print_debugging_info (stdout, dhandle))
2165 {
2166 non_fatal (_("%s: printing debugging information failed"),
2167 bfd_get_filename (abfd));
2168 exit_status = 1;
2169 }
2170 }
2171 }
2172 if (syms)
2173 {
2174 free (syms);
2175 syms = NULL;
2176 }
2177 if (dynsyms)
2178 {
2179 free (dynsyms);
2180 dynsyms = NULL;
2181 }
2182 }
2183
2184 static void
2185 display_bfd (abfd)
2186 bfd *abfd;
2187 {
2188 char **matching;
2189
2190 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2191 {
2192 dump_bfd (abfd);
2193 return;
2194 }
2195
2196 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2197 {
2198 nonfatal (bfd_get_filename (abfd));
2199 list_matching_formats (matching);
2200 free (matching);
2201 return;
2202 }
2203
2204 if (bfd_get_error () != bfd_error_file_not_recognized)
2205 {
2206 nonfatal (bfd_get_filename (abfd));
2207 return;
2208 }
2209
2210 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2211 {
2212 dump_bfd (abfd);
2213 return;
2214 }
2215
2216 nonfatal (bfd_get_filename (abfd));
2217
2218 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2219 {
2220 list_matching_formats (matching);
2221 free (matching);
2222 }
2223 }
2224
2225 static void
2226 display_file (filename, target)
2227 char *filename;
2228 char *target;
2229 {
2230 bfd *file, *arfile = (bfd *) NULL;
2231
2232 file = bfd_openr (filename, target);
2233 if (file == NULL)
2234 {
2235 nonfatal (filename);
2236 return;
2237 }
2238
2239 if (bfd_check_format (file, bfd_archive) == true)
2240 {
2241 bfd *last_arfile = NULL;
2242
2243 printf (_("In archive %s:\n"), bfd_get_filename (file));
2244 for (;;)
2245 {
2246 bfd_set_error (bfd_error_no_error);
2247
2248 arfile = bfd_openr_next_archived_file (file, arfile);
2249 if (arfile == NULL)
2250 {
2251 if (bfd_get_error () != bfd_error_no_more_archived_files)
2252 nonfatal (bfd_get_filename (file));
2253 break;
2254 }
2255
2256 display_bfd (arfile);
2257
2258 if (last_arfile != NULL)
2259 bfd_close (last_arfile);
2260 last_arfile = arfile;
2261 }
2262
2263 if (last_arfile != NULL)
2264 bfd_close (last_arfile);
2265 }
2266 else
2267 display_bfd (file);
2268
2269 bfd_close (file);
2270 }
2271 \f
2272 /* Actually display the various requested regions */
2273
2274 static void
2275 dump_data (abfd)
2276 bfd *abfd;
2277 {
2278 asection *section;
2279 bfd_byte *data = 0;
2280 bfd_size_type datasize = 0;
2281 bfd_size_type addr_offset;
2282 bfd_size_type start_offset, stop_offset;
2283 unsigned int opb = bfd_octets_per_byte (abfd);
2284
2285 for (section = abfd->sections; section != NULL; section =
2286 section->next)
2287 {
2288 int onaline = 16;
2289
2290 if (only == (char *) NULL ||
2291 strcmp (only, section->name) == 0)
2292 {
2293 if (section->flags & SEC_HAS_CONTENTS)
2294 {
2295 printf (_("Contents of section %s:\n"), section->name);
2296
2297 if (bfd_section_size (abfd, section) == 0)
2298 continue;
2299 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2300 datasize = bfd_section_size (abfd, section);
2301
2302
2303 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2304
2305 if (start_address == (bfd_vma) -1
2306 || start_address < section->vma)
2307 start_offset = 0;
2308 else
2309 start_offset = start_address - section->vma;
2310 if (stop_address == (bfd_vma) -1)
2311 stop_offset = bfd_section_size (abfd, section) / opb;
2312 else
2313 {
2314 if (stop_address < section->vma)
2315 stop_offset = 0;
2316 else
2317 stop_offset = stop_address - section->vma;
2318 if (stop_offset > bfd_section_size (abfd, section) / opb)
2319 stop_offset = bfd_section_size (abfd, section) / opb;
2320 }
2321 for (addr_offset = start_offset;
2322 addr_offset < stop_offset; addr_offset += onaline)
2323 {
2324 bfd_size_type j;
2325
2326 printf (" %04lx ", (unsigned long int)
2327 (addr_offset + section->vma));
2328 for (j = addr_offset * opb;
2329 j < addr_offset * opb + onaline; j++)
2330 {
2331 if (j < stop_offset * opb)
2332 printf ("%02x", (unsigned) (data[j]));
2333 else
2334 printf (" ");
2335 if ((j & 3) == 3)
2336 printf (" ");
2337 }
2338
2339 printf (" ");
2340 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2341 {
2342 if (j >= stop_offset * opb)
2343 printf (" ");
2344 else
2345 printf ("%c", isprint (data[j]) ? data[j] : '.');
2346 }
2347 putchar ('\n');
2348 }
2349 free (data);
2350 }
2351 }
2352 }
2353 }
2354
2355 /* Should perhaps share code and display with nm? */
2356 static void
2357 dump_symbols (abfd, dynamic)
2358 bfd *abfd ATTRIBUTE_UNUSED;
2359 boolean dynamic;
2360 {
2361 asymbol **current;
2362 long max;
2363 long count;
2364
2365 if (dynamic)
2366 {
2367 current = dynsyms;
2368 max = dynsymcount;
2369 if (max == 0)
2370 return;
2371 printf ("DYNAMIC SYMBOL TABLE:\n");
2372 }
2373 else
2374 {
2375 current = syms;
2376 max = symcount;
2377 if (max == 0)
2378 return;
2379 printf ("SYMBOL TABLE:\n");
2380 }
2381
2382 for (count = 0; count < max; count++)
2383 {
2384 if (*current)
2385 {
2386 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2387
2388 if (cur_bfd != NULL)
2389 {
2390 const char *name;
2391 char *alloc;
2392
2393 name = bfd_asymbol_name (*current);
2394 alloc = NULL;
2395 if (do_demangle && name != NULL && *name != '\0')
2396 {
2397 const char *n;
2398
2399 /* If we want to demangle the name, we demangle it
2400 here, and temporarily clobber it while calling
2401 bfd_print_symbol. FIXME: This is a gross hack. */
2402
2403 n = name;
2404 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2405 ++n;
2406 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2407 if (alloc != NULL)
2408 (*current)->name = alloc;
2409 else
2410 (*current)->name = n;
2411 }
2412
2413 bfd_print_symbol (cur_bfd, stdout, *current,
2414 bfd_print_symbol_all);
2415
2416 (*current)->name = name;
2417 if (alloc != NULL)
2418 free (alloc);
2419
2420 printf ("\n");
2421 }
2422 }
2423 current++;
2424 }
2425 printf ("\n");
2426 printf ("\n");
2427 }
2428
2429 static void
2430 dump_relocs (abfd)
2431 bfd *abfd;
2432 {
2433 arelent **relpp;
2434 long relcount;
2435 asection *a;
2436
2437 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2438 {
2439 long relsize;
2440
2441 if (bfd_is_abs_section (a))
2442 continue;
2443 if (bfd_is_und_section (a))
2444 continue;
2445 if (bfd_is_com_section (a))
2446 continue;
2447
2448 if (only)
2449 {
2450 if (strcmp (only, a->name))
2451 continue;
2452 }
2453 else if ((a->flags & SEC_RELOC) == 0)
2454 continue;
2455
2456 relsize = bfd_get_reloc_upper_bound (abfd, a);
2457 if (relsize < 0)
2458 bfd_fatal (bfd_get_filename (abfd));
2459
2460 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2461
2462 if (relsize == 0)
2463 {
2464 printf (" (none)\n\n");
2465 }
2466 else
2467 {
2468 relpp = (arelent **) xmalloc (relsize);
2469 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2470 if (relcount < 0)
2471 bfd_fatal (bfd_get_filename (abfd));
2472 else if (relcount == 0)
2473 {
2474 printf (" (none)\n\n");
2475 }
2476 else
2477 {
2478 printf ("\n");
2479 dump_reloc_set (abfd, a, relpp, relcount);
2480 printf ("\n\n");
2481 }
2482 free (relpp);
2483 }
2484 }
2485 }
2486
2487 static void
2488 dump_dynamic_relocs (abfd)
2489 bfd *abfd;
2490 {
2491 long relsize;
2492 arelent **relpp;
2493 long relcount;
2494
2495 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2496 if (relsize < 0)
2497 bfd_fatal (bfd_get_filename (abfd));
2498
2499 printf ("DYNAMIC RELOCATION RECORDS");
2500
2501 if (relsize == 0)
2502 {
2503 printf (" (none)\n\n");
2504 }
2505 else
2506 {
2507 relpp = (arelent **) xmalloc (relsize);
2508 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2509 if (relcount < 0)
2510 bfd_fatal (bfd_get_filename (abfd));
2511 else if (relcount == 0)
2512 {
2513 printf (" (none)\n\n");
2514 }
2515 else
2516 {
2517 printf ("\n");
2518 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2519 printf ("\n\n");
2520 }
2521 free (relpp);
2522 }
2523 }
2524
2525 static void
2526 dump_reloc_set (abfd, sec, relpp, relcount)
2527 bfd *abfd;
2528 asection *sec;
2529 arelent **relpp;
2530 long relcount;
2531 {
2532 arelent **p;
2533 char *last_filename, *last_functionname;
2534 unsigned int last_line;
2535
2536 /* Get column headers lined up reasonably. */
2537 {
2538 static int width;
2539 if (width == 0)
2540 {
2541 char buf[30];
2542 sprintf_vma (buf, (bfd_vma) -1);
2543 width = strlen (buf) - 7;
2544 }
2545 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2546 }
2547
2548 last_filename = NULL;
2549 last_functionname = NULL;
2550 last_line = 0;
2551
2552 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2553 {
2554 arelent *q = *p;
2555 const char *filename, *functionname;
2556 unsigned int line;
2557 const char *sym_name;
2558 const char *section_name;
2559
2560 if (start_address != (bfd_vma) -1
2561 && q->address < start_address)
2562 continue;
2563 if (stop_address != (bfd_vma) -1
2564 && q->address > stop_address)
2565 continue;
2566
2567 if (with_line_numbers
2568 && sec != NULL
2569 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2570 &filename, &functionname, &line))
2571 {
2572 if (functionname != NULL
2573 && (last_functionname == NULL
2574 || strcmp (functionname, last_functionname) != 0))
2575 {
2576 printf ("%s():\n", functionname);
2577 if (last_functionname != NULL)
2578 free (last_functionname);
2579 last_functionname = xstrdup (functionname);
2580 }
2581 if (line > 0
2582 && (line != last_line
2583 || (filename != NULL
2584 && last_filename != NULL
2585 && strcmp (filename, last_filename) != 0)))
2586 {
2587 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2588 last_line = line;
2589 if (last_filename != NULL)
2590 free (last_filename);
2591 if (filename == NULL)
2592 last_filename = NULL;
2593 else
2594 last_filename = xstrdup (filename);
2595 }
2596 }
2597
2598 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2599 {
2600 sym_name = (*(q->sym_ptr_ptr))->name;
2601 section_name = (*(q->sym_ptr_ptr))->section->name;
2602 }
2603 else
2604 {
2605 sym_name = NULL;
2606 section_name = NULL;
2607 }
2608 if (sym_name)
2609 {
2610 printf_vma (q->address);
2611 if (q->howto->name)
2612 printf (" %-16s ", q->howto->name);
2613 else
2614 printf (" %-16d ", q->howto->type);
2615 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2616 *q->sym_ptr_ptr);
2617 }
2618 else
2619 {
2620 if (section_name == (CONST char *) NULL)
2621 section_name = "*unknown*";
2622 printf_vma (q->address);
2623 printf (" %-16s [%s]",
2624 q->howto->name,
2625 section_name);
2626 }
2627 if (q->addend)
2628 {
2629 printf ("+0x");
2630 printf_vma (q->addend);
2631 }
2632 printf ("\n");
2633 }
2634 }
2635 \f
2636 /* The length of the longest architecture name + 1. */
2637 #define LONGEST_ARCH sizeof("powerpc:common")
2638
2639 static const char *
2640 endian_string (endian)
2641 enum bfd_endian endian;
2642 {
2643 if (endian == BFD_ENDIAN_BIG)
2644 return "big endian";
2645 else if (endian == BFD_ENDIAN_LITTLE)
2646 return "little endian";
2647 else
2648 return "endianness unknown";
2649 }
2650
2651 /* List the targets that BFD is configured to support, each followed
2652 by its endianness and the architectures it supports. */
2653
2654 static void
2655 display_target_list ()
2656 {
2657 extern const bfd_target *const *bfd_target_vector;
2658 char *dummy_name;
2659 int t;
2660
2661 dummy_name = make_temp_file (NULL);
2662 for (t = 0; bfd_target_vector[t]; t++)
2663 {
2664 const bfd_target *p = bfd_target_vector[t];
2665 bfd *abfd = bfd_openw (dummy_name, p->name);
2666 int a;
2667
2668 printf ("%s\n (header %s, data %s)\n", p->name,
2669 endian_string (p->header_byteorder),
2670 endian_string (p->byteorder));
2671
2672 if (abfd == NULL)
2673 {
2674 nonfatal (dummy_name);
2675 continue;
2676 }
2677
2678 if (! bfd_set_format (abfd, bfd_object))
2679 {
2680 if (bfd_get_error () != bfd_error_invalid_operation)
2681 nonfatal (p->name);
2682 bfd_close_all_done (abfd);
2683 continue;
2684 }
2685
2686 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2687 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2688 printf (" %s\n",
2689 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2690 bfd_close_all_done (abfd);
2691 }
2692 unlink (dummy_name);
2693 free (dummy_name);
2694 }
2695
2696 /* Print a table showing which architectures are supported for entries
2697 FIRST through LAST-1 of bfd_target_vector (targets across,
2698 architectures down). */
2699
2700 static void
2701 display_info_table (first, last)
2702 int first;
2703 int last;
2704 {
2705 extern const bfd_target *const *bfd_target_vector;
2706 int t, a;
2707 char *dummy_name;
2708
2709 /* Print heading of target names. */
2710 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2711 for (t = first; t < last && bfd_target_vector[t]; t++)
2712 printf ("%s ", bfd_target_vector[t]->name);
2713 putchar ('\n');
2714
2715 dummy_name = make_temp_file (NULL);
2716 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2717 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2718 {
2719 printf ("%*s ", (int) LONGEST_ARCH - 1,
2720 bfd_printable_arch_mach (a, 0));
2721 for (t = first; t < last && bfd_target_vector[t]; t++)
2722 {
2723 const bfd_target *p = bfd_target_vector[t];
2724 boolean ok = true;
2725 bfd *abfd = bfd_openw (dummy_name, p->name);
2726
2727 if (abfd == NULL)
2728 {
2729 nonfatal (p->name);
2730 ok = false;
2731 }
2732
2733 if (ok)
2734 {
2735 if (! bfd_set_format (abfd, bfd_object))
2736 {
2737 if (bfd_get_error () != bfd_error_invalid_operation)
2738 nonfatal (p->name);
2739 ok = false;
2740 }
2741 }
2742
2743 if (ok)
2744 {
2745 if (! bfd_set_arch_mach (abfd, a, 0))
2746 ok = false;
2747 }
2748
2749 if (ok)
2750 printf ("%s ", p->name);
2751 else
2752 {
2753 int l = strlen (p->name);
2754 while (l--)
2755 putchar ('-');
2756 putchar (' ');
2757 }
2758 if (abfd != NULL)
2759 bfd_close_all_done (abfd);
2760 }
2761 putchar ('\n');
2762 }
2763 unlink (dummy_name);
2764 free (dummy_name);
2765 }
2766
2767 /* Print tables of all the target-architecture combinations that
2768 BFD has been configured to support. */
2769
2770 static void
2771 display_target_tables ()
2772 {
2773 int t, columns;
2774 extern const bfd_target *const *bfd_target_vector;
2775 char *colum;
2776
2777 columns = 0;
2778 colum = getenv ("COLUMNS");
2779 if (colum != NULL)
2780 columns = atoi (colum);
2781 if (columns == 0)
2782 columns = 80;
2783
2784 t = 0;
2785 while (bfd_target_vector[t] != NULL)
2786 {
2787 int oldt = t, wid;
2788
2789 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2790 ++t;
2791 while (wid < columns && bfd_target_vector[t] != NULL)
2792 {
2793 int newwid;
2794
2795 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2796 if (newwid >= columns)
2797 break;
2798 wid = newwid;
2799 ++t;
2800 }
2801 display_info_table (oldt, t);
2802 }
2803 }
2804
2805 static void
2806 display_info ()
2807 {
2808 printf (_("BFD header file version %s\n"), BFD_VERSION);
2809 display_target_list ();
2810 display_target_tables ();
2811 }
2812
2813 int
2814 main (argc, argv)
2815 int argc;
2816 char **argv;
2817 {
2818 int c;
2819 char *target = default_target;
2820 boolean seenflag = false;
2821
2822 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2823 setlocale (LC_MESSAGES, "");
2824 #endif
2825 bindtextdomain (PACKAGE, LOCALEDIR);
2826 textdomain (PACKAGE);
2827
2828 program_name = *argv;
2829 xmalloc_set_program_name (program_name);
2830
2831 START_PROGRESS (program_name, 0);
2832
2833 bfd_init ();
2834 set_default_bfd_target ();
2835
2836 while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG",
2837 long_options, (int *) 0))
2838 != EOF)
2839 {
2840 switch (c)
2841 {
2842 case 0:
2843 break; /* we've been given a long option */
2844 case 'm':
2845 machine = optarg;
2846 break;
2847 case 'M':
2848 disassembler_options = optarg;
2849 break;
2850 case 'j':
2851 only = optarg;
2852 break;
2853 case 'l':
2854 with_line_numbers = true;
2855 break;
2856 case 'b':
2857 target = optarg;
2858 break;
2859 case 'C':
2860 do_demangle = true;
2861 if (optarg != NULL)
2862 {
2863 enum demangling_styles style;
2864
2865 style = cplus_demangle_name_to_style (optarg);
2866 if (style == unknown_demangling)
2867 fatal (_("unknown demangling style `%s'"),
2868 optarg);
2869
2870 cplus_demangle_set_style (style);
2871 }
2872 break;
2873 case 'w':
2874 wide_output = true;
2875 break;
2876 case OPTION_ADJUST_VMA:
2877 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2878 break;
2879 case OPTION_START_ADDRESS:
2880 start_address = parse_vma (optarg, "--start-address");
2881 break;
2882 case OPTION_STOP_ADDRESS:
2883 stop_address = parse_vma (optarg, "--stop-address");
2884 break;
2885 case 'E':
2886 if (strcmp (optarg, "B") == 0)
2887 endian = BFD_ENDIAN_BIG;
2888 else if (strcmp (optarg, "L") == 0)
2889 endian = BFD_ENDIAN_LITTLE;
2890 else
2891 {
2892 non_fatal (_("unrecognized -E option"));
2893 usage (stderr, 1);
2894 }
2895 break;
2896 case OPTION_ENDIAN:
2897 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2898 endian = BFD_ENDIAN_BIG;
2899 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2900 endian = BFD_ENDIAN_LITTLE;
2901 else
2902 {
2903 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2904 usage (stderr, 1);
2905 }
2906 break;
2907
2908 case 'f':
2909 dump_file_header = true;
2910 seenflag = true;
2911 break;
2912 case 'i':
2913 formats_info = true;
2914 seenflag = true;
2915 break;
2916 case 'p':
2917 dump_private_headers = true;
2918 seenflag = true;
2919 break;
2920 case 'x':
2921 dump_private_headers = true;
2922 dump_symtab = true;
2923 dump_reloc_info = true;
2924 dump_file_header = true;
2925 dump_ar_hdrs = true;
2926 dump_section_headers = true;
2927 seenflag = true;
2928 break;
2929 case 't':
2930 dump_symtab = true;
2931 seenflag = true;
2932 break;
2933 case 'T':
2934 dump_dynamic_symtab = true;
2935 seenflag = true;
2936 break;
2937 case 'd':
2938 disassemble = true;
2939 seenflag = true;
2940 break;
2941 case 'z':
2942 disassemble_zeroes = true;
2943 break;
2944 case 'D':
2945 disassemble = true;
2946 disassemble_all = true;
2947 seenflag = true;
2948 break;
2949 case 'S':
2950 disassemble = true;
2951 with_source_code = true;
2952 seenflag = true;
2953 break;
2954 case 'g':
2955 dump_debugging = 1;
2956 seenflag = true;
2957 break;
2958 case 'G':
2959 dump_stab_section_info = true;
2960 seenflag = true;
2961 break;
2962 case 's':
2963 dump_section_contents = true;
2964 seenflag = true;
2965 break;
2966 case 'r':
2967 dump_reloc_info = true;
2968 seenflag = true;
2969 break;
2970 case 'R':
2971 dump_dynamic_reloc_info = true;
2972 seenflag = true;
2973 break;
2974 case 'a':
2975 dump_ar_hdrs = true;
2976 seenflag = true;
2977 break;
2978 case 'h':
2979 dump_section_headers = true;
2980 seenflag = true;
2981 break;
2982 case 'H':
2983 usage (stdout, 0);
2984 seenflag = true;
2985 case 'V':
2986 show_version = true;
2987 seenflag = true;
2988 break;
2989
2990 default:
2991 usage (stderr, 1);
2992 }
2993 }
2994
2995 if (show_version)
2996 print_version ("objdump");
2997
2998 if (seenflag == false)
2999 usage (stderr, 2);
3000
3001 if (formats_info)
3002 display_info ();
3003 else
3004 {
3005 if (optind == argc)
3006 display_file ("a.out", target);
3007 else
3008 for (; optind < argc;)
3009 display_file (argv[optind++], target);
3010 }
3011
3012 END_PROGRESS (program_name);
3013
3014 return exit_status;
3015 }
This page took 0.114976 seconds and 5 git commands to generate.