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