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