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