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