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