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