* c-valprint.c: Fix checkin glitch.
[deliverable/binutils-gdb.git] / binutils / objdump.c
... / ...
CommitLineData
1/* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3
4This file is part of GNU Binutils.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, 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. */
42extern int fprintf PARAMS ((FILE *, const char *, ...));
43#endif
44
45static char *default_target = NULL; /* default at runtime */
46
47static int show_version = 0; /* show the version number */
48static int dump_section_contents; /* -s */
49static int dump_section_headers; /* -h */
50static boolean dump_file_header; /* -f */
51static int dump_symtab; /* -t */
52static int dump_dynamic_symtab; /* -T */
53static int dump_reloc_info; /* -r */
54static int dump_dynamic_reloc_info; /* -R */
55static int dump_ar_hdrs; /* -a */
56static int dump_private_headers; /* -p */
57static int prefix_addresses; /* --prefix-addresses */
58static int with_line_numbers; /* -l */
59static boolean with_source_code; /* -S */
60static int show_raw_insn; /* --show-raw-insn */
61static int dump_stab_section_info; /* --stabs */
62static boolean disassemble; /* -d */
63static boolean disassemble_all; /* -D */
64static int disassemble_zeroes; /* --disassemble-zeroes */
65static boolean formats_info; /* -i */
66static char *only; /* -j secname */
67static int wide_output; /* -w */
68static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
69static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
70static int dump_debugging; /* --debugging */
71
72/* Extra info to pass to the disassembler address printing function. */
73struct objdump_disasm_info {
74 bfd *abfd;
75 asection *sec;
76 boolean require_sec;
77};
78
79/* Architecture to disassemble for, or default if NULL. */
80static char *machine = (char *) NULL;
81
82/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
83static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
84
85/* The symbol table. */
86static asymbol **syms;
87
88/* Number of symbols in `syms'. */
89static long symcount = 0;
90
91/* The sorted symbol table. */
92static asymbol **sorted_syms;
93
94/* Number of symbols in `sorted_syms'. */
95static long sorted_symcount = 0;
96
97/* The dynamic symbol table. */
98static asymbol **dynsyms;
99
100/* Number of symbols in `dynsyms'. */
101static long dynsymcount = 0;
102
103/* Forward declarations. */
104
105static void
106display_file PARAMS ((char *filename, char *target));
107
108static void
109dump_data PARAMS ((bfd *abfd));
110
111static void
112dump_relocs PARAMS ((bfd *abfd));
113
114static void
115dump_dynamic_relocs PARAMS ((bfd * abfd));
116
117static void
118dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
119
120static void
121dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
122
123static void
124display_bfd PARAMS ((bfd *abfd));
125
126static void
127objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
128
129static asymbol *
130find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
131
132static void
133objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
134 struct disassemble_info *, boolean));
135
136static void
137objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
138
139static void
140objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
141
142static void
143show_line PARAMS ((bfd *, asection *, bfd_vma));
144
145static void
146disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
147 boolean, bfd_byte *, long, long, arelent ***,
148 arelent **));
149
150static void
151disassemble_data PARAMS ((bfd *));
152
153static const char *
154endian_string PARAMS ((enum bfd_endian));
155\f
156static void
157usage (stream, status)
158 FILE *stream;
159 int status;
160{
161 fprintf (stream, "\
162Usage: %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\
175at 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
188static 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
223static void
224dump_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
295static void
296dump_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
308static asymbol **
309slurp_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
341static asymbol **
342slurp_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
379static long
380remove_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
405static int
406compare_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
513static int
514compare_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
538static void
539objdump_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
565static asymbol *
566find_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
687static void
688objdump_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
737static void
738objdump_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
762static void
763objdump_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
773static char *prev_functionname;
774static 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
780struct print_file_list
781{
782 struct print_file_list *next;
783 char *filename;
784 unsigned int line;
785 FILE *f;
786};
787
788static 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
798static void
799skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
800
801static void
802skip_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
829static void
830show_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. */
970typedef struct {
971 char *buffer;
972 char *current;
973} SFILE;
974
975/* sprintf to a "stream" */
976
977#ifdef ANSI_PROTOTYPES
978static int
979objdump_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
991static int
992objdump_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
1026static void
1027disassemble_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)
1202 printf (" ");
1203
1204 /* Separate raw data from instruction by extra space. */
1205 if (insns)
1206 putchar ('\t');
1207 else
1208 printf (" ");
1209 }
1210
1211 printf ("%s", buf);
1212
1213 if (! prefix_addresses || show_raw_insn)
1214 {
1215 while (pb < bytes)
1216 {
1217 long j;
1218 char *s;
1219
1220 putchar ('\n');
1221 j = i + pb;
1222
1223 sprintf_vma (buf, section->vma + j);
1224 for (s = buf + skip_addr_chars; *s == '0'; s++)
1225 *s = ' ';
1226 if (*s == '\0')
1227 *--s = '0';
1228 printf ("%s:\t", buf + skip_addr_chars);
1229
1230 pb += bytes_per_line;
1231 if (pb > bytes)
1232 pb = bytes;
1233 for (; j < i + pb; ++j)
1234 {
1235 printf ("%02x", (unsigned) data[j]);
1236 putchar (' ');
1237 }
1238 }
1239 }
1240
1241 if (!wide_output)
1242 putchar ('\n');
1243 else
1244 need_nl = true;
1245 }
1246
1247 if (dump_reloc_info
1248 && (section->flags & SEC_RELOC) != 0)
1249 {
1250 while ((*relppp) < relppend
1251 && ((**relppp)->address >= (bfd_vma) i
1252 && (**relppp)->address < (bfd_vma) i + bytes))
1253 {
1254 arelent *q;
1255 const char *sym_name;
1256
1257 q = **relppp;
1258
1259 if (wide_output)
1260 putchar ('\t');
1261 else
1262 printf ("\t\t\t");
1263
1264 objdump_print_value (section->vma + q->address, info, true);
1265
1266 printf (": %s\t", q->howto->name);
1267
1268 if (q->sym_ptr_ptr != NULL
1269 && *q->sym_ptr_ptr != NULL)
1270 {
1271 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1272 if (sym_name == NULL || *sym_name == '\0')
1273 {
1274 asection *sym_sec;
1275
1276 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1277 sym_name = bfd_get_section_name (abfd, sym_sec);
1278 if (sym_name == NULL || *sym_name == '\0')
1279 sym_name = "*unknown*";
1280 }
1281 }
1282 else
1283 sym_name = "*unknown*";
1284
1285 printf ("%s", sym_name);
1286
1287 if (q->addend)
1288 {
1289 printf ("+0x");
1290 objdump_print_value (q->addend, info, true);
1291 }
1292
1293 printf ("\n");
1294 need_nl = false;
1295 ++(*relppp);
1296 }
1297 }
1298
1299 if (need_nl)
1300 printf ("\n");
1301
1302 i += bytes;
1303 }
1304}
1305
1306/* Disassemble the contents of an object file. */
1307
1308static void
1309disassemble_data (abfd)
1310 bfd *abfd;
1311{
1312 long i;
1313 disassembler_ftype disassemble_fn;
1314 struct disassemble_info disasm_info;
1315 struct objdump_disasm_info aux;
1316 asection *section;
1317
1318 print_files = NULL;
1319 prev_functionname = NULL;
1320 prev_line = -1;
1321
1322 /* We make a copy of syms to sort. We don't want to sort syms
1323 because that will screw up the relocs. */
1324 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1325 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1326
1327 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1328
1329 /* Sort the symbols into section and symbol order */
1330 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1331
1332 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1333 disasm_info.application_data = (PTR) &aux;
1334 aux.abfd = abfd;
1335 aux.require_sec = false;
1336 disasm_info.print_address_func = objdump_print_address;
1337
1338 if (machine != (char *) NULL)
1339 {
1340 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1341 if (info == NULL)
1342 {
1343 fprintf (stderr, "%s: Can't use supplied machine %s\n",
1344 program_name,
1345 machine);
1346 exit (1);
1347 }
1348 abfd->arch_info = info;
1349 }
1350
1351 if (endian != BFD_ENDIAN_UNKNOWN)
1352 {
1353 struct bfd_target *xvec;
1354
1355 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1356 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1357 xvec->byteorder = endian;
1358 abfd->xvec = xvec;
1359 }
1360
1361 disassemble_fn = disassembler (abfd);
1362 if (!disassemble_fn)
1363 {
1364 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
1365 program_name,
1366 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1367 exit (1);
1368 }
1369
1370 disasm_info.flavour = bfd_get_flavour (abfd);
1371 disasm_info.arch = bfd_get_arch (abfd);
1372 disasm_info.mach = bfd_get_mach (abfd);
1373 if (bfd_big_endian (abfd))
1374 disasm_info.endian = BFD_ENDIAN_BIG;
1375 else if (bfd_little_endian (abfd))
1376 disasm_info.endian = BFD_ENDIAN_LITTLE;
1377 else
1378 /* ??? Aborting here seems too drastic. We could default to big or little
1379 instead. */
1380 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1381
1382 for (section = abfd->sections;
1383 section != (asection *) NULL;
1384 section = section->next)
1385 {
1386 bfd_byte *data = NULL;
1387 bfd_size_type datasize = 0;
1388 arelent **relbuf = NULL;
1389 arelent **relpp = NULL;
1390 arelent **relppend = NULL;
1391 long stop;
1392
1393 if ((section->flags & SEC_LOAD) == 0
1394 || (! disassemble_all
1395 && only == NULL
1396 && (section->flags & SEC_CODE) == 0))
1397 continue;
1398 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1399 continue;
1400
1401 if (dump_reloc_info
1402 && (section->flags & SEC_RELOC) != 0)
1403 {
1404 long relsize;
1405
1406 relsize = bfd_get_reloc_upper_bound (abfd, section);
1407 if (relsize < 0)
1408 bfd_fatal (bfd_get_filename (abfd));
1409
1410 if (relsize > 0)
1411 {
1412 long relcount;
1413
1414 relbuf = (arelent **) xmalloc (relsize);
1415 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1416 if (relcount < 0)
1417 bfd_fatal (bfd_get_filename (abfd));
1418
1419 /* Sort the relocs by address. */
1420 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1421
1422 relpp = relbuf;
1423 relppend = relpp + relcount;
1424 }
1425 }
1426
1427 printf ("Disassembly of section %s:\n", section->name);
1428
1429 datasize = bfd_get_section_size_before_reloc (section);
1430 if (datasize == 0)
1431 continue;
1432
1433 data = (bfd_byte *) xmalloc ((size_t) datasize);
1434
1435 bfd_get_section_contents (abfd, section, data, 0, datasize);
1436
1437 aux.sec = section;
1438 disasm_info.buffer = data;
1439 disasm_info.buffer_vma = section->vma;
1440 disasm_info.buffer_length = datasize;
1441 if (start_address == (bfd_vma) -1
1442 || start_address < disasm_info.buffer_vma)
1443 i = 0;
1444 else
1445 i = start_address - disasm_info.buffer_vma;
1446 if (stop_address == (bfd_vma) -1)
1447 stop = datasize;
1448 else
1449 {
1450 if (stop_address < disasm_info.buffer_vma)
1451 stop = 0;
1452 else
1453 stop = stop_address - disasm_info.buffer_vma;
1454 if (stop > disasm_info.buffer_length)
1455 stop = disasm_info.buffer_length;
1456 }
1457
1458 if (prefix_addresses)
1459 disassemble_bytes (&disasm_info, disassemble_fn, true, data, i, stop,
1460 &relpp, relppend);
1461 else
1462 {
1463 asymbol *sym;
1464 long place;
1465
1466 sym = find_symbol_for_address (abfd, section, i, true, &place);
1467 ++place;
1468 while (i < stop)
1469 {
1470 asymbol *nextsym;
1471 long nextstop;
1472 boolean insns;
1473
1474 disasm_info.symbol = sym;
1475
1476 printf ("\n");
1477 objdump_print_addr_with_sym (abfd, section, sym,
1478 section->vma + i,
1479 &disasm_info,
1480 false);
1481 printf (":\n");
1482
1483 if (sym == NULL)
1484 nextsym = NULL;
1485 else
1486 {
1487 while (place < sorted_symcount
1488 && (sorted_syms[place]->section != section
1489 || (bfd_asymbol_value (sorted_syms[place])
1490 <= bfd_asymbol_value (sym))))
1491 ++place;
1492 if (place >= sorted_symcount)
1493 nextsym = NULL;
1494 else
1495 nextsym = sorted_syms[place];
1496 }
1497
1498 if (nextsym == NULL)
1499 nextstop = stop;
1500 else
1501 {
1502 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1503 if (nextstop > stop)
1504 nextstop = stop;
1505 }
1506
1507 /* If a symbol is explicitly marked as being an object
1508 rather than a function, just dump the bytes without
1509 disassembling them. */
1510 if (disassemble_all
1511 || sym == NULL
1512 || ((sym->flags & BSF_OBJECT) == 0
1513 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1514 == NULL)
1515 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1516 == NULL))
1517 || (sym->flags & BSF_FUNCTION) != 0)
1518 insns = true;
1519 else
1520 insns = false;
1521
1522 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1523 nextstop, &relpp, relppend);
1524
1525 i = nextstop;
1526 sym = nextsym;
1527 }
1528 }
1529
1530 free (data);
1531 if (relbuf != NULL)
1532 free (relbuf);
1533 }
1534 free (sorted_syms);
1535}
1536\f
1537
1538/* Define a table of stab values and print-strings. We wish the initializer
1539 could be a direct-mapped table, but instead we build one the first
1540 time we need it. */
1541
1542static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1543 char *strsect_name));
1544
1545/* Dump the stabs sections from an object file that has a section that
1546 uses Sun stabs encoding. */
1547
1548static void
1549dump_stabs (abfd)
1550 bfd *abfd;
1551{
1552 dump_section_stabs (abfd, ".stab", ".stabstr");
1553 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1554 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1555 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1556}
1557
1558static bfd_byte *stabs;
1559static bfd_size_type stab_size;
1560
1561static char *strtab;
1562static bfd_size_type stabstr_size;
1563
1564/* Read ABFD's stabs section STABSECT_NAME into `stabs'
1565 and string table section STRSECT_NAME into `strtab'.
1566 If the section exists and was read, allocate the space and return true.
1567 Otherwise return false. */
1568
1569static boolean
1570read_section_stabs (abfd, stabsect_name, strsect_name)
1571 bfd *abfd;
1572 char *stabsect_name;
1573 char *strsect_name;
1574{
1575 asection *stabsect, *stabstrsect;
1576
1577 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1578 if (0 == stabsect)
1579 {
1580 printf ("No %s section present\n\n", stabsect_name);
1581 return false;
1582 }
1583
1584 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1585 if (0 == stabstrsect)
1586 {
1587 fprintf (stderr, "%s: %s has no %s section\n", program_name,
1588 bfd_get_filename (abfd), strsect_name);
1589 return false;
1590 }
1591
1592 stab_size = bfd_section_size (abfd, stabsect);
1593 stabstr_size = bfd_section_size (abfd, stabstrsect);
1594
1595 stabs = (bfd_byte *) xmalloc (stab_size);
1596 strtab = (char *) xmalloc (stabstr_size);
1597
1598 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1599 {
1600 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1601 program_name, stabsect_name, bfd_get_filename (abfd),
1602 bfd_errmsg (bfd_get_error ()));
1603 free (stabs);
1604 free (strtab);
1605 return false;
1606 }
1607
1608 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1609 stabstr_size))
1610 {
1611 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1612 program_name, strsect_name, bfd_get_filename (abfd),
1613 bfd_errmsg (bfd_get_error ()));
1614 free (stabs);
1615 free (strtab);
1616 return false;
1617 }
1618
1619 return true;
1620}
1621
1622/* Stabs entries use a 12 byte format:
1623 4 byte string table index
1624 1 byte stab type
1625 1 byte stab other field
1626 2 byte stab desc field
1627 4 byte stab value
1628 FIXME: This will have to change for a 64 bit object format. */
1629
1630#define STRDXOFF (0)
1631#define TYPEOFF (4)
1632#define OTHEROFF (5)
1633#define DESCOFF (6)
1634#define VALOFF (8)
1635#define STABSIZE (12)
1636
1637/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1638 using string table section STRSECT_NAME (in `strtab'). */
1639
1640static void
1641print_section_stabs (abfd, stabsect_name, strsect_name)
1642 bfd *abfd;
1643 char *stabsect_name;
1644 char *strsect_name;
1645{
1646 int i;
1647 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1648 bfd_byte *stabp, *stabs_end;
1649
1650 stabp = stabs;
1651 stabs_end = stabp + stab_size;
1652
1653 printf ("Contents of %s section:\n\n", stabsect_name);
1654 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1655
1656 /* Loop through all symbols and print them.
1657
1658 We start the index at -1 because there is a dummy symbol on
1659 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1660
1661 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1662 {
1663 const char *name;
1664 unsigned long strx;
1665 unsigned char type, other;
1666 unsigned short desc;
1667 bfd_vma value;
1668
1669 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1670 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1671 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1672 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1673 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1674
1675 printf ("\n%-6d ", i);
1676 /* Either print the stab name, or, if unnamed, print its number
1677 again (makes consistent formatting for tools like awk). */
1678 name = bfd_get_stab_name (type);
1679 if (name != NULL)
1680 printf ("%-6s", name);
1681 else if (type == N_UNDF)
1682 printf ("HdrSym");
1683 else
1684 printf ("%-6d", type);
1685 printf (" %-6d %-6d ", other, desc);
1686 printf_vma (value);
1687 printf (" %-6lu", strx);
1688
1689 /* Symbols with type == 0 (N_UNDF) specify the length of the
1690 string table associated with this file. We use that info
1691 to know how to relocate the *next* file's string table indices. */
1692
1693 if (type == N_UNDF)
1694 {
1695 file_string_table_offset = next_file_string_table_offset;
1696 next_file_string_table_offset += value;
1697 }
1698 else
1699 {
1700 /* Using the (possibly updated) string table offset, print the
1701 string (if any) associated with this symbol. */
1702
1703 if ((strx + file_string_table_offset) < stabstr_size)
1704 printf (" %s", &strtab[strx + file_string_table_offset]);
1705 else
1706 printf (" *");
1707 }
1708 }
1709 printf ("\n\n");
1710}
1711
1712static void
1713dump_section_stabs (abfd, stabsect_name, strsect_name)
1714 bfd *abfd;
1715 char *stabsect_name;
1716 char *strsect_name;
1717{
1718 asection *s;
1719
1720 /* Check for section names for which stabsect_name is a prefix, to
1721 handle .stab0, etc. */
1722 for (s = abfd->sections;
1723 s != NULL;
1724 s = s->next)
1725 {
1726 int len;
1727
1728 len = strlen (stabsect_name);
1729
1730/* If the prefix matches, and the files section name ends with a nul or a digit,
1731 then we match. Ie: we want either an exact match or a a section followed by
1732 a number. */
1733 if (strncmp (stabsect_name, s->name, len) == 0
1734 && (s->name[len] == '\000' || isdigit (s->name[len])))
1735 {
1736 if (read_section_stabs (abfd, s->name, strsect_name))
1737 {
1738 print_section_stabs (abfd, s->name, strsect_name);
1739 free (stabs);
1740 free (strtab);
1741 }
1742 }
1743 }
1744}
1745\f
1746static void
1747dump_bfd_header (abfd)
1748 bfd *abfd;
1749{
1750 char *comma = "";
1751
1752 printf ("architecture: %s, ",
1753 bfd_printable_arch_mach (bfd_get_arch (abfd),
1754 bfd_get_mach (abfd)));
1755 printf ("flags 0x%08x:\n", abfd->flags);
1756
1757#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1758 PF (HAS_RELOC, "HAS_RELOC");
1759 PF (EXEC_P, "EXEC_P");
1760 PF (HAS_LINENO, "HAS_LINENO");
1761 PF (HAS_DEBUG, "HAS_DEBUG");
1762 PF (HAS_SYMS, "HAS_SYMS");
1763 PF (HAS_LOCALS, "HAS_LOCALS");
1764 PF (DYNAMIC, "DYNAMIC");
1765 PF (WP_TEXT, "WP_TEXT");
1766 PF (D_PAGED, "D_PAGED");
1767 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1768 printf ("\nstart address 0x");
1769 printf_vma (abfd->start_address);
1770 printf ("\n");
1771}
1772\f
1773static void
1774dump_bfd_private_header (abfd)
1775bfd *abfd;
1776{
1777 bfd_print_private_bfd_data (abfd, stdout);
1778}
1779
1780static void
1781display_bfd (abfd)
1782 bfd *abfd;
1783{
1784 char **matching;
1785
1786 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
1787 {
1788 bfd_nonfatal (bfd_get_filename (abfd));
1789 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1790 {
1791 list_matching_formats (matching);
1792 free (matching);
1793 }
1794 return;
1795 }
1796
1797 printf ("\n%s: file format %s\n", bfd_get_filename (abfd),
1798 abfd->xvec->name);
1799 if (dump_ar_hdrs)
1800 print_arelt_descr (stdout, abfd, true);
1801 if (dump_file_header)
1802 dump_bfd_header (abfd);
1803 if (dump_private_headers)
1804 dump_bfd_private_header (abfd);
1805 putchar ('\n');
1806 if (dump_section_headers)
1807 dump_headers (abfd);
1808 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
1809 {
1810 syms = slurp_symtab (abfd);
1811 }
1812 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
1813 {
1814 dynsyms = slurp_dynamic_symtab (abfd);
1815 }
1816 if (dump_symtab)
1817 dump_symbols (abfd, false);
1818 if (dump_dynamic_symtab)
1819 dump_symbols (abfd, true);
1820 if (dump_stab_section_info)
1821 dump_stabs (abfd);
1822 if (dump_reloc_info && ! disassemble)
1823 dump_relocs (abfd);
1824 if (dump_dynamic_reloc_info)
1825 dump_dynamic_relocs (abfd);
1826 if (dump_section_contents)
1827 dump_data (abfd);
1828 if (disassemble)
1829 disassemble_data (abfd);
1830 if (dump_debugging)
1831 {
1832 PTR dhandle;
1833
1834 dhandle = read_debugging_info (abfd, syms, symcount);
1835 if (dhandle != NULL)
1836 {
1837 if (! print_debugging_info (stdout, dhandle))
1838 fprintf (stderr, "%s: printing debugging information failed\n",
1839 bfd_get_filename (abfd));
1840 }
1841 }
1842 if (syms)
1843 {
1844 free (syms);
1845 syms = NULL;
1846 }
1847 if (dynsyms)
1848 {
1849 free (dynsyms);
1850 dynsyms = NULL;
1851 }
1852}
1853
1854static void
1855display_file (filename, target)
1856 char *filename;
1857 char *target;
1858{
1859 bfd *file, *arfile = (bfd *) NULL;
1860
1861 file = bfd_openr (filename, target);
1862 if (file == NULL)
1863 {
1864 bfd_nonfatal (filename);
1865 return;
1866 }
1867
1868 if (bfd_check_format (file, bfd_archive) == true)
1869 {
1870 bfd *last_arfile = NULL;
1871
1872 printf ("In archive %s:\n", bfd_get_filename (file));
1873 for (;;)
1874 {
1875 bfd_set_error (bfd_error_no_error);
1876
1877 arfile = bfd_openr_next_archived_file (file, arfile);
1878 if (arfile == NULL)
1879 {
1880 if (bfd_get_error () != bfd_error_no_more_archived_files)
1881 {
1882 bfd_nonfatal (bfd_get_filename (file));
1883 }
1884 break;
1885 }
1886
1887 display_bfd (arfile);
1888
1889 if (last_arfile != NULL)
1890 bfd_close (last_arfile);
1891 last_arfile = arfile;
1892 }
1893
1894 if (last_arfile != NULL)
1895 bfd_close (last_arfile);
1896 }
1897 else
1898 display_bfd (file);
1899
1900 bfd_close (file);
1901}
1902\f
1903/* Actually display the various requested regions */
1904
1905static void
1906dump_data (abfd)
1907 bfd *abfd;
1908{
1909 asection *section;
1910 bfd_byte *data = 0;
1911 bfd_size_type datasize = 0;
1912 bfd_size_type i;
1913 bfd_size_type start, stop;
1914
1915 for (section = abfd->sections; section != NULL; section =
1916 section->next)
1917 {
1918 int onaline = 16;
1919
1920 if (only == (char *) NULL ||
1921 strcmp (only, section->name) == 0)
1922 {
1923 if (section->flags & SEC_HAS_CONTENTS)
1924 {
1925 printf ("Contents of section %s:\n", section->name);
1926
1927 if (bfd_section_size (abfd, section) == 0)
1928 continue;
1929 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
1930 datasize = bfd_section_size (abfd, section);
1931
1932
1933 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
1934
1935 if (start_address == (bfd_vma) -1
1936 || start_address < section->vma)
1937 start = 0;
1938 else
1939 start = start_address - section->vma;
1940 if (stop_address == (bfd_vma) -1)
1941 stop = bfd_section_size (abfd, section);
1942 else
1943 {
1944 if (stop_address < section->vma)
1945 stop = 0;
1946 else
1947 stop = stop_address - section->vma;
1948 if (stop > bfd_section_size (abfd, section))
1949 stop = bfd_section_size (abfd, section);
1950 }
1951 for (i = start; i < stop; i += onaline)
1952 {
1953 bfd_size_type j;
1954
1955 printf (" %04lx ", (unsigned long int) (i + section->vma));
1956 for (j = i; j < i + onaline; j++)
1957 {
1958 if (j < stop)
1959 printf ("%02x", (unsigned) (data[j]));
1960 else
1961 printf (" ");
1962 if ((j & 3) == 3)
1963 printf (" ");
1964 }
1965
1966 printf (" ");
1967 for (j = i; j < i + onaline; j++)
1968 {
1969 if (j >= stop)
1970 printf (" ");
1971 else
1972 printf ("%c", isprint (data[j]) ? data[j] : '.');
1973 }
1974 putchar ('\n');
1975 }
1976 free (data);
1977 }
1978 }
1979 }
1980}
1981
1982/* Should perhaps share code and display with nm? */
1983static void
1984dump_symbols (abfd, dynamic)
1985 bfd *abfd;
1986 boolean dynamic;
1987{
1988 asymbol **current;
1989 long max;
1990 long count;
1991
1992 if (dynamic)
1993 {
1994 current = dynsyms;
1995 max = dynsymcount;
1996 if (max == 0)
1997 return;
1998 printf ("DYNAMIC SYMBOL TABLE:\n");
1999 }
2000 else
2001 {
2002 current = syms;
2003 max = symcount;
2004 if (max == 0)
2005 return;
2006 printf ("SYMBOL TABLE:\n");
2007 }
2008
2009 for (count = 0; count < max; count++)
2010 {
2011 if (*current)
2012 {
2013 bfd *cur_bfd = bfd_asymbol_bfd(*current);
2014 if (cur_bfd)
2015 {
2016 bfd_print_symbol (cur_bfd,
2017 stdout,
2018 *current, bfd_print_symbol_all);
2019 printf ("\n");
2020 }
2021 }
2022 current++;
2023 }
2024 printf ("\n");
2025 printf ("\n");
2026}
2027
2028static void
2029dump_relocs (abfd)
2030 bfd *abfd;
2031{
2032 arelent **relpp;
2033 long relcount;
2034 asection *a;
2035
2036 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2037 {
2038 long relsize;
2039
2040 if (bfd_is_abs_section (a))
2041 continue;
2042 if (bfd_is_und_section (a))
2043 continue;
2044 if (bfd_is_com_section (a))
2045 continue;
2046
2047 if (only)
2048 {
2049 if (strcmp (only, a->name))
2050 continue;
2051 }
2052 else if ((a->flags & SEC_RELOC) == 0)
2053 continue;
2054
2055 relsize = bfd_get_reloc_upper_bound (abfd, a);
2056 if (relsize < 0)
2057 bfd_fatal (bfd_get_filename (abfd));
2058
2059 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2060
2061 if (relsize == 0)
2062 {
2063 printf (" (none)\n\n");
2064 }
2065 else
2066 {
2067 relpp = (arelent **) xmalloc (relsize);
2068 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2069 if (relcount < 0)
2070 bfd_fatal (bfd_get_filename (abfd));
2071 else if (relcount == 0)
2072 {
2073 printf (" (none)\n\n");
2074 }
2075 else
2076 {
2077 printf ("\n");
2078 dump_reloc_set (abfd, a, relpp, relcount);
2079 printf ("\n\n");
2080 }
2081 free (relpp);
2082 }
2083 }
2084}
2085
2086static void
2087dump_dynamic_relocs (abfd)
2088 bfd *abfd;
2089{
2090 long relsize;
2091 arelent **relpp;
2092 long relcount;
2093
2094 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2095 if (relsize < 0)
2096 bfd_fatal (bfd_get_filename (abfd));
2097
2098 printf ("DYNAMIC RELOCATION RECORDS");
2099
2100 if (relsize == 0)
2101 {
2102 printf (" (none)\n\n");
2103 }
2104 else
2105 {
2106 relpp = (arelent **) xmalloc (relsize);
2107 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2108 if (relcount < 0)
2109 bfd_fatal (bfd_get_filename (abfd));
2110 else if (relcount == 0)
2111 {
2112 printf (" (none)\n\n");
2113 }
2114 else
2115 {
2116 printf ("\n");
2117 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2118 printf ("\n\n");
2119 }
2120 free (relpp);
2121 }
2122}
2123
2124static void
2125dump_reloc_set (abfd, sec, relpp, relcount)
2126 bfd *abfd;
2127 asection *sec;
2128 arelent **relpp;
2129 long relcount;
2130{
2131 arelent **p;
2132 char *last_filename, *last_functionname;
2133 unsigned int last_line;
2134
2135 /* Get column headers lined up reasonably. */
2136 {
2137 static int width;
2138 if (width == 0)
2139 {
2140 char buf[30];
2141 sprintf_vma (buf, (bfd_vma) -1);
2142 width = strlen (buf) - 7;
2143 }
2144 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2145 }
2146
2147 last_filename = NULL;
2148 last_functionname = NULL;
2149 last_line = 0;
2150
2151 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2152 {
2153 arelent *q = *p;
2154 const char *filename, *functionname;
2155 unsigned int line;
2156 const char *sym_name;
2157 const char *section_name;
2158
2159 if (start_address != (bfd_vma) -1
2160 && q->address < start_address)
2161 continue;
2162 if (stop_address != (bfd_vma) -1
2163 && q->address > stop_address)
2164 continue;
2165
2166 if (with_line_numbers
2167 && sec != NULL
2168 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2169 &filename, &functionname, &line))
2170 {
2171 if (functionname != NULL
2172 && (last_functionname == NULL
2173 || strcmp (functionname, last_functionname) != 0))
2174 {
2175 printf ("%s():\n", functionname);
2176 if (last_functionname != NULL)
2177 free (last_functionname);
2178 last_functionname = xstrdup (functionname);
2179 }
2180 if (line > 0
2181 && (line != last_line
2182 || (filename != NULL
2183 && last_filename != NULL
2184 && strcmp (filename, last_filename) != 0)))
2185 {
2186 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2187 last_line = line;
2188 if (last_filename != NULL)
2189 free (last_filename);
2190 if (filename == NULL)
2191 last_filename = NULL;
2192 else
2193 last_filename = xstrdup (filename);
2194 }
2195 }
2196
2197 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2198 {
2199 sym_name = (*(q->sym_ptr_ptr))->name;
2200 section_name = (*(q->sym_ptr_ptr))->section->name;
2201 }
2202 else
2203 {
2204 sym_name = NULL;
2205 section_name = NULL;
2206 }
2207 if (sym_name)
2208 {
2209 printf_vma (q->address);
2210 printf (" %-16s %s",
2211 q->howto->name,
2212 sym_name);
2213 }
2214 else
2215 {
2216 if (section_name == (CONST char *) NULL)
2217 section_name = "*unknown*";
2218 printf_vma (q->address);
2219 printf (" %-16s [%s]",
2220 q->howto->name,
2221 section_name);
2222 }
2223 if (q->addend)
2224 {
2225 printf ("+0x");
2226 printf_vma (q->addend);
2227 }
2228 printf ("\n");
2229 }
2230}
2231\f
2232/* The length of the longest architecture name + 1. */
2233#define LONGEST_ARCH sizeof("rs6000:6000")
2234
2235static const char *
2236endian_string (endian)
2237 enum bfd_endian endian;
2238{
2239 if (endian == BFD_ENDIAN_BIG)
2240 return "big endian";
2241 else if (endian == BFD_ENDIAN_LITTLE)
2242 return "little endian";
2243 else
2244 return "endianness unknown";
2245}
2246
2247/* List the targets that BFD is configured to support, each followed
2248 by its endianness and the architectures it supports. */
2249
2250static void
2251display_target_list ()
2252{
2253 extern bfd_target *bfd_target_vector[];
2254 char *dummy_name;
2255 int t;
2256
2257 dummy_name = choose_temp_base ();
2258 for (t = 0; bfd_target_vector[t]; t++)
2259 {
2260 bfd_target *p = bfd_target_vector[t];
2261 bfd *abfd = bfd_openw (dummy_name, p->name);
2262 int a;
2263
2264 printf ("%s\n (header %s, data %s)\n", p->name,
2265 endian_string (p->header_byteorder),
2266 endian_string (p->byteorder));
2267
2268 if (abfd == NULL)
2269 {
2270 bfd_nonfatal (dummy_name);
2271 continue;
2272 }
2273
2274 if (! bfd_set_format (abfd, bfd_object))
2275 {
2276 if (bfd_get_error () != bfd_error_invalid_operation)
2277 bfd_nonfatal (p->name);
2278 continue;
2279 }
2280
2281 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2282 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2283 printf (" %s\n",
2284 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2285 }
2286 unlink (dummy_name);
2287 free (dummy_name);
2288}
2289
2290/* Print a table showing which architectures are supported for entries
2291 FIRST through LAST-1 of bfd_target_vector (targets across,
2292 architectures down). */
2293
2294static void
2295display_info_table (first, last)
2296 int first;
2297 int last;
2298{
2299 extern bfd_target *bfd_target_vector[];
2300 int t, a;
2301 char *dummy_name;
2302
2303 /* Print heading of target names. */
2304 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2305 for (t = first; t < last && bfd_target_vector[t]; t++)
2306 printf ("%s ", bfd_target_vector[t]->name);
2307 putchar ('\n');
2308
2309 dummy_name = choose_temp_base ();
2310 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2311 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2312 {
2313 printf ("%*s ", (int) LONGEST_ARCH - 1,
2314 bfd_printable_arch_mach (a, 0));
2315 for (t = first; t < last && bfd_target_vector[t]; t++)
2316 {
2317 bfd_target *p = bfd_target_vector[t];
2318 boolean ok = true;
2319 bfd *abfd = bfd_openw (dummy_name, p->name);
2320
2321 if (abfd == NULL)
2322 {
2323 bfd_nonfatal (p->name);
2324 ok = false;
2325 }
2326
2327 if (ok)
2328 {
2329 if (! bfd_set_format (abfd, bfd_object))
2330 {
2331 if (bfd_get_error () != bfd_error_invalid_operation)
2332 bfd_nonfatal (p->name);
2333 ok = false;
2334 }
2335 }
2336
2337 if (ok)
2338 {
2339 if (! bfd_set_arch_mach (abfd, a, 0))
2340 ok = false;
2341 }
2342
2343 if (ok)
2344 printf ("%s ", p->name);
2345 else
2346 {
2347 int l = strlen (p->name);
2348 while (l--)
2349 putchar ('-');
2350 putchar (' ');
2351 }
2352 }
2353 putchar ('\n');
2354 }
2355 unlink (dummy_name);
2356 free (dummy_name);
2357}
2358
2359/* Print tables of all the target-architecture combinations that
2360 BFD has been configured to support. */
2361
2362static void
2363display_target_tables ()
2364{
2365 int t, columns;
2366 extern bfd_target *bfd_target_vector[];
2367 char *colum;
2368 extern char *getenv ();
2369
2370 columns = 0;
2371 colum = getenv ("COLUMNS");
2372 if (colum != NULL)
2373 columns = atoi (colum);
2374 if (columns == 0)
2375 columns = 80;
2376
2377 t = 0;
2378 while (bfd_target_vector[t] != NULL)
2379 {
2380 int oldt = t, wid;
2381
2382 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2383 ++t;
2384 while (wid < columns && bfd_target_vector[t] != NULL)
2385 {
2386 int newwid;
2387
2388 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2389 if (newwid >= columns)
2390 break;
2391 wid = newwid;
2392 ++t;
2393 }
2394 display_info_table (oldt, t);
2395 }
2396}
2397
2398static void
2399display_info ()
2400{
2401 printf ("BFD header file version %s\n", BFD_VERSION);
2402 display_target_list ();
2403 display_target_tables ();
2404}
2405
2406int
2407main (argc, argv)
2408 int argc;
2409 char **argv;
2410{
2411 int c;
2412 char *target = default_target;
2413 boolean seenflag = false;
2414
2415 program_name = *argv;
2416 xmalloc_set_program_name (program_name);
2417
2418 START_PROGRESS (program_name, 0);
2419
2420 bfd_init ();
2421
2422 while ((c = getopt_long (argc, argv, "pib:m:VdDlfahrRtTxsSj:wE:",
2423 long_options, (int *) 0))
2424 != EOF)
2425 {
2426 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2427 seenflag = true;
2428 switch (c)
2429 {
2430 case 0:
2431 break; /* we've been given a long option */
2432 case 'm':
2433 machine = optarg;
2434 break;
2435 case 'j':
2436 only = optarg;
2437 break;
2438 case 'l':
2439 with_line_numbers = 1;
2440 break;
2441 case 'b':
2442 target = optarg;
2443 break;
2444 case 'f':
2445 dump_file_header = true;
2446 break;
2447 case 'i':
2448 formats_info = true;
2449 break;
2450 case 'p':
2451 dump_private_headers = 1;
2452 break;
2453 case 'x':
2454 dump_private_headers = 1;
2455 dump_symtab = 1;
2456 dump_reloc_info = 1;
2457 dump_file_header = true;
2458 dump_ar_hdrs = 1;
2459 dump_section_headers = 1;
2460 break;
2461 case 't':
2462 dump_symtab = 1;
2463 break;
2464 case 'T':
2465 dump_dynamic_symtab = 1;
2466 break;
2467 case 'd':
2468 disassemble = true;
2469 break;
2470 case 'D':
2471 disassemble = disassemble_all = true;
2472 break;
2473 case 'S':
2474 disassemble = true;
2475 with_source_code = true;
2476 break;
2477 case 's':
2478 dump_section_contents = 1;
2479 break;
2480 case 'r':
2481 dump_reloc_info = 1;
2482 break;
2483 case 'R':
2484 dump_dynamic_reloc_info = 1;
2485 break;
2486 case 'a':
2487 dump_ar_hdrs = 1;
2488 break;
2489 case 'h':
2490 dump_section_headers = 1;
2491 break;
2492 case 'H':
2493 usage (stdout, 0);
2494 case 'V':
2495 show_version = 1;
2496 break;
2497 case 'w':
2498 wide_output = 1;
2499 break;
2500 case OPTION_START_ADDRESS:
2501 start_address = parse_vma (optarg, "--start-address");
2502 break;
2503 case OPTION_STOP_ADDRESS:
2504 stop_address = parse_vma (optarg, "--stop-address");
2505 break;
2506 case 'E':
2507 if (strcmp (optarg, "B") == 0)
2508 endian = BFD_ENDIAN_BIG;
2509 else if (strcmp (optarg, "L") == 0)
2510 endian = BFD_ENDIAN_LITTLE;
2511 else
2512 {
2513 fprintf (stderr, "%s: unrecognized -E option\n", program_name);
2514 usage (stderr, 1);
2515 }
2516 break;
2517 case OPTION_ENDIAN:
2518 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2519 endian = BFD_ENDIAN_BIG;
2520 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2521 endian = BFD_ENDIAN_LITTLE;
2522 else
2523 {
2524 fprintf (stderr, "%s: unrecognized --endian type `%s'\n",
2525 program_name, optarg);
2526 usage (stderr, 1);
2527 }
2528 break;
2529 default:
2530 usage (stderr, 1);
2531 }
2532 }
2533
2534 if (show_version)
2535 print_version ("objdump");
2536
2537 if (seenflag == false)
2538 usage (stderr, 1);
2539
2540 if (formats_info)
2541 {
2542 display_info ();
2543 }
2544 else
2545 {
2546 if (optind == argc)
2547 display_file ("a.out", target);
2548 else
2549 for (; optind < argc;)
2550 display_file (argv[optind++], target);
2551 }
2552
2553 END_PROGRESS (program_name);
2554
2555 return 0;
2556}
This page took 0.032484 seconds and 4 git commands to generate.