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