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