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