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