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