fix gdb/13620 -- control-c to interrupt gdb command only works once.
[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, ">");
fd6d6c60
NC
831
832 /* Notify the disassembler of the symbol being used: */
833 disasm_symaddr (sym, info);
2fa0b342 834 }
b4aabb24
ILT
835}
836
51b8c416
ILT
837/* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
838 true, don't output leading zeroes. */
b4aabb24
ILT
839
840static void
51b8c416 841objdump_print_addr (vma, info, skip_zeroes)
b4aabb24
ILT
842 bfd_vma vma;
843 struct disassemble_info *info;
51b8c416 844 boolean skip_zeroes;
b4aabb24
ILT
845{
846 struct objdump_disasm_info *aux;
847 asymbol *sym;
848
849 if (sorted_symcount < 1)
850 {
fd6d6c60 851 (*info->fprintf_func) (info->stream, "0x");
51b8c416 852 objdump_print_value (vma, info, skip_zeroes);
b4aabb24
ILT
853 return;
854 }
855
856 aux = (struct objdump_disasm_info *) info->application_data;
857 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
858 (long *) NULL);
51b8c416
ILT
859 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
860 skip_zeroes);
861}
862
863/* Print VMA to INFO. This function is passed to the disassembler
864 routine. */
865
866static void
867objdump_print_address (vma, info)
868 bfd_vma vma;
869 struct disassemble_info *info;
870{
871 objdump_print_addr (vma, info, ! prefix_addresses);
2fa0b342
DHW
872}
873
fd6d6c60
NC
874/* Determine of the given address has a symbol associated with it. */
875
876static int
877objdump_symbol_at_address (vma, info)
878 bfd_vma vma;
879 struct disassemble_info * info;
880{
881 struct objdump_disasm_info * aux;
882 asymbol * sym;
883
884 /* No symbols - do not bother checking. */
885 if (sorted_symcount < 1)
886 return 0;
887
888 aux = (struct objdump_disasm_info *) info->application_data;
889 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
890 (long *) NULL);
891
892 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
893}
894
be1d162b
ILT
895/* Hold the last function name and the last line number we displayed
896 in a disassembly. */
897
898static char *prev_functionname;
899static unsigned int prev_line;
900
901/* We keep a list of all files that we have seen when doing a
902 dissassembly with source, so that we know how much of the file to
903 display. This can be important for inlined functions. */
904
905struct print_file_list
906{
907 struct print_file_list *next;
908 char *filename;
909 unsigned int line;
910 FILE *f;
911};
912
913static struct print_file_list *print_files;
914
915/* The number of preceding context lines to show when we start
916 displaying a file for the first time. */
917
918#define SHOW_PRECEDING_CONTEXT_LINES (5)
919
920/* Skip ahead to a given line in a file, optionally printing each
921 line. */
922
923static void
924skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
925
926static void
927skip_to_line (p, line, show)
928 struct print_file_list *p;
929 unsigned int line;
930 boolean show;
931{
932 while (p->line < line)
933 {
934 char buf[100];
935
936 if (fgets (buf, sizeof buf, p->f) == NULL)
937 {
938 fclose (p->f);
939 p->f = NULL;
940 break;
941 }
942
943 if (show)
944 printf ("%s", buf);
945
946 if (strchr (buf, '\n') != NULL)
947 ++p->line;
948 }
949}
950
951/* Show the line number, or the source line, in a dissassembly
952 listing. */
953
954static void
955show_line (abfd, section, off)
aa0a709a 956 bfd *abfd;
be1d162b
ILT
957 asection *section;
958 bfd_vma off;
2fa0b342 959{
be1d162b
ILT
960 CONST char *filename;
961 CONST char *functionname;
962 unsigned int line;
2e8adbd7 963
be1d162b
ILT
964 if (! with_line_numbers && ! with_source_code)
965 return;
d20f480f 966
be1d162b
ILT
967 if (! bfd_find_nearest_line (abfd, section, syms, off, &filename,
968 &functionname, &line))
969 return;
aa0a709a 970
be1d162b
ILT
971 if (filename != NULL && *filename == '\0')
972 filename = NULL;
973 if (functionname != NULL && *functionname == '\0')
974 functionname = NULL;
aa0a709a 975
be1d162b 976 if (with_line_numbers)
d5464baa 977 {
be1d162b
ILT
978 if (functionname != NULL
979 && (prev_functionname == NULL
980 || strcmp (functionname, prev_functionname) != 0))
981 printf ("%s():\n", functionname);
982 if (line > 0 && line != prev_line)
983 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
984 }
985
986 if (with_source_code
987 && filename != NULL
988 && line > 0)
989 {
990 struct print_file_list **pp, *p;
991
992 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
993 if (strcmp ((*pp)->filename, filename) == 0)
994 break;
995 p = *pp;
996
997 if (p != NULL)
d5464baa 998 {
be1d162b
ILT
999 if (p != print_files)
1000 {
1001 int l;
1002
1003 /* We have reencountered a file name which we saw
1004 earlier. This implies that either we are dumping out
1005 code from an included file, or the same file was
1006 linked in more than once. There are two common cases
1007 of an included file: inline functions in a header
1008 file, and a bison or flex skeleton file. In the
1009 former case we want to just start printing (but we
1010 back up a few lines to give context); in the latter
1011 case we want to continue from where we left off. I
1012 can't think of a good way to distinguish the cases,
1013 so I used a heuristic based on the file name. */
1014 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1015 l = p->line;
1016 else
1017 {
1018 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1019 if (l <= 0)
1020 l = 1;
1021 }
d5464baa 1022
be1d162b
ILT
1023 if (p->f == NULL)
1024 {
1025 p->f = fopen (p->filename, "r");
1026 p->line = 0;
1027 }
1028 if (p->f != NULL)
1029 skip_to_line (p, l, false);
d5464baa 1030
be1d162b
ILT
1031 if (print_files->f != NULL)
1032 {
1033 fclose (print_files->f);
1034 print_files->f = NULL;
1035 }
1036 }
d5464baa 1037
be1d162b
ILT
1038 if (p->f != NULL)
1039 {
1040 skip_to_line (p, line, true);
1041 *pp = p->next;
1042 p->next = print_files;
1043 print_files = p;
1044 }
1045 }
1046 else
1047 {
1048 FILE *f;
d5464baa 1049
be1d162b
ILT
1050 f = fopen (filename, "r");
1051 if (f != NULL)
d5464baa 1052 {
be1d162b 1053 int l;
d5464baa 1054
be1d162b
ILT
1055 p = ((struct print_file_list *)
1056 xmalloc (sizeof (struct print_file_list)));
1057 p->filename = xmalloc (strlen (filename) + 1);
1058 strcpy (p->filename, filename);
1059 p->line = 0;
1060 p->f = f;
1061
1062 if (print_files != NULL && print_files->f != NULL)
1063 {
1064 fclose (print_files->f);
1065 print_files->f = NULL;
1066 }
1067 p->next = print_files;
1068 print_files = p;
1069
1070 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1071 if (l <= 0)
1072 l = 1;
1073 skip_to_line (p, l, false);
1074 if (p->f != NULL)
1075 skip_to_line (p, line, true);
d5464baa
ILT
1076 }
1077 }
1078 }
1079
be1d162b
ILT
1080 if (functionname != NULL
1081 && (prev_functionname == NULL
1082 || strcmp (functionname, prev_functionname) != 0))
aa0a709a 1083 {
be1d162b
ILT
1084 if (prev_functionname != NULL)
1085 free (prev_functionname);
1086 prev_functionname = xmalloc (strlen (functionname) + 1);
1087 strcpy (prev_functionname, functionname);
aa0a709a 1088 }
2fa0b342 1089
be1d162b
ILT
1090 if (line > 0 && line != prev_line)
1091 prev_line = line;
1092}
1093
7fc01fc9
ILT
1094/* Pseudo FILE object for strings. */
1095typedef struct {
1096 char *buffer;
1097 char *current;
1098} SFILE;
1099
1100/* sprintf to a "stream" */
1101
1102#ifdef ANSI_PROTOTYPES
1103static int
1104objdump_sprintf (SFILE *f, const char *format, ...)
1105{
1106 int n;
1107 va_list args;
1108
1109 va_start (args, format);
1110 vsprintf (f->current, format, args);
1111 f->current += n = strlen (f->current);
1112 va_end (args);
1113 return n;
1114}
1115#else
1116static int
1117objdump_sprintf (va_alist)
1118 va_dcl
1119{
1120 int n;
1121 SFILE *f;
1122 const char *format;
1123 va_list args;
1124
1125 va_start (args);
1126 f = va_arg (args, SFILE *);
1127 format = va_arg (args, const char *);
1128 vsprintf (f->current, format, args);
1129 f->current += n = strlen (f->current);
1130 va_end (args);
1131 return n;
1132}
1133#endif
1134
b4aabb24
ILT
1135/* The number of zeroes we want to see before we start skipping them.
1136 The number is arbitrarily chosen. */
1137
1138#define SKIP_ZEROES (8)
1139
1140/* The number of zeroes to skip at the end of a section. If the
1141 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1142 SKIP_ZEROES, they will be disassembled. If there are fewer than
1143 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1144 attempt to avoid disassembling zeroes inserted by section
1145 alignment. */
1146
1147#define SKIP_ZEROES_AT_END (3)
1148
1149/* Disassemble some data in memory between given values. */
1150
1151static void
1152disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp,
1153 relppend)
1154 struct disassemble_info *info;
1155 disassembler_ftype disassemble_fn;
1156 boolean insns;
1157 bfd_byte *data;
1158 long start;
1159 long stop;
1160 arelent ***relppp;
1161 arelent **relppend;
1162{
1163 struct objdump_disasm_info *aux;
1164 asection *section;
1165 int bytes_per_line;
1166 boolean done_dot;
51b8c416 1167 int skip_addr_chars;
b4aabb24
ILT
1168 long i;
1169
1170 aux = (struct objdump_disasm_info *) info->application_data;
1171 section = aux->sec;
1172
1173 if (insns)
1174 bytes_per_line = 4;
1175 else
1176 bytes_per_line = 16;
1177
51b8c416
ILT
1178 /* Figure out how many characters to skip at the start of an
1179 address, to make the disassembly look nicer. We discard leading
1180 zeroes in chunks of 4, ensuring that there is always a leading
1181 zero remaining. */
1182 skip_addr_chars = 0;
1183 if (! prefix_addresses)
1184 {
1185 char buf[30];
1186 char *s;
1187
1188 sprintf_vma (buf,
1189 section->vma + bfd_section_size (section->owner, section));
1190 s = buf;
1191 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1192 && s[4] == '0')
1193 {
1194 skip_addr_chars += 4;
1195 s += 4;
1196 }
1197 }
1198
b4aabb24
ILT
1199 info->insn_info_valid = 0;
1200
1201 done_dot = false;
1202 i = start;
1203 while (i < stop)
1204 {
1205 long z;
1206 int bytes;
1207 boolean need_nl = false;
1208
1209 /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1210 print `...'. */
1211 for (z = i; z < stop; z++)
1212 if (data[z] != 0)
1213 break;
51b8c416
ILT
1214 if (! disassemble_zeroes
1215 && (info->insn_info_valid == 0
1216 || info->branch_delay_insns == 0)
b4aabb24
ILT
1217 && (z - i >= SKIP_ZEROES
1218 || (z == stop && z - i < SKIP_ZEROES_AT_END)))
1219 {
1220 printf ("\t...\n");
1221
1222 /* If there are more nonzero bytes to follow, we only skip
1223 zeroes in multiples of 4, to try to avoid running over
1224 the start of an instruction which happens to start with
1225 zero. */
1226 if (z != stop)
1227 z = i + ((z - i) &~ 3);
1228
1229 bytes = z - i;
1230 }
1231 else
1232 {
1233 char buf[1000];
1234 SFILE sfile;
33a795dd 1235 int bpc, pb = 0;
b4aabb24
ILT
1236
1237 done_dot = false;
1238
1239 if (with_line_numbers || with_source_code)
1240 show_line (aux->abfd, section, i);
1241
1242 if (! prefix_addresses)
51b8c416
ILT
1243 {
1244 char *s;
1245
1246 sprintf_vma (buf, section->vma + i);
1247 for (s = buf + skip_addr_chars; *s == '0'; s++)
1248 *s = ' ';
1249 if (*s == '\0')
1250 *--s = '0';
1251 printf ("%s:\t", buf + skip_addr_chars);
1252 }
b4aabb24
ILT
1253 else
1254 {
1255 aux->require_sec = true;
1256 objdump_print_address (section->vma + i, info);
1257 aux->require_sec = false;
1258 putchar (' ');
1259 }
1260
1261 if (insns)
1262 {
1263 sfile.buffer = sfile.current = buf;
1264 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1265 info->stream = (FILE *) &sfile;
1266 info->bytes_per_line = 0;
33a795dd 1267 info->bytes_per_chunk = 0;
b4aabb24
ILT
1268 bytes = (*disassemble_fn) (section->vma + i, info);
1269 info->fprintf_func = (fprintf_ftype) fprintf;
1270 info->stream = stdout;
1271 if (info->bytes_per_line != 0)
1272 bytes_per_line = info->bytes_per_line;
1273 if (bytes < 0)
1274 break;
1275 }
1276 else
1277 {
1278 long j;
1279
1280 bytes = bytes_per_line;
1281 if (i + bytes > stop)
1282 bytes = stop - i;
1283
1284 for (j = i; j < i + bytes; ++j)
1285 {
1286 if (isprint (data[j]))
1287 buf[j - i] = data[j];
1288 else
1289 buf[j - i] = '.';
1290 }
1291 buf[j - i] = '\0';
1292 }
1293
5c59269f
ILT
1294 if (prefix_addresses
1295 ? show_raw_insn > 0
1296 : show_raw_insn >= 0)
b4aabb24
ILT
1297 {
1298 long j;
1299
1300 /* If ! prefix_addresses and ! wide_output, we print
33a795dd 1301 bytes_per_line bytes per line. */
b4aabb24
ILT
1302 pb = bytes;
1303 if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1304 pb = bytes_per_line;
1305
33a795dd
MH
1306 if (info->bytes_per_chunk)
1307 bpc = info->bytes_per_chunk;
1308 else
1309 bpc = 1;
1310
1311 for (j = i; j < i + pb; j += bpc)
b4aabb24 1312 {
33a795dd
MH
1313 int k;
1314 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1315 {
0988ea9f
ILT
1316 for (k = bpc - 1; k >= 0; k--)
1317 printf ("%02x", (unsigned) data[j + k]);
33a795dd
MH
1318 putchar (' ');
1319 }
1320 else
1321 {
0988ea9f
ILT
1322 for (k = 0; k < bpc; k++)
1323 printf ("%02x", (unsigned) data[j + k]);
33a795dd
MH
1324 putchar (' ');
1325 }
b4aabb24
ILT
1326 }
1327
0988ea9f
ILT
1328 for (; pb < bytes_per_line; pb += bpc)
1329 {
1330 int k;
1331
1332 for (k = 0; k < bpc; k++)
1333 printf (" ");
1334 putchar (' ');
1335 }
b4aabb24
ILT
1336
1337 /* Separate raw data from instruction by extra space. */
1338 if (insns)
1339 putchar ('\t');
1340 else
1341 printf (" ");
1342 }
1343
1344 printf ("%s", buf);
1345
5c59269f
ILT
1346 if (prefix_addresses
1347 ? show_raw_insn > 0
1348 : show_raw_insn >= 0)
b4aabb24
ILT
1349 {
1350 while (pb < bytes)
1351 {
1352 long j;
0948199a 1353 char *s;
b4aabb24
ILT
1354
1355 putchar ('\n');
1356 j = i + pb;
0948199a
ILT
1357
1358 sprintf_vma (buf, section->vma + j);
1359 for (s = buf + skip_addr_chars; *s == '0'; s++)
1360 *s = ' ';
1361 if (*s == '\0')
1362 *--s = '0';
1363 printf ("%s:\t", buf + skip_addr_chars);
1364
b4aabb24
ILT
1365 pb += bytes_per_line;
1366 if (pb > bytes)
1367 pb = bytes;
0988ea9f 1368 for (; j < i + pb; j += bpc)
b4aabb24 1369 {
0988ea9f
ILT
1370 int k;
1371
1372 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1373 {
1374 for (k = bpc - 1; k >= 0; k--)
1375 printf ("%02x", (unsigned) data[j + k]);
1376 putchar (' ');
1377 }
1378 else
1379 {
1380 for (k = 0; k < bpc; k++)
1381 printf ("%02x", (unsigned) data[j + k]);
1382 putchar (' ');
1383 }
b4aabb24
ILT
1384 }
1385 }
1386 }
1387
1388 if (!wide_output)
1389 putchar ('\n');
1390 else
1391 need_nl = true;
1392 }
1393
1394 if (dump_reloc_info
1395 && (section->flags & SEC_RELOC) != 0)
1396 {
1397 while ((*relppp) < relppend
1398 && ((**relppp)->address >= (bfd_vma) i
1399 && (**relppp)->address < (bfd_vma) i + bytes))
1400 {
1401 arelent *q;
b4aabb24
ILT
1402
1403 q = **relppp;
1404
1405 if (wide_output)
1406 putchar ('\t');
1407 else
1408 printf ("\t\t\t");
1409
51b8c416 1410 objdump_print_value (section->vma + q->address, info, true);
b4aabb24
ILT
1411
1412 printf (": %s\t", q->howto->name);
1413
9793039f
ILT
1414 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1415 printf ("*unknown*");
1416 else
b4aabb24 1417 {
9793039f
ILT
1418 const char *sym_name;
1419
b4aabb24 1420 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
9793039f
ILT
1421 if (sym_name != NULL && *sym_name != '\0')
1422 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1423 else
b4aabb24
ILT
1424 {
1425 asection *sym_sec;
1426
1427 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
9793039f 1428 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
b4aabb24
ILT
1429 if (sym_name == NULL || *sym_name == '\0')
1430 sym_name = "*unknown*";
9793039f 1431 printf ("%s", sym_name);
b4aabb24
ILT
1432 }
1433 }
b4aabb24
ILT
1434
1435 if (q->addend)
1436 {
1437 printf ("+0x");
51b8c416 1438 objdump_print_value (q->addend, info, true);
b4aabb24
ILT
1439 }
1440
1441 printf ("\n");
1442 need_nl = false;
1443 ++(*relppp);
1444 }
1445 }
1446
1447 if (need_nl)
1448 printf ("\n");
1449
1450 i += bytes;
1451 }
1452}
1453
1454/* Disassemble the contents of an object file. */
1455
18f39dfa 1456static void
be1d162b
ILT
1457disassemble_data (abfd)
1458 bfd *abfd;
1459{
1460 long i;
b4aabb24 1461 disassembler_ftype disassemble_fn;
be1d162b
ILT
1462 struct disassemble_info disasm_info;
1463 struct objdump_disasm_info aux;
1464 asection *section;
be1d162b
ILT
1465
1466 print_files = NULL;
1467 prev_functionname = NULL;
1468 prev_line = -1;
1469
1470 /* We make a copy of syms to sort. We don't want to sort syms
1471 because that will screw up the relocs. */
1472 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1473 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1474
1475 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
2fa0b342
DHW
1476
1477 /* Sort the symbols into section and symbol order */
be1d162b 1478 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2fa0b342 1479
4e050e3b 1480 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
cef35d48
DM
1481 disasm_info.application_data = (PTR) &aux;
1482 aux.abfd = abfd;
8275482c 1483 aux.require_sec = false;
cef35d48 1484 disasm_info.print_address_func = objdump_print_address;
fd6d6c60 1485 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
cef35d48 1486
aa0a709a
SC
1487 if (machine != (char *) NULL)
1488 {
db552bda 1489 const bfd_arch_info_type *info = bfd_scan_arch (machine);
cef35d48 1490 if (info == NULL)
aa0a709a
SC
1491 {
1492 fprintf (stderr, "%s: Can't use supplied machine %s\n",
1493 program_name,
1494 machine);
1495 exit (1);
1496 }
1497 abfd->arch_info = info;
2fa0b342 1498 }
e779a58c 1499
18f39dfa
SG
1500 if (endian != BFD_ENDIAN_UNKNOWN)
1501 {
1502 struct bfd_target *xvec;
1503
1504 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1505 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1506 xvec->byteorder = endian;
1507 abfd->xvec = xvec;
1508 }
1509
db552bda
ILT
1510 disassemble_fn = disassembler (abfd);
1511 if (!disassemble_fn)
aa0a709a 1512 {
db552bda
ILT
1513 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
1514 program_name,
1515 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
243aa0c2 1516 return;
aa0a709a 1517 }
2fa0b342 1518
7f924d55 1519 disasm_info.flavour = bfd_get_flavour (abfd);
458bbd1f
DE
1520 disasm_info.arch = bfd_get_arch (abfd);
1521 disasm_info.mach = bfd_get_mach (abfd);
1522 if (bfd_big_endian (abfd))
1523 disasm_info.endian = BFD_ENDIAN_BIG;
38aa863c 1524 else if (bfd_little_endian (abfd))
458bbd1f 1525 disasm_info.endian = BFD_ENDIAN_LITTLE;
38aa863c
DE
1526 else
1527 /* ??? Aborting here seems too drastic. We could default to big or little
1528 instead. */
1529 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
458bbd1f 1530
2fa0b342 1531 for (section = abfd->sections;
aa0a709a
SC
1532 section != (asection *) NULL;
1533 section = section->next)
65cceb78 1534 {
cef35d48
DM
1535 bfd_byte *data = NULL;
1536 bfd_size_type datasize = 0;
be1d162b 1537 arelent **relbuf = NULL;
d5464baa
ILT
1538 arelent **relpp = NULL;
1539 arelent **relppend = NULL;
aa21a2a9 1540 long stop;
fd6d6c60
NC
1541 asymbol *sym = NULL;
1542 long place = 0;
2fa0b342 1543
d5464baa
ILT
1544 if ((section->flags & SEC_LOAD) == 0
1545 || (! disassemble_all
1546 && only == NULL
1547 && (section->flags & SEC_CODE) == 0))
cef35d48
DM
1548 continue;
1549 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1550 continue;
2fa0b342 1551
d5464baa
ILT
1552 if (dump_reloc_info
1553 && (section->flags & SEC_RELOC) != 0)
1554 {
be1d162b
ILT
1555 long relsize;
1556
1557 relsize = bfd_get_reloc_upper_bound (abfd, section);
1558 if (relsize < 0)
1559 bfd_fatal (bfd_get_filename (abfd));
1560
1561 if (relsize > 0)
1562 {
1563 long relcount;
1564
1565 relbuf = (arelent **) xmalloc (relsize);
1566 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1567 if (relcount < 0)
1568 bfd_fatal (bfd_get_filename (abfd));
1569
1570 /* Sort the relocs by address. */
1571 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1572
1573 relpp = relbuf;
1574 relppend = relpp + relcount;
1575 }
d5464baa
ILT
1576 }
1577
cef35d48 1578 printf ("Disassembly of section %s:\n", section->name);
2fa0b342 1579
cef35d48
DM
1580 datasize = bfd_get_section_size_before_reloc (section);
1581 if (datasize == 0)
1582 continue;
2fa0b342 1583
cef35d48 1584 data = (bfd_byte *) xmalloc ((size_t) datasize);
2fa0b342 1585
cef35d48 1586 bfd_get_section_contents (abfd, section, data, 0, datasize);
2fa0b342 1587
cef35d48
DM
1588 aux.sec = section;
1589 disasm_info.buffer = data;
1590 disasm_info.buffer_vma = section->vma;
1591 disasm_info.buffer_length = datasize;
aa21a2a9
ILT
1592 if (start_address == (bfd_vma) -1
1593 || start_address < disasm_info.buffer_vma)
1594 i = 0;
1595 else
1596 i = start_address - disasm_info.buffer_vma;
1597 if (stop_address == (bfd_vma) -1)
1598 stop = datasize;
1599 else
1600 {
1601 if (stop_address < disasm_info.buffer_vma)
1602 stop = 0;
1603 else
1604 stop = stop_address - disasm_info.buffer_vma;
1605 if (stop > disasm_info.buffer_length)
1606 stop = disasm_info.buffer_length;
1607 }
b4aabb24 1608
fd6d6c60
NC
1609 sym = find_symbol_for_address (abfd, section, section->vma + i,
1610 true, &place);
1611 ++place;
1612 while (i < stop)
cef35d48 1613 {
fd6d6c60
NC
1614 asymbol *nextsym;
1615 long nextstop;
1616 boolean insns;
1617
1618 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
1619 disasm_info.symbol = sym;
1620 else
1621 disasm_info.symbol = NULL;
1622
1623 if (! prefix_addresses)
cef35d48 1624 {
fd6d6c60
NC
1625 printf ("\n");
1626 objdump_print_addr_with_sym (abfd, section, sym,
1627 section->vma + i,
1628 &disasm_info,
1629 false);
1630 printf (":\n");
1631 }
1632
1633 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1634 nextsym = sym;
1635 else if (sym == NULL)
1636 nextsym = NULL;
1637 else
1638 {
1639 while (place < sorted_symcount
1640 && (sorted_syms[place]->section != section
1641 || (bfd_asymbol_value (sorted_syms[place])
1642 <= bfd_asymbol_value (sym))))
1643 ++place;
1644 if (place >= sorted_symcount)
b4aabb24
ILT
1645 nextsym = NULL;
1646 else
fd6d6c60
NC
1647 nextsym = sorted_syms[place];
1648 }
1649
1650 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1651 {
1652 nextstop = bfd_asymbol_value (sym) - section->vma;
1653 if (nextstop > stop)
b4aabb24 1654 nextstop = stop;
d5464baa 1655 }
fd6d6c60
NC
1656 else if (nextsym == NULL)
1657 nextstop = stop;
1658 else
1659 {
1660 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1661 if (nextstop > stop)
1662 nextstop = stop;
1663 }
1664
1665 /* If a symbol is explicitly marked as being an object
1666 rather than a function, just dump the bytes without
1667 disassembling them. */
1668 if (disassemble_all
1669 || sym == NULL
1670 || bfd_asymbol_value (sym) > section->vma + i
1671 || ((sym->flags & BSF_OBJECT) == 0
1672 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1673 == NULL)
1674 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1675 == NULL))
1676 || (sym->flags & BSF_FUNCTION) != 0)
1677 insns = true;
1678 else
1679 insns = false;
1680
1681 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1682 nextstop, &relpp, relppend);
1683
1684 i = nextstop;
1685 sym = nextsym;
96d7950b 1686 }
fd6d6c60 1687
cef35d48 1688 free (data);
be1d162b
ILT
1689 if (relbuf != NULL)
1690 free (relbuf);
2fa0b342 1691 }
c5ba2759 1692 free (sorted_syms);
2fa0b342 1693}
73b8f102 1694\f
73b8f102
JG
1695
1696/* Define a table of stab values and print-strings. We wish the initializer
1697 could be a direct-mapped table, but instead we build one the first
1698 time we need it. */
1699
18f39dfa
SG
1700static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1701 char *strsect_name));
249c6fc0 1702
250e36fe 1703/* Dump the stabs sections from an object file that has a section that
18f39dfa 1704 uses Sun stabs encoding. */
73b8f102 1705
18f39dfa 1706static void
9b018ecd 1707dump_stabs (abfd)
73b8f102
JG
1708 bfd *abfd;
1709{
250e36fe
DM
1710 dump_section_stabs (abfd, ".stab", ".stabstr");
1711 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1712 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1713 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
249c6fc0
RS
1714}
1715
18f39dfa 1716static bfd_byte *stabs;
250e36fe
DM
1717static bfd_size_type stab_size;
1718
1719static char *strtab;
1720static bfd_size_type stabstr_size;
1721
1722/* Read ABFD's stabs section STABSECT_NAME into `stabs'
1723 and string table section STRSECT_NAME into `strtab'.
1724 If the section exists and was read, allocate the space and return true.
1725 Otherwise return false. */
1726
18f39dfa 1727static boolean
250e36fe 1728read_section_stabs (abfd, stabsect_name, strsect_name)
249c6fc0 1729 bfd *abfd;
243aa0c2
FCE
1730 const char *stabsect_name;
1731 const char *strsect_name;
249c6fc0 1732{
9b018ecd 1733 asection *stabsect, *stabstrsect;
9b018ecd 1734
d5671c53
ILT
1735 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1736 if (0 == stabsect)
73b8f102 1737 {
250e36fe
DM
1738 printf ("No %s section present\n\n", stabsect_name);
1739 return false;
73b8f102
JG
1740 }
1741
d5671c53
ILT
1742 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1743 if (0 == stabstrsect)
73b8f102 1744 {
eae82145 1745 fprintf (stderr, "%s: %s has no %s section\n", program_name,
250e36fe
DM
1746 bfd_get_filename (abfd), strsect_name);
1747 return false;
73b8f102 1748 }
9b018ecd 1749
d5671c53
ILT
1750 stab_size = bfd_section_size (abfd, stabsect);
1751 stabstr_size = bfd_section_size (abfd, stabstrsect);
73b8f102 1752
18f39dfa 1753 stabs = (bfd_byte *) xmalloc (stab_size);
9b018ecd 1754 strtab = (char *) xmalloc (stabstr_size);
73b8f102 1755
d5671c53 1756 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
9b018ecd 1757 {
d5671c53
ILT
1758 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1759 program_name, stabsect_name, bfd_get_filename (abfd),
1760 bfd_errmsg (bfd_get_error ()));
1761 free (stabs);
1762 free (strtab);
1763 return false;
73b8f102 1764 }
2fa0b342 1765
d5671c53
ILT
1766 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1767 stabstr_size))
9b018ecd 1768 {
d5671c53
ILT
1769 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1770 program_name, strsect_name, bfd_get_filename (abfd),
1771 bfd_errmsg (bfd_get_error ()));
1772 free (stabs);
1773 free (strtab);
1774 return false;
73b8f102 1775 }
d5671c53 1776
250e36fe
DM
1777 return true;
1778}
73b8f102 1779
18f39dfa
SG
1780/* Stabs entries use a 12 byte format:
1781 4 byte string table index
1782 1 byte stab type
1783 1 byte stab other field
1784 2 byte stab desc field
1785 4 byte stab value
1786 FIXME: This will have to change for a 64 bit object format. */
1787
1788#define STRDXOFF (0)
1789#define TYPEOFF (4)
1790#define OTHEROFF (5)
1791#define DESCOFF (6)
1792#define VALOFF (8)
1793#define STABSIZE (12)
73b8f102 1794
250e36fe
DM
1795/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1796 using string table section STRSECT_NAME (in `strtab'). */
1797
18f39dfa 1798static void
250e36fe
DM
1799print_section_stabs (abfd, stabsect_name, strsect_name)
1800 bfd *abfd;
243aa0c2
FCE
1801 const char *stabsect_name;
1802 const char *strsect_name;
250e36fe
DM
1803{
1804 int i;
1805 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
18f39dfa
SG
1806 bfd_byte *stabp, *stabs_end;
1807
1808 stabp = stabs;
1809 stabs_end = stabp + stab_size;
73b8f102 1810
250e36fe
DM
1811 printf ("Contents of %s section:\n\n", stabsect_name);
1812 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
249c6fc0
RS
1813
1814 /* Loop through all symbols and print them.
1815
1816 We start the index at -1 because there is a dummy symbol on
250e36fe 1817 the front of stabs-in-{coff,elf} sections that supplies sizes. */
249c6fc0 1818
18f39dfa 1819 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
73b8f102 1820 {
7fc01fc9 1821 const char *name;
18f39dfa
SG
1822 unsigned long strx;
1823 unsigned char type, other;
1824 unsigned short desc;
1825 bfd_vma value;
1826
1827 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1828 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1829 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1830 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1831 value = bfd_h_get_32 (abfd, stabp + VALOFF);
7fc01fc9 1832
fe2750e1 1833 printf ("\n%-6d ", i);
250e36fe 1834 /* Either print the stab name, or, if unnamed, print its number
fe2750e1 1835 again (makes consistent formatting for tools like awk). */
18f39dfa 1836 name = bfd_get_stab_name (type);
7fc01fc9
ILT
1837 if (name != NULL)
1838 printf ("%-6s", name);
18f39dfa 1839 else if (type == N_UNDF)
105da05c 1840 printf ("HdrSym");
fe2750e1 1841 else
18f39dfa
SG
1842 printf ("%-6d", type);
1843 printf (" %-6d %-6d ", other, desc);
1844 printf_vma (value);
1845 printf (" %-6lu", strx);
249c6fc0
RS
1846
1847 /* Symbols with type == 0 (N_UNDF) specify the length of the
1848 string table associated with this file. We use that info
1849 to know how to relocate the *next* file's string table indices. */
1850
18f39dfa 1851 if (type == N_UNDF)
249c6fc0
RS
1852 {
1853 file_string_table_offset = next_file_string_table_offset;
18f39dfa 1854 next_file_string_table_offset += value;
249c6fc0 1855 }
249c6fc0 1856 else
e1ec9f07 1857 {
250e36fe 1858 /* Using the (possibly updated) string table offset, print the
e1ec9f07
SS
1859 string (if any) associated with this symbol. */
1860
18f39dfa
SG
1861 if ((strx + file_string_table_offset) < stabstr_size)
1862 printf (" %s", &strtab[strx + file_string_table_offset]);
e1ec9f07
SS
1863 else
1864 printf (" *");
1865 }
73b8f102
JG
1866 }
1867 printf ("\n\n");
1868}
249c6fc0 1869
18f39dfa 1870static void
250e36fe
DM
1871dump_section_stabs (abfd, stabsect_name, strsect_name)
1872 bfd *abfd;
1873 char *stabsect_name;
1874 char *strsect_name;
1875{
13e4db2e 1876 asection *s;
13e4db2e 1877
a65619c8
SC
1878 /* Check for section names for which stabsect_name is a prefix, to
1879 handle .stab0, etc. */
13e4db2e 1880 for (s = abfd->sections;
a65619c8 1881 s != NULL;
13e4db2e
SC
1882 s = s->next)
1883 {
18f39dfa
SG
1884 int len;
1885
1886 len = strlen (stabsect_name);
1887
1888/* If the prefix matches, and the files section name ends with a nul or a digit,
1889 then we match. Ie: we want either an exact match or a a section followed by
1890 a number. */
1891 if (strncmp (stabsect_name, s->name, len) == 0
1892 && (s->name[len] == '\000' || isdigit (s->name[len])))
13e4db2e 1893 {
a65619c8
SC
1894 if (read_section_stabs (abfd, s->name, strsect_name))
1895 {
1896 print_section_stabs (abfd, s->name, strsect_name);
1897 free (stabs);
1898 free (strtab);
1899 }
13e4db2e
SC
1900 }
1901 }
250e36fe
DM
1902}
1903\f
eae82145 1904static void
f7b839f7
DM
1905dump_bfd_header (abfd)
1906 bfd *abfd;
1907{
1908 char *comma = "";
1909
1910 printf ("architecture: %s, ",
1911 bfd_printable_arch_mach (bfd_get_arch (abfd),
1912 bfd_get_mach (abfd)));
1913 printf ("flags 0x%08x:\n", abfd->flags);
1914
1915#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1916 PF (HAS_RELOC, "HAS_RELOC");
1917 PF (EXEC_P, "EXEC_P");
1918 PF (HAS_LINENO, "HAS_LINENO");
1919 PF (HAS_DEBUG, "HAS_DEBUG");
1920 PF (HAS_SYMS, "HAS_SYMS");
1921 PF (HAS_LOCALS, "HAS_LOCALS");
1922 PF (DYNAMIC, "DYNAMIC");
1923 PF (WP_TEXT, "WP_TEXT");
1924 PF (D_PAGED, "D_PAGED");
1925 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1926 printf ("\nstart address 0x");
1927 printf_vma (abfd->start_address);
38d7c012 1928 printf ("\n");
f7b839f7 1929}
a65619c8
SC
1930\f
1931static void
1932dump_bfd_private_header (abfd)
1933bfd *abfd;
1934{
1935 bfd_print_private_bfd_data (abfd, stdout);
1936}
18f39dfa 1937
02a68547 1938static void
2fa0b342
DHW
1939display_bfd (abfd)
1940 bfd *abfd;
1941{
209e5610
DM
1942 char **matching;
1943
1944 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
aa0a709a 1945 {
cef35d48 1946 bfd_nonfatal (bfd_get_filename (abfd));
8f197c94 1947 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
209e5610
DM
1948 {
1949 list_matching_formats (matching);
1950 free (matching);
1951 }
aa0a709a
SC
1952 return;
1953 }
f7b839f7 1954
5c59269f
ILT
1955 /* If we are adjusting section VMA's, change them all now. Changing
1956 the BFD information is a hack. However, we must do it, or
1957 bfd_find_nearest_line will not do the right thing. */
1958 if (adjust_section_vma != 0)
1959 {
1960 asection *s;
1961
1962 for (s = abfd->sections; s != NULL; s = s->next)
1963 {
1964 s->vma += adjust_section_vma;
1965 s->lma += adjust_section_vma;
1966 }
1967 }
1968
cef35d48
DM
1969 printf ("\n%s: file format %s\n", bfd_get_filename (abfd),
1970 abfd->xvec->name);
aa0a709a
SC
1971 if (dump_ar_hdrs)
1972 print_arelt_descr (stdout, abfd, true);
aa0a709a 1973 if (dump_file_header)
f7b839f7 1974 dump_bfd_header (abfd);
a65619c8
SC
1975 if (dump_private_headers)
1976 dump_bfd_private_header (abfd);
f7b839f7 1977 putchar ('\n');
2fa0b342 1978 if (dump_section_headers)
aa0a709a 1979 dump_headers (abfd);
83f4323e 1980 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
aa0a709a
SC
1981 {
1982 syms = slurp_symtab (abfd);
1983 }
de3b08ac
ILT
1984 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
1985 {
1986 dynsyms = slurp_dynamic_symtab (abfd);
1987 }
aa0a709a 1988 if (dump_symtab)
de3b08ac
ILT
1989 dump_symbols (abfd, false);
1990 if (dump_dynamic_symtab)
1991 dump_symbols (abfd, true);
73b8f102 1992 if (dump_stab_section_info)
9b018ecd 1993 dump_stabs (abfd);
d5464baa 1994 if (dump_reloc_info && ! disassemble)
aa0a709a 1995 dump_relocs (abfd);
de3b08ac
ILT
1996 if (dump_dynamic_reloc_info)
1997 dump_dynamic_relocs (abfd);
aa0a709a
SC
1998 if (dump_section_contents)
1999 dump_data (abfd);
2000 if (disassemble)
2001 disassemble_data (abfd);
e1c14599
ILT
2002 if (dump_debugging)
2003 {
2004 PTR dhandle;
2005
83f4323e 2006 dhandle = read_debugging_info (abfd, syms, symcount);
e1c14599
ILT
2007 if (dhandle != NULL)
2008 {
2009 if (! print_debugging_info (stdout, dhandle))
2010 fprintf (stderr, "%s: printing debugging information failed\n",
2011 bfd_get_filename (abfd));
2012 }
2013 }
c5ba2759
ILT
2014 if (syms)
2015 {
2016 free (syms);
2017 syms = NULL;
2018 }
2019 if (dynsyms)
2020 {
2021 free (dynsyms);
2022 dynsyms = NULL;
2023 }
2fa0b342
DHW
2024}
2025
d9971b83 2026static void
2fa0b342
DHW
2027display_file (filename, target)
2028 char *filename;
2029 char *target;
2030{
2031 bfd *file, *arfile = (bfd *) NULL;
2032
2033 file = bfd_openr (filename, target);
aa0a709a
SC
2034 if (file == NULL)
2035 {
cef35d48 2036 bfd_nonfatal (filename);
aa0a709a
SC
2037 return;
2038 }
2fa0b342 2039
aa0a709a
SC
2040 if (bfd_check_format (file, bfd_archive) == true)
2041 {
8f197c94
ILT
2042 bfd *last_arfile = NULL;
2043
aa0a709a
SC
2044 printf ("In archive %s:\n", bfd_get_filename (file));
2045 for (;;)
2046 {
8f197c94 2047 bfd_set_error (bfd_error_no_error);
aa0a709a
SC
2048
2049 arfile = bfd_openr_next_archived_file (file, arfile);
2050 if (arfile == NULL)
2051 {
8f197c94 2052 if (bfd_get_error () != bfd_error_no_more_archived_files)
d2442698 2053 {
cef35d48 2054 bfd_nonfatal (bfd_get_filename (file));
d2442698 2055 }
8f197c94 2056 break;
aa0a709a 2057 }
2fa0b342 2058
aa0a709a 2059 display_bfd (arfile);
8f197c94
ILT
2060
2061 if (last_arfile != NULL)
2062 bfd_close (last_arfile);
2063 last_arfile = arfile;
aa0a709a 2064 }
8f197c94
ILT
2065
2066 if (last_arfile != NULL)
2067 bfd_close (last_arfile);
2fa0b342 2068 }
2fa0b342 2069 else
aa0a709a 2070 display_bfd (file);
2fa0b342 2071
aa0a709a 2072 bfd_close (file);
2fa0b342
DHW
2073}
2074\f
2075/* Actually display the various requested regions */
2076
d9971b83 2077static void
2fa0b342
DHW
2078dump_data (abfd)
2079 bfd *abfd;
2080{
2081 asection *section;
aa0a709a 2082 bfd_byte *data = 0;
fc5d6074
SC
2083 bfd_size_type datasize = 0;
2084 bfd_size_type i;
aa21a2a9 2085 bfd_size_type start, stop;
2fa0b342
DHW
2086
2087 for (section = abfd->sections; section != NULL; section =
aa0a709a
SC
2088 section->next)
2089 {
2090 int onaline = 16;
2fa0b342 2091
aa0a709a
SC
2092 if (only == (char *) NULL ||
2093 strcmp (only, section->name) == 0)
60c80016 2094 {
aa0a709a
SC
2095 if (section->flags & SEC_HAS_CONTENTS)
2096 {
2097 printf ("Contents of section %s:\n", section->name);
2098
9b018ecd 2099 if (bfd_section_size (abfd, section) == 0)
aa0a709a 2100 continue;
02a68547 2101 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
9b018ecd 2102 datasize = bfd_section_size (abfd, section);
2fa0b342 2103
2fa0b342 2104
9b018ecd 2105 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2fa0b342 2106
aa21a2a9
ILT
2107 if (start_address == (bfd_vma) -1
2108 || start_address < section->vma)
2109 start = 0;
2110 else
2111 start = start_address - section->vma;
2112 if (stop_address == (bfd_vma) -1)
2113 stop = bfd_section_size (abfd, section);
2114 else
2115 {
2116 if (stop_address < section->vma)
2117 stop = 0;
2118 else
2119 stop = stop_address - section->vma;
2120 if (stop > bfd_section_size (abfd, section))
2121 stop = bfd_section_size (abfd, section);
2122 }
2123 for (i = start; i < stop; i += onaline)
aa0a709a
SC
2124 {
2125 bfd_size_type j;
2126
2127 printf (" %04lx ", (unsigned long int) (i + section->vma));
2128 for (j = i; j < i + onaline; j++)
2129 {
aa21a2a9 2130 if (j < stop)
aa0a709a
SC
2131 printf ("%02x", (unsigned) (data[j]));
2132 else
2133 printf (" ");
2134 if ((j & 3) == 3)
2135 printf (" ");
2136 }
2fa0b342 2137
aa0a709a
SC
2138 printf (" ");
2139 for (j = i; j < i + onaline; j++)
2140 {
aa21a2a9 2141 if (j >= stop)
aa0a709a
SC
2142 printf (" ");
2143 else
2144 printf ("%c", isprint (data[j]) ? data[j] : '.');
2145 }
2146 putchar ('\n');
2147 }
d9971b83 2148 free (data);
60c80016 2149 }
2fa0b342 2150 }
2fa0b342 2151 }
2fa0b342
DHW
2152}
2153
2fa0b342 2154/* Should perhaps share code and display with nm? */
d9971b83 2155static void
de3b08ac 2156dump_symbols (abfd, dynamic)
2fa0b342 2157 bfd *abfd;
de3b08ac 2158 boolean dynamic;
2fa0b342 2159{
de3b08ac
ILT
2160 asymbol **current;
2161 long max;
ae5d2ff5 2162 long count;
2fa0b342 2163
de3b08ac 2164 if (dynamic)
aa0a709a 2165 {
de3b08ac
ILT
2166 current = dynsyms;
2167 max = dynsymcount;
2168 if (max == 0)
2169 return;
2170 printf ("DYNAMIC SYMBOL TABLE:\n");
2171 }
2172 else
2173 {
2174 current = syms;
2175 max = symcount;
2176 if (max == 0)
2177 return;
2178 printf ("SYMBOL TABLE:\n");
2179 }
2fa0b342 2180
de3b08ac
ILT
2181 for (count = 0; count < max; count++)
2182 {
d9971b83 2183 if (*current)
aa0a709a 2184 {
9793039f
ILT
2185 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2186
2187 if (cur_bfd != NULL)
d9971b83 2188 {
9793039f
ILT
2189 const char *name;
2190 char *alloc;
2191
2192 name = bfd_asymbol_name (*current);
2193 alloc = NULL;
2194 if (do_demangle && name != NULL && *name != '\0')
2195 {
2196 const char *n;
2197
2198 /* If we want to demangle the name, we demangle it
2199 here, and temporarily clobber it while calling
2200 bfd_print_symbol. FIXME: This is a gross hack. */
2201
2202 n = name;
2203 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2204 ++n;
2205 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2206 if (alloc != NULL)
2207 (*current)->name = alloc;
2208 else
2209 (*current)->name = n;
2210 }
2211
2212 bfd_print_symbol (cur_bfd, stdout, *current,
2213 bfd_print_symbol_all);
2214
2215 (*current)->name = name;
2216 if (alloc != NULL)
2217 free (alloc);
2218
d9971b83
KR
2219 printf ("\n");
2220 }
aa0a709a
SC
2221 }
2222 current++;
2fa0b342 2223 }
aa0a709a
SC
2224 printf ("\n");
2225 printf ("\n");
2fa0b342
DHW
2226}
2227
d9971b83 2228static void
aa0a709a
SC
2229dump_relocs (abfd)
2230 bfd *abfd;
2fa0b342
DHW
2231{
2232 arelent **relpp;
ae5d2ff5 2233 long relcount;
2fa0b342 2234 asection *a;
aa0a709a
SC
2235
2236 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2237 {
ae5d2ff5
ILT
2238 long relsize;
2239
28d1b01e 2240 if (bfd_is_abs_section (a))
aa0a709a 2241 continue;
28d1b01e 2242 if (bfd_is_und_section (a))
aa0a709a 2243 continue;
d9971b83 2244 if (bfd_is_com_section (a))
aa0a709a
SC
2245 continue;
2246
195d1adf
KR
2247 if (only)
2248 {
2249 if (strcmp (only, a->name))
2250 continue;
2251 }
2252 else if ((a->flags & SEC_RELOC) == 0)
2253 continue;
2254
ae5d2ff5
ILT
2255 relsize = bfd_get_reloc_upper_bound (abfd, a);
2256 if (relsize < 0)
2257 bfd_fatal (bfd_get_filename (abfd));
2258
c5ba2759
ILT
2259 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2260
ae5d2ff5 2261 if (relsize == 0)
aa0a709a
SC
2262 {
2263 printf (" (none)\n\n");
d20f480f 2264 }
aa0a709a
SC
2265 else
2266 {
ae5d2ff5 2267 relpp = (arelent **) xmalloc (relsize);
aa0a709a 2268 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
ae5d2ff5
ILT
2269 if (relcount < 0)
2270 bfd_fatal (bfd_get_filename (abfd));
2271 else if (relcount == 0)
aa0a709a
SC
2272 {
2273 printf (" (none)\n\n");
d20f480f 2274 }
aa0a709a
SC
2275 else
2276 {
2277 printf ("\n");
18f39dfa 2278 dump_reloc_set (abfd, a, relpp, relcount);
aa0a709a 2279 printf ("\n\n");
d20f480f 2280 }
de3b08ac 2281 free (relpp);
2fa0b342 2282 }
de3b08ac
ILT
2283 }
2284}
2fa0b342 2285
de3b08ac
ILT
2286static void
2287dump_dynamic_relocs (abfd)
2288 bfd *abfd;
2289{
2290 long relsize;
2291 arelent **relpp;
2292 long relcount;
2293
de3b08ac
ILT
2294 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2295 if (relsize < 0)
2296 bfd_fatal (bfd_get_filename (abfd));
2297
c5ba2759
ILT
2298 printf ("DYNAMIC RELOCATION RECORDS");
2299
de3b08ac
ILT
2300 if (relsize == 0)
2301 {
2302 printf (" (none)\n\n");
2303 }
2304 else
2305 {
2306 relpp = (arelent **) xmalloc (relsize);
2307 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2308 if (relcount < 0)
2309 bfd_fatal (bfd_get_filename (abfd));
2310 else if (relcount == 0)
2311 {
2312 printf (" (none)\n\n");
2313 }
2314 else
2315 {
2316 printf ("\n");
18f39dfa 2317 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
de3b08ac
ILT
2318 printf ("\n\n");
2319 }
2320 free (relpp);
2321 }
2322}
2323
2324static void
18f39dfa 2325dump_reloc_set (abfd, sec, relpp, relcount)
de3b08ac 2326 bfd *abfd;
18f39dfa 2327 asection *sec;
de3b08ac
ILT
2328 arelent **relpp;
2329 long relcount;
2330{
2331 arelent **p;
18f39dfa
SG
2332 char *last_filename, *last_functionname;
2333 unsigned int last_line;
de3b08ac
ILT
2334
2335 /* Get column headers lined up reasonably. */
2336 {
2337 static int width;
2338 if (width == 0)
2339 {
2340 char buf[30];
2341 sprintf_vma (buf, (bfd_vma) -1);
2342 width = strlen (buf) - 7;
2343 }
2344 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2345 }
2346
18f39dfa
SG
2347 last_filename = NULL;
2348 last_functionname = NULL;
2349 last_line = 0;
2350
de3b08ac
ILT
2351 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2352 {
2353 arelent *q = *p;
18f39dfa
SG
2354 const char *filename, *functionname;
2355 unsigned int line;
2356 const char *sym_name;
2357 const char *section_name;
de3b08ac 2358
aa21a2a9
ILT
2359 if (start_address != (bfd_vma) -1
2360 && q->address < start_address)
2361 continue;
2362 if (stop_address != (bfd_vma) -1
2363 && q->address > stop_address)
2364 continue;
2365
18f39dfa
SG
2366 if (with_line_numbers
2367 && sec != NULL
2368 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2369 &filename, &functionname, &line))
2370 {
2371 if (functionname != NULL
2372 && (last_functionname == NULL
2373 || strcmp (functionname, last_functionname) != 0))
2374 {
2375 printf ("%s():\n", functionname);
2376 if (last_functionname != NULL)
2377 free (last_functionname);
2378 last_functionname = xstrdup (functionname);
2379 }
2380 if (line > 0
2381 && (line != last_line
2382 || (filename != NULL
2383 && last_filename != NULL
2384 && strcmp (filename, last_filename) != 0)))
2385 {
2386 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2387 last_line = line;
2388 if (last_filename != NULL)
2389 free (last_filename);
2390 if (filename == NULL)
2391 last_filename = NULL;
2392 else
2393 last_filename = xstrdup (filename);
2394 }
2395 }
2396
de3b08ac
ILT
2397 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2398 {
2399 sym_name = (*(q->sym_ptr_ptr))->name;
2400 section_name = (*(q->sym_ptr_ptr))->section->name;
2401 }
2402 else
2403 {
2404 sym_name = NULL;
2405 section_name = NULL;
2406 }
2407 if (sym_name)
2408 {
2409 printf_vma (q->address);
9793039f
ILT
2410 printf (" %-16s ", q->howto->name);
2411 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2412 *q->sym_ptr_ptr);
de3b08ac
ILT
2413 }
2414 else
2415 {
2416 if (section_name == (CONST char *) NULL)
2417 section_name = "*unknown*";
2418 printf_vma (q->address);
2419 printf (" %-16s [%s]",
2420 q->howto->name,
2421 section_name);
2422 }
2423 if (q->addend)
2424 {
2425 printf ("+0x");
2426 printf_vma (q->addend);
2427 }
2428 printf ("\n");
d20f480f 2429 }
2fa0b342 2430}
f7b839f7 2431\f
f7b839f7
DM
2432/* The length of the longest architecture name + 1. */
2433#define LONGEST_ARCH sizeof("rs6000:6000")
2434
e1c14599
ILT
2435static const char *
2436endian_string (endian)
2437 enum bfd_endian endian;
2438{
2439 if (endian == BFD_ENDIAN_BIG)
2440 return "big endian";
2441 else if (endian == BFD_ENDIAN_LITTLE)
2442 return "little endian";
2443 else
2444 return "endianness unknown";
2445}
2446
f7b839f7
DM
2447/* List the targets that BFD is configured to support, each followed
2448 by its endianness and the architectures it supports. */
2449
2450static void
2451display_target_list ()
2452{
2453 extern bfd_target *bfd_target_vector[];
de04bceb 2454 char *dummy_name;
f7b839f7
DM
2455 int t;
2456
7f924d55 2457 dummy_name = choose_temp_base ();
f7b839f7
DM
2458 for (t = 0; bfd_target_vector[t]; t++)
2459 {
f7b839f7 2460 bfd_target *p = bfd_target_vector[t];
de04bceb 2461 bfd *abfd = bfd_openw (dummy_name, p->name);
105da05c
ILT
2462 int a;
2463
2464 printf ("%s\n (header %s, data %s)\n", p->name,
e1c14599
ILT
2465 endian_string (p->header_byteorder),
2466 endian_string (p->byteorder));
f7b839f7 2467
334d6e76
SS
2468 if (abfd == NULL)
2469 {
de04bceb 2470 bfd_nonfatal (dummy_name);
105da05c 2471 continue;
334d6e76 2472 }
105da05c
ILT
2473
2474 if (! bfd_set_format (abfd, bfd_object))
2475 {
2476 if (bfd_get_error () != bfd_error_invalid_operation)
2477 bfd_nonfatal (p->name);
2478 continue;
2479 }
2480
f7b839f7
DM
2481 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2482 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2483 printf (" %s\n",
2484 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2485 }
de04bceb 2486 unlink (dummy_name);
7f924d55 2487 free (dummy_name);
f7b839f7
DM
2488}
2489
2490/* Print a table showing which architectures are supported for entries
2491 FIRST through LAST-1 of bfd_target_vector (targets across,
2492 architectures down). */
2493
9872a49c 2494static void
abdcac0f
DM
2495display_info_table (first, last)
2496 int first;
2497 int last;
9872a49c 2498{
abdcac0f 2499 extern bfd_target *bfd_target_vector[];
de04bceb
ILT
2500 int t, a;
2501 char *dummy_name;
9872a49c 2502
f7b839f7 2503 /* Print heading of target names. */
ae5d2ff5 2504 printf ("\n%*s", (int) LONGEST_ARCH, " ");
105da05c 2505 for (t = first; t < last && bfd_target_vector[t]; t++)
f7b839f7
DM
2506 printf ("%s ", bfd_target_vector[t]->name);
2507 putchar ('\n');
9872a49c 2508
7f924d55 2509 dummy_name = choose_temp_base ();
f7b839f7
DM
2510 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2511 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
e779a58c 2512 {
ae5d2ff5
ILT
2513 printf ("%*s ", (int) LONGEST_ARCH - 1,
2514 bfd_printable_arch_mach (a, 0));
105da05c 2515 for (t = first; t < last && bfd_target_vector[t]; t++)
aa0a709a 2516 {
f7b839f7 2517 bfd_target *p = bfd_target_vector[t];
105da05c 2518 boolean ok = true;
de04bceb 2519 bfd *abfd = bfd_openw (dummy_name, p->name);
aa0a709a 2520
334d6e76
SS
2521 if (abfd == NULL)
2522 {
105da05c
ILT
2523 bfd_nonfatal (p->name);
2524 ok = false;
2525 }
2526
2527 if (ok)
2528 {
2529 if (! bfd_set_format (abfd, bfd_object))
2530 {
2531 if (bfd_get_error () != bfd_error_invalid_operation)
2532 bfd_nonfatal (p->name);
2533 ok = false;
2534 }
334d6e76 2535 }
105da05c
ILT
2536
2537 if (ok)
2538 {
2539 if (! bfd_set_arch_mach (abfd, a, 0))
2540 ok = false;
2541 }
2542
2543 if (ok)
aa0a709a
SC
2544 printf ("%s ", p->name);
2545 else
e779a58c 2546 {
f7b839f7 2547 int l = strlen (p->name);
aa0a709a 2548 while (l--)
f7b839f7
DM
2549 putchar ('-');
2550 putchar (' ');
e779a58c 2551 }
e779a58c 2552 }
f7b839f7 2553 putchar ('\n');
e779a58c 2554 }
de04bceb 2555 unlink (dummy_name);
7f924d55 2556 free (dummy_name);
9872a49c 2557}
aa0a709a 2558
f7b839f7
DM
2559/* Print tables of all the target-architecture combinations that
2560 BFD has been configured to support. */
2561
aa0a709a 2562static void
f7b839f7 2563display_target_tables ()
aa0a709a 2564{
f7b839f7 2565 int t, columns;
abdcac0f 2566 extern bfd_target *bfd_target_vector[];
f7b839f7 2567 char *colum;
aa0a709a 2568
aa0a709a 2569 columns = 0;
f7b839f7
DM
2570 colum = getenv ("COLUMNS");
2571 if (colum != NULL)
aa0a709a 2572 columns = atoi (colum);
f7b839f7 2573 if (columns == 0)
aa0a709a 2574 columns = 80;
f7b839f7 2575
105da05c
ILT
2576 t = 0;
2577 while (bfd_target_vector[t] != NULL)
aa0a709a 2578 {
f7b839f7
DM
2579 int oldt = t, wid;
2580
105da05c
ILT
2581 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2582 ++t;
2583 while (wid < columns && bfd_target_vector[t] != NULL)
2584 {
2585 int newwid;
2586
2587 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2588 if (newwid >= columns)
2589 break;
2590 wid = newwid;
2591 ++t;
2592 }
f7b839f7 2593 display_info_table (oldt, t);
aa0a709a
SC
2594 }
2595}
2596
f7b839f7
DM
2597static void
2598display_info ()
2599{
2600 printf ("BFD header file version %s\n", BFD_VERSION);
2601 display_target_list ();
2602 display_target_tables ();
2603}
2604
2fa0b342
DHW
2605int
2606main (argc, argv)
2607 int argc;
2608 char **argv;
2609{
2610 int c;
2fa0b342
DHW
2611 char *target = default_target;
2612 boolean seenflag = false;
2fa0b342
DHW
2613
2614 program_name = *argv;
8f197c94
ILT
2615 xmalloc_set_program_name (program_name);
2616
be1d162b
ILT
2617 START_PROGRESS (program_name, 0);
2618
8f197c94 2619 bfd_init ();
5c59269f 2620 set_default_bfd_target ();
2fa0b342 2621
9793039f 2622 while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
18f39dfa 2623 long_options, (int *) 0))
aa0a709a
SC
2624 != EOF)
2625 {
aa21a2a9
ILT
2626 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2627 seenflag = true;
aa0a709a
SC
2628 switch (c)
2629 {
b3a2b497
ILT
2630 case 0:
2631 break; /* we've been given a long option */
aa0a709a
SC
2632 case 'm':
2633 machine = optarg;
2634 break;
2635 case 'j':
2636 only = optarg;
2637 break;
2638 case 'l':
2639 with_line_numbers = 1;
2640 break;
2641 case 'b':
2642 target = optarg;
2643 break;
2644 case 'f':
2645 dump_file_header = true;
2646 break;
2647 case 'i':
e1ec9f07 2648 formats_info = true;
aa0a709a 2649 break;
a65619c8
SC
2650 case 'p':
2651 dump_private_headers = 1;
2652 break;
aa0a709a 2653 case 'x':
a65619c8 2654 dump_private_headers = 1;
aa0a709a
SC
2655 dump_symtab = 1;
2656 dump_reloc_info = 1;
2657 dump_file_header = true;
2658 dump_ar_hdrs = 1;
2659 dump_section_headers = 1;
2660 break;
aa0a709a
SC
2661 case 't':
2662 dump_symtab = 1;
2663 break;
de3b08ac
ILT
2664 case 'T':
2665 dump_dynamic_symtab = 1;
2666 break;
9793039f
ILT
2667 case 'C':
2668 do_demangle = 1;
2669 break;
aa0a709a
SC
2670 case 'd':
2671 disassemble = true;
2672 break;
d5464baa
ILT
2673 case 'D':
2674 disassemble = disassemble_all = true;
2675 break;
be1d162b
ILT
2676 case 'S':
2677 disassemble = true;
2678 with_source_code = true;
2679 break;
aa0a709a
SC
2680 case 's':
2681 dump_section_contents = 1;
2682 break;
2683 case 'r':
2684 dump_reloc_info = 1;
2685 break;
de3b08ac
ILT
2686 case 'R':
2687 dump_dynamic_reloc_info = 1;
2688 break;
aa0a709a
SC
2689 case 'a':
2690 dump_ar_hdrs = 1;
2691 break;
2692 case 'h':
2693 dump_section_headers = 1;
2694 break;
b3a2b497
ILT
2695 case 'H':
2696 usage (stdout, 0);
249c6fc0
RS
2697 case 'V':
2698 show_version = 1;
2699 break;
13e4db2e
SC
2700 case 'w':
2701 wide_output = 1;
2702 break;
5c59269f
ILT
2703 case OPTION_ADJUST_VMA:
2704 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2705 break;
aa21a2a9
ILT
2706 case OPTION_START_ADDRESS:
2707 start_address = parse_vma (optarg, "--start-address");
2708 break;
2709 case OPTION_STOP_ADDRESS:
2710 stop_address = parse_vma (optarg, "--stop-address");
2711 break;
18f39dfa
SG
2712 case 'E':
2713 if (strcmp (optarg, "B") == 0)
2714 endian = BFD_ENDIAN_BIG;
2715 else if (strcmp (optarg, "L") == 0)
2716 endian = BFD_ENDIAN_LITTLE;
2717 else
2718 {
2719 fprintf (stderr, "%s: unrecognized -E option\n", program_name);
2720 usage (stderr, 1);
2721 }
2722 break;
2723 case OPTION_ENDIAN:
2724 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2725 endian = BFD_ENDIAN_BIG;
2726 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2727 endian = BFD_ENDIAN_LITTLE;
2728 else
2729 {
2730 fprintf (stderr, "%s: unrecognized --endian type `%s'\n",
2731 program_name, optarg);
2732 usage (stderr, 1);
2733 }
2734 break;
aa0a709a 2735 default:
b3a2b497 2736 usage (stderr, 1);
aa0a709a 2737 }
2fa0b342 2738 }
2fa0b342 2739
249c6fc0 2740 if (show_version)
7f924d55 2741 print_version ("objdump");
249c6fc0 2742
2fa0b342 2743 if (seenflag == false)
b3a2b497 2744 usage (stderr, 1);
2fa0b342 2745
e1ec9f07 2746 if (formats_info)
aa0a709a
SC
2747 {
2748 display_info ();
2749 }
2750 else
2751 {
2752 if (optind == argc)
2753 display_file ("a.out", target);
2754 else
2755 for (; optind < argc;)
2756 display_file (argv[optind++], target);
2757 }
be1d162b
ILT
2758
2759 END_PROGRESS (program_name);
2760
2fa0b342
DHW
2761 return 0;
2762}
This page took 0.342317 seconds and 4 git commands to generate.