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