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