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