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