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