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