Add TMS320C4x support
[binutils.git] / binutils / objdump.c
blob6488f9f061558fdc0f8cc4114b5fcf1f53cd2bbc
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
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.
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.
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. */
22 #include "bfd.h"
23 #include "progress.h"
24 #include "bucomm.h"
25 #include "budemang.h"
26 #include "getopt.h"
27 #include "safe-ctype.h"
28 #include "dis-asm.h"
29 #include "libiberty.h"
30 #include "demangle.h"
31 #include "debug.h"
32 #include "budbg.h"
34 /* Internal headers for the ELF .stab-dump code - sorry. */
35 #define BYTES_IN_WORD 32
36 #include "aout/aout64.h"
38 #ifdef NEED_DECLARATION_FPRINTF
39 /* This is needed by INIT_DISASSEMBLE_INFO. */
40 extern int fprintf PARAMS ((FILE *, const char *, ...));
41 #endif
43 /* Exit status. */
44 static int exit_status = 0;
46 static char *default_target = NULL; /* default at runtime */
48 static int show_version = 0; /* show the version number */
49 static int dump_section_contents; /* -s */
50 static int dump_section_headers; /* -h */
51 static boolean dump_file_header; /* -f */
52 static int dump_symtab; /* -t */
53 static int dump_dynamic_symtab; /* -T */
54 static int dump_reloc_info; /* -r */
55 static int dump_dynamic_reloc_info; /* -R */
56 static int dump_ar_hdrs; /* -a */
57 static int dump_private_headers; /* -p */
58 static int prefix_addresses; /* --prefix-addresses */
59 static int with_line_numbers; /* -l */
60 static boolean with_source_code; /* -S */
61 static int show_raw_insn; /* --show-raw-insn */
62 static int dump_stab_section_info; /* --stabs */
63 static int do_demangle; /* -C, --demangle */
64 static boolean disassemble; /* -d */
65 static boolean disassemble_all; /* -D */
66 static int disassemble_zeroes; /* --disassemble-zeroes */
67 static boolean formats_info; /* -i */
68 static char *only; /* -j secname */
69 static int wide_output; /* -w */
70 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
71 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
72 static int dump_debugging; /* --debugging */
73 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
74 static int file_start_context = 0; /* --file-start-context */
76 /* Extra info to pass to the disassembler address printing function. */
77 struct objdump_disasm_info
79 bfd *abfd;
80 asection *sec;
81 boolean require_sec;
84 /* Architecture to disassemble for, or default if NULL. */
85 static char *machine = (char *) NULL;
87 /* Target specific options to the disassembler. */
88 static char *disassembler_options = (char *) NULL;
90 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
91 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
93 /* The symbol table. */
94 static asymbol **syms;
96 /* Number of symbols in `syms'. */
97 static long symcount = 0;
99 /* The sorted symbol table. */
100 static asymbol **sorted_syms;
102 /* Number of symbols in `sorted_syms'. */
103 static long sorted_symcount = 0;
105 /* The dynamic symbol table. */
106 static asymbol **dynsyms;
108 /* Number of symbols in `dynsyms'. */
109 static long dynsymcount = 0;
111 /* Static declarations. */
113 static void usage PARAMS ((FILE *, int));
114 static void nonfatal PARAMS ((const char *));
115 static void display_file PARAMS ((char *filename, char *target));
116 static void dump_section_header PARAMS ((bfd *, asection *, PTR));
117 static void dump_headers PARAMS ((bfd *));
118 static void dump_data PARAMS ((bfd *abfd));
119 static void dump_relocs PARAMS ((bfd *abfd));
120 static void dump_dynamic_relocs PARAMS ((bfd * abfd));
121 static void dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
122 static void dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
123 static void dump_bfd_header PARAMS ((bfd *));
124 static void dump_bfd_private_header PARAMS ((bfd *));
125 static void dump_bfd PARAMS ((bfd *));
126 static void display_bfd PARAMS ((bfd *abfd));
127 static void display_target_list PARAMS ((void));
128 static void display_info_table PARAMS ((int, int));
129 static void display_target_tables PARAMS ((void));
130 static void display_info PARAMS ((void));
131 static void objdump_print_value
132 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
133 static void objdump_print_symname
134 PARAMS ((bfd *, struct disassemble_info *, asymbol *));
135 static asymbol *find_symbol_for_address
136 PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
137 static void objdump_print_addr_with_sym
138 PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
139 struct disassemble_info *, boolean));
140 static void objdump_print_addr
141 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
142 static void objdump_print_address
143 PARAMS ((bfd_vma, struct disassemble_info *));
144 static int objdump_symbol_at_address
145 PARAMS ((bfd_vma, struct disassemble_info *));
146 static void show_line PARAMS ((bfd *, asection *, bfd_vma));
147 static void disassemble_bytes
148 PARAMS ((struct disassemble_info *, disassembler_ftype, boolean,
149 bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
150 static void disassemble_data PARAMS ((bfd *));
151 static const char *endian_string PARAMS ((enum bfd_endian));
152 static asymbol ** slurp_symtab PARAMS ((bfd *));
153 static asymbol ** slurp_dynamic_symtab PARAMS ((bfd *));
154 static long remove_useless_symbols PARAMS ((asymbol **, long));
155 static int compare_symbols PARAMS ((const PTR, const PTR));
156 static int compare_relocs PARAMS ((const PTR, const PTR));
157 static void dump_stabs PARAMS ((bfd *));
158 static boolean read_section_stabs PARAMS ((bfd *, const char *, const char *));
159 static void print_section_stabs PARAMS ((bfd *, const char *, const char *));
161 static void
162 usage (stream, status)
163 FILE *stream;
164 int status;
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"));
169 fprintf (stream, _("\
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\
185 -v, --version Display this program's version number\n\
186 -i, --info List object formats and architectures supported\n\
187 -H, --help Display this information\n\
188 "));
189 if (status != 2)
191 fprintf (stream, _("\n The following switches are optional:\n"));
192 fprintf (stream, _("\
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\
197 -EB --endian=big Assume big endian format when disassembling\n\
198 -EL --endian=little Assume little endian format when disassembling\n\
199 --file-start-context Include context from start of file (with -S)\n\
200 -l, --line-numbers Include line numbers and filenames in output\n\
201 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
202 The STYLE, if specified, can be `auto', 'gnu',\n\
203 'lucid', 'arm', 'hp', 'edg', or 'gnu-v3'\n\
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\
208 --prefix-addresses Print complete address alongside disassembly\n\
209 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
210 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
211 \n"));
212 list_supported_targets (program_name, stream);
213 list_supported_architectures (program_name, stream);
215 disassembler_usage (stream);
217 if (status == 0)
218 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
219 exit (status);
222 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
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)
229 static struct option long_options[]=
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'},
236 {"debugging", no_argument, NULL, 'g'},
237 {"demangle", optional_argument, NULL, 'C'},
238 {"disassemble", no_argument, NULL, 'd'},
239 {"disassemble-all", no_argument, NULL, 'D'},
240 {"disassembler-options", required_argument, NULL, 'M'},
241 {"disassemble-zeroes", no_argument, NULL, 'z'},
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'},
246 {"file-start-context", no_argument, &file_start_context, 1},
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'},
259 {"stabs", no_argument, NULL, 'G'},
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'},
264 {"version", no_argument, NULL, 'V'},
265 {"wide", no_argument, NULL, 'w'},
266 {0, no_argument, 0, 0}
269 static void
270 nonfatal (msg)
271 const char *msg;
273 bfd_nonfatal (msg);
274 exit_status = 1;
277 static void
278 dump_section_header (abfd, section, ignored)
279 bfd *abfd ATTRIBUTE_UNUSED;
280 asection *section;
281 PTR ignored ATTRIBUTE_UNUSED;
283 char *comma = "";
284 unsigned int opb = bfd_octets_per_byte (abfd);
286 printf ("%3d %-13s %08lx ", section->index,
287 bfd_get_section_name (abfd, section),
288 (unsigned long) bfd_section_size (abfd, section) / opb);
289 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
290 printf (" ");
291 bfd_printf_vma (abfd, section->lma);
292 printf (" %08lx 2**%u", (unsigned long) section->filepos,
293 bfd_get_section_alignment (abfd, section));
294 if (! wide_output)
295 printf ("\n ");
296 printf (" ");
298 #define PF(x, y) \
299 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
301 PF (SEC_HAS_CONTENTS, "CONTENTS");
302 PF (SEC_ALLOC, "ALLOC");
303 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
304 PF (SEC_LOAD, "LOAD");
305 PF (SEC_RELOC, "RELOC");
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");
314 PF (SEC_BLOCK, "BLOCK");
315 PF (SEC_CLINK, "CLINK");
316 PF (SEC_SMALL_DATA, "SMALL_DATA");
317 PF (SEC_SHARED, "SHARED");
318 PF (SEC_ARCH_BIT_0, "ARCH_BIT_0");
319 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
321 if ((section->flags & SEC_LINK_ONCE) != 0)
323 const char *ls;
325 switch (section->flags & SEC_LINK_DUPLICATES)
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;
342 printf ("%s%s", comma, ls);
344 if (section->comdat != NULL)
345 printf (" (COMDAT %s %ld)", section->comdat->name,
346 section->comdat->symbol);
348 comma = ", ";
351 printf ("\n");
352 #undef PF
355 static void
356 dump_headers (abfd)
357 bfd *abfd;
359 printf (_("Sections:\n"));
361 #ifndef BFD64
362 printf (_("Idx Name Size VMA LMA File off Algn"));
363 #else
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"));
369 #endif
371 if (wide_output)
372 printf (_(" Flags"));
373 if (abfd->flags & HAS_LOAD_PAGE)
374 printf (_(" Pg"));
375 printf ("\n");
377 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
380 static asymbol **
381 slurp_symtab (abfd)
382 bfd *abfd;
384 asymbol **sy = (asymbol **) NULL;
385 long storage;
387 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
389 symcount = 0;
390 return NULL;
393 storage = bfd_get_symtab_upper_bound (abfd);
394 if (storage < 0)
395 bfd_fatal (bfd_get_filename (abfd));
396 if (storage)
397 sy = (asymbol **) xmalloc (storage);
399 symcount = bfd_canonicalize_symtab (abfd, sy);
400 if (symcount < 0)
401 bfd_fatal (bfd_get_filename (abfd));
402 return sy;
405 /* Read in the dynamic symbols. */
407 static asymbol **
408 slurp_dynamic_symtab (abfd)
409 bfd *abfd;
411 asymbol **sy = (asymbol **) NULL;
412 long storage;
414 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
415 if (storage < 0)
417 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
419 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
420 dynsymcount = 0;
421 return NULL;
424 bfd_fatal (bfd_get_filename (abfd));
426 if (storage)
427 sy = (asymbol **) xmalloc (storage);
429 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
430 if (dynsymcount < 0)
431 bfd_fatal (bfd_get_filename (abfd));
432 return sy;
435 /* Filter out (in place) symbols that are useless for disassembly.
436 COUNT is the number of elements in SYMBOLS.
437 Return the number of useful symbols. */
439 static long
440 remove_useless_symbols (symbols, count)
441 asymbol **symbols;
442 long count;
444 register asymbol **in_ptr = symbols, **out_ptr = symbols;
446 while (--count >= 0)
448 asymbol *sym = *in_ptr++;
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;
458 *out_ptr++ = sym;
460 return out_ptr - symbols;
463 /* Sort symbols into value order. */
465 static int
466 compare_symbols (ap, bp)
467 const PTR ap;
468 const PTR bp;
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;
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;
482 if (a->section > b->section)
483 return 1;
484 else if (a->section < b->section)
485 return -1;
487 an = bfd_asymbol_name (a);
488 bn = bfd_asymbol_name (b);
489 anl = strlen (an);
490 bnl = strlen (bn);
492 /* The symbols gnu_compiled and gcc2_compiled convey no real
493 information, so put them after other symbols with the same value. */
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);
500 if (af && ! bf)
501 return 1;
502 if (! af && bf)
503 return -1;
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. */
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')))
516 af = file_symbol (a, an, anl);
517 bf = file_symbol (b, bn, bnl);
519 if (af && ! bf)
520 return 1;
521 if (! af && bf)
522 return -1;
524 /* Try to sort global symbols before local symbols before function
525 symbols before debugging symbols. */
527 aflags = a->flags;
528 bflags = b->flags;
530 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
532 if ((aflags & BSF_DEBUGGING) != 0)
533 return 1;
534 else
535 return -1;
537 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
539 if ((aflags & BSF_FUNCTION) != 0)
540 return -1;
541 else
542 return 1;
544 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
546 if ((aflags & BSF_LOCAL) != 0)
547 return 1;
548 else
549 return -1;
551 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
553 if ((aflags & BSF_GLOBAL) != 0)
554 return -1;
555 else
556 return 1;
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;
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);
571 /* Sort relocs into address order. */
573 static int
574 compare_relocs (ap, bp)
575 const PTR ap;
576 const PTR bp;
578 const arelent *a = *(const arelent **)ap;
579 const arelent *b = *(const arelent **)bp;
581 if (a->address > b->address)
582 return 1;
583 else if (a->address < b->address)
584 return -1;
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;
596 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
598 static void
599 objdump_print_value (vma, info, skip_zeroes)
600 bfd_vma vma;
601 struct disassemble_info *info;
602 boolean skip_zeroes;
604 char buf[30];
605 char *p;
606 struct objdump_disasm_info *aux
607 = (struct objdump_disasm_info *) info->application_data;
609 bfd_sprintf_vma (aux->abfd, buf, vma);
610 if (! skip_zeroes)
611 p = buf;
612 else
614 for (p = buf; *p == '0'; ++p)
616 if (*p == '\0')
617 --p;
619 (*info->fprintf_func) (info->stream, "%s", p);
622 /* Print the name of a symbol. */
624 static void
625 objdump_print_symname (abfd, info, sym)
626 bfd *abfd;
627 struct disassemble_info *info;
628 asymbol *sym;
630 char *alloc;
631 const char *name;
633 alloc = NULL;
634 name = bfd_asymbol_name (sym);
635 if (do_demangle && name[0] != '\0')
637 /* Demangle the name. */
638 alloc = demangle (abfd, name);
639 name = alloc;
642 if (info != NULL)
643 (*info->fprintf_func) (info->stream, "%s", name);
644 else
645 printf ("%s", name);
647 if (alloc != NULL)
648 free (alloc);
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. */
656 static asymbol *
657 find_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;
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. */
669 /* Indices in `sorted_syms'. */
670 long min = 0;
671 long max = sorted_symcount;
672 long thisplace;
673 unsigned int opb = bfd_octets_per_byte (abfd);
675 if (sorted_symcount < 1)
676 return NULL;
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)
682 asymbol *sym;
684 thisplace = (max + min) / 2;
685 sym = sorted_syms[thisplace];
687 if (bfd_asymbol_value (sym) > vma)
688 max = thisplace;
689 else if (bfd_asymbol_value (sym) < vma)
690 min = thisplace;
691 else
693 min = thisplace;
694 break;
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;
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.
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. */
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)
721 + bfd_section_size (abfd, sec) / opb))))
723 long i;
725 for (i = thisplace + 1; i < sorted_symcount; i++)
727 if (bfd_asymbol_value (sorted_syms[i])
728 != bfd_asymbol_value (sorted_syms[thisplace]))
729 break;
731 --i;
732 for (; i >= 0; i--)
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]))))
740 thisplace = i;
741 break;
745 if (sorted_syms[thisplace]->section != sec)
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++)
751 if (sorted_syms[i]->section == sec)
753 thisplace = i;
754 break;
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)))))
766 /* There is no suitable symbol. */
767 return NULL;
771 if (place != NULL)
772 *place = thisplace;
774 return sorted_syms[thisplace];
777 /* Print an address to INFO symbolically. */
779 static void
780 objdump_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;
788 objdump_print_value (vma, info, skip_zeroes);
790 if (sym == NULL)
792 bfd_vma secaddr;
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)
799 (*info->fprintf_func) (info->stream, "-0x");
800 objdump_print_value (secaddr - vma, info, true);
802 else if (vma > secaddr)
804 (*info->fprintf_func) (info->stream, "+0x");
805 objdump_print_value (vma - secaddr, info, true);
807 (*info->fprintf_func) (info->stream, ">");
809 else
811 (*info->fprintf_func) (info->stream, " <");
812 objdump_print_symname (abfd, info, sym);
813 if (bfd_asymbol_value (sym) > vma)
815 (*info->fprintf_func) (info->stream, "-0x");
816 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
818 else if (vma > bfd_asymbol_value (sym))
820 (*info->fprintf_func) (info->stream, "+0x");
821 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
823 (*info->fprintf_func) (info->stream, ">");
827 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
828 true, don't output leading zeroes. */
830 static void
831 objdump_print_addr (vma, info, skip_zeroes)
832 bfd_vma vma;
833 struct disassemble_info *info;
834 boolean skip_zeroes;
836 struct objdump_disasm_info *aux;
837 asymbol *sym;
839 if (sorted_symcount < 1)
841 (*info->fprintf_func) (info->stream, "0x");
842 objdump_print_value (vma, info, skip_zeroes);
843 return;
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);
853 /* Print VMA to INFO. This function is passed to the disassembler
854 routine. */
856 static void
857 objdump_print_address (vma, info)
858 bfd_vma vma;
859 struct disassemble_info *info;
861 objdump_print_addr (vma, info, ! prefix_addresses);
864 /* Determine of the given address has a symbol associated with it. */
866 static int
867 objdump_symbol_at_address (vma, info)
868 bfd_vma vma;
869 struct disassemble_info * info;
871 struct objdump_disasm_info * aux;
872 asymbol * sym;
874 /* No symbols - do not bother checking. */
875 if (sorted_symcount < 1)
876 return 0;
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);
882 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
885 /* Hold the last function name and the last line number we displayed
886 in a disassembly. */
888 static char *prev_functionname;
889 static unsigned int prev_line;
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. */
895 struct print_file_list
897 struct print_file_list *next;
898 char *filename;
899 unsigned int line;
900 FILE *f;
903 static struct print_file_list *print_files;
905 /* The number of preceding context lines to show when we start
906 displaying a file for the first time. */
908 #define SHOW_PRECEDING_CONTEXT_LINES (5)
910 /* Skip ahead to a given line in a file, optionally printing each
911 line. */
913 static void
914 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
916 static void
917 skip_to_line (p, line, show)
918 struct print_file_list *p;
919 unsigned int line;
920 boolean show;
922 while (p->line < line)
924 char buf[100];
926 if (fgets (buf, sizeof buf, p->f) == NULL)
928 fclose (p->f);
929 p->f = NULL;
930 break;
933 if (show)
934 printf ("%s", buf);
936 if (strchr (buf, '\n') != NULL)
937 ++p->line;
941 /* Show the line number, or the source line, in a dissassembly
942 listing. */
944 static void
945 show_line (abfd, section, addr_offset)
946 bfd *abfd;
947 asection *section;
948 bfd_vma addr_offset;
950 const char *filename;
951 const char *functionname;
952 unsigned int line;
954 if (! with_line_numbers && ! with_source_code)
955 return;
957 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
958 &functionname, &line))
959 return;
961 if (filename != NULL && *filename == '\0')
962 filename = NULL;
963 if (functionname != NULL && *functionname == '\0')
964 functionname = NULL;
966 if (with_line_numbers)
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);
976 if (with_source_code
977 && filename != NULL
978 && line > 0)
980 struct print_file_list **pp, *p;
982 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
983 if (strcmp ((*pp)->filename, filename) == 0)
984 break;
985 p = *pp;
987 if (p != NULL)
989 if (p != print_files)
991 int l;
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
1008 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1009 if (l < 0)
1010 l = 0;
1013 if (p->f == NULL)
1015 p->f = fopen (p->filename, "r");
1016 p->line = 0;
1018 if (p->f != NULL)
1019 skip_to_line (p, l, false);
1021 if (print_files->f != NULL)
1023 fclose (print_files->f);
1024 print_files->f = NULL;
1028 if (p->f != NULL)
1030 skip_to_line (p, line, true);
1031 *pp = p->next;
1032 p->next = print_files;
1033 print_files = p;
1036 else
1038 FILE *f;
1040 f = fopen (filename, "r");
1041 if (f != NULL)
1043 int l;
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;
1052 if (print_files != NULL && print_files->f != NULL)
1054 fclose (print_files->f);
1055 print_files->f = NULL;
1057 p->next = print_files;
1058 print_files = p;
1060 if (file_start_context)
1061 l = 0;
1062 else
1063 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1064 if (l < 0)
1065 l = 0;
1066 skip_to_line (p, l, false);
1067 if (p->f != NULL)
1068 skip_to_line (p, line, true);
1073 if (functionname != NULL
1074 && (prev_functionname == NULL
1075 || strcmp (functionname, prev_functionname) != 0))
1077 if (prev_functionname != NULL)
1078 free (prev_functionname);
1079 prev_functionname = xmalloc (strlen (functionname) + 1);
1080 strcpy (prev_functionname, functionname);
1083 if (line > 0 && line != prev_line)
1084 prev_line = line;
1087 /* Pseudo FILE object for strings. */
1088 typedef struct
1090 char *buffer;
1091 size_t size;
1092 char *current;
1093 } SFILE;
1095 /* sprintf to a "stream" */
1097 static int
1098 objdump_sprintf VPARAMS ((SFILE *f, const char *format, ...))
1100 char *buf;
1101 size_t n;
1103 VA_OPEN (args, format);
1104 VA_FIXEDARG (args, SFILE *, f);
1105 VA_FIXEDARG (args, const char *, format);
1107 vasprintf (&buf, format, args);
1109 if (buf == NULL)
1111 va_end (args);
1112 fatal (_("Out of virtual memory"));
1115 n = strlen (buf);
1117 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1119 size_t curroff;
1121 curroff = f->current - f->buffer;
1122 f->size *= 2;
1123 f->buffer = xrealloc (f->buffer, f->size);
1124 f->current = f->buffer + curroff;
1127 memcpy (f->current, buf, n);
1128 f->current += n;
1129 f->current[0] = '\0';
1131 free (buf);
1133 VA_CLOSE (args);
1134 return n;
1137 /* The number of zeroes we want to see before we start skipping them.
1138 The number is arbitrarily chosen. */
1140 #ifndef SKIP_ZEROES
1141 #define SKIP_ZEROES (8)
1142 #endif
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. */
1151 #ifndef SKIP_ZEROES_AT_END
1152 #define SKIP_ZEROES_AT_END (3)
1153 #endif
1155 /* Disassemble some data in memory between given values. */
1157 static void
1158 disassemble_bytes (info, disassemble_fn, insns, data,
1159 start_offset, stop_offset, relppp,
1160 relppend)
1161 struct disassemble_info *info;
1162 disassembler_ftype disassemble_fn;
1163 boolean insns;
1164 bfd_byte *data;
1165 bfd_vma start_offset;
1166 bfd_vma stop_offset;
1167 arelent ***relppp;
1168 arelent **relppend;
1170 struct objdump_disasm_info *aux;
1171 asection *section;
1172 int octets_per_line;
1173 boolean done_dot;
1174 int skip_addr_chars;
1175 bfd_vma addr_offset;
1176 int opb = info->octets_per_byte;
1178 aux = (struct objdump_disasm_info *) info->application_data;
1179 section = aux->sec;
1181 if (insns)
1182 octets_per_line = 4;
1183 else
1184 octets_per_line = 16;
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)
1193 char buf[30];
1194 char *s;
1196 bfd_sprintf_vma
1197 (aux->abfd, buf,
1198 (section->vma
1199 + bfd_section_size (section->owner, section) / opb));
1200 s = buf;
1201 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1202 && s[4] == '0')
1204 skip_addr_chars += 4;
1205 s += 4;
1209 info->insn_info_valid = 0;
1211 done_dot = false;
1212 addr_offset = start_offset;
1213 while (addr_offset < stop_offset)
1215 bfd_vma z;
1216 int octets = 0;
1217 boolean need_nl = false;
1219 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1220 print `...'. */
1221 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1222 if (data[z] != 0)
1223 break;
1224 if (! disassemble_zeroes
1225 && (info->insn_info_valid == 0
1226 || info->branch_delay_insns == 0)
1227 && (z - addr_offset * opb >= SKIP_ZEROES
1228 || (z == stop_offset * opb &&
1229 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1231 printf ("\t...\n");
1233 /* If there are more nonzero octets to follow, we only skip
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. */
1237 if (z != stop_offset * opb)
1238 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1240 octets = z - addr_offset * opb;
1242 else
1244 char buf[50];
1245 SFILE sfile;
1246 int bpc = 0;
1247 int pb = 0;
1249 done_dot = false;
1251 if (with_line_numbers || with_source_code)
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);
1257 if (! prefix_addresses)
1259 char *s;
1261 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
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);
1268 else
1270 aux->require_sec = true;
1271 objdump_print_address (section->vma + addr_offset, info);
1272 aux->require_sec = false;
1273 putchar (' ');
1276 if (insns)
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;
1286 #ifdef DISASSEMBLER_NEEDS_RELOCS
1287 /* FIXME: This is wrong. It tests the number of octets
1288 in the last instruction, not the current one. */
1289 if (*relppp < relppend
1290 && (**relppp)->address >= addr_offset
1291 && (**relppp)->address <= addr_offset + octets / opb)
1292 info->flags = INSN_HAS_RELOC;
1293 else
1294 #endif
1295 info->flags = 0;
1297 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1298 info->fprintf_func = (fprintf_ftype) fprintf;
1299 info->stream = stdout;
1300 if (info->bytes_per_line != 0)
1301 octets_per_line = info->bytes_per_line;
1302 if (octets < 0)
1304 if (sfile.current != sfile.buffer)
1305 printf ("%s\n", sfile.buffer);
1306 free (sfile.buffer);
1307 break;
1310 else
1312 bfd_vma j;
1314 octets = octets_per_line;
1315 if (addr_offset + octets / opb > stop_offset)
1316 octets = (stop_offset - addr_offset) * opb;
1318 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1320 if (ISPRINT (data[j]))
1321 buf[j - addr_offset * opb] = data[j];
1322 else
1323 buf[j - addr_offset * opb] = '.';
1325 buf[j - addr_offset * opb] = '\0';
1328 if (prefix_addresses
1329 ? show_raw_insn > 0
1330 : show_raw_insn >= 0)
1332 bfd_vma j;
1334 /* If ! prefix_addresses and ! wide_output, we print
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;
1340 if (info->bytes_per_chunk)
1341 bpc = info->bytes_per_chunk;
1342 else
1343 bpc = 1;
1345 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1347 int k;
1348 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1350 for (k = bpc - 1; k >= 0; k--)
1351 printf ("%02x", (unsigned) data[j + k]);
1352 putchar (' ');
1354 else
1356 for (k = 0; k < bpc; k++)
1357 printf ("%02x", (unsigned) data[j + k]);
1358 putchar (' ');
1362 for (; pb < octets_per_line; pb += bpc)
1364 int k;
1366 for (k = 0; k < bpc; k++)
1367 printf (" ");
1368 putchar (' ');
1371 /* Separate raw data from instruction by extra space. */
1372 if (insns)
1373 putchar ('\t');
1374 else
1375 printf (" ");
1378 if (! insns)
1379 printf ("%s", buf);
1380 else
1382 printf ("%s", sfile.buffer);
1383 free (sfile.buffer);
1386 if (prefix_addresses
1387 ? show_raw_insn > 0
1388 : show_raw_insn >= 0)
1390 while (pb < octets)
1392 bfd_vma j;
1393 char *s;
1395 putchar ('\n');
1396 j = addr_offset * opb + pb;
1398 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
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);
1405 pb += octets_per_line;
1406 if (pb > octets)
1407 pb = octets;
1408 for (; j < addr_offset * opb + pb; j += bpc)
1410 int k;
1412 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1414 for (k = bpc - 1; k >= 0; k--)
1415 printf ("%02x", (unsigned) data[j + k]);
1416 putchar (' ');
1418 else
1420 for (k = 0; k < bpc; k++)
1421 printf ("%02x", (unsigned) data[j + k]);
1422 putchar (' ');
1428 if (!wide_output)
1429 putchar ('\n');
1430 else
1431 need_nl = true;
1434 if ((section->flags & SEC_RELOC) != 0
1435 #ifndef DISASSEMBLER_NEEDS_RELOCS
1436 && dump_reloc_info
1437 #endif
1440 while ((*relppp) < relppend
1441 && ((**relppp)->address >= (bfd_vma) addr_offset
1442 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1443 #ifdef DISASSEMBLER_NEEDS_RELOCS
1444 if (! dump_reloc_info)
1445 ++(*relppp);
1446 else
1447 #endif
1449 arelent *q;
1451 q = **relppp;
1453 if (wide_output)
1454 putchar ('\t');
1455 else
1456 printf ("\t\t\t");
1458 objdump_print_value (section->vma + q->address, info, true);
1460 printf (": %s\t", q->howto->name);
1462 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1463 printf ("*unknown*");
1464 else
1466 const char *sym_name;
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
1473 asection *sym_sec;
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);
1483 if (q->addend)
1485 printf ("+0x");
1486 objdump_print_value (q->addend, info, true);
1489 printf ("\n");
1490 need_nl = false;
1491 ++(*relppp);
1495 if (need_nl)
1496 printf ("\n");
1498 addr_offset += octets / opb;
1502 /* Disassemble the contents of an object file. */
1504 static void
1505 disassemble_data (abfd)
1506 bfd *abfd;
1508 unsigned long addr_offset;
1509 disassembler_ftype disassemble_fn;
1510 struct disassemble_info disasm_info;
1511 struct objdump_disasm_info aux;
1512 asection *section;
1513 unsigned int opb;
1515 print_files = NULL;
1516 prev_functionname = NULL;
1517 prev_line = -1;
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 *));
1524 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1526 /* Sort the symbols into section and symbol order */
1527 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
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;
1536 if (machine != (char *) NULL)
1538 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1539 if (info == NULL)
1541 fatal (_("Can't use supplied machine %s"), machine);
1543 abfd->arch_info = info;
1546 if (endian != BFD_ENDIAN_UNKNOWN)
1548 struct bfd_target *xvec;
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;
1556 disassemble_fn = disassembler (abfd);
1557 if (!disassemble_fn)
1559 non_fatal (_("Can't disassemble for architecture %s\n"),
1560 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1561 exit_status = 1;
1562 return;
1565 opb = bfd_octets_per_byte (abfd);
1567 disasm_info.flavour = bfd_get_flavour (abfd);
1568 disasm_info.arch = bfd_get_arch (abfd);
1569 disasm_info.mach = bfd_get_mach (abfd);
1570 disasm_info.disassembler_options = disassembler_options;
1571 disasm_info.octets_per_byte = opb;
1573 if (bfd_big_endian (abfd))
1574 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1575 else if (bfd_little_endian (abfd))
1576 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1577 else
1578 /* ??? Aborting here seems too drastic. We could default to big or little
1579 instead. */
1580 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1582 for (section = abfd->sections;
1583 section != (asection *) NULL;
1584 section = section->next)
1586 bfd_byte *data = NULL;
1587 bfd_size_type datasize = 0;
1588 arelent **relbuf = NULL;
1589 arelent **relpp = NULL;
1590 arelent **relppend = NULL;
1591 unsigned long stop_offset;
1592 asymbol *sym = NULL;
1593 long place = 0;
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;
1603 if ((section->flags & SEC_RELOC) != 0
1604 #ifndef DISASSEMBLER_NEEDS_RELOCS
1605 && dump_reloc_info
1606 #endif
1609 long relsize;
1611 relsize = bfd_get_reloc_upper_bound (abfd, section);
1612 if (relsize < 0)
1613 bfd_fatal (bfd_get_filename (abfd));
1615 if (relsize > 0)
1617 long relcount;
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));
1624 /* Sort the relocs by address. */
1625 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1627 relpp = relbuf;
1628 relppend = relpp + relcount;
1630 /* Skip over the relocs belonging to addresses below the
1631 start address. */
1632 if (start_address != (bfd_vma) -1)
1634 while (relpp < relppend
1635 && (*relpp)->address < start_address)
1636 ++relpp;
1641 printf (_("Disassembly of section %s:\n"), section->name);
1643 datasize = bfd_get_section_size_before_reloc (section);
1644 if (datasize == 0)
1645 continue;
1647 data = (bfd_byte *) xmalloc ((size_t) datasize);
1649 bfd_get_section_contents (abfd, section, data, 0, datasize);
1651 aux.sec = section;
1652 disasm_info.buffer = data;
1653 disasm_info.buffer_vma = section->vma;
1654 disasm_info.buffer_length = datasize;
1655 disasm_info.section = section;
1656 if (start_address == (bfd_vma) -1
1657 || start_address < disasm_info.buffer_vma)
1658 addr_offset = 0;
1659 else
1660 addr_offset = start_address - disasm_info.buffer_vma;
1661 if (stop_address == (bfd_vma) -1)
1662 stop_offset = datasize / opb;
1663 else
1665 if (stop_address < disasm_info.buffer_vma)
1666 stop_offset = 0;
1667 else
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;
1673 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1674 true, &place);
1676 while (addr_offset < stop_offset)
1678 asymbol *nextsym;
1679 unsigned long nextstop_offset;
1680 boolean insns;
1682 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1684 int x;
1686 for (x = place;
1687 (x < sorted_symcount
1688 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1689 ++x)
1690 continue;
1691 disasm_info.symbols = & sorted_syms[place];
1692 disasm_info.num_symbols = x - place;
1694 else
1695 disasm_info.symbols = NULL;
1697 if (! prefix_addresses)
1699 printf ("\n");
1700 objdump_print_addr_with_sym (abfd, section, sym,
1701 section->vma + addr_offset,
1702 &disasm_info,
1703 false);
1704 printf (":\n");
1707 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1708 nextsym = sym;
1709 else if (sym == NULL)
1710 nextsym = NULL;
1711 else
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. */
1717 while (place < sorted_symcount
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];
1728 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1730 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1731 if (nextstop_offset > stop_offset)
1732 nextstop_offset = stop_offset;
1734 else if (nextsym == NULL)
1735 nextstop_offset = stop_offset;
1736 else
1738 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1739 if (nextstop_offset > stop_offset)
1740 nextstop_offset = stop_offset;
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
1748 || bfd_asymbol_value (sym) > section->vma + addr_offset
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;
1759 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1760 addr_offset, nextstop_offset, &relpp, relppend);
1762 addr_offset = nextstop_offset;
1763 sym = nextsym;
1766 free (data);
1767 if (relbuf != NULL)
1768 free (relbuf);
1770 free (sorted_syms);
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. */
1778 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1779 char *strsect_name));
1781 /* Dump the stabs sections from an object file that has a section that
1782 uses Sun stabs encoding. */
1784 static void
1785 dump_stabs (abfd)
1786 bfd *abfd;
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$");
1794 static bfd_byte *stabs;
1795 static bfd_size_type stab_size;
1797 static char *strtab;
1798 static bfd_size_type stabstr_size;
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. */
1805 static boolean
1806 read_section_stabs (abfd, stabsect_name, strsect_name)
1807 bfd *abfd;
1808 const char *stabsect_name;
1809 const char *strsect_name;
1811 asection *stabsect, *stabstrsect;
1813 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1814 if (0 == stabsect)
1816 printf (_("No %s section present\n\n"), stabsect_name);
1817 return false;
1820 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1821 if (0 == stabstrsect)
1823 non_fatal (_("%s has no %s section"),
1824 bfd_get_filename (abfd), strsect_name);
1825 exit_status = 1;
1826 return false;
1829 stab_size = bfd_section_size (abfd, stabsect);
1830 stabstr_size = bfd_section_size (abfd, stabstrsect);
1832 stabs = (bfd_byte *) xmalloc (stab_size);
1833 strtab = (char *) xmalloc (stabstr_size);
1835 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1837 non_fatal (_("Reading %s section of %s failed: %s"),
1838 stabsect_name, bfd_get_filename (abfd),
1839 bfd_errmsg (bfd_get_error ()));
1840 free (stabs);
1841 free (strtab);
1842 exit_status = 1;
1843 return false;
1846 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1847 stabstr_size))
1849 non_fatal (_("Reading %s section of %s failed: %s\n"),
1850 strsect_name, bfd_get_filename (abfd),
1851 bfd_errmsg (bfd_get_error ()));
1852 free (stabs);
1853 free (strtab);
1854 exit_status = 1;
1855 return false;
1858 return true;
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. */
1869 #define STRDXOFF (0)
1870 #define TYPEOFF (4)
1871 #define OTHEROFF (5)
1872 #define DESCOFF (6)
1873 #define VALOFF (8)
1874 #define STABSIZE (12)
1876 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1877 using string table section STRSECT_NAME (in `strtab'). */
1879 static void
1880 print_section_stabs (abfd, stabsect_name, strsect_name)
1881 bfd *abfd;
1882 const char *stabsect_name;
1883 const char *strsect_name ATTRIBUTE_UNUSED;
1885 int i;
1886 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1887 bfd_byte *stabp, *stabs_end;
1889 stabp = stabs;
1890 stabs_end = stabp + stab_size;
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");
1895 /* Loop through all symbols and print them.
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. */
1900 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1902 const char *name;
1903 unsigned long strx;
1904 unsigned char type, other;
1905 unsigned short desc;
1906 bfd_vma value;
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);
1914 printf ("\n%-6d ", i);
1915 /* Either print the stab name, or, if unnamed, print its number
1916 again (makes consistent formatting for tools like awk). */
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);
1925 bfd_printf_vma (abfd, value);
1926 printf (" %-6lu", strx);
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. */
1932 if (type == N_UNDF)
1934 file_string_table_offset = next_file_string_table_offset;
1935 next_file_string_table_offset += value;
1937 else
1939 /* Using the (possibly updated) string table offset, print the
1940 string (if any) associated with this symbol. */
1942 if ((strx + file_string_table_offset) < stabstr_size)
1943 printf (" %s", &strtab[strx + file_string_table_offset]);
1944 else
1945 printf (" *");
1948 printf ("\n\n");
1951 static void
1952 dump_section_stabs (abfd, stabsect_name, strsect_name)
1953 bfd *abfd;
1954 char *stabsect_name;
1955 char *strsect_name;
1957 asection *s;
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)
1965 int len;
1967 len = strlen (stabsect_name);
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'
1974 || ISDIGIT (s->name[len])))
1976 if (read_section_stabs (abfd, s->name, strsect_name))
1978 print_section_stabs (abfd, s->name, strsect_name);
1979 free (stabs);
1980 free (strtab);
1986 static void
1987 dump_bfd_header (abfd)
1988 bfd *abfd;
1990 char *comma = "";
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);
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");
2008 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2009 printf (_("\nstart address 0x"));
2010 bfd_printf_vma (abfd, abfd->start_address);
2011 printf ("\n");
2014 static void
2015 dump_bfd_private_header (abfd)
2016 bfd *abfd;
2018 bfd_print_private_bfd_data (abfd, stdout);
2021 /* Dump selected contents of ABFD */
2023 static void
2024 dump_bfd (abfd)
2025 bfd *abfd;
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)
2032 asection *s;
2034 for (s = abfd->sections; s != NULL; s = s->next)
2036 s->vma += adjust_section_vma;
2037 s->lma += adjust_section_vma;
2041 if (dump_ar_hdrs)
2042 print_arelt_descr (stdout, abfd, true);
2043 if (dump_file_header)
2044 dump_bfd_header (abfd);
2045 if (dump_private_headers)
2046 dump_bfd_private_header (abfd);
2047 putchar ('\n');
2048 if (dump_section_headers)
2049 dump_headers (abfd);
2051 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2052 syms = slurp_symtab (abfd);
2053 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2054 dynsyms = slurp_dynamic_symtab (abfd);
2056 if (dump_symtab)
2057 dump_symbols (abfd, false);
2058 if (dump_dynamic_symtab)
2059 dump_symbols (abfd, true);
2060 if (dump_stab_section_info)
2061 dump_stabs (abfd);
2062 if (dump_reloc_info && ! disassemble)
2063 dump_relocs (abfd);
2064 if (dump_dynamic_reloc_info)
2065 dump_dynamic_relocs (abfd);
2066 if (dump_section_contents)
2067 dump_data (abfd);
2068 if (disassemble)
2069 disassemble_data (abfd);
2070 if (dump_debugging)
2072 PTR dhandle;
2074 dhandle = read_debugging_info (abfd, syms, symcount);
2075 if (dhandle != NULL)
2077 if (! print_debugging_info (stdout, dhandle))
2079 non_fatal (_("%s: printing debugging information failed"),
2080 bfd_get_filename (abfd));
2081 exit_status = 1;
2086 if (syms)
2088 free (syms);
2089 syms = NULL;
2092 if (dynsyms)
2094 free (dynsyms);
2095 dynsyms = NULL;
2099 static void
2100 display_bfd (abfd)
2101 bfd *abfd;
2103 char **matching;
2105 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2107 dump_bfd (abfd);
2108 return;
2111 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2113 nonfatal (bfd_get_filename (abfd));
2114 list_matching_formats (matching);
2115 free (matching);
2116 return;
2119 if (bfd_get_error () != bfd_error_file_not_recognized)
2121 nonfatal (bfd_get_filename (abfd));
2122 return;
2125 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2127 dump_bfd (abfd);
2128 return;
2131 nonfatal (bfd_get_filename (abfd));
2133 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2135 list_matching_formats (matching);
2136 free (matching);
2140 static void
2141 display_file (filename, target)
2142 char *filename;
2143 char *target;
2145 bfd *file, *arfile = (bfd *) NULL;
2147 file = bfd_openr (filename, target);
2148 if (file == NULL)
2150 nonfatal (filename);
2151 return;
2154 if (bfd_check_format (file, bfd_archive) == true)
2156 bfd *last_arfile = NULL;
2158 printf (_("In archive %s:\n"), bfd_get_filename (file));
2159 for (;;)
2161 bfd_set_error (bfd_error_no_error);
2163 arfile = bfd_openr_next_archived_file (file, arfile);
2164 if (arfile == NULL)
2166 if (bfd_get_error () != bfd_error_no_more_archived_files)
2167 nonfatal (bfd_get_filename (file));
2168 break;
2171 display_bfd (arfile);
2173 if (last_arfile != NULL)
2174 bfd_close (last_arfile);
2175 last_arfile = arfile;
2178 if (last_arfile != NULL)
2179 bfd_close (last_arfile);
2181 else
2182 display_bfd (file);
2184 bfd_close (file);
2187 /* Actually display the various requested regions */
2189 static void
2190 dump_data (abfd)
2191 bfd *abfd;
2193 asection *section;
2194 bfd_byte *data = 0;
2195 bfd_size_type datasize = 0;
2196 bfd_size_type addr_offset;
2197 bfd_size_type start_offset, stop_offset;
2198 unsigned int opb = bfd_octets_per_byte (abfd);
2200 for (section = abfd->sections; section != NULL; section =
2201 section->next)
2203 int onaline = 16;
2205 if (only == (char *) NULL ||
2206 strcmp (only, section->name) == 0)
2208 if (section->flags & SEC_HAS_CONTENTS)
2210 printf (_("Contents of section %s:\n"), section->name);
2212 if (bfd_section_size (abfd, section) == 0)
2213 continue;
2214 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2215 datasize = bfd_section_size (abfd, section);
2218 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2220 if (start_address == (bfd_vma) -1
2221 || start_address < section->vma)
2222 start_offset = 0;
2223 else
2224 start_offset = start_address - section->vma;
2225 if (stop_address == (bfd_vma) -1)
2226 stop_offset = bfd_section_size (abfd, section) / opb;
2227 else
2229 if (stop_address < section->vma)
2230 stop_offset = 0;
2231 else
2232 stop_offset = stop_address - section->vma;
2233 if (stop_offset > bfd_section_size (abfd, section) / opb)
2234 stop_offset = bfd_section_size (abfd, section) / opb;
2236 for (addr_offset = start_offset;
2237 addr_offset < stop_offset; addr_offset += onaline)
2239 bfd_size_type j;
2241 printf (" %04lx ", (unsigned long int)
2242 (addr_offset + section->vma));
2243 for (j = addr_offset * opb;
2244 j < addr_offset * opb + onaline; j++)
2246 if (j < stop_offset * opb)
2247 printf ("%02x", (unsigned) (data[j]));
2248 else
2249 printf (" ");
2250 if ((j & 3) == 3)
2251 printf (" ");
2254 printf (" ");
2255 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2257 if (j >= stop_offset * opb)
2258 printf (" ");
2259 else
2260 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2262 putchar ('\n');
2264 free (data);
2270 /* Should perhaps share code and display with nm? */
2271 static void
2272 dump_symbols (abfd, dynamic)
2273 bfd *abfd ATTRIBUTE_UNUSED;
2274 boolean dynamic;
2276 asymbol **current;
2277 long max;
2278 long count;
2280 if (dynamic)
2282 current = dynsyms;
2283 max = dynsymcount;
2284 printf ("DYNAMIC SYMBOL TABLE:\n");
2286 else
2288 current = syms;
2289 max = symcount;
2290 printf ("SYMBOL TABLE:\n");
2293 if (max == 0)
2294 printf (_("no symbols\n"));
2296 for (count = 0; count < max; count++)
2298 if (*current)
2300 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2302 if (cur_bfd != NULL)
2304 const char *name;
2305 char *alloc;
2307 name = (*current)->name;
2308 alloc = NULL;
2309 if (do_demangle && name != NULL && *name != '\0')
2311 /* If we want to demangle the name, we demangle it
2312 here, and temporarily clobber it while calling
2313 bfd_print_symbol. FIXME: This is a gross hack. */
2315 alloc = demangle (cur_bfd, name);
2316 (*current)->name = alloc;
2319 bfd_print_symbol (cur_bfd, stdout, *current,
2320 bfd_print_symbol_all);
2322 (*current)->name = name;
2323 if (alloc != NULL)
2324 free (alloc);
2326 printf ("\n");
2329 current++;
2331 printf ("\n");
2332 printf ("\n");
2335 static void
2336 dump_relocs (abfd)
2337 bfd *abfd;
2339 arelent **relpp;
2340 long relcount;
2341 asection *a;
2343 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2345 long relsize;
2347 if (bfd_is_abs_section (a))
2348 continue;
2349 if (bfd_is_und_section (a))
2350 continue;
2351 if (bfd_is_com_section (a))
2352 continue;
2354 if (only)
2356 if (strcmp (only, a->name))
2357 continue;
2359 else if ((a->flags & SEC_RELOC) == 0)
2360 continue;
2362 relsize = bfd_get_reloc_upper_bound (abfd, a);
2363 if (relsize < 0)
2364 bfd_fatal (bfd_get_filename (abfd));
2366 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2368 if (relsize == 0)
2370 printf (" (none)\n\n");
2372 else
2374 relpp = (arelent **) xmalloc (relsize);
2375 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2376 if (relcount < 0)
2377 bfd_fatal (bfd_get_filename (abfd));
2378 else if (relcount == 0)
2380 printf (" (none)\n\n");
2382 else
2384 printf ("\n");
2385 dump_reloc_set (abfd, a, relpp, relcount);
2386 printf ("\n\n");
2388 free (relpp);
2393 static void
2394 dump_dynamic_relocs (abfd)
2395 bfd *abfd;
2397 long relsize;
2398 arelent **relpp;
2399 long relcount;
2401 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2402 if (relsize < 0)
2403 bfd_fatal (bfd_get_filename (abfd));
2405 printf ("DYNAMIC RELOCATION RECORDS");
2407 if (relsize == 0)
2409 printf (" (none)\n\n");
2411 else
2413 relpp = (arelent **) xmalloc (relsize);
2414 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2415 if (relcount < 0)
2416 bfd_fatal (bfd_get_filename (abfd));
2417 else if (relcount == 0)
2419 printf (" (none)\n\n");
2421 else
2423 printf ("\n");
2424 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2425 printf ("\n\n");
2427 free (relpp);
2431 static void
2432 dump_reloc_set (abfd, sec, relpp, relcount)
2433 bfd *abfd;
2434 asection *sec;
2435 arelent **relpp;
2436 long relcount;
2438 arelent **p;
2439 char *last_filename, *last_functionname;
2440 unsigned int last_line;
2442 /* Get column headers lined up reasonably. */
2444 static int width;
2445 if (width == 0)
2447 char buf[30];
2448 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2449 width = strlen (buf) - 7;
2451 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2454 last_filename = NULL;
2455 last_functionname = NULL;
2456 last_line = 0;
2458 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2460 arelent *q = *p;
2461 const char *filename, *functionname;
2462 unsigned int line;
2463 const char *sym_name;
2464 const char *section_name;
2466 if (start_address != (bfd_vma) -1
2467 && q->address < start_address)
2468 continue;
2469 if (stop_address != (bfd_vma) -1
2470 && q->address > stop_address)
2471 continue;
2473 if (with_line_numbers
2474 && sec != NULL
2475 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2476 &filename, &functionname, &line))
2478 if (functionname != NULL
2479 && (last_functionname == NULL
2480 || strcmp (functionname, last_functionname) != 0))
2482 printf ("%s():\n", functionname);
2483 if (last_functionname != NULL)
2484 free (last_functionname);
2485 last_functionname = xstrdup (functionname);
2487 if (line > 0
2488 && (line != last_line
2489 || (filename != NULL
2490 && last_filename != NULL
2491 && strcmp (filename, last_filename) != 0)))
2493 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2494 last_line = line;
2495 if (last_filename != NULL)
2496 free (last_filename);
2497 if (filename == NULL)
2498 last_filename = NULL;
2499 else
2500 last_filename = xstrdup (filename);
2504 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2506 sym_name = (*(q->sym_ptr_ptr))->name;
2507 section_name = (*(q->sym_ptr_ptr))->section->name;
2509 else
2511 sym_name = NULL;
2512 section_name = NULL;
2514 if (sym_name)
2516 bfd_printf_vma (abfd, q->address);
2517 if (q->howto->name)
2518 printf (" %-16s ", q->howto->name);
2519 else
2520 printf (" %-16d ", q->howto->type);
2521 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2522 *q->sym_ptr_ptr);
2524 else
2526 if (section_name == (const char *) NULL)
2527 section_name = "*unknown*";
2528 bfd_printf_vma (abfd, q->address);
2529 printf (" %-16s [%s]",
2530 q->howto->name,
2531 section_name);
2533 if (q->addend)
2535 printf ("+0x");
2536 bfd_printf_vma (abfd, q->addend);
2538 printf ("\n");
2542 /* The length of the longest architecture name + 1. */
2543 #define LONGEST_ARCH sizeof("powerpc:common")
2545 static const char *
2546 endian_string (endian)
2547 enum bfd_endian endian;
2549 if (endian == BFD_ENDIAN_BIG)
2550 return "big endian";
2551 else if (endian == BFD_ENDIAN_LITTLE)
2552 return "little endian";
2553 else
2554 return "endianness unknown";
2557 /* List the targets that BFD is configured to support, each followed
2558 by its endianness and the architectures it supports. */
2560 static void
2561 display_target_list ()
2563 extern const bfd_target *const *bfd_target_vector;
2564 char *dummy_name;
2565 int t;
2567 dummy_name = make_temp_file (NULL);
2568 for (t = 0; bfd_target_vector[t]; t++)
2570 const bfd_target *p = bfd_target_vector[t];
2571 bfd *abfd = bfd_openw (dummy_name, p->name);
2572 int a;
2574 printf ("%s\n (header %s, data %s)\n", p->name,
2575 endian_string (p->header_byteorder),
2576 endian_string (p->byteorder));
2578 if (abfd == NULL)
2580 nonfatal (dummy_name);
2581 continue;
2584 if (! bfd_set_format (abfd, bfd_object))
2586 if (bfd_get_error () != bfd_error_invalid_operation)
2587 nonfatal (p->name);
2588 bfd_close_all_done (abfd);
2589 continue;
2592 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2593 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2594 printf (" %s\n",
2595 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2596 bfd_close_all_done (abfd);
2598 unlink (dummy_name);
2599 free (dummy_name);
2602 /* Print a table showing which architectures are supported for entries
2603 FIRST through LAST-1 of bfd_target_vector (targets across,
2604 architectures down). */
2606 static void
2607 display_info_table (first, last)
2608 int first;
2609 int last;
2611 extern const bfd_target *const *bfd_target_vector;
2612 int t, a;
2613 char *dummy_name;
2615 /* Print heading of target names. */
2616 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2617 for (t = first; t < last && bfd_target_vector[t]; t++)
2618 printf ("%s ", bfd_target_vector[t]->name);
2619 putchar ('\n');
2621 dummy_name = make_temp_file (NULL);
2622 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2623 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2625 printf ("%*s ", (int) LONGEST_ARCH - 1,
2626 bfd_printable_arch_mach (a, 0));
2627 for (t = first; t < last && bfd_target_vector[t]; t++)
2629 const bfd_target *p = bfd_target_vector[t];
2630 boolean ok = true;
2631 bfd *abfd = bfd_openw (dummy_name, p->name);
2633 if (abfd == NULL)
2635 nonfatal (p->name);
2636 ok = false;
2639 if (ok)
2641 if (! bfd_set_format (abfd, bfd_object))
2643 if (bfd_get_error () != bfd_error_invalid_operation)
2644 nonfatal (p->name);
2645 ok = false;
2649 if (ok)
2651 if (! bfd_set_arch_mach (abfd, a, 0))
2652 ok = false;
2655 if (ok)
2656 printf ("%s ", p->name);
2657 else
2659 int l = strlen (p->name);
2660 while (l--)
2661 putchar ('-');
2662 putchar (' ');
2664 if (abfd != NULL)
2665 bfd_close_all_done (abfd);
2667 putchar ('\n');
2669 unlink (dummy_name);
2670 free (dummy_name);
2673 /* Print tables of all the target-architecture combinations that
2674 BFD has been configured to support. */
2676 static void
2677 display_target_tables ()
2679 int t, columns;
2680 extern const bfd_target *const *bfd_target_vector;
2681 char *colum;
2683 columns = 0;
2684 colum = getenv ("COLUMNS");
2685 if (colum != NULL)
2686 columns = atoi (colum);
2687 if (columns == 0)
2688 columns = 80;
2690 t = 0;
2691 while (bfd_target_vector[t] != NULL)
2693 int oldt = t, wid;
2695 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2696 ++t;
2697 while (wid < columns && bfd_target_vector[t] != NULL)
2699 int newwid;
2701 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2702 if (newwid >= columns)
2703 break;
2704 wid = newwid;
2705 ++t;
2707 display_info_table (oldt, t);
2711 static void
2712 display_info ()
2714 printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
2715 display_target_list ();
2716 display_target_tables ();
2719 int main PARAMS ((int, char **));
2722 main (argc, argv)
2723 int argc;
2724 char **argv;
2726 int c;
2727 char *target = default_target;
2728 boolean seenflag = false;
2730 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2731 setlocale (LC_MESSAGES, "");
2732 #endif
2733 #if defined (HAVE_SETLOCALE)
2734 setlocale (LC_CTYPE, "");
2735 #endif
2736 bindtextdomain (PACKAGE, LOCALEDIR);
2737 textdomain (PACKAGE);
2739 program_name = *argv;
2740 xmalloc_set_program_name (program_name);
2742 START_PROGRESS (program_name, 0);
2744 bfd_init ();
2745 set_default_bfd_target ();
2747 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSj:wE:zgG",
2748 long_options, (int *) 0))
2749 != EOF)
2751 switch (c)
2753 case 0:
2754 break; /* We've been given a long option. */
2755 case 'm':
2756 machine = optarg;
2757 break;
2758 case 'M':
2759 disassembler_options = optarg;
2760 break;
2761 case 'j':
2762 only = optarg;
2763 break;
2764 case 'l':
2765 with_line_numbers = true;
2766 break;
2767 case 'b':
2768 target = optarg;
2769 break;
2770 case 'C':
2771 do_demangle = true;
2772 if (optarg != NULL)
2774 enum demangling_styles style;
2776 style = cplus_demangle_name_to_style (optarg);
2777 if (style == unknown_demangling)
2778 fatal (_("unknown demangling style `%s'"),
2779 optarg);
2781 cplus_demangle_set_style (style);
2783 break;
2784 case 'w':
2785 wide_output = true;
2786 break;
2787 case OPTION_ADJUST_VMA:
2788 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2789 break;
2790 case OPTION_START_ADDRESS:
2791 start_address = parse_vma (optarg, "--start-address");
2792 break;
2793 case OPTION_STOP_ADDRESS:
2794 stop_address = parse_vma (optarg, "--stop-address");
2795 break;
2796 case 'E':
2797 if (strcmp (optarg, "B") == 0)
2798 endian = BFD_ENDIAN_BIG;
2799 else if (strcmp (optarg, "L") == 0)
2800 endian = BFD_ENDIAN_LITTLE;
2801 else
2803 non_fatal (_("unrecognized -E option"));
2804 usage (stderr, 1);
2806 break;
2807 case OPTION_ENDIAN:
2808 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2809 endian = BFD_ENDIAN_BIG;
2810 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2811 endian = BFD_ENDIAN_LITTLE;
2812 else
2814 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2815 usage (stderr, 1);
2817 break;
2819 case 'f':
2820 dump_file_header = true;
2821 seenflag = true;
2822 break;
2823 case 'i':
2824 formats_info = true;
2825 seenflag = true;
2826 break;
2827 case 'p':
2828 dump_private_headers = true;
2829 seenflag = true;
2830 break;
2831 case 'x':
2832 dump_private_headers = true;
2833 dump_symtab = true;
2834 dump_reloc_info = true;
2835 dump_file_header = true;
2836 dump_ar_hdrs = true;
2837 dump_section_headers = true;
2838 seenflag = true;
2839 break;
2840 case 't':
2841 dump_symtab = true;
2842 seenflag = true;
2843 break;
2844 case 'T':
2845 dump_dynamic_symtab = true;
2846 seenflag = true;
2847 break;
2848 case 'd':
2849 disassemble = true;
2850 seenflag = true;
2851 break;
2852 case 'z':
2853 disassemble_zeroes = true;
2854 break;
2855 case 'D':
2856 disassemble = true;
2857 disassemble_all = true;
2858 seenflag = true;
2859 break;
2860 case 'S':
2861 disassemble = true;
2862 with_source_code = true;
2863 seenflag = true;
2864 break;
2865 case 'g':
2866 dump_debugging = 1;
2867 seenflag = true;
2868 break;
2869 case 'G':
2870 dump_stab_section_info = true;
2871 seenflag = true;
2872 break;
2873 case 's':
2874 dump_section_contents = true;
2875 seenflag = true;
2876 break;
2877 case 'r':
2878 dump_reloc_info = true;
2879 seenflag = true;
2880 break;
2881 case 'R':
2882 dump_dynamic_reloc_info = true;
2883 seenflag = true;
2884 break;
2885 case 'a':
2886 dump_ar_hdrs = true;
2887 seenflag = true;
2888 break;
2889 case 'h':
2890 dump_section_headers = true;
2891 seenflag = true;
2892 break;
2893 case 'H':
2894 usage (stdout, 0);
2895 seenflag = true;
2896 case 'v':
2897 case 'V':
2898 show_version = true;
2899 seenflag = true;
2900 break;
2902 default:
2903 usage (stderr, 1);
2907 if (show_version)
2908 print_version ("objdump");
2910 if (seenflag == false)
2911 usage (stderr, 2);
2913 if (formats_info)
2914 display_info ();
2915 else
2917 if (optind == argc)
2918 display_file ("a.out", target);
2919 else
2920 for (; optind < argc;)
2921 display_file (argv[optind++], target);
2924 END_PROGRESS (program_name);
2926 return exit_status;