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