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