* elf32-mips.c (mips_elf_is_local_label_name): Accept the generic
[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;
33a795dd 1110 int bpc, pb = 0;
b4aabb24
ILT
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;
33a795dd 1142 info->bytes_per_chunk = 0;
b4aabb24
ILT
1143 bytes = (*disassemble_fn) (section->vma + i, info);
1144 info->fprintf_func = (fprintf_ftype) fprintf;
1145 info->stream = stdout;
1146 if (info->bytes_per_line != 0)
1147 bytes_per_line = info->bytes_per_line;
1148 if (bytes < 0)
1149 break;
1150 }
1151 else
1152 {
1153 long j;
1154
1155 bytes = bytes_per_line;
1156 if (i + bytes > stop)
1157 bytes = stop - i;
1158
1159 for (j = i; j < i + bytes; ++j)
1160 {
1161 if (isprint (data[j]))
1162 buf[j - i] = data[j];
1163 else
1164 buf[j - i] = '.';
1165 }
1166 buf[j - i] = '\0';
1167 }
1168
1169 if (! prefix_addresses || show_raw_insn)
1170 {
1171 long j;
1172
1173 /* If ! prefix_addresses and ! wide_output, we print
33a795dd 1174 bytes_per_line bytes per line. */
b4aabb24
ILT
1175 pb = bytes;
1176 if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1177 pb = bytes_per_line;
1178
33a795dd
MH
1179 if (info->bytes_per_chunk)
1180 bpc = info->bytes_per_chunk;
1181 else
1182 bpc = 1;
1183
1184 for (j = i; j < i + pb; j += bpc)
b4aabb24 1185 {
33a795dd
MH
1186 int k;
1187 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1188 {
0988ea9f
ILT
1189 for (k = bpc - 1; k >= 0; k--)
1190 printf ("%02x", (unsigned) data[j + k]);
33a795dd
MH
1191 putchar (' ');
1192 }
1193 else
1194 {
0988ea9f
ILT
1195 for (k = 0; k < bpc; k++)
1196 printf ("%02x", (unsigned) data[j + k]);
33a795dd
MH
1197 putchar (' ');
1198 }
b4aabb24
ILT
1199 }
1200
0988ea9f
ILT
1201 for (; pb < bytes_per_line; pb += bpc)
1202 {
1203 int k;
1204
1205 for (k = 0; k < bpc; k++)
1206 printf (" ");
1207 putchar (' ');
1208 }
b4aabb24
ILT
1209
1210 /* Separate raw data from instruction by extra space. */
1211 if (insns)
1212 putchar ('\t');
1213 else
1214 printf (" ");
1215 }
1216
1217 printf ("%s", buf);
1218
1219 if (! prefix_addresses || show_raw_insn)
1220 {
1221 while (pb < bytes)
1222 {
1223 long j;
0948199a 1224 char *s;
b4aabb24
ILT
1225
1226 putchar ('\n');
1227 j = i + pb;
0948199a
ILT
1228
1229 sprintf_vma (buf, section->vma + j);
1230 for (s = buf + skip_addr_chars; *s == '0'; s++)
1231 *s = ' ';
1232 if (*s == '\0')
1233 *--s = '0';
1234 printf ("%s:\t", buf + skip_addr_chars);
1235
b4aabb24
ILT
1236 pb += bytes_per_line;
1237 if (pb > bytes)
1238 pb = bytes;
0988ea9f 1239 for (; j < i + pb; j += bpc)
b4aabb24 1240 {
0988ea9f
ILT
1241 int k;
1242
1243 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1244 {
1245 for (k = bpc - 1; k >= 0; k--)
1246 printf ("%02x", (unsigned) data[j + k]);
1247 putchar (' ');
1248 }
1249 else
1250 {
1251 for (k = 0; k < bpc; k++)
1252 printf ("%02x", (unsigned) data[j + k]);
1253 putchar (' ');
1254 }
b4aabb24
ILT
1255 }
1256 }
1257 }
1258
1259 if (!wide_output)
1260 putchar ('\n');
1261 else
1262 need_nl = true;
1263 }
1264
1265 if (dump_reloc_info
1266 && (section->flags & SEC_RELOC) != 0)
1267 {
1268 while ((*relppp) < relppend
1269 && ((**relppp)->address >= (bfd_vma) i
1270 && (**relppp)->address < (bfd_vma) i + bytes))
1271 {
1272 arelent *q;
1273 const char *sym_name;
1274
1275 q = **relppp;
1276
1277 if (wide_output)
1278 putchar ('\t');
1279 else
1280 printf ("\t\t\t");
1281
51b8c416 1282 objdump_print_value (section->vma + q->address, info, true);
b4aabb24
ILT
1283
1284 printf (": %s\t", q->howto->name);
1285
1286 if (q->sym_ptr_ptr != NULL
1287 && *q->sym_ptr_ptr != NULL)
1288 {
1289 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1290 if (sym_name == NULL || *sym_name == '\0')
1291 {
1292 asection *sym_sec;
1293
1294 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1295 sym_name = bfd_get_section_name (abfd, sym_sec);
1296 if (sym_name == NULL || *sym_name == '\0')
1297 sym_name = "*unknown*";
1298 }
1299 }
1300 else
1301 sym_name = "*unknown*";
1302
1303 printf ("%s", sym_name);
1304
1305 if (q->addend)
1306 {
1307 printf ("+0x");
51b8c416 1308 objdump_print_value (q->addend, info, true);
b4aabb24
ILT
1309 }
1310
1311 printf ("\n");
1312 need_nl = false;
1313 ++(*relppp);
1314 }
1315 }
1316
1317 if (need_nl)
1318 printf ("\n");
1319
1320 i += bytes;
1321 }
1322}
1323
1324/* Disassemble the contents of an object file. */
1325
18f39dfa 1326static void
be1d162b
ILT
1327disassemble_data (abfd)
1328 bfd *abfd;
1329{
1330 long i;
b4aabb24 1331 disassembler_ftype disassemble_fn;
be1d162b
ILT
1332 struct disassemble_info disasm_info;
1333 struct objdump_disasm_info aux;
1334 asection *section;
be1d162b
ILT
1335
1336 print_files = NULL;
1337 prev_functionname = NULL;
1338 prev_line = -1;
1339
1340 /* We make a copy of syms to sort. We don't want to sort syms
1341 because that will screw up the relocs. */
1342 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1343 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1344
1345 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
2fa0b342
DHW
1346
1347 /* Sort the symbols into section and symbol order */
be1d162b 1348 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2fa0b342 1349
4e050e3b 1350 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
cef35d48
DM
1351 disasm_info.application_data = (PTR) &aux;
1352 aux.abfd = abfd;
8275482c 1353 aux.require_sec = false;
cef35d48
DM
1354 disasm_info.print_address_func = objdump_print_address;
1355
aa0a709a
SC
1356 if (machine != (char *) NULL)
1357 {
db552bda 1358 const bfd_arch_info_type *info = bfd_scan_arch (machine);
cef35d48 1359 if (info == NULL)
aa0a709a
SC
1360 {
1361 fprintf (stderr, "%s: Can't use supplied machine %s\n",
1362 program_name,
1363 machine);
1364 exit (1);
1365 }
1366 abfd->arch_info = info;
2fa0b342 1367 }
e779a58c 1368
18f39dfa
SG
1369 if (endian != BFD_ENDIAN_UNKNOWN)
1370 {
1371 struct bfd_target *xvec;
1372
1373 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1374 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1375 xvec->byteorder = endian;
1376 abfd->xvec = xvec;
1377 }
1378
db552bda
ILT
1379 disassemble_fn = disassembler (abfd);
1380 if (!disassemble_fn)
aa0a709a 1381 {
db552bda
ILT
1382 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
1383 program_name,
1384 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1385 exit (1);
aa0a709a 1386 }
2fa0b342 1387
7f924d55 1388 disasm_info.flavour = bfd_get_flavour (abfd);
458bbd1f
DE
1389 disasm_info.arch = bfd_get_arch (abfd);
1390 disasm_info.mach = bfd_get_mach (abfd);
1391 if (bfd_big_endian (abfd))
1392 disasm_info.endian = BFD_ENDIAN_BIG;
38aa863c 1393 else if (bfd_little_endian (abfd))
458bbd1f 1394 disasm_info.endian = BFD_ENDIAN_LITTLE;
38aa863c
DE
1395 else
1396 /* ??? Aborting here seems too drastic. We could default to big or little
1397 instead. */
1398 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
458bbd1f 1399
2fa0b342 1400 for (section = abfd->sections;
aa0a709a
SC
1401 section != (asection *) NULL;
1402 section = section->next)
65cceb78 1403 {
cef35d48
DM
1404 bfd_byte *data = NULL;
1405 bfd_size_type datasize = 0;
be1d162b 1406 arelent **relbuf = NULL;
d5464baa
ILT
1407 arelent **relpp = NULL;
1408 arelent **relppend = NULL;
aa21a2a9 1409 long stop;
2fa0b342 1410
d5464baa
ILT
1411 if ((section->flags & SEC_LOAD) == 0
1412 || (! disassemble_all
1413 && only == NULL
1414 && (section->flags & SEC_CODE) == 0))
cef35d48
DM
1415 continue;
1416 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1417 continue;
2fa0b342 1418
d5464baa
ILT
1419 if (dump_reloc_info
1420 && (section->flags & SEC_RELOC) != 0)
1421 {
be1d162b
ILT
1422 long relsize;
1423
1424 relsize = bfd_get_reloc_upper_bound (abfd, section);
1425 if (relsize < 0)
1426 bfd_fatal (bfd_get_filename (abfd));
1427
1428 if (relsize > 0)
1429 {
1430 long relcount;
1431
1432 relbuf = (arelent **) xmalloc (relsize);
1433 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1434 if (relcount < 0)
1435 bfd_fatal (bfd_get_filename (abfd));
1436
1437 /* Sort the relocs by address. */
1438 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1439
1440 relpp = relbuf;
1441 relppend = relpp + relcount;
1442 }
d5464baa
ILT
1443 }
1444
cef35d48 1445 printf ("Disassembly of section %s:\n", section->name);
2fa0b342 1446
cef35d48
DM
1447 datasize = bfd_get_section_size_before_reloc (section);
1448 if (datasize == 0)
1449 continue;
2fa0b342 1450
cef35d48 1451 data = (bfd_byte *) xmalloc ((size_t) datasize);
2fa0b342 1452
cef35d48 1453 bfd_get_section_contents (abfd, section, data, 0, datasize);
2fa0b342 1454
cef35d48
DM
1455 aux.sec = section;
1456 disasm_info.buffer = data;
1457 disasm_info.buffer_vma = section->vma;
1458 disasm_info.buffer_length = datasize;
aa21a2a9
ILT
1459 if (start_address == (bfd_vma) -1
1460 || start_address < disasm_info.buffer_vma)
1461 i = 0;
1462 else
1463 i = start_address - disasm_info.buffer_vma;
1464 if (stop_address == (bfd_vma) -1)
1465 stop = datasize;
1466 else
1467 {
1468 if (stop_address < disasm_info.buffer_vma)
1469 stop = 0;
1470 else
1471 stop = stop_address - disasm_info.buffer_vma;
1472 if (stop > disasm_info.buffer_length)
1473 stop = disasm_info.buffer_length;
1474 }
b4aabb24
ILT
1475
1476 if (prefix_addresses)
1477 disassemble_bytes (&disasm_info, disassemble_fn, true, data, i, stop,
1478 &relpp, relppend);
1479 else
cef35d48 1480 {
b4aabb24
ILT
1481 asymbol *sym;
1482 long place;
1483
1484 sym = find_symbol_for_address (abfd, section, i, true, &place);
1485 ++place;
1486 while (i < stop)
cef35d48 1487 {
b4aabb24
ILT
1488 asymbol *nextsym;
1489 long nextstop;
1490 boolean insns;
65cceb78 1491
b4aabb24
ILT
1492 disasm_info.symbol = sym;
1493
1494 printf ("\n");
1495 objdump_print_addr_with_sym (abfd, section, sym,
1496 section->vma + i,
51b8c416
ILT
1497 &disasm_info,
1498 false);
b4aabb24 1499 printf (":\n");
db552bda 1500
b4aabb24
ILT
1501 if (sym == NULL)
1502 nextsym = NULL;
1503 else
7fc01fc9 1504 {
b4aabb24
ILT
1505 while (place < sorted_symcount
1506 && (sorted_syms[place]->section != section
1507 || (bfd_asymbol_value (sorted_syms[place])
1508 <= bfd_asymbol_value (sym))))
1509 ++place;
1510 if (place >= sorted_symcount)
1511 nextsym = NULL;
1512 else
1513 nextsym = sorted_syms[place];
7fc01fc9
ILT
1514 }
1515
b4aabb24
ILT
1516 if (nextsym == NULL)
1517 nextstop = stop;
13e4db2e 1518 else
d5464baa 1519 {
b4aabb24
ILT
1520 nextstop = bfd_asymbol_value (nextsym) - section->vma;
1521 if (nextstop > stop)
1522 nextstop = stop;
1523 }
d5464baa 1524
b4aabb24
ILT
1525 /* If a symbol is explicitly marked as being an object
1526 rather than a function, just dump the bytes without
1527 disassembling them. */
1528 if (disassemble_all
1529 || sym == NULL
1530 || ((sym->flags & BSF_OBJECT) == 0
1531 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1532 == NULL)
1533 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1534 == NULL))
1535 || (sym->flags & BSF_FUNCTION) != 0)
1536 insns = true;
1537 else
1538 insns = false;
d5464baa 1539
b4aabb24
ILT
1540 disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1541 nextstop, &relpp, relppend);
d5464baa 1542
b4aabb24
ILT
1543 i = nextstop;
1544 sym = nextsym;
d5464baa 1545 }
96d7950b 1546 }
be1d162b 1547
cef35d48 1548 free (data);
be1d162b
ILT
1549 if (relbuf != NULL)
1550 free (relbuf);
2fa0b342 1551 }
c5ba2759 1552 free (sorted_syms);
2fa0b342 1553}
73b8f102 1554\f
73b8f102
JG
1555
1556/* Define a table of stab values and print-strings. We wish the initializer
1557 could be a direct-mapped table, but instead we build one the first
1558 time we need it. */
1559
18f39dfa
SG
1560static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1561 char *strsect_name));
249c6fc0 1562
250e36fe 1563/* Dump the stabs sections from an object file that has a section that
18f39dfa 1564 uses Sun stabs encoding. */
73b8f102 1565
18f39dfa 1566static void
9b018ecd 1567dump_stabs (abfd)
73b8f102
JG
1568 bfd *abfd;
1569{
250e36fe
DM
1570 dump_section_stabs (abfd, ".stab", ".stabstr");
1571 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1572 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1573 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
249c6fc0
RS
1574}
1575
18f39dfa 1576static bfd_byte *stabs;
250e36fe
DM
1577static bfd_size_type stab_size;
1578
1579static char *strtab;
1580static bfd_size_type stabstr_size;
1581
1582/* Read ABFD's stabs section STABSECT_NAME into `stabs'
1583 and string table section STRSECT_NAME into `strtab'.
1584 If the section exists and was read, allocate the space and return true.
1585 Otherwise return false. */
1586
18f39dfa 1587static boolean
250e36fe 1588read_section_stabs (abfd, stabsect_name, strsect_name)
249c6fc0 1589 bfd *abfd;
250e36fe
DM
1590 char *stabsect_name;
1591 char *strsect_name;
249c6fc0 1592{
9b018ecd 1593 asection *stabsect, *stabstrsect;
9b018ecd 1594
d5671c53
ILT
1595 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1596 if (0 == stabsect)
73b8f102 1597 {
250e36fe
DM
1598 printf ("No %s section present\n\n", stabsect_name);
1599 return false;
73b8f102
JG
1600 }
1601
d5671c53
ILT
1602 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1603 if (0 == stabstrsect)
73b8f102 1604 {
eae82145 1605 fprintf (stderr, "%s: %s has no %s section\n", program_name,
250e36fe
DM
1606 bfd_get_filename (abfd), strsect_name);
1607 return false;
73b8f102 1608 }
9b018ecd 1609
d5671c53
ILT
1610 stab_size = bfd_section_size (abfd, stabsect);
1611 stabstr_size = bfd_section_size (abfd, stabstrsect);
73b8f102 1612
18f39dfa 1613 stabs = (bfd_byte *) xmalloc (stab_size);
9b018ecd 1614 strtab = (char *) xmalloc (stabstr_size);
73b8f102 1615
d5671c53 1616 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
9b018ecd 1617 {
d5671c53
ILT
1618 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1619 program_name, stabsect_name, bfd_get_filename (abfd),
1620 bfd_errmsg (bfd_get_error ()));
1621 free (stabs);
1622 free (strtab);
1623 return false;
73b8f102 1624 }
2fa0b342 1625
d5671c53
ILT
1626 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1627 stabstr_size))
9b018ecd 1628 {
d5671c53
ILT
1629 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1630 program_name, strsect_name, bfd_get_filename (abfd),
1631 bfd_errmsg (bfd_get_error ()));
1632 free (stabs);
1633 free (strtab);
1634 return false;
73b8f102 1635 }
d5671c53 1636
250e36fe
DM
1637 return true;
1638}
73b8f102 1639
18f39dfa
SG
1640/* Stabs entries use a 12 byte format:
1641 4 byte string table index
1642 1 byte stab type
1643 1 byte stab other field
1644 2 byte stab desc field
1645 4 byte stab value
1646 FIXME: This will have to change for a 64 bit object format. */
1647
1648#define STRDXOFF (0)
1649#define TYPEOFF (4)
1650#define OTHEROFF (5)
1651#define DESCOFF (6)
1652#define VALOFF (8)
1653#define STABSIZE (12)
73b8f102 1654
250e36fe
DM
1655/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1656 using string table section STRSECT_NAME (in `strtab'). */
1657
18f39dfa 1658static void
250e36fe
DM
1659print_section_stabs (abfd, stabsect_name, strsect_name)
1660 bfd *abfd;
1661 char *stabsect_name;
1662 char *strsect_name;
1663{
1664 int i;
1665 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
18f39dfa
SG
1666 bfd_byte *stabp, *stabs_end;
1667
1668 stabp = stabs;
1669 stabs_end = stabp + stab_size;
73b8f102 1670
250e36fe
DM
1671 printf ("Contents of %s section:\n\n", stabsect_name);
1672 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
249c6fc0
RS
1673
1674 /* Loop through all symbols and print them.
1675
1676 We start the index at -1 because there is a dummy symbol on
250e36fe 1677 the front of stabs-in-{coff,elf} sections that supplies sizes. */
249c6fc0 1678
18f39dfa 1679 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
73b8f102 1680 {
7fc01fc9 1681 const char *name;
18f39dfa
SG
1682 unsigned long strx;
1683 unsigned char type, other;
1684 unsigned short desc;
1685 bfd_vma value;
1686
1687 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1688 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1689 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1690 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1691 value = bfd_h_get_32 (abfd, stabp + VALOFF);
7fc01fc9 1692
fe2750e1 1693 printf ("\n%-6d ", i);
250e36fe 1694 /* Either print the stab name, or, if unnamed, print its number
fe2750e1 1695 again (makes consistent formatting for tools like awk). */
18f39dfa 1696 name = bfd_get_stab_name (type);
7fc01fc9
ILT
1697 if (name != NULL)
1698 printf ("%-6s", name);
18f39dfa 1699 else if (type == N_UNDF)
105da05c 1700 printf ("HdrSym");
fe2750e1 1701 else
18f39dfa
SG
1702 printf ("%-6d", type);
1703 printf (" %-6d %-6d ", other, desc);
1704 printf_vma (value);
1705 printf (" %-6lu", strx);
249c6fc0
RS
1706
1707 /* Symbols with type == 0 (N_UNDF) specify the length of the
1708 string table associated with this file. We use that info
1709 to know how to relocate the *next* file's string table indices. */
1710
18f39dfa 1711 if (type == N_UNDF)
249c6fc0
RS
1712 {
1713 file_string_table_offset = next_file_string_table_offset;
18f39dfa 1714 next_file_string_table_offset += value;
249c6fc0 1715 }
249c6fc0 1716 else
e1ec9f07 1717 {
250e36fe 1718 /* Using the (possibly updated) string table offset, print the
e1ec9f07
SS
1719 string (if any) associated with this symbol. */
1720
18f39dfa
SG
1721 if ((strx + file_string_table_offset) < stabstr_size)
1722 printf (" %s", &strtab[strx + file_string_table_offset]);
e1ec9f07
SS
1723 else
1724 printf (" *");
1725 }
73b8f102
JG
1726 }
1727 printf ("\n\n");
1728}
249c6fc0 1729
18f39dfa 1730static void
250e36fe
DM
1731dump_section_stabs (abfd, stabsect_name, strsect_name)
1732 bfd *abfd;
1733 char *stabsect_name;
1734 char *strsect_name;
1735{
13e4db2e 1736 asection *s;
13e4db2e 1737
a65619c8
SC
1738 /* Check for section names for which stabsect_name is a prefix, to
1739 handle .stab0, etc. */
13e4db2e 1740 for (s = abfd->sections;
a65619c8 1741 s != NULL;
13e4db2e
SC
1742 s = s->next)
1743 {
18f39dfa
SG
1744 int len;
1745
1746 len = strlen (stabsect_name);
1747
1748/* If the prefix matches, and the files section name ends with a nul or a digit,
1749 then we match. Ie: we want either an exact match or a a section followed by
1750 a number. */
1751 if (strncmp (stabsect_name, s->name, len) == 0
1752 && (s->name[len] == '\000' || isdigit (s->name[len])))
13e4db2e 1753 {
a65619c8
SC
1754 if (read_section_stabs (abfd, s->name, strsect_name))
1755 {
1756 print_section_stabs (abfd, s->name, strsect_name);
1757 free (stabs);
1758 free (strtab);
1759 }
13e4db2e
SC
1760 }
1761 }
250e36fe
DM
1762}
1763\f
eae82145 1764static void
f7b839f7
DM
1765dump_bfd_header (abfd)
1766 bfd *abfd;
1767{
1768 char *comma = "";
1769
1770 printf ("architecture: %s, ",
1771 bfd_printable_arch_mach (bfd_get_arch (abfd),
1772 bfd_get_mach (abfd)));
1773 printf ("flags 0x%08x:\n", abfd->flags);
1774
1775#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1776 PF (HAS_RELOC, "HAS_RELOC");
1777 PF (EXEC_P, "EXEC_P");
1778 PF (HAS_LINENO, "HAS_LINENO");
1779 PF (HAS_DEBUG, "HAS_DEBUG");
1780 PF (HAS_SYMS, "HAS_SYMS");
1781 PF (HAS_LOCALS, "HAS_LOCALS");
1782 PF (DYNAMIC, "DYNAMIC");
1783 PF (WP_TEXT, "WP_TEXT");
1784 PF (D_PAGED, "D_PAGED");
1785 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1786 printf ("\nstart address 0x");
1787 printf_vma (abfd->start_address);
38d7c012 1788 printf ("\n");
f7b839f7 1789}
a65619c8
SC
1790\f
1791static void
1792dump_bfd_private_header (abfd)
1793bfd *abfd;
1794{
1795 bfd_print_private_bfd_data (abfd, stdout);
1796}
18f39dfa 1797
02a68547 1798static void
2fa0b342
DHW
1799display_bfd (abfd)
1800 bfd *abfd;
1801{
209e5610
DM
1802 char **matching;
1803
1804 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
aa0a709a 1805 {
cef35d48 1806 bfd_nonfatal (bfd_get_filename (abfd));
8f197c94 1807 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
209e5610
DM
1808 {
1809 list_matching_formats (matching);
1810 free (matching);
1811 }
aa0a709a
SC
1812 return;
1813 }
f7b839f7 1814
cef35d48
DM
1815 printf ("\n%s: file format %s\n", bfd_get_filename (abfd),
1816 abfd->xvec->name);
aa0a709a
SC
1817 if (dump_ar_hdrs)
1818 print_arelt_descr (stdout, abfd, true);
aa0a709a 1819 if (dump_file_header)
f7b839f7 1820 dump_bfd_header (abfd);
a65619c8
SC
1821 if (dump_private_headers)
1822 dump_bfd_private_header (abfd);
f7b839f7 1823 putchar ('\n');
2fa0b342 1824 if (dump_section_headers)
aa0a709a 1825 dump_headers (abfd);
83f4323e 1826 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
aa0a709a
SC
1827 {
1828 syms = slurp_symtab (abfd);
1829 }
de3b08ac
ILT
1830 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
1831 {
1832 dynsyms = slurp_dynamic_symtab (abfd);
1833 }
aa0a709a 1834 if (dump_symtab)
de3b08ac
ILT
1835 dump_symbols (abfd, false);
1836 if (dump_dynamic_symtab)
1837 dump_symbols (abfd, true);
73b8f102 1838 if (dump_stab_section_info)
9b018ecd 1839 dump_stabs (abfd);
d5464baa 1840 if (dump_reloc_info && ! disassemble)
aa0a709a 1841 dump_relocs (abfd);
de3b08ac
ILT
1842 if (dump_dynamic_reloc_info)
1843 dump_dynamic_relocs (abfd);
aa0a709a
SC
1844 if (dump_section_contents)
1845 dump_data (abfd);
1846 if (disassemble)
1847 disassemble_data (abfd);
e1c14599
ILT
1848 if (dump_debugging)
1849 {
1850 PTR dhandle;
1851
83f4323e 1852 dhandle = read_debugging_info (abfd, syms, symcount);
e1c14599
ILT
1853 if (dhandle != NULL)
1854 {
1855 if (! print_debugging_info (stdout, dhandle))
1856 fprintf (stderr, "%s: printing debugging information failed\n",
1857 bfd_get_filename (abfd));
1858 }
1859 }
c5ba2759
ILT
1860 if (syms)
1861 {
1862 free (syms);
1863 syms = NULL;
1864 }
1865 if (dynsyms)
1866 {
1867 free (dynsyms);
1868 dynsyms = NULL;
1869 }
2fa0b342
DHW
1870}
1871
d9971b83 1872static void
2fa0b342
DHW
1873display_file (filename, target)
1874 char *filename;
1875 char *target;
1876{
1877 bfd *file, *arfile = (bfd *) NULL;
1878
1879 file = bfd_openr (filename, target);
aa0a709a
SC
1880 if (file == NULL)
1881 {
cef35d48 1882 bfd_nonfatal (filename);
aa0a709a
SC
1883 return;
1884 }
2fa0b342 1885
aa0a709a
SC
1886 if (bfd_check_format (file, bfd_archive) == true)
1887 {
8f197c94
ILT
1888 bfd *last_arfile = NULL;
1889
aa0a709a
SC
1890 printf ("In archive %s:\n", bfd_get_filename (file));
1891 for (;;)
1892 {
8f197c94 1893 bfd_set_error (bfd_error_no_error);
aa0a709a
SC
1894
1895 arfile = bfd_openr_next_archived_file (file, arfile);
1896 if (arfile == NULL)
1897 {
8f197c94 1898 if (bfd_get_error () != bfd_error_no_more_archived_files)
d2442698 1899 {
cef35d48 1900 bfd_nonfatal (bfd_get_filename (file));
d2442698 1901 }
8f197c94 1902 break;
aa0a709a 1903 }
2fa0b342 1904
aa0a709a 1905 display_bfd (arfile);
8f197c94
ILT
1906
1907 if (last_arfile != NULL)
1908 bfd_close (last_arfile);
1909 last_arfile = arfile;
aa0a709a 1910 }
8f197c94
ILT
1911
1912 if (last_arfile != NULL)
1913 bfd_close (last_arfile);
2fa0b342 1914 }
2fa0b342 1915 else
aa0a709a 1916 display_bfd (file);
2fa0b342 1917
aa0a709a 1918 bfd_close (file);
2fa0b342
DHW
1919}
1920\f
1921/* Actually display the various requested regions */
1922
d9971b83 1923static void
2fa0b342
DHW
1924dump_data (abfd)
1925 bfd *abfd;
1926{
1927 asection *section;
aa0a709a 1928 bfd_byte *data = 0;
fc5d6074
SC
1929 bfd_size_type datasize = 0;
1930 bfd_size_type i;
aa21a2a9 1931 bfd_size_type start, stop;
2fa0b342
DHW
1932
1933 for (section = abfd->sections; section != NULL; section =
aa0a709a
SC
1934 section->next)
1935 {
1936 int onaline = 16;
2fa0b342 1937
aa0a709a
SC
1938 if (only == (char *) NULL ||
1939 strcmp (only, section->name) == 0)
60c80016 1940 {
aa0a709a
SC
1941 if (section->flags & SEC_HAS_CONTENTS)
1942 {
1943 printf ("Contents of section %s:\n", section->name);
1944
9b018ecd 1945 if (bfd_section_size (abfd, section) == 0)
aa0a709a 1946 continue;
02a68547 1947 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
9b018ecd 1948 datasize = bfd_section_size (abfd, section);
2fa0b342 1949
2fa0b342 1950
9b018ecd 1951 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2fa0b342 1952
aa21a2a9
ILT
1953 if (start_address == (bfd_vma) -1
1954 || start_address < section->vma)
1955 start = 0;
1956 else
1957 start = start_address - section->vma;
1958 if (stop_address == (bfd_vma) -1)
1959 stop = bfd_section_size (abfd, section);
1960 else
1961 {
1962 if (stop_address < section->vma)
1963 stop = 0;
1964 else
1965 stop = stop_address - section->vma;
1966 if (stop > bfd_section_size (abfd, section))
1967 stop = bfd_section_size (abfd, section);
1968 }
1969 for (i = start; i < stop; i += onaline)
aa0a709a
SC
1970 {
1971 bfd_size_type j;
1972
1973 printf (" %04lx ", (unsigned long int) (i + section->vma));
1974 for (j = i; j < i + onaline; j++)
1975 {
aa21a2a9 1976 if (j < stop)
aa0a709a
SC
1977 printf ("%02x", (unsigned) (data[j]));
1978 else
1979 printf (" ");
1980 if ((j & 3) == 3)
1981 printf (" ");
1982 }
2fa0b342 1983
aa0a709a
SC
1984 printf (" ");
1985 for (j = i; j < i + onaline; j++)
1986 {
aa21a2a9 1987 if (j >= stop)
aa0a709a
SC
1988 printf (" ");
1989 else
1990 printf ("%c", isprint (data[j]) ? data[j] : '.');
1991 }
1992 putchar ('\n');
1993 }
d9971b83 1994 free (data);
60c80016 1995 }
2fa0b342 1996 }
2fa0b342 1997 }
2fa0b342
DHW
1998}
1999
2fa0b342 2000/* Should perhaps share code and display with nm? */
d9971b83 2001static void
de3b08ac 2002dump_symbols (abfd, dynamic)
2fa0b342 2003 bfd *abfd;
de3b08ac 2004 boolean dynamic;
2fa0b342 2005{
de3b08ac
ILT
2006 asymbol **current;
2007 long max;
ae5d2ff5 2008 long count;
2fa0b342 2009
de3b08ac 2010 if (dynamic)
aa0a709a 2011 {
de3b08ac
ILT
2012 current = dynsyms;
2013 max = dynsymcount;
2014 if (max == 0)
2015 return;
2016 printf ("DYNAMIC SYMBOL TABLE:\n");
2017 }
2018 else
2019 {
2020 current = syms;
2021 max = symcount;
2022 if (max == 0)
2023 return;
2024 printf ("SYMBOL TABLE:\n");
2025 }
2fa0b342 2026
de3b08ac
ILT
2027 for (count = 0; count < max; count++)
2028 {
d9971b83 2029 if (*current)
aa0a709a 2030 {
d9971b83
KR
2031 bfd *cur_bfd = bfd_asymbol_bfd(*current);
2032 if (cur_bfd)
2033 {
2034 bfd_print_symbol (cur_bfd,
2035 stdout,
2036 *current, bfd_print_symbol_all);
2037 printf ("\n");
2038 }
aa0a709a
SC
2039 }
2040 current++;
2fa0b342 2041 }
aa0a709a
SC
2042 printf ("\n");
2043 printf ("\n");
2fa0b342
DHW
2044}
2045
d9971b83 2046static void
aa0a709a
SC
2047dump_relocs (abfd)
2048 bfd *abfd;
2fa0b342
DHW
2049{
2050 arelent **relpp;
ae5d2ff5 2051 long relcount;
2fa0b342 2052 asection *a;
aa0a709a
SC
2053
2054 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2055 {
ae5d2ff5
ILT
2056 long relsize;
2057
28d1b01e 2058 if (bfd_is_abs_section (a))
aa0a709a 2059 continue;
28d1b01e 2060 if (bfd_is_und_section (a))
aa0a709a 2061 continue;
d9971b83 2062 if (bfd_is_com_section (a))
aa0a709a
SC
2063 continue;
2064
195d1adf
KR
2065 if (only)
2066 {
2067 if (strcmp (only, a->name))
2068 continue;
2069 }
2070 else if ((a->flags & SEC_RELOC) == 0)
2071 continue;
2072
ae5d2ff5
ILT
2073 relsize = bfd_get_reloc_upper_bound (abfd, a);
2074 if (relsize < 0)
2075 bfd_fatal (bfd_get_filename (abfd));
2076
c5ba2759
ILT
2077 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2078
ae5d2ff5 2079 if (relsize == 0)
aa0a709a
SC
2080 {
2081 printf (" (none)\n\n");
d20f480f 2082 }
aa0a709a
SC
2083 else
2084 {
ae5d2ff5 2085 relpp = (arelent **) xmalloc (relsize);
aa0a709a 2086 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
ae5d2ff5
ILT
2087 if (relcount < 0)
2088 bfd_fatal (bfd_get_filename (abfd));
2089 else if (relcount == 0)
aa0a709a
SC
2090 {
2091 printf (" (none)\n\n");
d20f480f 2092 }
aa0a709a
SC
2093 else
2094 {
2095 printf ("\n");
18f39dfa 2096 dump_reloc_set (abfd, a, relpp, relcount);
aa0a709a 2097 printf ("\n\n");
d20f480f 2098 }
de3b08ac 2099 free (relpp);
2fa0b342 2100 }
de3b08ac
ILT
2101 }
2102}
2fa0b342 2103
de3b08ac
ILT
2104static void
2105dump_dynamic_relocs (abfd)
2106 bfd *abfd;
2107{
2108 long relsize;
2109 arelent **relpp;
2110 long relcount;
2111
de3b08ac
ILT
2112 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2113 if (relsize < 0)
2114 bfd_fatal (bfd_get_filename (abfd));
2115
c5ba2759
ILT
2116 printf ("DYNAMIC RELOCATION RECORDS");
2117
de3b08ac
ILT
2118 if (relsize == 0)
2119 {
2120 printf (" (none)\n\n");
2121 }
2122 else
2123 {
2124 relpp = (arelent **) xmalloc (relsize);
2125 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2126 if (relcount < 0)
2127 bfd_fatal (bfd_get_filename (abfd));
2128 else if (relcount == 0)
2129 {
2130 printf (" (none)\n\n");
2131 }
2132 else
2133 {
2134 printf ("\n");
18f39dfa 2135 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
de3b08ac
ILT
2136 printf ("\n\n");
2137 }
2138 free (relpp);
2139 }
2140}
2141
2142static void
18f39dfa 2143dump_reloc_set (abfd, sec, relpp, relcount)
de3b08ac 2144 bfd *abfd;
18f39dfa 2145 asection *sec;
de3b08ac
ILT
2146 arelent **relpp;
2147 long relcount;
2148{
2149 arelent **p;
18f39dfa
SG
2150 char *last_filename, *last_functionname;
2151 unsigned int last_line;
de3b08ac
ILT
2152
2153 /* Get column headers lined up reasonably. */
2154 {
2155 static int width;
2156 if (width == 0)
2157 {
2158 char buf[30];
2159 sprintf_vma (buf, (bfd_vma) -1);
2160 width = strlen (buf) - 7;
2161 }
2162 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2163 }
2164
18f39dfa
SG
2165 last_filename = NULL;
2166 last_functionname = NULL;
2167 last_line = 0;
2168
de3b08ac
ILT
2169 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2170 {
2171 arelent *q = *p;
18f39dfa
SG
2172 const char *filename, *functionname;
2173 unsigned int line;
2174 const char *sym_name;
2175 const char *section_name;
de3b08ac 2176
aa21a2a9
ILT
2177 if (start_address != (bfd_vma) -1
2178 && q->address < start_address)
2179 continue;
2180 if (stop_address != (bfd_vma) -1
2181 && q->address > stop_address)
2182 continue;
2183
18f39dfa
SG
2184 if (with_line_numbers
2185 && sec != NULL
2186 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2187 &filename, &functionname, &line))
2188 {
2189 if (functionname != NULL
2190 && (last_functionname == NULL
2191 || strcmp (functionname, last_functionname) != 0))
2192 {
2193 printf ("%s():\n", functionname);
2194 if (last_functionname != NULL)
2195 free (last_functionname);
2196 last_functionname = xstrdup (functionname);
2197 }
2198 if (line > 0
2199 && (line != last_line
2200 || (filename != NULL
2201 && last_filename != NULL
2202 && strcmp (filename, last_filename) != 0)))
2203 {
2204 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2205 last_line = line;
2206 if (last_filename != NULL)
2207 free (last_filename);
2208 if (filename == NULL)
2209 last_filename = NULL;
2210 else
2211 last_filename = xstrdup (filename);
2212 }
2213 }
2214
de3b08ac
ILT
2215 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2216 {
2217 sym_name = (*(q->sym_ptr_ptr))->name;
2218 section_name = (*(q->sym_ptr_ptr))->section->name;
2219 }
2220 else
2221 {
2222 sym_name = NULL;
2223 section_name = NULL;
2224 }
2225 if (sym_name)
2226 {
2227 printf_vma (q->address);
2228 printf (" %-16s %s",
2229 q->howto->name,
2230 sym_name);
2231 }
2232 else
2233 {
2234 if (section_name == (CONST char *) NULL)
2235 section_name = "*unknown*";
2236 printf_vma (q->address);
2237 printf (" %-16s [%s]",
2238 q->howto->name,
2239 section_name);
2240 }
2241 if (q->addend)
2242 {
2243 printf ("+0x");
2244 printf_vma (q->addend);
2245 }
2246 printf ("\n");
d20f480f 2247 }
2fa0b342 2248}
f7b839f7 2249\f
f7b839f7
DM
2250/* The length of the longest architecture name + 1. */
2251#define LONGEST_ARCH sizeof("rs6000:6000")
2252
e1c14599
ILT
2253static const char *
2254endian_string (endian)
2255 enum bfd_endian endian;
2256{
2257 if (endian == BFD_ENDIAN_BIG)
2258 return "big endian";
2259 else if (endian == BFD_ENDIAN_LITTLE)
2260 return "little endian";
2261 else
2262 return "endianness unknown";
2263}
2264
f7b839f7
DM
2265/* List the targets that BFD is configured to support, each followed
2266 by its endianness and the architectures it supports. */
2267
2268static void
2269display_target_list ()
2270{
2271 extern bfd_target *bfd_target_vector[];
de04bceb 2272 char *dummy_name;
f7b839f7
DM
2273 int t;
2274
7f924d55 2275 dummy_name = choose_temp_base ();
f7b839f7
DM
2276 for (t = 0; bfd_target_vector[t]; t++)
2277 {
f7b839f7 2278 bfd_target *p = bfd_target_vector[t];
de04bceb 2279 bfd *abfd = bfd_openw (dummy_name, p->name);
105da05c
ILT
2280 int a;
2281
2282 printf ("%s\n (header %s, data %s)\n", p->name,
e1c14599
ILT
2283 endian_string (p->header_byteorder),
2284 endian_string (p->byteorder));
f7b839f7 2285
334d6e76
SS
2286 if (abfd == NULL)
2287 {
de04bceb 2288 bfd_nonfatal (dummy_name);
105da05c 2289 continue;
334d6e76 2290 }
105da05c
ILT
2291
2292 if (! bfd_set_format (abfd, bfd_object))
2293 {
2294 if (bfd_get_error () != bfd_error_invalid_operation)
2295 bfd_nonfatal (p->name);
2296 continue;
2297 }
2298
f7b839f7
DM
2299 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2300 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2301 printf (" %s\n",
2302 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2303 }
de04bceb 2304 unlink (dummy_name);
7f924d55 2305 free (dummy_name);
f7b839f7
DM
2306}
2307
2308/* Print a table showing which architectures are supported for entries
2309 FIRST through LAST-1 of bfd_target_vector (targets across,
2310 architectures down). */
2311
9872a49c 2312static void
abdcac0f
DM
2313display_info_table (first, last)
2314 int first;
2315 int last;
9872a49c 2316{
abdcac0f 2317 extern bfd_target *bfd_target_vector[];
de04bceb
ILT
2318 int t, a;
2319 char *dummy_name;
9872a49c 2320
f7b839f7 2321 /* Print heading of target names. */
ae5d2ff5 2322 printf ("\n%*s", (int) LONGEST_ARCH, " ");
105da05c 2323 for (t = first; t < last && bfd_target_vector[t]; t++)
f7b839f7
DM
2324 printf ("%s ", bfd_target_vector[t]->name);
2325 putchar ('\n');
9872a49c 2326
7f924d55 2327 dummy_name = choose_temp_base ();
f7b839f7
DM
2328 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2329 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
e779a58c 2330 {
ae5d2ff5
ILT
2331 printf ("%*s ", (int) LONGEST_ARCH - 1,
2332 bfd_printable_arch_mach (a, 0));
105da05c 2333 for (t = first; t < last && bfd_target_vector[t]; t++)
aa0a709a 2334 {
f7b839f7 2335 bfd_target *p = bfd_target_vector[t];
105da05c 2336 boolean ok = true;
de04bceb 2337 bfd *abfd = bfd_openw (dummy_name, p->name);
aa0a709a 2338
334d6e76
SS
2339 if (abfd == NULL)
2340 {
105da05c
ILT
2341 bfd_nonfatal (p->name);
2342 ok = false;
2343 }
2344
2345 if (ok)
2346 {
2347 if (! bfd_set_format (abfd, bfd_object))
2348 {
2349 if (bfd_get_error () != bfd_error_invalid_operation)
2350 bfd_nonfatal (p->name);
2351 ok = false;
2352 }
334d6e76 2353 }
105da05c
ILT
2354
2355 if (ok)
2356 {
2357 if (! bfd_set_arch_mach (abfd, a, 0))
2358 ok = false;
2359 }
2360
2361 if (ok)
aa0a709a
SC
2362 printf ("%s ", p->name);
2363 else
e779a58c 2364 {
f7b839f7 2365 int l = strlen (p->name);
aa0a709a 2366 while (l--)
f7b839f7
DM
2367 putchar ('-');
2368 putchar (' ');
e779a58c 2369 }
e779a58c 2370 }
f7b839f7 2371 putchar ('\n');
e779a58c 2372 }
de04bceb 2373 unlink (dummy_name);
7f924d55 2374 free (dummy_name);
9872a49c 2375}
aa0a709a 2376
f7b839f7
DM
2377/* Print tables of all the target-architecture combinations that
2378 BFD has been configured to support. */
2379
aa0a709a 2380static void
f7b839f7 2381display_target_tables ()
aa0a709a 2382{
f7b839f7 2383 int t, columns;
abdcac0f 2384 extern bfd_target *bfd_target_vector[];
f7b839f7 2385 char *colum;
aa0a709a
SC
2386 extern char *getenv ();
2387
aa0a709a 2388 columns = 0;
f7b839f7
DM
2389 colum = getenv ("COLUMNS");
2390 if (colum != NULL)
aa0a709a 2391 columns = atoi (colum);
f7b839f7 2392 if (columns == 0)
aa0a709a 2393 columns = 80;
f7b839f7 2394
105da05c
ILT
2395 t = 0;
2396 while (bfd_target_vector[t] != NULL)
aa0a709a 2397 {
f7b839f7
DM
2398 int oldt = t, wid;
2399
105da05c
ILT
2400 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2401 ++t;
2402 while (wid < columns && bfd_target_vector[t] != NULL)
2403 {
2404 int newwid;
2405
2406 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2407 if (newwid >= columns)
2408 break;
2409 wid = newwid;
2410 ++t;
2411 }
f7b839f7 2412 display_info_table (oldt, t);
aa0a709a
SC
2413 }
2414}
2415
f7b839f7
DM
2416static void
2417display_info ()
2418{
2419 printf ("BFD header file version %s\n", BFD_VERSION);
2420 display_target_list ();
2421 display_target_tables ();
2422}
2423
2fa0b342
DHW
2424int
2425main (argc, argv)
2426 int argc;
2427 char **argv;
2428{
2429 int c;
2fa0b342
DHW
2430 char *target = default_target;
2431 boolean seenflag = false;
2fa0b342
DHW
2432
2433 program_name = *argv;
8f197c94
ILT
2434 xmalloc_set_program_name (program_name);
2435
be1d162b
ILT
2436 START_PROGRESS (program_name, 0);
2437
8f197c94 2438 bfd_init ();
2fa0b342 2439
18f39dfa
SG
2440 while ((c = getopt_long (argc, argv, "pib:m:VdDlfahrRtTxsSj:wE:",
2441 long_options, (int *) 0))
aa0a709a
SC
2442 != EOF)
2443 {
aa21a2a9
ILT
2444 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2445 seenflag = true;
aa0a709a
SC
2446 switch (c)
2447 {
b3a2b497
ILT
2448 case 0:
2449 break; /* we've been given a long option */
aa0a709a
SC
2450 case 'm':
2451 machine = optarg;
2452 break;
2453 case 'j':
2454 only = optarg;
2455 break;
2456 case 'l':
2457 with_line_numbers = 1;
2458 break;
2459 case 'b':
2460 target = optarg;
2461 break;
2462 case 'f':
2463 dump_file_header = true;
2464 break;
2465 case 'i':
e1ec9f07 2466 formats_info = true;
aa0a709a 2467 break;
a65619c8
SC
2468 case 'p':
2469 dump_private_headers = 1;
2470 break;
aa0a709a 2471 case 'x':
a65619c8 2472 dump_private_headers = 1;
aa0a709a
SC
2473 dump_symtab = 1;
2474 dump_reloc_info = 1;
2475 dump_file_header = true;
2476 dump_ar_hdrs = 1;
2477 dump_section_headers = 1;
2478 break;
aa0a709a
SC
2479 case 't':
2480 dump_symtab = 1;
2481 break;
de3b08ac
ILT
2482 case 'T':
2483 dump_dynamic_symtab = 1;
2484 break;
aa0a709a
SC
2485 case 'd':
2486 disassemble = true;
2487 break;
d5464baa
ILT
2488 case 'D':
2489 disassemble = disassemble_all = true;
2490 break;
be1d162b
ILT
2491 case 'S':
2492 disassemble = true;
2493 with_source_code = true;
2494 break;
aa0a709a
SC
2495 case 's':
2496 dump_section_contents = 1;
2497 break;
2498 case 'r':
2499 dump_reloc_info = 1;
2500 break;
de3b08ac
ILT
2501 case 'R':
2502 dump_dynamic_reloc_info = 1;
2503 break;
aa0a709a
SC
2504 case 'a':
2505 dump_ar_hdrs = 1;
2506 break;
2507 case 'h':
2508 dump_section_headers = 1;
2509 break;
b3a2b497
ILT
2510 case 'H':
2511 usage (stdout, 0);
249c6fc0
RS
2512 case 'V':
2513 show_version = 1;
2514 break;
13e4db2e
SC
2515 case 'w':
2516 wide_output = 1;
2517 break;
aa21a2a9
ILT
2518 case OPTION_START_ADDRESS:
2519 start_address = parse_vma (optarg, "--start-address");
2520 break;
2521 case OPTION_STOP_ADDRESS:
2522 stop_address = parse_vma (optarg, "--stop-address");
2523 break;
18f39dfa
SG
2524 case 'E':
2525 if (strcmp (optarg, "B") == 0)
2526 endian = BFD_ENDIAN_BIG;
2527 else if (strcmp (optarg, "L") == 0)
2528 endian = BFD_ENDIAN_LITTLE;
2529 else
2530 {
2531 fprintf (stderr, "%s: unrecognized -E option\n", program_name);
2532 usage (stderr, 1);
2533 }
2534 break;
2535 case OPTION_ENDIAN:
2536 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2537 endian = BFD_ENDIAN_BIG;
2538 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2539 endian = BFD_ENDIAN_LITTLE;
2540 else
2541 {
2542 fprintf (stderr, "%s: unrecognized --endian type `%s'\n",
2543 program_name, optarg);
2544 usage (stderr, 1);
2545 }
2546 break;
aa0a709a 2547 default:
b3a2b497 2548 usage (stderr, 1);
aa0a709a 2549 }
2fa0b342 2550 }
2fa0b342 2551
249c6fc0 2552 if (show_version)
7f924d55 2553 print_version ("objdump");
249c6fc0 2554
2fa0b342 2555 if (seenflag == false)
b3a2b497 2556 usage (stderr, 1);
2fa0b342 2557
e1ec9f07 2558 if (formats_info)
aa0a709a
SC
2559 {
2560 display_info ();
2561 }
2562 else
2563 {
2564 if (optind == argc)
2565 display_file ("a.out", target);
2566 else
2567 for (; optind < argc;)
2568 display_file (argv[optind++], target);
2569 }
be1d162b
ILT
2570
2571 END_PROGRESS (program_name);
2572
2fa0b342
DHW
2573 return 0;
2574}
This page took 0.344442 seconds and 4 git commands to generate.