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