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