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