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