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