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