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