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