Fix typos in ChangeLogs and update copyright notices
[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
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 show_line (aux->abfd, section, addr_offset);
1332
1333 if (! prefix_addresses)
1334 {
1335 char *s;
1336
1337 sprintf_vma (buf, section->vma + addr_offset);
1338 for (s = buf + skip_addr_chars; *s == '0'; s++)
1339 *s = ' ';
1340 if (*s == '\0')
1341 *--s = '0';
1342 printf ("%s:\t", buf + skip_addr_chars);
1343 }
1344 else
1345 {
1346 aux->require_sec = true;
1347 objdump_print_address (section->vma + addr_offset, info);
1348 aux->require_sec = false;
1349 putchar (' ');
1350 }
1351
1352 if (insns)
1353 {
1354 sfile.size = 120;
1355 sfile.buffer = xmalloc (sfile.size);
1356 sfile.current = sfile.buffer;
1357 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1358 info->stream = (FILE *) &sfile;
1359 info->bytes_per_line = 0;
1360 info->bytes_per_chunk = 0;
1361
1362 #ifdef DISASSEMBLER_NEEDS_RELOCS
1363 /* FIXME: This is wrong. It tests the number of octets
1364 in the last instruction, not the current one. */
1365 if (*relppp < relppend
1366 && (**relppp)->address >= addr_offset
1367 && (**relppp)->address <= addr_offset + octets / opb)
1368 info->flags = INSN_HAS_RELOC;
1369 else
1370 #endif
1371 info->flags = 0;
1372
1373 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1374 info->fprintf_func = (fprintf_ftype) fprintf;
1375 info->stream = stdout;
1376 if (info->bytes_per_line != 0)
1377 octets_per_line = info->bytes_per_line;
1378 if (octets < 0)
1379 {
1380 if (sfile.current != sfile.buffer)
1381 printf ("%s\n", sfile.buffer);
1382 free (sfile.buffer);
1383 break;
1384 }
1385 }
1386 else
1387 {
1388 bfd_vma j;
1389
1390 octets = octets_per_line;
1391 if (addr_offset + octets / opb > stop_offset)
1392 octets = (stop_offset - addr_offset) * opb;
1393
1394 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1395 {
1396 if (isprint (data[j]))
1397 buf[j - addr_offset * opb] = data[j];
1398 else
1399 buf[j - addr_offset * opb] = '.';
1400 }
1401 buf[j - addr_offset * opb] = '\0';
1402 }
1403
1404 if (prefix_addresses
1405 ? show_raw_insn > 0
1406 : show_raw_insn >= 0)
1407 {
1408 bfd_vma j;
1409
1410 /* If ! prefix_addresses and ! wide_output, we print
1411 octets_per_line octets per line. */
1412 pb = octets;
1413 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1414 pb = octets_per_line;
1415
1416 if (info->bytes_per_chunk)
1417 bpc = info->bytes_per_chunk;
1418 else
1419 bpc = 1;
1420
1421 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1422 {
1423 int k;
1424 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1425 {
1426 for (k = bpc - 1; k >= 0; k--)
1427 printf ("%02x", (unsigned) data[j + k]);
1428 putchar (' ');
1429 }
1430 else
1431 {
1432 for (k = 0; k < bpc; k++)
1433 printf ("%02x", (unsigned) data[j + k]);
1434 putchar (' ');
1435 }
1436 }
1437
1438 for (; pb < octets_per_line; pb += bpc)
1439 {
1440 int k;
1441
1442 for (k = 0; k < bpc; k++)
1443 printf (" ");
1444 putchar (' ');
1445 }
1446
1447 /* Separate raw data from instruction by extra space. */
1448 if (insns)
1449 putchar ('\t');
1450 else
1451 printf (" ");
1452 }
1453
1454 if (! insns)
1455 printf ("%s", buf);
1456 else
1457 {
1458 printf ("%s", sfile.buffer);
1459 free (sfile.buffer);
1460 }
1461
1462 if (prefix_addresses
1463 ? show_raw_insn > 0
1464 : show_raw_insn >= 0)
1465 {
1466 while (pb < octets)
1467 {
1468 bfd_vma j;
1469 char *s;
1470
1471 putchar ('\n');
1472 j = addr_offset * opb + pb;
1473
1474 sprintf_vma (buf, section->vma + j / opb);
1475 for (s = buf + skip_addr_chars; *s == '0'; s++)
1476 *s = ' ';
1477 if (*s == '\0')
1478 *--s = '0';
1479 printf ("%s:\t", buf + skip_addr_chars);
1480
1481 pb += octets_per_line;
1482 if (pb > octets)
1483 pb = octets;
1484 for (; j < addr_offset * opb + pb; j += bpc)
1485 {
1486 int k;
1487
1488 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1489 {
1490 for (k = bpc - 1; k >= 0; k--)
1491 printf ("%02x", (unsigned) data[j + k]);
1492 putchar (' ');
1493 }
1494 else
1495 {
1496 for (k = 0; k < bpc; k++)
1497 printf ("%02x", (unsigned) data[j + k]);
1498 putchar (' ');
1499 }
1500 }
1501 }
1502 }
1503
1504 if (!wide_output)
1505 putchar ('\n');
1506 else
1507 need_nl = true;
1508 }
1509
1510 if ((section->flags & SEC_RELOC) != 0
1511 #ifndef DISASSEMBLER_NEEDS_RELOCS
1512 && dump_reloc_info
1513 #endif
1514 )
1515 {
1516 while ((*relppp) < relppend
1517 && ((**relppp)->address >= (bfd_vma) addr_offset
1518 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1519 #ifdef DISASSEMBLER_NEEDS_RELOCS
1520 if (! dump_reloc_info)
1521 ++(*relppp);
1522 else
1523 #endif
1524 {
1525 arelent *q;
1526
1527 q = **relppp;
1528
1529 if (wide_output)
1530 putchar ('\t');
1531 else
1532 printf ("\t\t\t");
1533
1534 objdump_print_value (section->vma + q->address, info, true);
1535
1536 printf (": %s\t", q->howto->name);
1537
1538 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1539 printf ("*unknown*");
1540 else
1541 {
1542 const char *sym_name;
1543
1544 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1545 if (sym_name != NULL && *sym_name != '\0')
1546 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1547 else
1548 {
1549 asection *sym_sec;
1550
1551 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1552 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1553 if (sym_name == NULL || *sym_name == '\0')
1554 sym_name = "*unknown*";
1555 printf ("%s", sym_name);
1556 }
1557 }
1558
1559 if (q->addend)
1560 {
1561 printf ("+0x");
1562 objdump_print_value (q->addend, info, true);
1563 }
1564
1565 printf ("\n");
1566 need_nl = false;
1567 ++(*relppp);
1568 }
1569 }
1570
1571 if (need_nl)
1572 printf ("\n");
1573
1574 addr_offset += octets / opb;
1575 }
1576 }
1577
1578 /* Disassemble the contents of an object file. */
1579
1580 static void
1581 disassemble_data (abfd)
1582 bfd *abfd;
1583 {
1584 unsigned long addr_offset;
1585 disassembler_ftype disassemble_fn;
1586 struct disassemble_info disasm_info;
1587 struct objdump_disasm_info aux;
1588 asection *section;
1589 unsigned int opb;
1590
1591 print_files = NULL;
1592 prev_functionname = NULL;
1593 prev_line = -1;
1594
1595 /* We make a copy of syms to sort. We don't want to sort syms
1596 because that will screw up the relocs. */
1597 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1598 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1599
1600 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1601
1602 /* Sort the symbols into section and symbol order */
1603 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1604
1605 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1606 disasm_info.application_data = (PTR) &aux;
1607 aux.abfd = abfd;
1608 aux.require_sec = false;
1609 disasm_info.print_address_func = objdump_print_address;
1610 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1611
1612 if (machine != (char *) NULL)
1613 {
1614 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1615 if (info == NULL)
1616 {
1617 fatal (_("Can't use supplied machine %s"), machine);
1618 }
1619 abfd->arch_info = info;
1620 }
1621
1622 if (endian != BFD_ENDIAN_UNKNOWN)
1623 {
1624 struct bfd_target *xvec;
1625
1626 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1627 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1628 xvec->byteorder = endian;
1629 abfd->xvec = xvec;
1630 }
1631
1632 disassemble_fn = disassembler (abfd);
1633 if (!disassemble_fn)
1634 {
1635 non_fatal (_("Can't disassemble for architecture %s\n"),
1636 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1637 exit_status = 1;
1638 return;
1639 }
1640
1641 opb = bfd_octets_per_byte (abfd);
1642
1643 disasm_info.flavour = bfd_get_flavour (abfd);
1644 disasm_info.arch = bfd_get_arch (abfd);
1645 disasm_info.mach = bfd_get_mach (abfd);
1646 disasm_info.disassembler_options = disassembler_options;
1647 disasm_info.octets_per_byte = opb;
1648
1649 if (bfd_big_endian (abfd))
1650 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1651 else if (bfd_little_endian (abfd))
1652 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1653 else
1654 /* ??? Aborting here seems too drastic. We could default to big or little
1655 instead. */
1656 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1657
1658 for (section = abfd->sections;
1659 section != (asection *) NULL;
1660 section = section->next)
1661 {
1662 bfd_byte *data = NULL;
1663 bfd_size_type datasize = 0;
1664 arelent **relbuf = NULL;
1665 arelent **relpp = NULL;
1666 arelent **relppend = NULL;
1667 unsigned long stop_offset;
1668 asymbol *sym = NULL;
1669 long place = 0;
1670
1671 if ((section->flags & SEC_LOAD) == 0
1672 || (! disassemble_all
1673 && only == NULL
1674 && (section->flags & SEC_CODE) == 0))
1675 continue;
1676 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1677 continue;
1678
1679 if ((section->flags & SEC_RELOC) != 0
1680 #ifndef DISASSEMBLER_NEEDS_RELOCS
1681 && dump_reloc_info
1682 #endif
1683 )
1684 {
1685 long relsize;
1686
1687 relsize = bfd_get_reloc_upper_bound (abfd, section);
1688 if (relsize < 0)
1689 bfd_fatal (bfd_get_filename (abfd));
1690
1691 if (relsize > 0)
1692 {
1693 long relcount;
1694
1695 relbuf = (arelent **) xmalloc (relsize);
1696 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1697 if (relcount < 0)
1698 bfd_fatal (bfd_get_filename (abfd));
1699
1700 /* Sort the relocs by address. */
1701 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1702
1703 relpp = relbuf;
1704 relppend = relpp + relcount;
1705
1706 /* Skip over the relocs belonging to addresses below the
1707 start address. */
1708 if (start_address != (bfd_vma) -1)
1709 {
1710 while (relpp < relppend
1711 && (*relpp)->address < start_address)
1712 ++relpp;
1713 }
1714 }
1715 }
1716
1717 printf (_("Disassembly of section %s:\n"), section->name);
1718
1719 datasize = bfd_get_section_size_before_reloc (section);
1720 if (datasize == 0)
1721 continue;
1722
1723 data = (bfd_byte *) xmalloc ((size_t) datasize);
1724
1725 bfd_get_section_contents (abfd, section, data, 0, datasize);
1726
1727 aux.sec = section;
1728 disasm_info.buffer = data;
1729 disasm_info.buffer_vma = section->vma;
1730 disasm_info.buffer_length = datasize;
1731 if (start_address == (bfd_vma) -1
1732 || start_address < disasm_info.buffer_vma)
1733 addr_offset = 0;
1734 else
1735 addr_offset = start_address - disasm_info.buffer_vma;
1736 if (stop_address == (bfd_vma) -1)
1737 stop_offset = datasize / opb;
1738 else
1739 {
1740 if (stop_address < disasm_info.buffer_vma)
1741 stop_offset = 0;
1742 else
1743 stop_offset = stop_address - disasm_info.buffer_vma;
1744 if (stop_offset > disasm_info.buffer_length / opb)
1745 stop_offset = disasm_info.buffer_length / opb;
1746 }
1747
1748 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1749 true, &place);
1750
1751 while (addr_offset < stop_offset)
1752 {
1753 asymbol *nextsym;
1754 unsigned long nextstop_offset;
1755 boolean insns;
1756
1757 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1758 {
1759 int x;
1760
1761 for (x = place;
1762 (x < sorted_symcount
1763 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1764 ++x)
1765 continue;
1766 disasm_info.symbols = & sorted_syms[place];
1767 disasm_info.num_symbols = x - place;
1768 }
1769 else
1770 disasm_info.symbols = NULL;
1771
1772 if (! prefix_addresses)
1773 {
1774 printf ("\n");
1775 objdump_print_addr_with_sym (abfd, section, sym,
1776 section->vma + addr_offset,
1777 &disasm_info,
1778 false);
1779 printf (":\n");
1780 }
1781
1782 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1783 nextsym = sym;
1784 else if (sym == NULL)
1785 nextsym = NULL;
1786 else
1787 {
1788 /* Search forward for the next appropriate symbol in
1789 SECTION. Note that all the symbols are sorted
1790 together into one big array, and that some sections
1791 may have overlapping addresses. */
1792 while (place < sorted_symcount
1793 && (sorted_syms[place]->section != section
1794 || (bfd_asymbol_value (sorted_syms[place])
1795 <= bfd_asymbol_value (sym))))
1796 ++place;
1797 if (place >= sorted_symcount)
1798 nextsym = NULL;
1799 else
1800 nextsym = sorted_syms[place];
1801 }
1802
1803 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1804 {
1805 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1806 if (nextstop_offset > stop_offset)
1807 nextstop_offset = stop_offset;
1808 }
1809 else if (nextsym == NULL)
1810 nextstop_offset = stop_offset;
1811 else
1812 {
1813 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1814 if (nextstop_offset > stop_offset)
1815 nextstop_offset = stop_offset;
1816 }
1817
1818 /* If a symbol is explicitly marked as being an object
1819 rather than a function, just dump the bytes without
1820 disassembling them. */
1821 if (disassemble_all
1822 || sym == NULL
1823 || bfd_asymbol_value (sym) > section->vma + addr_offset
1824 || ((sym->flags & BSF_OBJECT) == 0
1825 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1826 == NULL)
1827 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1828 == NULL))
1829 || (sym->flags & BSF_FUNCTION) != 0)
1830 insns = true;
1831 else
1832 insns = false;
1833
1834 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1835 addr_offset, nextstop_offset, &relpp, relppend);
1836
1837 addr_offset = nextstop_offset;
1838 sym = nextsym;
1839 }
1840
1841 free (data);
1842 if (relbuf != NULL)
1843 free (relbuf);
1844 }
1845 free (sorted_syms);
1846 }
1847 \f
1848
1849 /* Define a table of stab values and print-strings. We wish the initializer
1850 could be a direct-mapped table, but instead we build one the first
1851 time we need it. */
1852
1853 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1854 char *strsect_name));
1855
1856 /* Dump the stabs sections from an object file that has a section that
1857 uses Sun stabs encoding. */
1858
1859 static void
1860 dump_stabs (abfd)
1861 bfd *abfd;
1862 {
1863 dump_section_stabs (abfd, ".stab", ".stabstr");
1864 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1865 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1866 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1867 }
1868
1869 static bfd_byte *stabs;
1870 static bfd_size_type stab_size;
1871
1872 static char *strtab;
1873 static bfd_size_type stabstr_size;
1874
1875 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1876 and string table section STRSECT_NAME into `strtab'.
1877 If the section exists and was read, allocate the space and return true.
1878 Otherwise return false. */
1879
1880 static boolean
1881 read_section_stabs (abfd, stabsect_name, strsect_name)
1882 bfd *abfd;
1883 const char *stabsect_name;
1884 const char *strsect_name;
1885 {
1886 asection *stabsect, *stabstrsect;
1887
1888 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1889 if (0 == stabsect)
1890 {
1891 printf (_("No %s section present\n\n"), stabsect_name);
1892 return false;
1893 }
1894
1895 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1896 if (0 == stabstrsect)
1897 {
1898 non_fatal (_("%s has no %s section"),
1899 bfd_get_filename (abfd), strsect_name);
1900 exit_status = 1;
1901 return false;
1902 }
1903
1904 stab_size = bfd_section_size (abfd, stabsect);
1905 stabstr_size = bfd_section_size (abfd, stabstrsect);
1906
1907 stabs = (bfd_byte *) xmalloc (stab_size);
1908 strtab = (char *) xmalloc (stabstr_size);
1909
1910 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1911 {
1912 non_fatal (_("Reading %s section of %s failed: %s"),
1913 stabsect_name, bfd_get_filename (abfd),
1914 bfd_errmsg (bfd_get_error ()));
1915 free (stabs);
1916 free (strtab);
1917 exit_status = 1;
1918 return false;
1919 }
1920
1921 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1922 stabstr_size))
1923 {
1924 non_fatal (_("Reading %s section of %s failed: %s\n"),
1925 strsect_name, bfd_get_filename (abfd),
1926 bfd_errmsg (bfd_get_error ()));
1927 free (stabs);
1928 free (strtab);
1929 exit_status = 1;
1930 return false;
1931 }
1932
1933 return true;
1934 }
1935
1936 /* Stabs entries use a 12 byte format:
1937 4 byte string table index
1938 1 byte stab type
1939 1 byte stab other field
1940 2 byte stab desc field
1941 4 byte stab value
1942 FIXME: This will have to change for a 64 bit object format. */
1943
1944 #define STRDXOFF (0)
1945 #define TYPEOFF (4)
1946 #define OTHEROFF (5)
1947 #define DESCOFF (6)
1948 #define VALOFF (8)
1949 #define STABSIZE (12)
1950
1951 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1952 using string table section STRSECT_NAME (in `strtab'). */
1953
1954 static void
1955 print_section_stabs (abfd, stabsect_name, strsect_name)
1956 bfd *abfd;
1957 const char *stabsect_name;
1958 const char *strsect_name ATTRIBUTE_UNUSED;
1959 {
1960 int i;
1961 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1962 bfd_byte *stabp, *stabs_end;
1963
1964 stabp = stabs;
1965 stabs_end = stabp + stab_size;
1966
1967 printf (_("Contents of %s section:\n\n"), stabsect_name);
1968 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1969
1970 /* Loop through all symbols and print them.
1971
1972 We start the index at -1 because there is a dummy symbol on
1973 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1974
1975 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1976 {
1977 const char *name;
1978 unsigned long strx;
1979 unsigned char type, other;
1980 unsigned short desc;
1981 bfd_vma value;
1982
1983 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1984 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1985 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1986 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1987 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1988
1989 printf ("\n%-6d ", i);
1990 /* Either print the stab name, or, if unnamed, print its number
1991 again (makes consistent formatting for tools like awk). */
1992 name = bfd_get_stab_name (type);
1993 if (name != NULL)
1994 printf ("%-6s", name);
1995 else if (type == N_UNDF)
1996 printf ("HdrSym");
1997 else
1998 printf ("%-6d", type);
1999 printf (" %-6d %-6d ", other, desc);
2000 printf_vma (value);
2001 printf (" %-6lu", strx);
2002
2003 /* Symbols with type == 0 (N_UNDF) specify the length of the
2004 string table associated with this file. We use that info
2005 to know how to relocate the *next* file's string table indices. */
2006
2007 if (type == N_UNDF)
2008 {
2009 file_string_table_offset = next_file_string_table_offset;
2010 next_file_string_table_offset += value;
2011 }
2012 else
2013 {
2014 /* Using the (possibly updated) string table offset, print the
2015 string (if any) associated with this symbol. */
2016
2017 if ((strx + file_string_table_offset) < stabstr_size)
2018 printf (" %s", &strtab[strx + file_string_table_offset]);
2019 else
2020 printf (" *");
2021 }
2022 }
2023 printf ("\n\n");
2024 }
2025
2026 static void
2027 dump_section_stabs (abfd, stabsect_name, strsect_name)
2028 bfd *abfd;
2029 char *stabsect_name;
2030 char *strsect_name;
2031 {
2032 asection *s;
2033
2034 /* Check for section names for which stabsect_name is a prefix, to
2035 handle .stab0, etc. */
2036 for (s = abfd->sections;
2037 s != NULL;
2038 s = s->next)
2039 {
2040 int len;
2041
2042 len = strlen (stabsect_name);
2043
2044 /* If the prefix matches, and the files section name ends with a
2045 nul or a digit, then we match. I.e., we want either an exact
2046 match or a section followed by a number. */
2047 if (strncmp (stabsect_name, s->name, len) == 0
2048 && (s->name[len] == '\000'
2049 || isdigit ((unsigned char) s->name[len])))
2050 {
2051 if (read_section_stabs (abfd, s->name, strsect_name))
2052 {
2053 print_section_stabs (abfd, s->name, strsect_name);
2054 free (stabs);
2055 free (strtab);
2056 }
2057 }
2058 }
2059 }
2060 \f
2061 static void
2062 dump_bfd_header (abfd)
2063 bfd *abfd;
2064 {
2065 char *comma = "";
2066
2067 printf (_("architecture: %s, "),
2068 bfd_printable_arch_mach (bfd_get_arch (abfd),
2069 bfd_get_mach (abfd)));
2070 printf (_("flags 0x%08x:\n"), abfd->flags);
2071
2072 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2073 PF (HAS_RELOC, "HAS_RELOC");
2074 PF (EXEC_P, "EXEC_P");
2075 PF (HAS_LINENO, "HAS_LINENO");
2076 PF (HAS_DEBUG, "HAS_DEBUG");
2077 PF (HAS_SYMS, "HAS_SYMS");
2078 PF (HAS_LOCALS, "HAS_LOCALS");
2079 PF (DYNAMIC, "DYNAMIC");
2080 PF (WP_TEXT, "WP_TEXT");
2081 PF (D_PAGED, "D_PAGED");
2082 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2083 printf (_("\nstart address 0x"));
2084 printf_vma (abfd->start_address);
2085 printf ("\n");
2086 }
2087 \f
2088 static void
2089 dump_bfd_private_header (abfd)
2090 bfd *abfd;
2091 {
2092 bfd_print_private_bfd_data (abfd, stdout);
2093 }
2094
2095 /* Dump selected contents of ABFD */
2096
2097 static void
2098 dump_bfd (abfd)
2099 bfd *abfd;
2100 {
2101 /* If we are adjusting section VMA's, change them all now. Changing
2102 the BFD information is a hack. However, we must do it, or
2103 bfd_find_nearest_line will not do the right thing. */
2104 if (adjust_section_vma != 0)
2105 {
2106 asection *s;
2107
2108 for (s = abfd->sections; s != NULL; s = s->next)
2109 {
2110 s->vma += adjust_section_vma;
2111 s->lma += adjust_section_vma;
2112 }
2113 }
2114
2115 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2116 abfd->xvec->name);
2117 if (dump_ar_hdrs)
2118 print_arelt_descr (stdout, abfd, true);
2119 if (dump_file_header)
2120 dump_bfd_header (abfd);
2121 if (dump_private_headers)
2122 dump_bfd_private_header (abfd);
2123 putchar ('\n');
2124 if (dump_section_headers)
2125 dump_headers (abfd);
2126 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2127 {
2128 syms = slurp_symtab (abfd);
2129 }
2130 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2131 {
2132 dynsyms = slurp_dynamic_symtab (abfd);
2133 }
2134 if (dump_symtab)
2135 dump_symbols (abfd, false);
2136 if (dump_dynamic_symtab)
2137 dump_symbols (abfd, true);
2138 if (dump_stab_section_info)
2139 dump_stabs (abfd);
2140 if (dump_reloc_info && ! disassemble)
2141 dump_relocs (abfd);
2142 if (dump_dynamic_reloc_info)
2143 dump_dynamic_relocs (abfd);
2144 if (dump_section_contents)
2145 dump_data (abfd);
2146 if (disassemble)
2147 disassemble_data (abfd);
2148 if (dump_debugging)
2149 {
2150 PTR dhandle;
2151
2152 dhandle = read_debugging_info (abfd, syms, symcount);
2153 if (dhandle != NULL)
2154 {
2155 if (! print_debugging_info (stdout, dhandle))
2156 {
2157 non_fatal (_("%s: printing debugging information failed"),
2158 bfd_get_filename (abfd));
2159 exit_status = 1;
2160 }
2161 }
2162 }
2163 if (syms)
2164 {
2165 free (syms);
2166 syms = NULL;
2167 }
2168 if (dynsyms)
2169 {
2170 free (dynsyms);
2171 dynsyms = NULL;
2172 }
2173 }
2174
2175 static void
2176 display_bfd (abfd)
2177 bfd *abfd;
2178 {
2179 char **matching;
2180
2181 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2182 {
2183 dump_bfd (abfd);
2184 return;
2185 }
2186
2187 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2188 {
2189 nonfatal (bfd_get_filename (abfd));
2190 list_matching_formats (matching);
2191 free (matching);
2192 return;
2193 }
2194
2195 if (bfd_get_error () != bfd_error_file_not_recognized)
2196 {
2197 nonfatal (bfd_get_filename (abfd));
2198 return;
2199 }
2200
2201 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2202 {
2203 dump_bfd (abfd);
2204 return;
2205 }
2206
2207 nonfatal (bfd_get_filename (abfd));
2208
2209 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2210 {
2211 list_matching_formats (matching);
2212 free (matching);
2213 }
2214 }
2215
2216 static void
2217 display_file (filename, target)
2218 char *filename;
2219 char *target;
2220 {
2221 bfd *file, *arfile = (bfd *) NULL;
2222
2223 file = bfd_openr (filename, target);
2224 if (file == NULL)
2225 {
2226 nonfatal (filename);
2227 return;
2228 }
2229
2230 if (bfd_check_format (file, bfd_archive) == true)
2231 {
2232 bfd *last_arfile = NULL;
2233
2234 printf (_("In archive %s:\n"), bfd_get_filename (file));
2235 for (;;)
2236 {
2237 bfd_set_error (bfd_error_no_error);
2238
2239 arfile = bfd_openr_next_archived_file (file, arfile);
2240 if (arfile == NULL)
2241 {
2242 if (bfd_get_error () != bfd_error_no_more_archived_files)
2243 nonfatal (bfd_get_filename (file));
2244 break;
2245 }
2246
2247 display_bfd (arfile);
2248
2249 if (last_arfile != NULL)
2250 bfd_close (last_arfile);
2251 last_arfile = arfile;
2252 }
2253
2254 if (last_arfile != NULL)
2255 bfd_close (last_arfile);
2256 }
2257 else
2258 display_bfd (file);
2259
2260 bfd_close (file);
2261 }
2262 \f
2263 /* Actually display the various requested regions */
2264
2265 static void
2266 dump_data (abfd)
2267 bfd *abfd;
2268 {
2269 asection *section;
2270 bfd_byte *data = 0;
2271 bfd_size_type datasize = 0;
2272 bfd_size_type addr_offset;
2273 bfd_size_type start_offset, stop_offset;
2274 unsigned int opb = bfd_octets_per_byte (abfd);
2275
2276 for (section = abfd->sections; section != NULL; section =
2277 section->next)
2278 {
2279 int onaline = 16;
2280
2281 if (only == (char *) NULL ||
2282 strcmp (only, section->name) == 0)
2283 {
2284 if (section->flags & SEC_HAS_CONTENTS)
2285 {
2286 printf (_("Contents of section %s:\n"), section->name);
2287
2288 if (bfd_section_size (abfd, section) == 0)
2289 continue;
2290 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2291 datasize = bfd_section_size (abfd, section);
2292
2293
2294 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2295
2296 if (start_address == (bfd_vma) -1
2297 || start_address < section->vma)
2298 start_offset = 0;
2299 else
2300 start_offset = start_address - section->vma;
2301 if (stop_address == (bfd_vma) -1)
2302 stop_offset = bfd_section_size (abfd, section) / opb;
2303 else
2304 {
2305 if (stop_address < section->vma)
2306 stop_offset = 0;
2307 else
2308 stop_offset = stop_address - section->vma;
2309 if (stop_offset > bfd_section_size (abfd, section) / opb)
2310 stop_offset = bfd_section_size (abfd, section) / opb;
2311 }
2312 for (addr_offset = start_offset;
2313 addr_offset < stop_offset; addr_offset += onaline)
2314 {
2315 bfd_size_type j;
2316
2317 printf (" %04lx ", (unsigned long int)
2318 (addr_offset + section->vma));
2319 for (j = addr_offset * opb;
2320 j < addr_offset * opb + onaline; j++)
2321 {
2322 if (j < stop_offset * opb)
2323 printf ("%02x", (unsigned) (data[j]));
2324 else
2325 printf (" ");
2326 if ((j & 3) == 3)
2327 printf (" ");
2328 }
2329
2330 printf (" ");
2331 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2332 {
2333 if (j >= stop_offset * opb)
2334 printf (" ");
2335 else
2336 printf ("%c", isprint (data[j]) ? data[j] : '.');
2337 }
2338 putchar ('\n');
2339 }
2340 free (data);
2341 }
2342 }
2343 }
2344 }
2345
2346 /* Should perhaps share code and display with nm? */
2347 static void
2348 dump_symbols (abfd, dynamic)
2349 bfd *abfd ATTRIBUTE_UNUSED;
2350 boolean dynamic;
2351 {
2352 asymbol **current;
2353 long max;
2354 long count;
2355
2356 if (dynamic)
2357 {
2358 current = dynsyms;
2359 max = dynsymcount;
2360 if (max == 0)
2361 return;
2362 printf ("DYNAMIC SYMBOL TABLE:\n");
2363 }
2364 else
2365 {
2366 current = syms;
2367 max = symcount;
2368 if (max == 0)
2369 return;
2370 printf ("SYMBOL TABLE:\n");
2371 }
2372
2373 for (count = 0; count < max; count++)
2374 {
2375 if (*current)
2376 {
2377 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2378
2379 if (cur_bfd != NULL)
2380 {
2381 const char *name;
2382 char *alloc;
2383
2384 name = bfd_asymbol_name (*current);
2385 alloc = NULL;
2386 if (do_demangle && name != NULL && *name != '\0')
2387 {
2388 const char *n;
2389
2390 /* If we want to demangle the name, we demangle it
2391 here, and temporarily clobber it while calling
2392 bfd_print_symbol. FIXME: This is a gross hack. */
2393
2394 n = name;
2395 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2396 ++n;
2397 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2398 if (alloc != NULL)
2399 (*current)->name = alloc;
2400 else
2401 (*current)->name = n;
2402 }
2403
2404 bfd_print_symbol (cur_bfd, stdout, *current,
2405 bfd_print_symbol_all);
2406
2407 (*current)->name = name;
2408 if (alloc != NULL)
2409 free (alloc);
2410
2411 printf ("\n");
2412 }
2413 }
2414 current++;
2415 }
2416 printf ("\n");
2417 printf ("\n");
2418 }
2419
2420 static void
2421 dump_relocs (abfd)
2422 bfd *abfd;
2423 {
2424 arelent **relpp;
2425 long relcount;
2426 asection *a;
2427
2428 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2429 {
2430 long relsize;
2431
2432 if (bfd_is_abs_section (a))
2433 continue;
2434 if (bfd_is_und_section (a))
2435 continue;
2436 if (bfd_is_com_section (a))
2437 continue;
2438
2439 if (only)
2440 {
2441 if (strcmp (only, a->name))
2442 continue;
2443 }
2444 else if ((a->flags & SEC_RELOC) == 0)
2445 continue;
2446
2447 relsize = bfd_get_reloc_upper_bound (abfd, a);
2448 if (relsize < 0)
2449 bfd_fatal (bfd_get_filename (abfd));
2450
2451 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2452
2453 if (relsize == 0)
2454 {
2455 printf (" (none)\n\n");
2456 }
2457 else
2458 {
2459 relpp = (arelent **) xmalloc (relsize);
2460 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2461 if (relcount < 0)
2462 bfd_fatal (bfd_get_filename (abfd));
2463 else if (relcount == 0)
2464 {
2465 printf (" (none)\n\n");
2466 }
2467 else
2468 {
2469 printf ("\n");
2470 dump_reloc_set (abfd, a, relpp, relcount);
2471 printf ("\n\n");
2472 }
2473 free (relpp);
2474 }
2475 }
2476 }
2477
2478 static void
2479 dump_dynamic_relocs (abfd)
2480 bfd *abfd;
2481 {
2482 long relsize;
2483 arelent **relpp;
2484 long relcount;
2485
2486 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2487 if (relsize < 0)
2488 bfd_fatal (bfd_get_filename (abfd));
2489
2490 printf ("DYNAMIC RELOCATION RECORDS");
2491
2492 if (relsize == 0)
2493 {
2494 printf (" (none)\n\n");
2495 }
2496 else
2497 {
2498 relpp = (arelent **) xmalloc (relsize);
2499 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2500 if (relcount < 0)
2501 bfd_fatal (bfd_get_filename (abfd));
2502 else if (relcount == 0)
2503 {
2504 printf (" (none)\n\n");
2505 }
2506 else
2507 {
2508 printf ("\n");
2509 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2510 printf ("\n\n");
2511 }
2512 free (relpp);
2513 }
2514 }
2515
2516 static void
2517 dump_reloc_set (abfd, sec, relpp, relcount)
2518 bfd *abfd;
2519 asection *sec;
2520 arelent **relpp;
2521 long relcount;
2522 {
2523 arelent **p;
2524 char *last_filename, *last_functionname;
2525 unsigned int last_line;
2526
2527 /* Get column headers lined up reasonably. */
2528 {
2529 static int width;
2530 if (width == 0)
2531 {
2532 char buf[30];
2533 sprintf_vma (buf, (bfd_vma) -1);
2534 width = strlen (buf) - 7;
2535 }
2536 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2537 }
2538
2539 last_filename = NULL;
2540 last_functionname = NULL;
2541 last_line = 0;
2542
2543 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2544 {
2545 arelent *q = *p;
2546 const char *filename, *functionname;
2547 unsigned int line;
2548 const char *sym_name;
2549 const char *section_name;
2550
2551 if (start_address != (bfd_vma) -1
2552 && q->address < start_address)
2553 continue;
2554 if (stop_address != (bfd_vma) -1
2555 && q->address > stop_address)
2556 continue;
2557
2558 if (with_line_numbers
2559 && sec != NULL
2560 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2561 &filename, &functionname, &line))
2562 {
2563 if (functionname != NULL
2564 && (last_functionname == NULL
2565 || strcmp (functionname, last_functionname) != 0))
2566 {
2567 printf ("%s():\n", functionname);
2568 if (last_functionname != NULL)
2569 free (last_functionname);
2570 last_functionname = xstrdup (functionname);
2571 }
2572 if (line > 0
2573 && (line != last_line
2574 || (filename != NULL
2575 && last_filename != NULL
2576 && strcmp (filename, last_filename) != 0)))
2577 {
2578 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2579 last_line = line;
2580 if (last_filename != NULL)
2581 free (last_filename);
2582 if (filename == NULL)
2583 last_filename = NULL;
2584 else
2585 last_filename = xstrdup (filename);
2586 }
2587 }
2588
2589 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2590 {
2591 sym_name = (*(q->sym_ptr_ptr))->name;
2592 section_name = (*(q->sym_ptr_ptr))->section->name;
2593 }
2594 else
2595 {
2596 sym_name = NULL;
2597 section_name = NULL;
2598 }
2599 if (sym_name)
2600 {
2601 printf_vma (q->address);
2602 if (q->howto->name)
2603 printf (" %-16s ", q->howto->name);
2604 else
2605 printf (" %-16d ", q->howto->type);
2606 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2607 *q->sym_ptr_ptr);
2608 }
2609 else
2610 {
2611 if (section_name == (CONST char *) NULL)
2612 section_name = "*unknown*";
2613 printf_vma (q->address);
2614 printf (" %-16s [%s]",
2615 q->howto->name,
2616 section_name);
2617 }
2618 if (q->addend)
2619 {
2620 printf ("+0x");
2621 printf_vma (q->addend);
2622 }
2623 printf ("\n");
2624 }
2625 }
2626 \f
2627 /* The length of the longest architecture name + 1. */
2628 #define LONGEST_ARCH sizeof("powerpc:common")
2629
2630 static const char *
2631 endian_string (endian)
2632 enum bfd_endian endian;
2633 {
2634 if (endian == BFD_ENDIAN_BIG)
2635 return "big endian";
2636 else if (endian == BFD_ENDIAN_LITTLE)
2637 return "little endian";
2638 else
2639 return "endianness unknown";
2640 }
2641
2642 /* List the targets that BFD is configured to support, each followed
2643 by its endianness and the architectures it supports. */
2644
2645 static void
2646 display_target_list ()
2647 {
2648 extern const bfd_target *const *bfd_target_vector;
2649 char *dummy_name;
2650 int t;
2651
2652 dummy_name = make_temp_file (NULL);
2653 for (t = 0; bfd_target_vector[t]; t++)
2654 {
2655 const bfd_target *p = bfd_target_vector[t];
2656 bfd *abfd = bfd_openw (dummy_name, p->name);
2657 int a;
2658
2659 printf ("%s\n (header %s, data %s)\n", p->name,
2660 endian_string (p->header_byteorder),
2661 endian_string (p->byteorder));
2662
2663 if (abfd == NULL)
2664 {
2665 nonfatal (dummy_name);
2666 continue;
2667 }
2668
2669 if (! bfd_set_format (abfd, bfd_object))
2670 {
2671 if (bfd_get_error () != bfd_error_invalid_operation)
2672 nonfatal (p->name);
2673 bfd_close_all_done (abfd);
2674 continue;
2675 }
2676
2677 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2678 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2679 printf (" %s\n",
2680 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2681 bfd_close_all_done (abfd);
2682 }
2683 unlink (dummy_name);
2684 free (dummy_name);
2685 }
2686
2687 /* Print a table showing which architectures are supported for entries
2688 FIRST through LAST-1 of bfd_target_vector (targets across,
2689 architectures down). */
2690
2691 static void
2692 display_info_table (first, last)
2693 int first;
2694 int last;
2695 {
2696 extern const bfd_target *const *bfd_target_vector;
2697 int t, a;
2698 char *dummy_name;
2699
2700 /* Print heading of target names. */
2701 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2702 for (t = first; t < last && bfd_target_vector[t]; t++)
2703 printf ("%s ", bfd_target_vector[t]->name);
2704 putchar ('\n');
2705
2706 dummy_name = make_temp_file (NULL);
2707 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2708 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2709 {
2710 printf ("%*s ", (int) LONGEST_ARCH - 1,
2711 bfd_printable_arch_mach (a, 0));
2712 for (t = first; t < last && bfd_target_vector[t]; t++)
2713 {
2714 const bfd_target *p = bfd_target_vector[t];
2715 boolean ok = true;
2716 bfd *abfd = bfd_openw (dummy_name, p->name);
2717
2718 if (abfd == NULL)
2719 {
2720 nonfatal (p->name);
2721 ok = false;
2722 }
2723
2724 if (ok)
2725 {
2726 if (! bfd_set_format (abfd, bfd_object))
2727 {
2728 if (bfd_get_error () != bfd_error_invalid_operation)
2729 nonfatal (p->name);
2730 ok = false;
2731 }
2732 }
2733
2734 if (ok)
2735 {
2736 if (! bfd_set_arch_mach (abfd, a, 0))
2737 ok = false;
2738 }
2739
2740 if (ok)
2741 printf ("%s ", p->name);
2742 else
2743 {
2744 int l = strlen (p->name);
2745 while (l--)
2746 putchar ('-');
2747 putchar (' ');
2748 }
2749 if (abfd != NULL)
2750 bfd_close_all_done (abfd);
2751 }
2752 putchar ('\n');
2753 }
2754 unlink (dummy_name);
2755 free (dummy_name);
2756 }
2757
2758 /* Print tables of all the target-architecture combinations that
2759 BFD has been configured to support. */
2760
2761 static void
2762 display_target_tables ()
2763 {
2764 int t, columns;
2765 extern const bfd_target *const *bfd_target_vector;
2766 char *colum;
2767
2768 columns = 0;
2769 colum = getenv ("COLUMNS");
2770 if (colum != NULL)
2771 columns = atoi (colum);
2772 if (columns == 0)
2773 columns = 80;
2774
2775 t = 0;
2776 while (bfd_target_vector[t] != NULL)
2777 {
2778 int oldt = t, wid;
2779
2780 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2781 ++t;
2782 while (wid < columns && bfd_target_vector[t] != NULL)
2783 {
2784 int newwid;
2785
2786 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2787 if (newwid >= columns)
2788 break;
2789 wid = newwid;
2790 ++t;
2791 }
2792 display_info_table (oldt, t);
2793 }
2794 }
2795
2796 static void
2797 display_info ()
2798 {
2799 printf (_("BFD header file version %s\n"), BFD_VERSION);
2800 display_target_list ();
2801 display_target_tables ();
2802 }
2803
2804 int
2805 main (argc, argv)
2806 int argc;
2807 char **argv;
2808 {
2809 int c;
2810 char *target = default_target;
2811 boolean seenflag = false;
2812
2813 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2814 setlocale (LC_MESSAGES, "");
2815 #endif
2816 bindtextdomain (PACKAGE, LOCALEDIR);
2817 textdomain (PACKAGE);
2818
2819 program_name = *argv;
2820 xmalloc_set_program_name (program_name);
2821
2822 START_PROGRESS (program_name, 0);
2823
2824 bfd_init ();
2825 set_default_bfd_target ();
2826
2827 while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG",
2828 long_options, (int *) 0))
2829 != EOF)
2830 {
2831 switch (c)
2832 {
2833 case 0:
2834 break; /* we've been given a long option */
2835 case 'm':
2836 machine = optarg;
2837 break;
2838 case 'M':
2839 disassembler_options = optarg;
2840 break;
2841 case 'j':
2842 only = optarg;
2843 break;
2844 case 'l':
2845 with_line_numbers = true;
2846 break;
2847 case 'b':
2848 target = optarg;
2849 break;
2850 case 'C':
2851 do_demangle = true;
2852 if (optarg != NULL)
2853 {
2854 enum demangling_styles style;
2855
2856 style = cplus_demangle_name_to_style (optarg);
2857 if (style == unknown_demangling)
2858 fatal (_("unknown demangling style `%s'"),
2859 optarg);
2860
2861 cplus_demangle_set_style (style);
2862 }
2863 break;
2864 case 'w':
2865 wide_output = true;
2866 break;
2867 case OPTION_ADJUST_VMA:
2868 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2869 break;
2870 case OPTION_START_ADDRESS:
2871 start_address = parse_vma (optarg, "--start-address");
2872 break;
2873 case OPTION_STOP_ADDRESS:
2874 stop_address = parse_vma (optarg, "--stop-address");
2875 break;
2876 case 'E':
2877 if (strcmp (optarg, "B") == 0)
2878 endian = BFD_ENDIAN_BIG;
2879 else if (strcmp (optarg, "L") == 0)
2880 endian = BFD_ENDIAN_LITTLE;
2881 else
2882 {
2883 non_fatal (_("unrecognized -E option"));
2884 usage (stderr, 1);
2885 }
2886 break;
2887 case OPTION_ENDIAN:
2888 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2889 endian = BFD_ENDIAN_BIG;
2890 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2891 endian = BFD_ENDIAN_LITTLE;
2892 else
2893 {
2894 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2895 usage (stderr, 1);
2896 }
2897 break;
2898
2899 case 'f':
2900 dump_file_header = true;
2901 seenflag = true;
2902 break;
2903 case 'i':
2904 formats_info = true;
2905 seenflag = true;
2906 break;
2907 case 'p':
2908 dump_private_headers = true;
2909 seenflag = true;
2910 break;
2911 case 'x':
2912 dump_private_headers = true;
2913 dump_symtab = true;
2914 dump_reloc_info = true;
2915 dump_file_header = true;
2916 dump_ar_hdrs = true;
2917 dump_section_headers = true;
2918 seenflag = true;
2919 break;
2920 case 't':
2921 dump_symtab = true;
2922 seenflag = true;
2923 break;
2924 case 'T':
2925 dump_dynamic_symtab = true;
2926 seenflag = true;
2927 break;
2928 case 'd':
2929 disassemble = true;
2930 seenflag = true;
2931 break;
2932 case 'z':
2933 disassemble_zeroes = true;
2934 break;
2935 case 'D':
2936 disassemble = true;
2937 disassemble_all = true;
2938 seenflag = true;
2939 break;
2940 case 'S':
2941 disassemble = true;
2942 with_source_code = true;
2943 seenflag = true;
2944 break;
2945 case 'g':
2946 dump_debugging = 1;
2947 seenflag = true;
2948 break;
2949 case 'G':
2950 dump_stab_section_info = true;
2951 seenflag = true;
2952 break;
2953 case 's':
2954 dump_section_contents = true;
2955 seenflag = true;
2956 break;
2957 case 'r':
2958 dump_reloc_info = true;
2959 seenflag = true;
2960 break;
2961 case 'R':
2962 dump_dynamic_reloc_info = true;
2963 seenflag = true;
2964 break;
2965 case 'a':
2966 dump_ar_hdrs = true;
2967 seenflag = true;
2968 break;
2969 case 'h':
2970 dump_section_headers = true;
2971 seenflag = true;
2972 break;
2973 case 'H':
2974 usage (stdout, 0);
2975 seenflag = true;
2976 case 'V':
2977 show_version = true;
2978 seenflag = true;
2979 break;
2980
2981 default:
2982 usage (stderr, 1);
2983 }
2984 }
2985
2986 if (show_version)
2987 print_version ("objdump");
2988
2989 if (seenflag == false)
2990 usage (stderr, 2);
2991
2992 if (formats_info)
2993 display_info ();
2994 else
2995 {
2996 if (optind == argc)
2997 display_file ("a.out", target);
2998 else
2999 for (; optind < argc;)
3000 display_file (argv[optind++], target);
3001 }
3002
3003 END_PROGRESS (program_name);
3004
3005 return exit_status;
3006 }
This page took 0.118411 seconds and 4 git commands to generate.