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