]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/objdump.c
19990502 sourceware import
[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 break;
1309 }
1310 else
1311 {
1312 long j;
1313
1314 bytes = bytes_per_line;
1315 if (i + bytes > stop)
1316 bytes = stop - i;
1317
1318 for (j = i; j < i + bytes; ++j)
1319 {
1320 if (isprint (data[j]))
1321 buf[j - i] = data[j];
1322 else
1323 buf[j - i] = '.';
1324 }
1325 buf[j - i] = '\0';
1326 }
1327
1328 if (prefix_addresses
1329 ? show_raw_insn > 0
1330 : show_raw_insn >= 0)
1331 {
1332 long j;
1333
1334 /* If ! prefix_addresses and ! wide_output, we print
1335 bytes_per_line bytes per line. */
1336 pb = bytes;
1337 if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1338 pb = bytes_per_line;
1339
1340 if (info->bytes_per_chunk)
1341 bpc = info->bytes_per_chunk;
1342 else
1343 bpc = 1;
1344
1345 for (j = i; j < i + pb; j += bpc)
1346 {
1347 int k;
1348 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1349 {
1350 for (k = bpc - 1; k >= 0; k--)
1351 printf ("%02x", (unsigned) data[j + k]);
1352 putchar (' ');
1353 }
1354 else
1355 {
1356 for (k = 0; k < bpc; k++)
1357 printf ("%02x", (unsigned) data[j + k]);
1358 putchar (' ');
1359 }
1360 }
1361
1362 for (; pb < bytes_per_line; pb += bpc)
1363 {
1364 int k;
1365
1366 for (k = 0; k < bpc; k++)
1367 printf (" ");
1368 putchar (' ');
1369 }
1370
1371 /* Separate raw data from instruction by extra space. */
1372 if (insns)
1373 putchar ('\t');
1374 else
1375 printf (" ");
1376 }
1377
1378 if (! insns)
1379 printf ("%s", buf);
1380 else
1381 {
1382 printf ("%s", sfile.buffer);
1383 free (sfile.buffer);
1384 }
1385
1386 if (prefix_addresses
1387 ? show_raw_insn > 0
1388 : show_raw_insn >= 0)
1389 {
1390 while (pb < bytes)
1391 {
1392 long j;
1393 char *s;
1394
1395 putchar ('\n');
1396 j = i + pb;
1397
1398 sprintf_vma (buf, section->vma + j);
1399 for (s = buf + skip_addr_chars; *s == '0'; s++)
1400 *s = ' ';
1401 if (*s == '\0')
1402 *--s = '0';
1403 printf ("%s:\t", buf + skip_addr_chars);
1404
1405 pb += bytes_per_line;
1406 if (pb > bytes)
1407 pb = bytes;
1408 for (; j < i + pb; j += bpc)
1409 {
1410 int k;
1411
1412 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1413 {
1414 for (k = bpc - 1; k >= 0; k--)
1415 printf ("%02x", (unsigned) data[j + k]);
1416 putchar (' ');
1417 }
1418 else
1419 {
1420 for (k = 0; k < bpc; k++)
1421 printf ("%02x", (unsigned) data[j + k]);
1422 putchar (' ');
1423 }
1424 }
1425 }
1426 }
1427
1428 if (!wide_output)
1429 putchar ('\n');
1430 else
1431 need_nl = true;
1432 }
1433
1434 if (dump_reloc_info
1435 && (section->flags & SEC_RELOC) != 0)
1436 {
1437 while ((*relppp) < relppend
1438 && ((**relppp)->address >= (bfd_vma) i
1439 && (**relppp)->address < (bfd_vma) i + bytes))
1440 {
1441 arelent *q;
1442
1443 q = **relppp;
1444
1445 if (wide_output)
1446 putchar ('\t');
1447 else
1448 printf ("\t\t\t");
1449
1450 objdump_print_value (section->vma + q->address, info, true);
1451
1452 printf (": %s\t", q->howto->name);
1453
1454 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1455 printf ("*unknown*");
1456 else
1457 {
1458 const char *sym_name;
1459
1460 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1461 if (sym_name != NULL && *sym_name != '\0')
1462 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1463 else
1464 {
1465 asection *sym_sec;
1466
1467 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1468 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1469 if (sym_name == NULL || *sym_name == '\0')
1470 sym_name = "*unknown*";
1471 printf ("%s", sym_name);
1472 }
1473 }
1474
1475 if (q->addend)
1476 {
1477 printf ("+0x");
1478 objdump_print_value (q->addend, info, true);
1479 }
1480
1481 printf ("\n");
1482 need_nl = false;
1483 ++(*relppp);
1484 }
1485 }
1486
1487 if (need_nl)
1488 printf ("\n");
1489
1490 i += bytes;
1491 }
1492 }
1493
1494 /* Disassemble the contents of an object file. */
1495
1496 static void
1497 disassemble_data (abfd)
1498 bfd *abfd;
1499 {
1500 long i;
1501 disassembler_ftype disassemble_fn;
1502 struct disassemble_info disasm_info;
1503 struct objdump_disasm_info aux;
1504 asection *section;
1505
1506 print_files = NULL;
1507 prev_functionname = NULL;
1508 prev_line = -1;
1509
1510 /* We make a copy of syms to sort. We don't want to sort syms
1511 because that will screw up the relocs. */
1512 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1513 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1514
1515 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1516
1517 /* Sort the symbols into section and symbol order */
1518 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1519
1520 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1521 disasm_info.application_data = (PTR) &aux;
1522 aux.abfd = abfd;
1523 aux.require_sec = false;
1524 disasm_info.print_address_func = objdump_print_address;
1525 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1526
1527 if (machine != (char *) NULL)
1528 {
1529 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1530 if (info == NULL)
1531 {
1532 fprintf (stderr, _("%s: Can't use supplied machine %s\n"),
1533 program_name,
1534 machine);
1535 exit (1);
1536 }
1537 abfd->arch_info = info;
1538 }
1539
1540 if (endian != BFD_ENDIAN_UNKNOWN)
1541 {
1542 struct bfd_target *xvec;
1543
1544 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1545 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1546 xvec->byteorder = endian;
1547 abfd->xvec = xvec;
1548 }
1549
1550 disassemble_fn = disassembler (abfd);
1551 if (!disassemble_fn)
1552 {
1553 fprintf (stderr, _("%s: Can't disassemble for architecture %s\n"),
1554 program_name,
1555 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1556 return;
1557 }
1558
1559 disasm_info.flavour = bfd_get_flavour (abfd);
1560 disasm_info.arch = bfd_get_arch (abfd);
1561 disasm_info.mach = bfd_get_mach (abfd);
1562 if (bfd_big_endian (abfd))
1563 disasm_info.endian = BFD_ENDIAN_BIG;
1564 else if (bfd_little_endian (abfd))
1565 disasm_info.endian = BFD_ENDIAN_LITTLE;
1566 else
1567 /* ??? Aborting here seems too drastic. We could default to big or little
1568 instead. */
1569 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1570
1571 for (section = abfd->sections;
1572 section != (asection *) NULL;
1573 section = section->next)
1574 {
1575 bfd_byte *data = NULL;
1576 bfd_size_type datasize = 0;
1577 arelent **relbuf = NULL;
1578 arelent **relpp = NULL;
1579 arelent **relppend = NULL;
1580 long stop;
1581 asymbol *sym = NULL;
1582 long place = 0;
1583
1584 if ((section->flags & SEC_LOAD) == 0
1585 || (! disassemble_all
1586 && only == NULL
1587 && (section->flags & SEC_CODE) == 0))
1588 continue;
1589 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1590 continue;
1591
1592 if (dump_reloc_info
1593 && (section->flags & SEC_RELOC) != 0)
1594 {
1595 long relsize;
1596
1597 relsize = bfd_get_reloc_upper_bound (abfd, section);
1598 if (relsize < 0)
1599 bfd_fatal (bfd_get_filename (abfd));
1600
1601 if (relsize > 0)
1602 {
1603 long relcount;
1604
1605 relbuf = (arelent **) xmalloc (relsize);
1606 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1607 if (relcount < 0)
1608 bfd_fatal (bfd_get_filename (abfd));
1609
1610 /* Sort the relocs by address. */
1611 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1612
1613 relpp = relbuf;
1614 relppend = relpp + relcount;
1615
1616 /* Skip over the relocs belonging to addresses below the
1617 start address. */
1618 if (start_address != (bfd_vma) -1)
1619 {
1620 while (relpp < relppend
1621 && (*relpp)->address < start_address)
1622 ++relpp;
1623 }
1624 }
1625 }
1626
1627 printf (_("Disassembly of section %s:\n"), section->name);
1628
1629 datasize = bfd_get_section_size_before_reloc (section);
1630 if (datasize == 0)
1631 continue;
1632
1633 data = (bfd_byte *) xmalloc ((size_t) datasize);
1634
1635 bfd_get_section_contents (abfd, section, data, 0, datasize);
1636
1637 aux.sec = section;
1638 disasm_info.buffer = data;
1639 disasm_info.buffer_vma = section->vma;
1640 disasm_info.buffer_length = datasize;
1641 if (start_address == (bfd_vma) -1
1642 || start_address < disasm_info.buffer_vma)
1643 i = 0;
1644 else
1645 i = start_address - disasm_info.buffer_vma;
1646 if (stop_address == (bfd_vma) -1)
1647 stop = datasize;
1648 else
1649 {
1650 if (stop_address < disasm_info.buffer_vma)
1651 stop = 0;
1652 else
1653 stop = stop_address - disasm_info.buffer_vma;
1654 if (stop > disasm_info.buffer_length)
1655 stop = disasm_info.buffer_length;
1656 }
1657
1658 sym = find_symbol_for_address (abfd, section, section->vma + i,
1659 true, &place);
1660
1661 while (i < stop)
1662 {
1663 asymbol *nextsym;
1664 long nextstop;
1665 boolean insns;
1666
1667 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
1668 {
1669 int x;
1670
1671 for (x = place;
1672 (x < sorted_symcount
1673 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + i);
1674 ++x)
1675 continue;
1676 disasm_info.symbols = & sorted_syms[place];
1677 disasm_info.num_symbols = x - place;
1678 }
1679 else
1680 disasm_info.symbols = NULL;
1681
1682 if (! prefix_addresses)
1683 {
1684 printf ("\n");
1685 objdump_print_addr_with_sym (abfd, section, sym,
1686 section->vma + i,
1687 &disasm_info,
1688 false);
1689 printf (":\n");
1690 }
1691
1692 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1693 nextsym = sym;
1694 else if (sym == NULL)
1695 nextsym = NULL;
1696 else
1697 {
1698 while (place < sorted_symcount
1699 /* ??? Why the test for != section? */
1700 && (sorted_syms[place]->section != section
1701 || (bfd_asymbol_value (sorted_syms[place])
1702 <= bfd_asymbol_value (sym))))
1703 ++place;
1704 if (place >= sorted_symcount)
1705 nextsym = NULL;
1706 else
1707 nextsym = sorted_syms[place];
1708 }
1709
1710 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1711 {
1712 nextstop = bfd_asymbol_value (sym) - section->vma;
1713 if (nextstop > stop)
1714 nextstop = stop;
1715 }
1716 else if (nextsym == NULL)
1717 nextstop = stop;
1718 else
1719 {
1720 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1721 if (nextstop > stop)
1722 nextstop = stop;
1723 }
1724
1725 /* If a symbol is explicitly marked as being an object
1726 rather than a function, just dump the bytes without
1727 disassembling them. */
1728 if (disassemble_all
1729 || sym == NULL
1730 || bfd_asymbol_value (sym) > section->vma + i
1731 || ((sym->flags & BSF_OBJECT) == 0
1732 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1733 == NULL)
1734 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1735 == NULL))
1736 || (sym->flags & BSF_FUNCTION) != 0)
1737 insns = true;
1738 else
1739 insns = false;
1740
1741 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1742 nextstop, &relpp, relppend);
1743
1744 i = nextstop;
1745 sym = nextsym;
1746 }
1747
1748 free (data);
1749 if (relbuf != NULL)
1750 free (relbuf);
1751 }
1752 free (sorted_syms);
1753 }
1754 \f
1755
1756 /* Define a table of stab values and print-strings. We wish the initializer
1757 could be a direct-mapped table, but instead we build one the first
1758 time we need it. */
1759
1760 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1761 char *strsect_name));
1762
1763 /* Dump the stabs sections from an object file that has a section that
1764 uses Sun stabs encoding. */
1765
1766 static void
1767 dump_stabs (abfd)
1768 bfd *abfd;
1769 {
1770 dump_section_stabs (abfd, ".stab", ".stabstr");
1771 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1772 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1773 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1774 }
1775
1776 static bfd_byte *stabs;
1777 static bfd_size_type stab_size;
1778
1779 static char *strtab;
1780 static bfd_size_type stabstr_size;
1781
1782 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1783 and string table section STRSECT_NAME into `strtab'.
1784 If the section exists and was read, allocate the space and return true.
1785 Otherwise return false. */
1786
1787 static boolean
1788 read_section_stabs (abfd, stabsect_name, strsect_name)
1789 bfd *abfd;
1790 const char *stabsect_name;
1791 const char *strsect_name;
1792 {
1793 asection *stabsect, *stabstrsect;
1794
1795 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1796 if (0 == stabsect)
1797 {
1798 printf (_("No %s section present\n\n"), stabsect_name);
1799 return false;
1800 }
1801
1802 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1803 if (0 == stabstrsect)
1804 {
1805 fprintf (stderr, _("%s: %s has no %s section\n"), program_name,
1806 bfd_get_filename (abfd), strsect_name);
1807 return false;
1808 }
1809
1810 stab_size = bfd_section_size (abfd, stabsect);
1811 stabstr_size = bfd_section_size (abfd, stabstrsect);
1812
1813 stabs = (bfd_byte *) xmalloc (stab_size);
1814 strtab = (char *) xmalloc (stabstr_size);
1815
1816 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1817 {
1818 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1819 program_name, stabsect_name, bfd_get_filename (abfd),
1820 bfd_errmsg (bfd_get_error ()));
1821 free (stabs);
1822 free (strtab);
1823 return false;
1824 }
1825
1826 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1827 stabstr_size))
1828 {
1829 fprintf (stderr, _("%s: Reading %s section of %s failed: %s\n"),
1830 program_name, strsect_name, bfd_get_filename (abfd),
1831 bfd_errmsg (bfd_get_error ()));
1832 free (stabs);
1833 free (strtab);
1834 return false;
1835 }
1836
1837 return true;
1838 }
1839
1840 /* Stabs entries use a 12 byte format:
1841 4 byte string table index
1842 1 byte stab type
1843 1 byte stab other field
1844 2 byte stab desc field
1845 4 byte stab value
1846 FIXME: This will have to change for a 64 bit object format. */
1847
1848 #define STRDXOFF (0)
1849 #define TYPEOFF (4)
1850 #define OTHEROFF (5)
1851 #define DESCOFF (6)
1852 #define VALOFF (8)
1853 #define STABSIZE (12)
1854
1855 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1856 using string table section STRSECT_NAME (in `strtab'). */
1857
1858 static void
1859 print_section_stabs (abfd, stabsect_name, strsect_name)
1860 bfd *abfd;
1861 const char *stabsect_name;
1862 const char *strsect_name;
1863 {
1864 int i;
1865 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1866 bfd_byte *stabp, *stabs_end;
1867
1868 stabp = stabs;
1869 stabs_end = stabp + stab_size;
1870
1871 printf (_("Contents of %s section:\n\n"), stabsect_name);
1872 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1873
1874 /* Loop through all symbols and print them.
1875
1876 We start the index at -1 because there is a dummy symbol on
1877 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1878
1879 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1880 {
1881 const char *name;
1882 unsigned long strx;
1883 unsigned char type, other;
1884 unsigned short desc;
1885 bfd_vma value;
1886
1887 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1888 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1889 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1890 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1891 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1892
1893 printf ("\n%-6d ", i);
1894 /* Either print the stab name, or, if unnamed, print its number
1895 again (makes consistent formatting for tools like awk). */
1896 name = bfd_get_stab_name (type);
1897 if (name != NULL)
1898 printf ("%-6s", name);
1899 else if (type == N_UNDF)
1900 printf ("HdrSym");
1901 else
1902 printf ("%-6d", type);
1903 printf (" %-6d %-6d ", other, desc);
1904 printf_vma (value);
1905 printf (" %-6lu", strx);
1906
1907 /* Symbols with type == 0 (N_UNDF) specify the length of the
1908 string table associated with this file. We use that info
1909 to know how to relocate the *next* file's string table indices. */
1910
1911 if (type == N_UNDF)
1912 {
1913 file_string_table_offset = next_file_string_table_offset;
1914 next_file_string_table_offset += value;
1915 }
1916 else
1917 {
1918 /* Using the (possibly updated) string table offset, print the
1919 string (if any) associated with this symbol. */
1920
1921 if ((strx + file_string_table_offset) < stabstr_size)
1922 printf (" %s", &strtab[strx + file_string_table_offset]);
1923 else
1924 printf (" *");
1925 }
1926 }
1927 printf ("\n\n");
1928 }
1929
1930 static void
1931 dump_section_stabs (abfd, stabsect_name, strsect_name)
1932 bfd *abfd;
1933 char *stabsect_name;
1934 char *strsect_name;
1935 {
1936 asection *s;
1937
1938 /* Check for section names for which stabsect_name is a prefix, to
1939 handle .stab0, etc. */
1940 for (s = abfd->sections;
1941 s != NULL;
1942 s = s->next)
1943 {
1944 int len;
1945
1946 len = strlen (stabsect_name);
1947
1948 /* If the prefix matches, and the files section name ends with a
1949 nul or a digit, then we match. I.e., we want either an exact
1950 match or a section followed by a number. */
1951 if (strncmp (stabsect_name, s->name, len) == 0
1952 && (s->name[len] == '\000'
1953 || isdigit ((unsigned char) s->name[len])))
1954 {
1955 if (read_section_stabs (abfd, s->name, strsect_name))
1956 {
1957 print_section_stabs (abfd, s->name, strsect_name);
1958 free (stabs);
1959 free (strtab);
1960 }
1961 }
1962 }
1963 }
1964 \f
1965 static void
1966 dump_bfd_header (abfd)
1967 bfd *abfd;
1968 {
1969 char *comma = "";
1970
1971 printf (_("architecture: %s, "),
1972 bfd_printable_arch_mach (bfd_get_arch (abfd),
1973 bfd_get_mach (abfd)));
1974 printf (_("flags 0x%08x:\n"), abfd->flags);
1975
1976 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1977 PF (HAS_RELOC, "HAS_RELOC");
1978 PF (EXEC_P, "EXEC_P");
1979 PF (HAS_LINENO, "HAS_LINENO");
1980 PF (HAS_DEBUG, "HAS_DEBUG");
1981 PF (HAS_SYMS, "HAS_SYMS");
1982 PF (HAS_LOCALS, "HAS_LOCALS");
1983 PF (DYNAMIC, "DYNAMIC");
1984 PF (WP_TEXT, "WP_TEXT");
1985 PF (D_PAGED, "D_PAGED");
1986 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1987 printf (_("\nstart address 0x"));
1988 printf_vma (abfd->start_address);
1989 printf ("\n");
1990 }
1991 \f
1992 static void
1993 dump_bfd_private_header (abfd)
1994 bfd *abfd;
1995 {
1996 bfd_print_private_bfd_data (abfd, stdout);
1997 }
1998
1999 static void
2000 display_bfd (abfd)
2001 bfd *abfd;
2002 {
2003 char **matching;
2004
2005 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
2006 {
2007 bfd_nonfatal (bfd_get_filename (abfd));
2008 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2009 {
2010 list_matching_formats (matching);
2011 free (matching);
2012 }
2013 return;
2014 }
2015
2016 /* If we are adjusting section VMA's, change them all now. Changing
2017 the BFD information is a hack. However, we must do it, or
2018 bfd_find_nearest_line will not do the right thing. */
2019 if (adjust_section_vma != 0)
2020 {
2021 asection *s;
2022
2023 for (s = abfd->sections; s != NULL; s = s->next)
2024 {
2025 s->vma += adjust_section_vma;
2026 s->lma += adjust_section_vma;
2027 }
2028 }
2029
2030 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2031 abfd->xvec->name);
2032 if (dump_ar_hdrs)
2033 print_arelt_descr (stdout, abfd, true);
2034 if (dump_file_header)
2035 dump_bfd_header (abfd);
2036 if (dump_private_headers)
2037 dump_bfd_private_header (abfd);
2038 putchar ('\n');
2039 if (dump_section_headers)
2040 dump_headers (abfd);
2041 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2042 {
2043 syms = slurp_symtab (abfd);
2044 }
2045 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2046 {
2047 dynsyms = slurp_dynamic_symtab (abfd);
2048 }
2049 if (dump_symtab)
2050 dump_symbols (abfd, false);
2051 if (dump_dynamic_symtab)
2052 dump_symbols (abfd, true);
2053 if (dump_stab_section_info)
2054 dump_stabs (abfd);
2055 if (dump_reloc_info && ! disassemble)
2056 dump_relocs (abfd);
2057 if (dump_dynamic_reloc_info)
2058 dump_dynamic_relocs (abfd);
2059 if (dump_section_contents)
2060 dump_data (abfd);
2061 if (disassemble)
2062 disassemble_data (abfd);
2063 if (dump_debugging)
2064 {
2065 PTR dhandle;
2066
2067 dhandle = read_debugging_info (abfd, syms, symcount);
2068 if (dhandle != NULL)
2069 {
2070 if (! print_debugging_info (stdout, dhandle))
2071 fprintf (stderr, _("%s: printing debugging information failed\n"),
2072 bfd_get_filename (abfd));
2073 }
2074 }
2075 if (syms)
2076 {
2077 free (syms);
2078 syms = NULL;
2079 }
2080 if (dynsyms)
2081 {
2082 free (dynsyms);
2083 dynsyms = NULL;
2084 }
2085 }
2086
2087 static void
2088 display_file (filename, target)
2089 char *filename;
2090 char *target;
2091 {
2092 bfd *file, *arfile = (bfd *) NULL;
2093
2094 file = bfd_openr (filename, target);
2095 if (file == NULL)
2096 {
2097 bfd_nonfatal (filename);
2098 return;
2099 }
2100
2101 if (bfd_check_format (file, bfd_archive) == true)
2102 {
2103 bfd *last_arfile = NULL;
2104
2105 printf (_("In archive %s:\n"), bfd_get_filename (file));
2106 for (;;)
2107 {
2108 bfd_set_error (bfd_error_no_error);
2109
2110 arfile = bfd_openr_next_archived_file (file, arfile);
2111 if (arfile == NULL)
2112 {
2113 if (bfd_get_error () != bfd_error_no_more_archived_files)
2114 {
2115 bfd_nonfatal (bfd_get_filename (file));
2116 }
2117 break;
2118 }
2119
2120 display_bfd (arfile);
2121
2122 if (last_arfile != NULL)
2123 bfd_close (last_arfile);
2124 last_arfile = arfile;
2125 }
2126
2127 if (last_arfile != NULL)
2128 bfd_close (last_arfile);
2129 }
2130 else
2131 display_bfd (file);
2132
2133 bfd_close (file);
2134 }
2135 \f
2136 /* Actually display the various requested regions */
2137
2138 static void
2139 dump_data (abfd)
2140 bfd *abfd;
2141 {
2142 asection *section;
2143 bfd_byte *data = 0;
2144 bfd_size_type datasize = 0;
2145 bfd_size_type i;
2146 bfd_size_type start, stop;
2147
2148 for (section = abfd->sections; section != NULL; section =
2149 section->next)
2150 {
2151 int onaline = 16;
2152
2153 if (only == (char *) NULL ||
2154 strcmp (only, section->name) == 0)
2155 {
2156 if (section->flags & SEC_HAS_CONTENTS)
2157 {
2158 printf (_("Contents of section %s:\n"), section->name);
2159
2160 if (bfd_section_size (abfd, section) == 0)
2161 continue;
2162 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2163 datasize = bfd_section_size (abfd, section);
2164
2165
2166 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2167
2168 if (start_address == (bfd_vma) -1
2169 || start_address < section->vma)
2170 start = 0;
2171 else
2172 start = start_address - section->vma;
2173 if (stop_address == (bfd_vma) -1)
2174 stop = bfd_section_size (abfd, section);
2175 else
2176 {
2177 if (stop_address < section->vma)
2178 stop = 0;
2179 else
2180 stop = stop_address - section->vma;
2181 if (stop > bfd_section_size (abfd, section))
2182 stop = bfd_section_size (abfd, section);
2183 }
2184 for (i = start; i < stop; i += onaline)
2185 {
2186 bfd_size_type j;
2187
2188 printf (" %04lx ", (unsigned long int) (i + section->vma));
2189 for (j = i; j < i + onaline; j++)
2190 {
2191 if (j < stop)
2192 printf ("%02x", (unsigned) (data[j]));
2193 else
2194 printf (" ");
2195 if ((j & 3) == 3)
2196 printf (" ");
2197 }
2198
2199 printf (" ");
2200 for (j = i; j < i + onaline; j++)
2201 {
2202 if (j >= stop)
2203 printf (" ");
2204 else
2205 printf ("%c", isprint (data[j]) ? data[j] : '.');
2206 }
2207 putchar ('\n');
2208 }
2209 free (data);
2210 }
2211 }
2212 }
2213 }
2214
2215 /* Should perhaps share code and display with nm? */
2216 static void
2217 dump_symbols (abfd, dynamic)
2218 bfd *abfd;
2219 boolean dynamic;
2220 {
2221 asymbol **current;
2222 long max;
2223 long count;
2224
2225 if (dynamic)
2226 {
2227 current = dynsyms;
2228 max = dynsymcount;
2229 if (max == 0)
2230 return;
2231 printf ("DYNAMIC SYMBOL TABLE:\n");
2232 }
2233 else
2234 {
2235 current = syms;
2236 max = symcount;
2237 if (max == 0)
2238 return;
2239 printf ("SYMBOL TABLE:\n");
2240 }
2241
2242 for (count = 0; count < max; count++)
2243 {
2244 if (*current)
2245 {
2246 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2247
2248 if (cur_bfd != NULL)
2249 {
2250 const char *name;
2251 char *alloc;
2252
2253 name = bfd_asymbol_name (*current);
2254 alloc = NULL;
2255 if (do_demangle && name != NULL && *name != '\0')
2256 {
2257 const char *n;
2258
2259 /* If we want to demangle the name, we demangle it
2260 here, and temporarily clobber it while calling
2261 bfd_print_symbol. FIXME: This is a gross hack. */
2262
2263 n = name;
2264 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2265 ++n;
2266 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2267 if (alloc != NULL)
2268 (*current)->name = alloc;
2269 else
2270 (*current)->name = n;
2271 }
2272
2273 bfd_print_symbol (cur_bfd, stdout, *current,
2274 bfd_print_symbol_all);
2275
2276 (*current)->name = name;
2277 if (alloc != NULL)
2278 free (alloc);
2279
2280 printf ("\n");
2281 }
2282 }
2283 current++;
2284 }
2285 printf ("\n");
2286 printf ("\n");
2287 }
2288
2289 static void
2290 dump_relocs (abfd)
2291 bfd *abfd;
2292 {
2293 arelent **relpp;
2294 long relcount;
2295 asection *a;
2296
2297 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2298 {
2299 long relsize;
2300
2301 if (bfd_is_abs_section (a))
2302 continue;
2303 if (bfd_is_und_section (a))
2304 continue;
2305 if (bfd_is_com_section (a))
2306 continue;
2307
2308 if (only)
2309 {
2310 if (strcmp (only, a->name))
2311 continue;
2312 }
2313 else if ((a->flags & SEC_RELOC) == 0)
2314 continue;
2315
2316 relsize = bfd_get_reloc_upper_bound (abfd, a);
2317 if (relsize < 0)
2318 bfd_fatal (bfd_get_filename (abfd));
2319
2320 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2321
2322 if (relsize == 0)
2323 {
2324 printf (" (none)\n\n");
2325 }
2326 else
2327 {
2328 relpp = (arelent **) xmalloc (relsize);
2329 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2330 if (relcount < 0)
2331 bfd_fatal (bfd_get_filename (abfd));
2332 else if (relcount == 0)
2333 {
2334 printf (" (none)\n\n");
2335 }
2336 else
2337 {
2338 printf ("\n");
2339 dump_reloc_set (abfd, a, relpp, relcount);
2340 printf ("\n\n");
2341 }
2342 free (relpp);
2343 }
2344 }
2345 }
2346
2347 static void
2348 dump_dynamic_relocs (abfd)
2349 bfd *abfd;
2350 {
2351 long relsize;
2352 arelent **relpp;
2353 long relcount;
2354
2355 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2356 if (relsize < 0)
2357 bfd_fatal (bfd_get_filename (abfd));
2358
2359 printf ("DYNAMIC RELOCATION RECORDS");
2360
2361 if (relsize == 0)
2362 {
2363 printf (" (none)\n\n");
2364 }
2365 else
2366 {
2367 relpp = (arelent **) xmalloc (relsize);
2368 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2369 if (relcount < 0)
2370 bfd_fatal (bfd_get_filename (abfd));
2371 else if (relcount == 0)
2372 {
2373 printf (" (none)\n\n");
2374 }
2375 else
2376 {
2377 printf ("\n");
2378 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2379 printf ("\n\n");
2380 }
2381 free (relpp);
2382 }
2383 }
2384
2385 static void
2386 dump_reloc_set (abfd, sec, relpp, relcount)
2387 bfd *abfd;
2388 asection *sec;
2389 arelent **relpp;
2390 long relcount;
2391 {
2392 arelent **p;
2393 char *last_filename, *last_functionname;
2394 unsigned int last_line;
2395
2396 /* Get column headers lined up reasonably. */
2397 {
2398 static int width;
2399 if (width == 0)
2400 {
2401 char buf[30];
2402 sprintf_vma (buf, (bfd_vma) -1);
2403 width = strlen (buf) - 7;
2404 }
2405 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2406 }
2407
2408 last_filename = NULL;
2409 last_functionname = NULL;
2410 last_line = 0;
2411
2412 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2413 {
2414 arelent *q = *p;
2415 const char *filename, *functionname;
2416 unsigned int line;
2417 const char *sym_name;
2418 const char *section_name;
2419
2420 if (start_address != (bfd_vma) -1
2421 && q->address < start_address)
2422 continue;
2423 if (stop_address != (bfd_vma) -1
2424 && q->address > stop_address)
2425 continue;
2426
2427 if (with_line_numbers
2428 && sec != NULL
2429 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2430 &filename, &functionname, &line))
2431 {
2432 if (functionname != NULL
2433 && (last_functionname == NULL
2434 || strcmp (functionname, last_functionname) != 0))
2435 {
2436 printf ("%s():\n", functionname);
2437 if (last_functionname != NULL)
2438 free (last_functionname);
2439 last_functionname = xstrdup (functionname);
2440 }
2441 if (line > 0
2442 && (line != last_line
2443 || (filename != NULL
2444 && last_filename != NULL
2445 && strcmp (filename, last_filename) != 0)))
2446 {
2447 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2448 last_line = line;
2449 if (last_filename != NULL)
2450 free (last_filename);
2451 if (filename == NULL)
2452 last_filename = NULL;
2453 else
2454 last_filename = xstrdup (filename);
2455 }
2456 }
2457
2458 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2459 {
2460 sym_name = (*(q->sym_ptr_ptr))->name;
2461 section_name = (*(q->sym_ptr_ptr))->section->name;
2462 }
2463 else
2464 {
2465 sym_name = NULL;
2466 section_name = NULL;
2467 }
2468 if (sym_name)
2469 {
2470 printf_vma (q->address);
2471 printf (" %-16s ", q->howto->name);
2472 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2473 *q->sym_ptr_ptr);
2474 }
2475 else
2476 {
2477 if (section_name == (CONST char *) NULL)
2478 section_name = "*unknown*";
2479 printf_vma (q->address);
2480 printf (" %-16s [%s]",
2481 q->howto->name,
2482 section_name);
2483 }
2484 if (q->addend)
2485 {
2486 printf ("+0x");
2487 printf_vma (q->addend);
2488 }
2489 printf ("\n");
2490 }
2491 }
2492 \f
2493 /* The length of the longest architecture name + 1. */
2494 #define LONGEST_ARCH sizeof("rs6000:6000")
2495
2496 static const char *
2497 endian_string (endian)
2498 enum bfd_endian endian;
2499 {
2500 if (endian == BFD_ENDIAN_BIG)
2501 return "big endian";
2502 else if (endian == BFD_ENDIAN_LITTLE)
2503 return "little endian";
2504 else
2505 return "endianness unknown";
2506 }
2507
2508 /* List the targets that BFD is configured to support, each followed
2509 by its endianness and the architectures it supports. */
2510
2511 static void
2512 display_target_list ()
2513 {
2514 extern bfd_target *bfd_target_vector[];
2515 char *dummy_name;
2516 int t;
2517
2518 dummy_name = choose_temp_base ();
2519 for (t = 0; bfd_target_vector[t]; t++)
2520 {
2521 bfd_target *p = bfd_target_vector[t];
2522 bfd *abfd = bfd_openw (dummy_name, p->name);
2523 int a;
2524
2525 printf ("%s\n (header %s, data %s)\n", p->name,
2526 endian_string (p->header_byteorder),
2527 endian_string (p->byteorder));
2528
2529 if (abfd == NULL)
2530 {
2531 bfd_nonfatal (dummy_name);
2532 continue;
2533 }
2534
2535 if (! bfd_set_format (abfd, bfd_object))
2536 {
2537 if (bfd_get_error () != bfd_error_invalid_operation)
2538 bfd_nonfatal (p->name);
2539 continue;
2540 }
2541
2542 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2543 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2544 printf (" %s\n",
2545 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2546 }
2547 unlink (dummy_name);
2548 free (dummy_name);
2549 }
2550
2551 /* Print a table showing which architectures are supported for entries
2552 FIRST through LAST-1 of bfd_target_vector (targets across,
2553 architectures down). */
2554
2555 static void
2556 display_info_table (first, last)
2557 int first;
2558 int last;
2559 {
2560 extern bfd_target *bfd_target_vector[];
2561 int t, a;
2562 char *dummy_name;
2563
2564 /* Print heading of target names. */
2565 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2566 for (t = first; t < last && bfd_target_vector[t]; t++)
2567 printf ("%s ", bfd_target_vector[t]->name);
2568 putchar ('\n');
2569
2570 dummy_name = choose_temp_base ();
2571 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2572 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2573 {
2574 printf ("%*s ", (int) LONGEST_ARCH - 1,
2575 bfd_printable_arch_mach (a, 0));
2576 for (t = first; t < last && bfd_target_vector[t]; t++)
2577 {
2578 bfd_target *p = bfd_target_vector[t];
2579 boolean ok = true;
2580 bfd *abfd = bfd_openw (dummy_name, p->name);
2581
2582 if (abfd == NULL)
2583 {
2584 bfd_nonfatal (p->name);
2585 ok = false;
2586 }
2587
2588 if (ok)
2589 {
2590 if (! bfd_set_format (abfd, bfd_object))
2591 {
2592 if (bfd_get_error () != bfd_error_invalid_operation)
2593 bfd_nonfatal (p->name);
2594 ok = false;
2595 }
2596 }
2597
2598 if (ok)
2599 {
2600 if (! bfd_set_arch_mach (abfd, a, 0))
2601 ok = false;
2602 }
2603
2604 if (ok)
2605 printf ("%s ", p->name);
2606 else
2607 {
2608 int l = strlen (p->name);
2609 while (l--)
2610 putchar ('-');
2611 putchar (' ');
2612 }
2613 }
2614 putchar ('\n');
2615 }
2616 unlink (dummy_name);
2617 free (dummy_name);
2618 }
2619
2620 /* Print tables of all the target-architecture combinations that
2621 BFD has been configured to support. */
2622
2623 static void
2624 display_target_tables ()
2625 {
2626 int t, columns;
2627 extern bfd_target *bfd_target_vector[];
2628 char *colum;
2629
2630 columns = 0;
2631 colum = getenv ("COLUMNS");
2632 if (colum != NULL)
2633 columns = atoi (colum);
2634 if (columns == 0)
2635 columns = 80;
2636
2637 t = 0;
2638 while (bfd_target_vector[t] != NULL)
2639 {
2640 int oldt = t, wid;
2641
2642 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2643 ++t;
2644 while (wid < columns && bfd_target_vector[t] != NULL)
2645 {
2646 int newwid;
2647
2648 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2649 if (newwid >= columns)
2650 break;
2651 wid = newwid;
2652 ++t;
2653 }
2654 display_info_table (oldt, t);
2655 }
2656 }
2657
2658 static void
2659 display_info ()
2660 {
2661 printf (_("BFD header file version %s\n"), BFD_VERSION);
2662 display_target_list ();
2663 display_target_tables ();
2664 }
2665
2666 int
2667 main (argc, argv)
2668 int argc;
2669 char **argv;
2670 {
2671 int c;
2672 char *target = default_target;
2673 boolean seenflag = false;
2674
2675 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2676 setlocale (LC_MESSAGES, "");
2677 #endif
2678 bindtextdomain (PACKAGE, LOCALEDIR);
2679 textdomain (PACKAGE);
2680
2681 program_name = *argv;
2682 xmalloc_set_program_name (program_name);
2683
2684 START_PROGRESS (program_name, 0);
2685
2686 bfd_init ();
2687 set_default_bfd_target ();
2688
2689 while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
2690 long_options, (int *) 0))
2691 != EOF)
2692 {
2693 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2694 seenflag = true;
2695 switch (c)
2696 {
2697 case 0:
2698 break; /* we've been given a long option */
2699 case 'm':
2700 machine = optarg;
2701 break;
2702 case 'j':
2703 only = optarg;
2704 break;
2705 case 'l':
2706 with_line_numbers = 1;
2707 break;
2708 case 'b':
2709 target = optarg;
2710 break;
2711 case 'f':
2712 dump_file_header = true;
2713 break;
2714 case 'i':
2715 formats_info = true;
2716 break;
2717 case 'p':
2718 dump_private_headers = 1;
2719 break;
2720 case 'x':
2721 dump_private_headers = 1;
2722 dump_symtab = 1;
2723 dump_reloc_info = 1;
2724 dump_file_header = true;
2725 dump_ar_hdrs = 1;
2726 dump_section_headers = 1;
2727 break;
2728 case 't':
2729 dump_symtab = 1;
2730 break;
2731 case 'T':
2732 dump_dynamic_symtab = 1;
2733 break;
2734 case 'C':
2735 do_demangle = 1;
2736 break;
2737 case 'd':
2738 disassemble = true;
2739 break;
2740 case 'D':
2741 disassemble = disassemble_all = true;
2742 break;
2743 case 'S':
2744 disassemble = true;
2745 with_source_code = true;
2746 break;
2747 case 's':
2748 dump_section_contents = 1;
2749 break;
2750 case 'r':
2751 dump_reloc_info = 1;
2752 break;
2753 case 'R':
2754 dump_dynamic_reloc_info = 1;
2755 break;
2756 case 'a':
2757 dump_ar_hdrs = 1;
2758 break;
2759 case 'h':
2760 dump_section_headers = 1;
2761 break;
2762 case 'H':
2763 usage (stdout, 0);
2764 case 'V':
2765 show_version = 1;
2766 break;
2767 case 'w':
2768 wide_output = 1;
2769 break;
2770 case OPTION_ADJUST_VMA:
2771 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2772 break;
2773 case OPTION_START_ADDRESS:
2774 start_address = parse_vma (optarg, "--start-address");
2775 break;
2776 case OPTION_STOP_ADDRESS:
2777 stop_address = parse_vma (optarg, "--stop-address");
2778 break;
2779 case 'E':
2780 if (strcmp (optarg, "B") == 0)
2781 endian = BFD_ENDIAN_BIG;
2782 else if (strcmp (optarg, "L") == 0)
2783 endian = BFD_ENDIAN_LITTLE;
2784 else
2785 {
2786 fprintf (stderr, _("%s: unrecognized -E option\n"), program_name);
2787 usage (stderr, 1);
2788 }
2789 break;
2790 case OPTION_ENDIAN:
2791 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2792 endian = BFD_ENDIAN_BIG;
2793 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2794 endian = BFD_ENDIAN_LITTLE;
2795 else
2796 {
2797 fprintf (stderr, _("%s: unrecognized --endian type `%s'\n"),
2798 program_name, optarg);
2799 usage (stderr, 1);
2800 }
2801 break;
2802 default:
2803 usage (stderr, 1);
2804 }
2805 }
2806
2807 if (show_version)
2808 print_version ("objdump");
2809
2810 if (seenflag == false)
2811 usage (stderr, 1);
2812
2813 if (formats_info)
2814 {
2815 display_info ();
2816 }
2817 else
2818 {
2819 if (optind == argc)
2820 display_file ("a.out", target);
2821 else
2822 for (; optind < argc;)
2823 display_file (argv[optind++], target);
2824 }
2825
2826 END_PROGRESS (program_name);
2827
2828 return 0;
2829 }