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