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