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