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