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