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