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