* elf.c (_bfd_elf_make_section_from_shdr): Set SEC_THREAD_LOCAL
[binutils.git] / binutils / objdump.c
blobdce1308c3fb11916f581b7c33d5a184c12ae27fb
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
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 "getopt.h"
26 #include "safe-ctype.h"
27 #include "dis-asm.h"
28 #include "libiberty.h"
29 #include "demangle.h"
30 #include "debug.h"
31 #include "budbg.h"
33 /* Internal headers for the ELF .stab-dump code - sorry. */
34 #define BYTES_IN_WORD 32
35 #include "aout/aout64.h"
37 #ifdef NEED_DECLARATION_FPRINTF
38 /* This is needed by INIT_DISASSEMBLE_INFO. */
39 extern int fprintf PARAMS ((FILE *, const char *, ...));
40 #endif
42 /* Exit status. */
43 static int exit_status = 0;
45 static char *default_target = NULL; /* default at runtime */
47 static int show_version = 0; /* show the version number */
48 static int dump_section_contents; /* -s */
49 static int dump_section_headers; /* -h */
50 static boolean dump_file_header; /* -f */
51 static int dump_symtab; /* -t */
52 static int dump_dynamic_symtab; /* -T */
53 static int dump_reloc_info; /* -r */
54 static int dump_dynamic_reloc_info; /* -R */
55 static int dump_ar_hdrs; /* -a */
56 static int dump_private_headers; /* -p */
57 static int prefix_addresses; /* --prefix-addresses */
58 static int with_line_numbers; /* -l */
59 static boolean with_source_code; /* -S */
60 static int show_raw_insn; /* --show-raw-insn */
61 static int dump_stab_section_info; /* --stabs */
62 static int do_demangle; /* -C, --demangle */
63 static boolean disassemble; /* -d */
64 static boolean disassemble_all; /* -D */
65 static int disassemble_zeroes; /* --disassemble-zeroes */
66 static boolean formats_info; /* -i */
67 static char *only; /* -j secname */
68 static int wide_output; /* -w */
69 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
70 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
71 static int dump_debugging; /* --debugging */
72 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
73 static int file_start_context = 0; /* --file-start-context */
75 /* Extra info to pass to the disassembler address printing function. */
76 struct objdump_disasm_info {
77 bfd *abfd;
78 asection *sec;
79 boolean require_sec;
82 /* Architecture to disassemble for, or default if NULL. */
83 static char *machine = (char *) NULL;
85 /* Target specific options to the disassembler. */
86 static char *disassembler_options = (char *) NULL;
88 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
89 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
91 /* The symbol table. */
92 static asymbol **syms;
94 /* Number of symbols in `syms'. */
95 static long symcount = 0;
97 /* The sorted symbol table. */
98 static asymbol **sorted_syms;
100 /* Number of symbols in `sorted_syms'. */
101 static long sorted_symcount = 0;
103 /* The dynamic symbol table. */
104 static asymbol **dynsyms;
106 /* Number of symbols in `dynsyms'. */
107 static long dynsymcount = 0;
109 /* Static declarations. */
111 static void usage PARAMS ((FILE *, int));
112 static void nonfatal PARAMS ((const char *));
113 static void display_file PARAMS ((char *filename, char *target));
114 static void dump_section_header PARAMS ((bfd *, asection *, PTR));
115 static void dump_headers PARAMS ((bfd *));
116 static void dump_data PARAMS ((bfd *abfd));
117 static void dump_relocs PARAMS ((bfd *abfd));
118 static void dump_dynamic_relocs PARAMS ((bfd * abfd));
119 static void dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
120 static void dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
121 static void dump_bfd_header PARAMS ((bfd *));
122 static void dump_bfd_private_header PARAMS ((bfd *));
123 static void dump_bfd PARAMS ((bfd *));
124 static void display_bfd PARAMS ((bfd *abfd));
125 static void display_target_list PARAMS ((void));
126 static void display_info_table PARAMS ((int, int));
127 static void display_target_tables PARAMS ((void));
128 static void display_info PARAMS ((void));
129 static void objdump_print_value
130 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
131 static void objdump_print_symname
132 PARAMS ((bfd *, struct disassemble_info *, asymbol *));
133 static asymbol *find_symbol_for_address
134 PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
135 static void objdump_print_addr_with_sym
136 PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
137 struct disassemble_info *, boolean));
138 static void objdump_print_addr
139 PARAMS ((bfd_vma, struct disassemble_info *, boolean));
140 static void objdump_print_address
141 PARAMS ((bfd_vma, struct disassemble_info *));
142 static int objdump_symbol_at_address
143 PARAMS ((bfd_vma, struct disassemble_info *));
144 static void show_line PARAMS ((bfd *, asection *, bfd_vma));
145 static void disassemble_bytes
146 PARAMS ((struct disassemble_info *, disassembler_ftype, boolean,
147 bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
148 static void disassemble_data PARAMS ((bfd *));
149 static const char *endian_string PARAMS ((enum bfd_endian));
150 static asymbol ** slurp_symtab PARAMS ((bfd *));
151 static asymbol ** slurp_dynamic_symtab PARAMS ((bfd *));
152 static long remove_useless_symbols PARAMS ((asymbol **, long));
153 static int compare_symbols PARAMS ((const PTR, const PTR));
154 static int compare_relocs PARAMS ((const PTR, const PTR));
155 static void dump_stabs PARAMS ((bfd *));
156 static boolean read_section_stabs PARAMS ((bfd *, const char *, const char *));
157 static void print_section_stabs PARAMS ((bfd *, const char *, const char *));
159 static void
160 usage (stream, status)
161 FILE *stream;
162 int status;
164 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
165 fprintf (stream, _(" Display information from object <file(s)>.\n"));
166 fprintf (stream, _(" At least one of the following switches must be given:\n"));
167 fprintf (stream, _("\
168 -a, --archive-headers Display archive header information\n\
169 -f, --file-headers Display the contents of the overall file header\n\
170 -p, --private-headers Display object format specific file header contents\n\
171 -h, --[section-]headers Display the contents of the section headers\n\
172 -x, --all-headers Display the contents of all headers\n\
173 -d, --disassemble Display assembler contents of executable sections\n\
174 -D, --disassemble-all Display assembler contents of all sections\n\
175 -S, --source Intermix source code with disassembly\n\
176 -s, --full-contents Display the full contents of all sections requested\n\
177 -g, --debugging Display debug information in object file\n\
178 -G, --stabs Display (in raw form) any STABS info in the file\n\
179 -t, --syms Display the contents of the symbol table(s)\n\
180 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
181 -r, --reloc Display the relocation entries in the file\n\
182 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
183 -v, --version Display this program's version number\n\
184 -i, --info List object formats and architectures supported\n\
185 -H, --help Display this information\n\
186 "));
187 if (status != 2)
189 fprintf (stream, _("\n The following switches are optional:\n"));
190 fprintf (stream, _("\
191 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
192 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
193 -j, --section=NAME Only display information for section NAME\n\
194 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
195 -EB --endian=big Assume big endian format when disassembling\n\
196 -EL --endian=little Assume little endian format when disassembling\n\
197 --file-start-context Include context from start of file (with -S)\n\
198 -l, --line-numbers Include line numbers and filenames in output\n\
199 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
200 The STYLE, if specified, can be `auto', 'gnu',\n\
201 'lucid', 'arm', 'hp', 'edg', or 'gnu-new-abi'\n\
202 -w, --wide Format output for more than 80 columns\n\
203 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
204 --start-address=ADDR Only process data whoes address is >= ADDR\n\
205 --stop-address=ADDR Only process data whoes address is <= ADDR\n\
206 --prefix-addresses Print complete address alongside disassembly\n\
207 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
208 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
209 \n"));
210 list_supported_targets (program_name, stream);
211 list_supported_architectures (program_name, stream);
213 disassembler_usage (stream);
215 if (status == 0)
216 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
217 exit (status);
220 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
222 #define OPTION_ENDIAN (150)
223 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
224 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
225 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
227 static struct option long_options[]=
229 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
230 {"all-headers", no_argument, NULL, 'x'},
231 {"private-headers", no_argument, NULL, 'p'},
232 {"architecture", required_argument, NULL, 'm'},
233 {"archive-headers", no_argument, NULL, 'a'},
234 {"debugging", no_argument, NULL, 'g'},
235 {"demangle", optional_argument, NULL, 'C'},
236 {"disassemble", no_argument, NULL, 'd'},
237 {"disassemble-all", no_argument, NULL, 'D'},
238 {"disassembler-options", required_argument, NULL, 'M'},
239 {"disassemble-zeroes", no_argument, NULL, 'z'},
240 {"dynamic-reloc", no_argument, NULL, 'R'},
241 {"dynamic-syms", no_argument, NULL, 'T'},
242 {"endian", required_argument, NULL, OPTION_ENDIAN},
243 {"file-headers", no_argument, NULL, 'f'},
244 {"file-start-context", no_argument, &file_start_context, 1},
245 {"full-contents", no_argument, NULL, 's'},
246 {"headers", no_argument, NULL, 'h'},
247 {"help", no_argument, NULL, 'H'},
248 {"info", no_argument, NULL, 'i'},
249 {"line-numbers", no_argument, NULL, 'l'},
250 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
251 {"prefix-addresses", no_argument, &prefix_addresses, 1},
252 {"reloc", no_argument, NULL, 'r'},
253 {"section", required_argument, NULL, 'j'},
254 {"section-headers", no_argument, NULL, 'h'},
255 {"show-raw-insn", no_argument, &show_raw_insn, 1},
256 {"source", no_argument, NULL, 'S'},
257 {"stabs", no_argument, NULL, 'G'},
258 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
259 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
260 {"syms", no_argument, NULL, 't'},
261 {"target", required_argument, NULL, 'b'},
262 {"version", no_argument, NULL, 'V'},
263 {"wide", no_argument, NULL, 'w'},
264 {0, no_argument, 0, 0}
267 static void
268 nonfatal (msg)
269 const char *msg;
271 bfd_nonfatal (msg);
272 exit_status = 1;
275 static void
276 dump_section_header (abfd, section, ignored)
277 bfd *abfd ATTRIBUTE_UNUSED;
278 asection *section;
279 PTR ignored ATTRIBUTE_UNUSED;
281 char *comma = "";
282 unsigned int opb = bfd_octets_per_byte (abfd);
284 printf ("%3d %-13s %08lx ", section->index,
285 bfd_get_section_name (abfd, section),
286 (unsigned long) bfd_section_size (abfd, section) / opb);
287 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
288 printf (" ");
289 bfd_printf_vma (abfd, section->lma);
290 printf (" %08lx 2**%u", (unsigned long) section->filepos,
291 bfd_get_section_alignment (abfd, section));
292 if (! wide_output)
293 printf ("\n ");
294 printf (" ");
296 #define PF(x, y) \
297 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
299 PF (SEC_HAS_CONTENTS, "CONTENTS");
300 PF (SEC_ALLOC, "ALLOC");
301 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
302 PF (SEC_LOAD, "LOAD");
303 PF (SEC_RELOC, "RELOC");
304 PF (SEC_READONLY, "READONLY");
305 PF (SEC_CODE, "CODE");
306 PF (SEC_DATA, "DATA");
307 PF (SEC_ROM, "ROM");
308 PF (SEC_DEBUGGING, "DEBUGGING");
309 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
310 PF (SEC_EXCLUDE, "EXCLUDE");
311 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
312 PF (SEC_BLOCK, "BLOCK");
313 PF (SEC_CLINK, "CLINK");
314 PF (SEC_SMALL_DATA, "SMALL_DATA");
315 PF (SEC_SHARED, "SHARED");
316 PF (SEC_ARCH_BIT_0, "ARCH_BIT_0");
317 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
319 if ((section->flags & SEC_LINK_ONCE) != 0)
321 const char *ls;
323 switch (section->flags & SEC_LINK_DUPLICATES)
325 default:
326 abort ();
327 case SEC_LINK_DUPLICATES_DISCARD:
328 ls = "LINK_ONCE_DISCARD";
329 break;
330 case SEC_LINK_DUPLICATES_ONE_ONLY:
331 ls = "LINK_ONCE_ONE_ONLY";
332 break;
333 case SEC_LINK_DUPLICATES_SAME_SIZE:
334 ls = "LINK_ONCE_SAME_SIZE";
335 break;
336 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
337 ls = "LINK_ONCE_SAME_CONTENTS";
338 break;
340 printf ("%s%s", comma, ls);
342 if (section->comdat != NULL)
343 printf (" (COMDAT %s %ld)", section->comdat->name,
344 section->comdat->symbol);
346 comma = ", ";
349 printf ("\n");
350 #undef PF
353 static void
354 dump_headers (abfd)
355 bfd *abfd;
357 printf (_("Sections:\n"));
359 #ifndef BFD64
360 printf (_("Idx Name Size VMA LMA File off Algn"));
361 #else
362 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
363 if (bfd_get_arch_size (abfd) == 32)
364 printf (_("Idx Name Size VMA LMA File off Algn"));
365 else
366 printf (_("Idx Name Size VMA LMA File off Algn"));
367 #endif
369 if (wide_output)
370 printf (_(" Flags"));
371 printf ("\n");
373 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
376 static asymbol **
377 slurp_symtab (abfd)
378 bfd *abfd;
380 asymbol **sy = (asymbol **) NULL;
381 long storage;
383 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
385 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
386 symcount = 0;
387 return NULL;
390 storage = bfd_get_symtab_upper_bound (abfd);
391 if (storage < 0)
392 bfd_fatal (bfd_get_filename (abfd));
394 if (storage)
396 sy = (asymbol **) xmalloc (storage);
398 symcount = bfd_canonicalize_symtab (abfd, sy);
399 if (symcount < 0)
400 bfd_fatal (bfd_get_filename (abfd));
401 if (symcount == 0)
402 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
403 return sy;
406 /* Read in the dynamic symbols. */
408 static asymbol **
409 slurp_dynamic_symtab (abfd)
410 bfd *abfd;
412 asymbol **sy = (asymbol **) NULL;
413 long storage;
415 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
416 if (storage < 0)
418 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
420 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
421 dynsymcount = 0;
422 return NULL;
425 bfd_fatal (bfd_get_filename (abfd));
428 if (storage)
430 sy = (asymbol **) xmalloc (storage);
432 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
433 if (dynsymcount < 0)
434 bfd_fatal (bfd_get_filename (abfd));
435 if (dynsymcount == 0)
436 non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd));
437 return sy;
440 /* Filter out (in place) symbols that are useless for disassembly.
441 COUNT is the number of elements in SYMBOLS.
442 Return the number of useful symbols. */
444 static long
445 remove_useless_symbols (symbols, count)
446 asymbol **symbols;
447 long count;
449 register asymbol **in_ptr = symbols, **out_ptr = symbols;
451 while (--count >= 0)
453 asymbol *sym = *in_ptr++;
455 if (sym->name == NULL || sym->name[0] == '\0')
456 continue;
457 if (sym->flags & (BSF_DEBUGGING))
458 continue;
459 if (bfd_is_und_section (sym->section)
460 || bfd_is_com_section (sym->section))
461 continue;
463 *out_ptr++ = sym;
465 return out_ptr - symbols;
468 /* Sort symbols into value order. */
470 static int
471 compare_symbols (ap, bp)
472 const PTR ap;
473 const PTR bp;
475 const asymbol *a = *(const asymbol **)ap;
476 const asymbol *b = *(const asymbol **)bp;
477 const char *an, *bn;
478 size_t anl, bnl;
479 boolean af, bf;
480 flagword aflags, bflags;
482 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
483 return 1;
484 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
485 return -1;
487 if (a->section > b->section)
488 return 1;
489 else if (a->section < b->section)
490 return -1;
492 an = bfd_asymbol_name (a);
493 bn = bfd_asymbol_name (b);
494 anl = strlen (an);
495 bnl = strlen (bn);
497 /* The symbols gnu_compiled and gcc2_compiled convey no real
498 information, so put them after other symbols with the same value. */
500 af = (strstr (an, "gnu_compiled") != NULL
501 || strstr (an, "gcc2_compiled") != NULL);
502 bf = (strstr (bn, "gnu_compiled") != NULL
503 || strstr (bn, "gcc2_compiled") != NULL);
505 if (af && ! bf)
506 return 1;
507 if (! af && bf)
508 return -1;
510 /* We use a heuristic for the file name, to try to sort it after
511 more useful symbols. It may not work on non Unix systems, but it
512 doesn't really matter; the only difference is precisely which
513 symbol names get printed. */
515 #define file_symbol(s, sn, snl) \
516 (((s)->flags & BSF_FILE) != 0 \
517 || ((sn)[(snl) - 2] == '.' \
518 && ((sn)[(snl) - 1] == 'o' \
519 || (sn)[(snl) - 1] == 'a')))
521 af = file_symbol (a, an, anl);
522 bf = file_symbol (b, bn, bnl);
524 if (af && ! bf)
525 return 1;
526 if (! af && bf)
527 return -1;
529 /* Try to sort global symbols before local symbols before function
530 symbols before debugging symbols. */
532 aflags = a->flags;
533 bflags = b->flags;
535 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
537 if ((aflags & BSF_DEBUGGING) != 0)
538 return 1;
539 else
540 return -1;
542 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
544 if ((aflags & BSF_FUNCTION) != 0)
545 return -1;
546 else
547 return 1;
549 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
551 if ((aflags & BSF_LOCAL) != 0)
552 return 1;
553 else
554 return -1;
556 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
558 if ((aflags & BSF_GLOBAL) != 0)
559 return -1;
560 else
561 return 1;
564 /* Symbols that start with '.' might be section names, so sort them
565 after symbols that don't start with '.'. */
566 if (an[0] == '.' && bn[0] != '.')
567 return 1;
568 if (an[0] != '.' && bn[0] == '.')
569 return -1;
571 /* Finally, if we can't distinguish them in any other way, try to
572 get consistent results by sorting the symbols by name. */
573 return strcmp (an, bn);
576 /* Sort relocs into address order. */
578 static int
579 compare_relocs (ap, bp)
580 const PTR ap;
581 const PTR bp;
583 const arelent *a = *(const arelent **)ap;
584 const arelent *b = *(const arelent **)bp;
586 if (a->address > b->address)
587 return 1;
588 else if (a->address < b->address)
589 return -1;
591 /* So that associated relocations tied to the same address show up
592 in the correct order, we don't do any further sorting. */
593 if (a > b)
594 return 1;
595 else if (a < b)
596 return -1;
597 else
598 return 0;
601 /* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */
603 static void
604 objdump_print_value (vma, info, skip_zeroes)
605 bfd_vma vma;
606 struct disassemble_info *info;
607 boolean skip_zeroes;
609 char buf[30];
610 char *p;
611 struct objdump_disasm_info *aux
612 = (struct objdump_disasm_info *) info->application_data;
614 bfd_sprintf_vma (aux->abfd, buf, vma);
615 if (! skip_zeroes)
616 p = buf;
617 else
619 for (p = buf; *p == '0'; ++p)
621 if (*p == '\0')
622 --p;
624 (*info->fprintf_func) (info->stream, "%s", p);
627 /* Print the name of a symbol. */
629 static void
630 objdump_print_symname (abfd, info, sym)
631 bfd *abfd;
632 struct disassemble_info *info;
633 asymbol *sym;
635 char *alloc;
636 const char *name;
637 const char *print;
639 alloc = NULL;
640 name = bfd_asymbol_name (sym);
641 if (! do_demangle || name[0] == '\0')
642 print = name;
643 else
645 /* Demangle the name. */
646 if (bfd_get_symbol_leading_char (abfd) == name[0])
647 ++name;
649 alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
650 if (alloc == NULL)
651 print = name;
652 else
653 print = alloc;
656 if (info != NULL)
657 (*info->fprintf_func) (info->stream, "%s", print);
658 else
659 printf ("%s", print);
661 if (alloc != NULL)
662 free (alloc);
665 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
666 is true, then always require the symbol to be in the section. This
667 returns NULL if there is no suitable symbol. If PLACE is not NULL,
668 then *PLACE is set to the index of the symbol in sorted_syms. */
670 static asymbol *
671 find_symbol_for_address (abfd, sec, vma, require_sec, place)
672 bfd *abfd;
673 asection *sec;
674 bfd_vma vma;
675 boolean require_sec;
676 long *place;
678 /* @@ Would it speed things up to cache the last two symbols returned,
679 and maybe their address ranges? For many processors, only one memory
680 operand can be present at a time, so the 2-entry cache wouldn't be
681 constantly churned by code doing heavy memory accesses. */
683 /* Indices in `sorted_syms'. */
684 long min = 0;
685 long max = sorted_symcount;
686 long thisplace;
687 unsigned int opb = bfd_octets_per_byte (abfd);
689 if (sorted_symcount < 1)
690 return NULL;
692 /* Perform a binary search looking for the closest symbol to the
693 required value. We are searching the range (min, max]. */
694 while (min + 1 < max)
696 asymbol *sym;
698 thisplace = (max + min) / 2;
699 sym = sorted_syms[thisplace];
701 if (bfd_asymbol_value (sym) > vma)
702 max = thisplace;
703 else if (bfd_asymbol_value (sym) < vma)
704 min = thisplace;
705 else
707 min = thisplace;
708 break;
712 /* The symbol we want is now in min, the low end of the range we
713 were searching. If there are several symbols with the same
714 value, we want the first one. */
715 thisplace = min;
716 while (thisplace > 0
717 && (bfd_asymbol_value (sorted_syms[thisplace])
718 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
719 --thisplace;
721 /* If the file is relocateable, and the symbol could be from this
722 section, prefer a symbol from this section over symbols from
723 others, even if the other symbol's value might be closer.
725 Note that this may be wrong for some symbol references if the
726 sections have overlapping memory ranges, but in that case there's
727 no way to tell what's desired without looking at the relocation
728 table. */
730 if (sorted_syms[thisplace]->section != sec
731 && (require_sec
732 || ((abfd->flags & HAS_RELOC) != 0
733 && vma >= bfd_get_section_vma (abfd, sec)
734 && vma < (bfd_get_section_vma (abfd, sec)
735 + bfd_section_size (abfd, sec) / opb))))
737 long i;
739 for (i = thisplace + 1; i < sorted_symcount; i++)
741 if (bfd_asymbol_value (sorted_syms[i])
742 != bfd_asymbol_value (sorted_syms[thisplace]))
743 break;
745 --i;
746 for (; i >= 0; i--)
748 if (sorted_syms[i]->section == sec
749 && (i == 0
750 || sorted_syms[i - 1]->section != sec
751 || (bfd_asymbol_value (sorted_syms[i])
752 != bfd_asymbol_value (sorted_syms[i - 1]))))
754 thisplace = i;
755 break;
759 if (sorted_syms[thisplace]->section != sec)
761 /* We didn't find a good symbol with a smaller value.
762 Look for one with a larger value. */
763 for (i = thisplace + 1; i < sorted_symcount; i++)
765 if (sorted_syms[i]->section == sec)
767 thisplace = i;
768 break;
773 if (sorted_syms[thisplace]->section != sec
774 && (require_sec
775 || ((abfd->flags & HAS_RELOC) != 0
776 && vma >= bfd_get_section_vma (abfd, sec)
777 && vma < (bfd_get_section_vma (abfd, sec)
778 + bfd_section_size (abfd, sec)))))
780 /* There is no suitable symbol. */
781 return NULL;
785 if (place != NULL)
786 *place = thisplace;
788 return sorted_syms[thisplace];
791 /* Print an address to INFO symbolically. */
793 static void
794 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
795 bfd *abfd;
796 asection *sec;
797 asymbol *sym;
798 bfd_vma vma;
799 struct disassemble_info *info;
800 boolean skip_zeroes;
802 objdump_print_value (vma, info, skip_zeroes);
804 if (sym == NULL)
806 bfd_vma secaddr;
808 (*info->fprintf_func) (info->stream, " <%s",
809 bfd_get_section_name (abfd, sec));
810 secaddr = bfd_get_section_vma (abfd, sec);
811 if (vma < secaddr)
813 (*info->fprintf_func) (info->stream, "-0x");
814 objdump_print_value (secaddr - vma, info, true);
816 else if (vma > secaddr)
818 (*info->fprintf_func) (info->stream, "+0x");
819 objdump_print_value (vma - secaddr, info, true);
821 (*info->fprintf_func) (info->stream, ">");
823 else
825 (*info->fprintf_func) (info->stream, " <");
826 objdump_print_symname (abfd, info, sym);
827 if (bfd_asymbol_value (sym) > vma)
829 (*info->fprintf_func) (info->stream, "-0x");
830 objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
832 else if (vma > bfd_asymbol_value (sym))
834 (*info->fprintf_func) (info->stream, "+0x");
835 objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
837 (*info->fprintf_func) (info->stream, ">");
841 /* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is
842 true, don't output leading zeroes. */
844 static void
845 objdump_print_addr (vma, info, skip_zeroes)
846 bfd_vma vma;
847 struct disassemble_info *info;
848 boolean skip_zeroes;
850 struct objdump_disasm_info *aux;
851 asymbol *sym;
853 if (sorted_symcount < 1)
855 (*info->fprintf_func) (info->stream, "0x");
856 objdump_print_value (vma, info, skip_zeroes);
857 return;
860 aux = (struct objdump_disasm_info *) info->application_data;
861 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
862 (long *) NULL);
863 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
864 skip_zeroes);
867 /* Print VMA to INFO. This function is passed to the disassembler
868 routine. */
870 static void
871 objdump_print_address (vma, info)
872 bfd_vma vma;
873 struct disassemble_info *info;
875 objdump_print_addr (vma, info, ! prefix_addresses);
878 /* Determine of the given address has a symbol associated with it. */
880 static int
881 objdump_symbol_at_address (vma, info)
882 bfd_vma vma;
883 struct disassemble_info * info;
885 struct objdump_disasm_info * aux;
886 asymbol * sym;
888 /* No symbols - do not bother checking. */
889 if (sorted_symcount < 1)
890 return 0;
892 aux = (struct objdump_disasm_info *) info->application_data;
893 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
894 (long *) NULL);
896 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
899 /* Hold the last function name and the last line number we displayed
900 in a disassembly. */
902 static char *prev_functionname;
903 static unsigned int prev_line;
905 /* We keep a list of all files that we have seen when doing a
906 dissassembly with source, so that we know how much of the file to
907 display. This can be important for inlined functions. */
909 struct print_file_list
911 struct print_file_list *next;
912 char *filename;
913 unsigned int line;
914 FILE *f;
917 static struct print_file_list *print_files;
919 /* The number of preceding context lines to show when we start
920 displaying a file for the first time. */
922 #define SHOW_PRECEDING_CONTEXT_LINES (5)
924 /* Skip ahead to a given line in a file, optionally printing each
925 line. */
927 static void
928 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
930 static void
931 skip_to_line (p, line, show)
932 struct print_file_list *p;
933 unsigned int line;
934 boolean show;
936 while (p->line < line)
938 char buf[100];
940 if (fgets (buf, sizeof buf, p->f) == NULL)
942 fclose (p->f);
943 p->f = NULL;
944 break;
947 if (show)
948 printf ("%s", buf);
950 if (strchr (buf, '\n') != NULL)
951 ++p->line;
955 /* Show the line number, or the source line, in a dissassembly
956 listing. */
958 static void
959 show_line (abfd, section, addr_offset)
960 bfd *abfd;
961 asection *section;
962 bfd_vma addr_offset;
964 CONST char *filename;
965 CONST char *functionname;
966 unsigned int line;
968 if (! with_line_numbers && ! with_source_code)
969 return;
971 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
972 &functionname, &line))
973 return;
975 if (filename != NULL && *filename == '\0')
976 filename = NULL;
977 if (functionname != NULL && *functionname == '\0')
978 functionname = NULL;
980 if (with_line_numbers)
982 if (functionname != NULL
983 && (prev_functionname == NULL
984 || strcmp (functionname, prev_functionname) != 0))
985 printf ("%s():\n", functionname);
986 if (line > 0 && line != prev_line)
987 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
990 if (with_source_code
991 && filename != NULL
992 && line > 0)
994 struct print_file_list **pp, *p;
996 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
997 if (strcmp ((*pp)->filename, filename) == 0)
998 break;
999 p = *pp;
1001 if (p != NULL)
1003 if (p != print_files)
1005 int l;
1007 /* We have reencountered a file name which we saw
1008 earlier. This implies that either we are dumping out
1009 code from an included file, or the same file was
1010 linked in more than once. There are two common cases
1011 of an included file: inline functions in a header
1012 file, and a bison or flex skeleton file. In the
1013 former case we want to just start printing (but we
1014 back up a few lines to give context); in the latter
1015 case we want to continue from where we left off. I
1016 can't think of a good way to distinguish the cases,
1017 so I used a heuristic based on the file name. */
1018 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1019 l = p->line;
1020 else
1022 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1023 if (l < 0)
1024 l = 0;
1027 if (p->f == NULL)
1029 p->f = fopen (p->filename, "r");
1030 p->line = 0;
1032 if (p->f != NULL)
1033 skip_to_line (p, l, false);
1035 if (print_files->f != NULL)
1037 fclose (print_files->f);
1038 print_files->f = NULL;
1042 if (p->f != NULL)
1044 skip_to_line (p, line, true);
1045 *pp = p->next;
1046 p->next = print_files;
1047 print_files = p;
1050 else
1052 FILE *f;
1054 f = fopen (filename, "r");
1055 if (f != NULL)
1057 int l;
1059 p = ((struct print_file_list *)
1060 xmalloc (sizeof (struct print_file_list)));
1061 p->filename = xmalloc (strlen (filename) + 1);
1062 strcpy (p->filename, filename);
1063 p->line = 0;
1064 p->f = f;
1066 if (print_files != NULL && print_files->f != NULL)
1068 fclose (print_files->f);
1069 print_files->f = NULL;
1071 p->next = print_files;
1072 print_files = p;
1074 if (file_start_context)
1075 l = 0;
1076 else
1077 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1078 if (l < 0)
1079 l = 0;
1080 skip_to_line (p, l, false);
1081 if (p->f != NULL)
1082 skip_to_line (p, line, true);
1087 if (functionname != NULL
1088 && (prev_functionname == NULL
1089 || strcmp (functionname, prev_functionname) != 0))
1091 if (prev_functionname != NULL)
1092 free (prev_functionname);
1093 prev_functionname = xmalloc (strlen (functionname) + 1);
1094 strcpy (prev_functionname, functionname);
1097 if (line > 0 && line != prev_line)
1098 prev_line = line;
1101 /* Pseudo FILE object for strings. */
1102 typedef struct
1104 char *buffer;
1105 size_t size;
1106 char *current;
1107 } SFILE;
1109 /* sprintf to a "stream" */
1111 static int
1112 objdump_sprintf VPARAMS ((SFILE *f, const char *format, ...))
1114 char *buf;
1115 size_t n;
1117 VA_OPEN (args, format);
1118 VA_FIXEDARG (args, SFILE *, f);
1119 VA_FIXEDARG (args, const char *, format);
1121 vasprintf (&buf, format, args);
1123 if (buf == NULL)
1125 va_end (args);
1126 fatal (_("Out of virtual memory"));
1129 n = strlen (buf);
1131 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1133 size_t curroff;
1135 curroff = f->current - f->buffer;
1136 f->size *= 2;
1137 f->buffer = xrealloc (f->buffer, f->size);
1138 f->current = f->buffer + curroff;
1141 memcpy (f->current, buf, n);
1142 f->current += n;
1143 f->current[0] = '\0';
1145 free (buf);
1147 VA_CLOSE (args);
1148 return n;
1151 /* The number of zeroes we want to see before we start skipping them.
1152 The number is arbitrarily chosen. */
1154 #ifndef SKIP_ZEROES
1155 #define SKIP_ZEROES (8)
1156 #endif
1158 /* The number of zeroes to skip at the end of a section. If the
1159 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1160 SKIP_ZEROES, they will be disassembled. If there are fewer than
1161 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1162 attempt to avoid disassembling zeroes inserted by section
1163 alignment. */
1165 #ifndef SKIP_ZEROES_AT_END
1166 #define SKIP_ZEROES_AT_END (3)
1167 #endif
1169 /* Disassemble some data in memory between given values. */
1171 static void
1172 disassemble_bytes (info, disassemble_fn, insns, data,
1173 start_offset, stop_offset, relppp,
1174 relppend)
1175 struct disassemble_info *info;
1176 disassembler_ftype disassemble_fn;
1177 boolean insns;
1178 bfd_byte *data;
1179 bfd_vma start_offset;
1180 bfd_vma stop_offset;
1181 arelent ***relppp;
1182 arelent **relppend;
1184 struct objdump_disasm_info *aux;
1185 asection *section;
1186 int octets_per_line;
1187 boolean done_dot;
1188 int skip_addr_chars;
1189 bfd_vma addr_offset;
1190 int opb = info->octets_per_byte;
1192 aux = (struct objdump_disasm_info *) info->application_data;
1193 section = aux->sec;
1195 if (insns)
1196 octets_per_line = 4;
1197 else
1198 octets_per_line = 16;
1200 /* Figure out how many characters to skip at the start of an
1201 address, to make the disassembly look nicer. We discard leading
1202 zeroes in chunks of 4, ensuring that there is always a leading
1203 zero remaining. */
1204 skip_addr_chars = 0;
1205 if (! prefix_addresses)
1207 char buf[30];
1208 char *s;
1210 bfd_sprintf_vma
1211 (aux->abfd, buf,
1212 (section->vma
1213 + bfd_section_size (section->owner, section) / opb));
1214 s = buf;
1215 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1216 && s[4] == '0')
1218 skip_addr_chars += 4;
1219 s += 4;
1223 info->insn_info_valid = 0;
1225 done_dot = false;
1226 addr_offset = start_offset;
1227 while (addr_offset < stop_offset)
1229 bfd_vma z;
1230 int octets = 0;
1231 boolean need_nl = false;
1233 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1234 print `...'. */
1235 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1236 if (data[z] != 0)
1237 break;
1238 if (! disassemble_zeroes
1239 && (info->insn_info_valid == 0
1240 || info->branch_delay_insns == 0)
1241 && (z - addr_offset * opb >= SKIP_ZEROES
1242 || (z == stop_offset * opb &&
1243 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1245 printf ("\t...\n");
1247 /* If there are more nonzero octets to follow, we only skip
1248 zeroes in multiples of 4, to try to avoid running over
1249 the start of an instruction which happens to start with
1250 zero. */
1251 if (z != stop_offset * opb)
1252 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1254 octets = z - addr_offset * opb;
1256 else
1258 char buf[50];
1259 SFILE sfile;
1260 int bpc = 0;
1261 int pb = 0;
1263 done_dot = false;
1265 if (with_line_numbers || with_source_code)
1266 /* The line number tables will refer to unadjusted
1267 section VMAs, so we must undo any VMA modifications
1268 when calling show_line. */
1269 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
1271 if (! prefix_addresses)
1273 char *s;
1275 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1276 for (s = buf + skip_addr_chars; *s == '0'; s++)
1277 *s = ' ';
1278 if (*s == '\0')
1279 *--s = '0';
1280 printf ("%s:\t", buf + skip_addr_chars);
1282 else
1284 aux->require_sec = true;
1285 objdump_print_address (section->vma + addr_offset, info);
1286 aux->require_sec = false;
1287 putchar (' ');
1290 if (insns)
1292 sfile.size = 120;
1293 sfile.buffer = xmalloc (sfile.size);
1294 sfile.current = sfile.buffer;
1295 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1296 info->stream = (FILE *) &sfile;
1297 info->bytes_per_line = 0;
1298 info->bytes_per_chunk = 0;
1300 #ifdef DISASSEMBLER_NEEDS_RELOCS
1301 /* FIXME: This is wrong. It tests the number of octets
1302 in the last instruction, not the current one. */
1303 if (*relppp < relppend
1304 && (**relppp)->address >= addr_offset
1305 && (**relppp)->address <= addr_offset + octets / opb)
1306 info->flags = INSN_HAS_RELOC;
1307 else
1308 #endif
1309 info->flags = 0;
1311 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1312 info->fprintf_func = (fprintf_ftype) fprintf;
1313 info->stream = stdout;
1314 if (info->bytes_per_line != 0)
1315 octets_per_line = info->bytes_per_line;
1316 if (octets < 0)
1318 if (sfile.current != sfile.buffer)
1319 printf ("%s\n", sfile.buffer);
1320 free (sfile.buffer);
1321 break;
1324 else
1326 bfd_vma j;
1328 octets = octets_per_line;
1329 if (addr_offset + octets / opb > stop_offset)
1330 octets = (stop_offset - addr_offset) * opb;
1332 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1334 if (ISPRINT (data[j]))
1335 buf[j - addr_offset * opb] = data[j];
1336 else
1337 buf[j - addr_offset * opb] = '.';
1339 buf[j - addr_offset * opb] = '\0';
1342 if (prefix_addresses
1343 ? show_raw_insn > 0
1344 : show_raw_insn >= 0)
1346 bfd_vma j;
1348 /* If ! prefix_addresses and ! wide_output, we print
1349 octets_per_line octets per line. */
1350 pb = octets;
1351 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1352 pb = octets_per_line;
1354 if (info->bytes_per_chunk)
1355 bpc = info->bytes_per_chunk;
1356 else
1357 bpc = 1;
1359 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1361 int k;
1362 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1364 for (k = bpc - 1; k >= 0; k--)
1365 printf ("%02x", (unsigned) data[j + k]);
1366 putchar (' ');
1368 else
1370 for (k = 0; k < bpc; k++)
1371 printf ("%02x", (unsigned) data[j + k]);
1372 putchar (' ');
1376 for (; pb < octets_per_line; pb += bpc)
1378 int k;
1380 for (k = 0; k < bpc; k++)
1381 printf (" ");
1382 putchar (' ');
1385 /* Separate raw data from instruction by extra space. */
1386 if (insns)
1387 putchar ('\t');
1388 else
1389 printf (" ");
1392 if (! insns)
1393 printf ("%s", buf);
1394 else
1396 printf ("%s", sfile.buffer);
1397 free (sfile.buffer);
1400 if (prefix_addresses
1401 ? show_raw_insn > 0
1402 : show_raw_insn >= 0)
1404 while (pb < octets)
1406 bfd_vma j;
1407 char *s;
1409 putchar ('\n');
1410 j = addr_offset * opb + pb;
1412 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1413 for (s = buf + skip_addr_chars; *s == '0'; s++)
1414 *s = ' ';
1415 if (*s == '\0')
1416 *--s = '0';
1417 printf ("%s:\t", buf + skip_addr_chars);
1419 pb += octets_per_line;
1420 if (pb > octets)
1421 pb = octets;
1422 for (; j < addr_offset * opb + pb; j += bpc)
1424 int k;
1426 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1428 for (k = bpc - 1; k >= 0; k--)
1429 printf ("%02x", (unsigned) data[j + k]);
1430 putchar (' ');
1432 else
1434 for (k = 0; k < bpc; k++)
1435 printf ("%02x", (unsigned) data[j + k]);
1436 putchar (' ');
1442 if (!wide_output)
1443 putchar ('\n');
1444 else
1445 need_nl = true;
1448 if ((section->flags & SEC_RELOC) != 0
1449 #ifndef DISASSEMBLER_NEEDS_RELOCS
1450 && dump_reloc_info
1451 #endif
1454 while ((*relppp) < relppend
1455 && ((**relppp)->address >= (bfd_vma) addr_offset
1456 && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
1457 #ifdef DISASSEMBLER_NEEDS_RELOCS
1458 if (! dump_reloc_info)
1459 ++(*relppp);
1460 else
1461 #endif
1463 arelent *q;
1465 q = **relppp;
1467 if (wide_output)
1468 putchar ('\t');
1469 else
1470 printf ("\t\t\t");
1472 objdump_print_value (section->vma + q->address, info, true);
1474 printf (": %s\t", q->howto->name);
1476 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1477 printf ("*unknown*");
1478 else
1480 const char *sym_name;
1482 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1483 if (sym_name != NULL && *sym_name != '\0')
1484 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1485 else
1487 asection *sym_sec;
1489 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1490 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1491 if (sym_name == NULL || *sym_name == '\0')
1492 sym_name = "*unknown*";
1493 printf ("%s", sym_name);
1497 if (q->addend)
1499 printf ("+0x");
1500 objdump_print_value (q->addend, info, true);
1503 printf ("\n");
1504 need_nl = false;
1505 ++(*relppp);
1509 if (need_nl)
1510 printf ("\n");
1512 addr_offset += octets / opb;
1516 /* Disassemble the contents of an object file. */
1518 static void
1519 disassemble_data (abfd)
1520 bfd *abfd;
1522 unsigned long addr_offset;
1523 disassembler_ftype disassemble_fn;
1524 struct disassemble_info disasm_info;
1525 struct objdump_disasm_info aux;
1526 asection *section;
1527 unsigned int opb;
1529 print_files = NULL;
1530 prev_functionname = NULL;
1531 prev_line = -1;
1533 /* We make a copy of syms to sort. We don't want to sort syms
1534 because that will screw up the relocs. */
1535 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1536 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1538 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1540 /* Sort the symbols into section and symbol order */
1541 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1543 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1544 disasm_info.application_data = (PTR) &aux;
1545 aux.abfd = abfd;
1546 aux.require_sec = false;
1547 disasm_info.print_address_func = objdump_print_address;
1548 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1550 if (machine != (char *) NULL)
1552 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1553 if (info == NULL)
1555 fatal (_("Can't use supplied machine %s"), machine);
1557 abfd->arch_info = info;
1560 if (endian != BFD_ENDIAN_UNKNOWN)
1562 struct bfd_target *xvec;
1564 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1565 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1566 xvec->byteorder = endian;
1567 abfd->xvec = xvec;
1570 disassemble_fn = disassembler (abfd);
1571 if (!disassemble_fn)
1573 non_fatal (_("Can't disassemble for architecture %s\n"),
1574 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1575 exit_status = 1;
1576 return;
1579 opb = bfd_octets_per_byte (abfd);
1581 disasm_info.flavour = bfd_get_flavour (abfd);
1582 disasm_info.arch = bfd_get_arch (abfd);
1583 disasm_info.mach = bfd_get_mach (abfd);
1584 disasm_info.disassembler_options = disassembler_options;
1585 disasm_info.octets_per_byte = opb;
1587 if (bfd_big_endian (abfd))
1588 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1589 else if (bfd_little_endian (abfd))
1590 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1591 else
1592 /* ??? Aborting here seems too drastic. We could default to big or little
1593 instead. */
1594 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1596 for (section = abfd->sections;
1597 section != (asection *) NULL;
1598 section = section->next)
1600 bfd_byte *data = NULL;
1601 bfd_size_type datasize = 0;
1602 arelent **relbuf = NULL;
1603 arelent **relpp = NULL;
1604 arelent **relppend = NULL;
1605 unsigned long stop_offset;
1606 asymbol *sym = NULL;
1607 long place = 0;
1609 if ((section->flags & SEC_LOAD) == 0
1610 || (! disassemble_all
1611 && only == NULL
1612 && (section->flags & SEC_CODE) == 0))
1613 continue;
1614 if (only != (char *) NULL && strcmp (only, section->name) != 0)
1615 continue;
1617 if ((section->flags & SEC_RELOC) != 0
1618 #ifndef DISASSEMBLER_NEEDS_RELOCS
1619 && dump_reloc_info
1620 #endif
1623 long relsize;
1625 relsize = bfd_get_reloc_upper_bound (abfd, section);
1626 if (relsize < 0)
1627 bfd_fatal (bfd_get_filename (abfd));
1629 if (relsize > 0)
1631 long relcount;
1633 relbuf = (arelent **) xmalloc (relsize);
1634 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1635 if (relcount < 0)
1636 bfd_fatal (bfd_get_filename (abfd));
1638 /* Sort the relocs by address. */
1639 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1641 relpp = relbuf;
1642 relppend = relpp + relcount;
1644 /* Skip over the relocs belonging to addresses below the
1645 start address. */
1646 if (start_address != (bfd_vma) -1)
1648 while (relpp < relppend
1649 && (*relpp)->address < start_address)
1650 ++relpp;
1655 printf (_("Disassembly of section %s:\n"), section->name);
1657 datasize = bfd_get_section_size_before_reloc (section);
1658 if (datasize == 0)
1659 continue;
1661 data = (bfd_byte *) xmalloc ((size_t) datasize);
1663 bfd_get_section_contents (abfd, section, data, 0, datasize);
1665 aux.sec = section;
1666 disasm_info.buffer = data;
1667 disasm_info.buffer_vma = section->vma;
1668 disasm_info.buffer_length = datasize;
1669 disasm_info.section = section;
1670 if (start_address == (bfd_vma) -1
1671 || start_address < disasm_info.buffer_vma)
1672 addr_offset = 0;
1673 else
1674 addr_offset = start_address - disasm_info.buffer_vma;
1675 if (stop_address == (bfd_vma) -1)
1676 stop_offset = datasize / opb;
1677 else
1679 if (stop_address < disasm_info.buffer_vma)
1680 stop_offset = 0;
1681 else
1682 stop_offset = stop_address - disasm_info.buffer_vma;
1683 if (stop_offset > disasm_info.buffer_length / opb)
1684 stop_offset = disasm_info.buffer_length / opb;
1687 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1688 true, &place);
1690 while (addr_offset < stop_offset)
1692 asymbol *nextsym;
1693 unsigned long nextstop_offset;
1694 boolean insns;
1696 if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1698 int x;
1700 for (x = place;
1701 (x < sorted_symcount
1702 && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
1703 ++x)
1704 continue;
1705 disasm_info.symbols = & sorted_syms[place];
1706 disasm_info.num_symbols = x - place;
1708 else
1709 disasm_info.symbols = NULL;
1711 if (! prefix_addresses)
1713 printf ("\n");
1714 objdump_print_addr_with_sym (abfd, section, sym,
1715 section->vma + addr_offset,
1716 &disasm_info,
1717 false);
1718 printf (":\n");
1721 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1722 nextsym = sym;
1723 else if (sym == NULL)
1724 nextsym = NULL;
1725 else
1727 /* Search forward for the next appropriate symbol in
1728 SECTION. Note that all the symbols are sorted
1729 together into one big array, and that some sections
1730 may have overlapping addresses. */
1731 while (place < sorted_symcount
1732 && (sorted_syms[place]->section != section
1733 || (bfd_asymbol_value (sorted_syms[place])
1734 <= bfd_asymbol_value (sym))))
1735 ++place;
1736 if (place >= sorted_symcount)
1737 nextsym = NULL;
1738 else
1739 nextsym = sorted_syms[place];
1742 if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
1744 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1745 if (nextstop_offset > stop_offset)
1746 nextstop_offset = stop_offset;
1748 else if (nextsym == NULL)
1749 nextstop_offset = stop_offset;
1750 else
1752 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1753 if (nextstop_offset > stop_offset)
1754 nextstop_offset = stop_offset;
1757 /* If a symbol is explicitly marked as being an object
1758 rather than a function, just dump the bytes without
1759 disassembling them. */
1760 if (disassemble_all
1761 || sym == NULL
1762 || bfd_asymbol_value (sym) > section->vma + addr_offset
1763 || ((sym->flags & BSF_OBJECT) == 0
1764 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1765 == NULL)
1766 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1767 == NULL))
1768 || (sym->flags & BSF_FUNCTION) != 0)
1769 insns = true;
1770 else
1771 insns = false;
1773 disassemble_bytes (&disasm_info, disassemble_fn, insns, data,
1774 addr_offset, nextstop_offset, &relpp, relppend);
1776 addr_offset = nextstop_offset;
1777 sym = nextsym;
1780 free (data);
1781 if (relbuf != NULL)
1782 free (relbuf);
1784 free (sorted_syms);
1788 /* Define a table of stab values and print-strings. We wish the initializer
1789 could be a direct-mapped table, but instead we build one the first
1790 time we need it. */
1792 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1793 char *strsect_name));
1795 /* Dump the stabs sections from an object file that has a section that
1796 uses Sun stabs encoding. */
1798 static void
1799 dump_stabs (abfd)
1800 bfd *abfd;
1802 dump_section_stabs (abfd, ".stab", ".stabstr");
1803 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1804 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1805 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1808 static bfd_byte *stabs;
1809 static bfd_size_type stab_size;
1811 static char *strtab;
1812 static bfd_size_type stabstr_size;
1814 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1815 and string table section STRSECT_NAME into `strtab'.
1816 If the section exists and was read, allocate the space and return true.
1817 Otherwise return false. */
1819 static boolean
1820 read_section_stabs (abfd, stabsect_name, strsect_name)
1821 bfd *abfd;
1822 const char *stabsect_name;
1823 const char *strsect_name;
1825 asection *stabsect, *stabstrsect;
1827 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1828 if (0 == stabsect)
1830 printf (_("No %s section present\n\n"), stabsect_name);
1831 return false;
1834 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1835 if (0 == stabstrsect)
1837 non_fatal (_("%s has no %s section"),
1838 bfd_get_filename (abfd), strsect_name);
1839 exit_status = 1;
1840 return false;
1843 stab_size = bfd_section_size (abfd, stabsect);
1844 stabstr_size = bfd_section_size (abfd, stabstrsect);
1846 stabs = (bfd_byte *) xmalloc (stab_size);
1847 strtab = (char *) xmalloc (stabstr_size);
1849 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1851 non_fatal (_("Reading %s section of %s failed: %s"),
1852 stabsect_name, bfd_get_filename (abfd),
1853 bfd_errmsg (bfd_get_error ()));
1854 free (stabs);
1855 free (strtab);
1856 exit_status = 1;
1857 return false;
1860 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1861 stabstr_size))
1863 non_fatal (_("Reading %s section of %s failed: %s\n"),
1864 strsect_name, bfd_get_filename (abfd),
1865 bfd_errmsg (bfd_get_error ()));
1866 free (stabs);
1867 free (strtab);
1868 exit_status = 1;
1869 return false;
1872 return true;
1875 /* Stabs entries use a 12 byte format:
1876 4 byte string table index
1877 1 byte stab type
1878 1 byte stab other field
1879 2 byte stab desc field
1880 4 byte stab value
1881 FIXME: This will have to change for a 64 bit object format. */
1883 #define STRDXOFF (0)
1884 #define TYPEOFF (4)
1885 #define OTHEROFF (5)
1886 #define DESCOFF (6)
1887 #define VALOFF (8)
1888 #define STABSIZE (12)
1890 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1891 using string table section STRSECT_NAME (in `strtab'). */
1893 static void
1894 print_section_stabs (abfd, stabsect_name, strsect_name)
1895 bfd *abfd;
1896 const char *stabsect_name;
1897 const char *strsect_name ATTRIBUTE_UNUSED;
1899 int i;
1900 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1901 bfd_byte *stabp, *stabs_end;
1903 stabp = stabs;
1904 stabs_end = stabp + stab_size;
1906 printf (_("Contents of %s section:\n\n"), stabsect_name);
1907 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1909 /* Loop through all symbols and print them.
1911 We start the index at -1 because there is a dummy symbol on
1912 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1914 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1916 const char *name;
1917 unsigned long strx;
1918 unsigned char type, other;
1919 unsigned short desc;
1920 bfd_vma value;
1922 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1923 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1924 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1925 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1926 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1928 printf ("\n%-6d ", i);
1929 /* Either print the stab name, or, if unnamed, print its number
1930 again (makes consistent formatting for tools like awk). */
1931 name = bfd_get_stab_name (type);
1932 if (name != NULL)
1933 printf ("%-6s", name);
1934 else if (type == N_UNDF)
1935 printf ("HdrSym");
1936 else
1937 printf ("%-6d", type);
1938 printf (" %-6d %-6d ", other, desc);
1939 bfd_printf_vma (abfd, value);
1940 printf (" %-6lu", strx);
1942 /* Symbols with type == 0 (N_UNDF) specify the length of the
1943 string table associated with this file. We use that info
1944 to know how to relocate the *next* file's string table indices. */
1946 if (type == N_UNDF)
1948 file_string_table_offset = next_file_string_table_offset;
1949 next_file_string_table_offset += value;
1951 else
1953 /* Using the (possibly updated) string table offset, print the
1954 string (if any) associated with this symbol. */
1956 if ((strx + file_string_table_offset) < stabstr_size)
1957 printf (" %s", &strtab[strx + file_string_table_offset]);
1958 else
1959 printf (" *");
1962 printf ("\n\n");
1965 static void
1966 dump_section_stabs (abfd, stabsect_name, strsect_name)
1967 bfd *abfd;
1968 char *stabsect_name;
1969 char *strsect_name;
1971 asection *s;
1973 /* Check for section names for which stabsect_name is a prefix, to
1974 handle .stab0, etc. */
1975 for (s = abfd->sections;
1976 s != NULL;
1977 s = s->next)
1979 int len;
1981 len = strlen (stabsect_name);
1983 /* If the prefix matches, and the files section name ends with a
1984 nul or a digit, then we match. I.e., we want either an exact
1985 match or a section followed by a number. */
1986 if (strncmp (stabsect_name, s->name, len) == 0
1987 && (s->name[len] == '\000'
1988 || ISDIGIT (s->name[len])))
1990 if (read_section_stabs (abfd, s->name, strsect_name))
1992 print_section_stabs (abfd, s->name, strsect_name);
1993 free (stabs);
1994 free (strtab);
2000 static void
2001 dump_bfd_header (abfd)
2002 bfd *abfd;
2004 char *comma = "";
2006 printf (_("architecture: %s, "),
2007 bfd_printable_arch_mach (bfd_get_arch (abfd),
2008 bfd_get_mach (abfd)));
2009 printf (_("flags 0x%08x:\n"), abfd->flags);
2011 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2012 PF (HAS_RELOC, "HAS_RELOC");
2013 PF (EXEC_P, "EXEC_P");
2014 PF (HAS_LINENO, "HAS_LINENO");
2015 PF (HAS_DEBUG, "HAS_DEBUG");
2016 PF (HAS_SYMS, "HAS_SYMS");
2017 PF (HAS_LOCALS, "HAS_LOCALS");
2018 PF (DYNAMIC, "DYNAMIC");
2019 PF (WP_TEXT, "WP_TEXT");
2020 PF (D_PAGED, "D_PAGED");
2021 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2022 printf (_("\nstart address 0x"));
2023 bfd_printf_vma (abfd, abfd->start_address);
2024 printf ("\n");
2027 static void
2028 dump_bfd_private_header (abfd)
2029 bfd *abfd;
2031 bfd_print_private_bfd_data (abfd, stdout);
2034 /* Dump selected contents of ABFD */
2036 static void
2037 dump_bfd (abfd)
2038 bfd *abfd;
2040 /* If we are adjusting section VMA's, change them all now. Changing
2041 the BFD information is a hack. However, we must do it, or
2042 bfd_find_nearest_line will not do the right thing. */
2043 if (adjust_section_vma != 0)
2045 asection *s;
2047 for (s = abfd->sections; s != NULL; s = s->next)
2049 s->vma += adjust_section_vma;
2050 s->lma += adjust_section_vma;
2054 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2055 abfd->xvec->name);
2056 if (dump_ar_hdrs)
2057 print_arelt_descr (stdout, abfd, true);
2058 if (dump_file_header)
2059 dump_bfd_header (abfd);
2060 if (dump_private_headers)
2061 dump_bfd_private_header (abfd);
2062 putchar ('\n');
2063 if (dump_section_headers)
2064 dump_headers (abfd);
2065 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2067 syms = slurp_symtab (abfd);
2069 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2071 dynsyms = slurp_dynamic_symtab (abfd);
2073 if (dump_symtab)
2074 dump_symbols (abfd, false);
2075 if (dump_dynamic_symtab)
2076 dump_symbols (abfd, true);
2077 if (dump_stab_section_info)
2078 dump_stabs (abfd);
2079 if (dump_reloc_info && ! disassemble)
2080 dump_relocs (abfd);
2081 if (dump_dynamic_reloc_info)
2082 dump_dynamic_relocs (abfd);
2083 if (dump_section_contents)
2084 dump_data (abfd);
2085 if (disassemble)
2086 disassemble_data (abfd);
2087 if (dump_debugging)
2089 PTR dhandle;
2091 dhandle = read_debugging_info (abfd, syms, symcount);
2092 if (dhandle != NULL)
2094 if (! print_debugging_info (stdout, dhandle))
2096 non_fatal (_("%s: printing debugging information failed"),
2097 bfd_get_filename (abfd));
2098 exit_status = 1;
2102 if (syms)
2104 free (syms);
2105 syms = NULL;
2107 if (dynsyms)
2109 free (dynsyms);
2110 dynsyms = NULL;
2114 static void
2115 display_bfd (abfd)
2116 bfd *abfd;
2118 char **matching;
2120 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2122 dump_bfd (abfd);
2123 return;
2126 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2128 nonfatal (bfd_get_filename (abfd));
2129 list_matching_formats (matching);
2130 free (matching);
2131 return;
2134 if (bfd_get_error () != bfd_error_file_not_recognized)
2136 nonfatal (bfd_get_filename (abfd));
2137 return;
2140 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2142 dump_bfd (abfd);
2143 return;
2146 nonfatal (bfd_get_filename (abfd));
2148 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2150 list_matching_formats (matching);
2151 free (matching);
2155 static void
2156 display_file (filename, target)
2157 char *filename;
2158 char *target;
2160 bfd *file, *arfile = (bfd *) NULL;
2162 file = bfd_openr (filename, target);
2163 if (file == NULL)
2165 nonfatal (filename);
2166 return;
2169 if (bfd_check_format (file, bfd_archive) == true)
2171 bfd *last_arfile = NULL;
2173 printf (_("In archive %s:\n"), bfd_get_filename (file));
2174 for (;;)
2176 bfd_set_error (bfd_error_no_error);
2178 arfile = bfd_openr_next_archived_file (file, arfile);
2179 if (arfile == NULL)
2181 if (bfd_get_error () != bfd_error_no_more_archived_files)
2182 nonfatal (bfd_get_filename (file));
2183 break;
2186 display_bfd (arfile);
2188 if (last_arfile != NULL)
2189 bfd_close (last_arfile);
2190 last_arfile = arfile;
2193 if (last_arfile != NULL)
2194 bfd_close (last_arfile);
2196 else
2197 display_bfd (file);
2199 bfd_close (file);
2202 /* Actually display the various requested regions */
2204 static void
2205 dump_data (abfd)
2206 bfd *abfd;
2208 asection *section;
2209 bfd_byte *data = 0;
2210 bfd_size_type datasize = 0;
2211 bfd_size_type addr_offset;
2212 bfd_size_type start_offset, stop_offset;
2213 unsigned int opb = bfd_octets_per_byte (abfd);
2215 for (section = abfd->sections; section != NULL; section =
2216 section->next)
2218 int onaline = 16;
2220 if (only == (char *) NULL ||
2221 strcmp (only, section->name) == 0)
2223 if (section->flags & SEC_HAS_CONTENTS)
2225 printf (_("Contents of section %s:\n"), section->name);
2227 if (bfd_section_size (abfd, section) == 0)
2228 continue;
2229 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2230 datasize = bfd_section_size (abfd, section);
2233 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2235 if (start_address == (bfd_vma) -1
2236 || start_address < section->vma)
2237 start_offset = 0;
2238 else
2239 start_offset = start_address - section->vma;
2240 if (stop_address == (bfd_vma) -1)
2241 stop_offset = bfd_section_size (abfd, section) / opb;
2242 else
2244 if (stop_address < section->vma)
2245 stop_offset = 0;
2246 else
2247 stop_offset = stop_address - section->vma;
2248 if (stop_offset > bfd_section_size (abfd, section) / opb)
2249 stop_offset = bfd_section_size (abfd, section) / opb;
2251 for (addr_offset = start_offset;
2252 addr_offset < stop_offset; addr_offset += onaline)
2254 bfd_size_type j;
2256 printf (" %04lx ", (unsigned long int)
2257 (addr_offset + section->vma));
2258 for (j = addr_offset * opb;
2259 j < addr_offset * opb + onaline; j++)
2261 if (j < stop_offset * opb)
2262 printf ("%02x", (unsigned) (data[j]));
2263 else
2264 printf (" ");
2265 if ((j & 3) == 3)
2266 printf (" ");
2269 printf (" ");
2270 for (j = addr_offset; j < addr_offset * opb + onaline; j++)
2272 if (j >= stop_offset * opb)
2273 printf (" ");
2274 else
2275 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2277 putchar ('\n');
2279 free (data);
2285 /* Should perhaps share code and display with nm? */
2286 static void
2287 dump_symbols (abfd, dynamic)
2288 bfd *abfd ATTRIBUTE_UNUSED;
2289 boolean dynamic;
2291 asymbol **current;
2292 long max;
2293 long count;
2295 if (dynamic)
2297 current = dynsyms;
2298 max = dynsymcount;
2299 if (max == 0)
2300 return;
2301 printf ("DYNAMIC SYMBOL TABLE:\n");
2303 else
2305 current = syms;
2306 max = symcount;
2307 if (max == 0)
2308 return;
2309 printf ("SYMBOL TABLE:\n");
2312 for (count = 0; count < max; count++)
2314 if (*current)
2316 bfd *cur_bfd = bfd_asymbol_bfd (*current);
2318 if (cur_bfd != NULL)
2320 const char *name;
2321 char *alloc;
2323 name = bfd_asymbol_name (*current);
2324 alloc = NULL;
2325 if (do_demangle && name != NULL && *name != '\0')
2327 const char *n;
2329 /* If we want to demangle the name, we demangle it
2330 here, and temporarily clobber it while calling
2331 bfd_print_symbol. FIXME: This is a gross hack. */
2333 n = name;
2334 if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2335 ++n;
2336 alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2337 if (alloc != NULL)
2338 (*current)->name = alloc;
2339 else
2340 (*current)->name = n;
2343 bfd_print_symbol (cur_bfd, stdout, *current,
2344 bfd_print_symbol_all);
2346 (*current)->name = name;
2347 if (alloc != NULL)
2348 free (alloc);
2350 printf ("\n");
2353 current++;
2355 printf ("\n");
2356 printf ("\n");
2359 static void
2360 dump_relocs (abfd)
2361 bfd *abfd;
2363 arelent **relpp;
2364 long relcount;
2365 asection *a;
2367 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2369 long relsize;
2371 if (bfd_is_abs_section (a))
2372 continue;
2373 if (bfd_is_und_section (a))
2374 continue;
2375 if (bfd_is_com_section (a))
2376 continue;
2378 if (only)
2380 if (strcmp (only, a->name))
2381 continue;
2383 else if ((a->flags & SEC_RELOC) == 0)
2384 continue;
2386 relsize = bfd_get_reloc_upper_bound (abfd, a);
2387 if (relsize < 0)
2388 bfd_fatal (bfd_get_filename (abfd));
2390 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2392 if (relsize == 0)
2394 printf (" (none)\n\n");
2396 else
2398 relpp = (arelent **) xmalloc (relsize);
2399 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2400 if (relcount < 0)
2401 bfd_fatal (bfd_get_filename (abfd));
2402 else if (relcount == 0)
2404 printf (" (none)\n\n");
2406 else
2408 printf ("\n");
2409 dump_reloc_set (abfd, a, relpp, relcount);
2410 printf ("\n\n");
2412 free (relpp);
2417 static void
2418 dump_dynamic_relocs (abfd)
2419 bfd *abfd;
2421 long relsize;
2422 arelent **relpp;
2423 long relcount;
2425 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2426 if (relsize < 0)
2427 bfd_fatal (bfd_get_filename (abfd));
2429 printf ("DYNAMIC RELOCATION RECORDS");
2431 if (relsize == 0)
2433 printf (" (none)\n\n");
2435 else
2437 relpp = (arelent **) xmalloc (relsize);
2438 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2439 if (relcount < 0)
2440 bfd_fatal (bfd_get_filename (abfd));
2441 else if (relcount == 0)
2443 printf (" (none)\n\n");
2445 else
2447 printf ("\n");
2448 dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2449 printf ("\n\n");
2451 free (relpp);
2455 static void
2456 dump_reloc_set (abfd, sec, relpp, relcount)
2457 bfd *abfd;
2458 asection *sec;
2459 arelent **relpp;
2460 long relcount;
2462 arelent **p;
2463 char *last_filename, *last_functionname;
2464 unsigned int last_line;
2466 /* Get column headers lined up reasonably. */
2468 static int width;
2469 if (width == 0)
2471 char buf[30];
2472 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2473 width = strlen (buf) - 7;
2475 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2478 last_filename = NULL;
2479 last_functionname = NULL;
2480 last_line = 0;
2482 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2484 arelent *q = *p;
2485 const char *filename, *functionname;
2486 unsigned int line;
2487 const char *sym_name;
2488 const char *section_name;
2490 if (start_address != (bfd_vma) -1
2491 && q->address < start_address)
2492 continue;
2493 if (stop_address != (bfd_vma) -1
2494 && q->address > stop_address)
2495 continue;
2497 if (with_line_numbers
2498 && sec != NULL
2499 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2500 &filename, &functionname, &line))
2502 if (functionname != NULL
2503 && (last_functionname == NULL
2504 || strcmp (functionname, last_functionname) != 0))
2506 printf ("%s():\n", functionname);
2507 if (last_functionname != NULL)
2508 free (last_functionname);
2509 last_functionname = xstrdup (functionname);
2511 if (line > 0
2512 && (line != last_line
2513 || (filename != NULL
2514 && last_filename != NULL
2515 && strcmp (filename, last_filename) != 0)))
2517 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2518 last_line = line;
2519 if (last_filename != NULL)
2520 free (last_filename);
2521 if (filename == NULL)
2522 last_filename = NULL;
2523 else
2524 last_filename = xstrdup (filename);
2528 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2530 sym_name = (*(q->sym_ptr_ptr))->name;
2531 section_name = (*(q->sym_ptr_ptr))->section->name;
2533 else
2535 sym_name = NULL;
2536 section_name = NULL;
2538 if (sym_name)
2540 bfd_printf_vma (abfd, q->address);
2541 if (q->howto->name)
2542 printf (" %-16s ", q->howto->name);
2543 else
2544 printf (" %-16d ", q->howto->type);
2545 objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2546 *q->sym_ptr_ptr);
2548 else
2550 if (section_name == (CONST char *) NULL)
2551 section_name = "*unknown*";
2552 bfd_printf_vma (abfd, q->address);
2553 printf (" %-16s [%s]",
2554 q->howto->name,
2555 section_name);
2557 if (q->addend)
2559 printf ("+0x");
2560 bfd_printf_vma (abfd, q->addend);
2562 printf ("\n");
2566 /* The length of the longest architecture name + 1. */
2567 #define LONGEST_ARCH sizeof("powerpc:common")
2569 static const char *
2570 endian_string (endian)
2571 enum bfd_endian endian;
2573 if (endian == BFD_ENDIAN_BIG)
2574 return "big endian";
2575 else if (endian == BFD_ENDIAN_LITTLE)
2576 return "little endian";
2577 else
2578 return "endianness unknown";
2581 /* List the targets that BFD is configured to support, each followed
2582 by its endianness and the architectures it supports. */
2584 static void
2585 display_target_list ()
2587 extern const bfd_target *const *bfd_target_vector;
2588 char *dummy_name;
2589 int t;
2591 dummy_name = make_temp_file (NULL);
2592 for (t = 0; bfd_target_vector[t]; t++)
2594 const bfd_target *p = bfd_target_vector[t];
2595 bfd *abfd = bfd_openw (dummy_name, p->name);
2596 int a;
2598 printf ("%s\n (header %s, data %s)\n", p->name,
2599 endian_string (p->header_byteorder),
2600 endian_string (p->byteorder));
2602 if (abfd == NULL)
2604 nonfatal (dummy_name);
2605 continue;
2608 if (! bfd_set_format (abfd, bfd_object))
2610 if (bfd_get_error () != bfd_error_invalid_operation)
2611 nonfatal (p->name);
2612 bfd_close_all_done (abfd);
2613 continue;
2616 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2617 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2618 printf (" %s\n",
2619 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2620 bfd_close_all_done (abfd);
2622 unlink (dummy_name);
2623 free (dummy_name);
2626 /* Print a table showing which architectures are supported for entries
2627 FIRST through LAST-1 of bfd_target_vector (targets across,
2628 architectures down). */
2630 static void
2631 display_info_table (first, last)
2632 int first;
2633 int last;
2635 extern const bfd_target *const *bfd_target_vector;
2636 int t, a;
2637 char *dummy_name;
2639 /* Print heading of target names. */
2640 printf ("\n%*s", (int) LONGEST_ARCH, " ");
2641 for (t = first; t < last && bfd_target_vector[t]; t++)
2642 printf ("%s ", bfd_target_vector[t]->name);
2643 putchar ('\n');
2645 dummy_name = make_temp_file (NULL);
2646 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2647 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2649 printf ("%*s ", (int) LONGEST_ARCH - 1,
2650 bfd_printable_arch_mach (a, 0));
2651 for (t = first; t < last && bfd_target_vector[t]; t++)
2653 const bfd_target *p = bfd_target_vector[t];
2654 boolean ok = true;
2655 bfd *abfd = bfd_openw (dummy_name, p->name);
2657 if (abfd == NULL)
2659 nonfatal (p->name);
2660 ok = false;
2663 if (ok)
2665 if (! bfd_set_format (abfd, bfd_object))
2667 if (bfd_get_error () != bfd_error_invalid_operation)
2668 nonfatal (p->name);
2669 ok = false;
2673 if (ok)
2675 if (! bfd_set_arch_mach (abfd, a, 0))
2676 ok = false;
2679 if (ok)
2680 printf ("%s ", p->name);
2681 else
2683 int l = strlen (p->name);
2684 while (l--)
2685 putchar ('-');
2686 putchar (' ');
2688 if (abfd != NULL)
2689 bfd_close_all_done (abfd);
2691 putchar ('\n');
2693 unlink (dummy_name);
2694 free (dummy_name);
2697 /* Print tables of all the target-architecture combinations that
2698 BFD has been configured to support. */
2700 static void
2701 display_target_tables ()
2703 int t, columns;
2704 extern const bfd_target *const *bfd_target_vector;
2705 char *colum;
2707 columns = 0;
2708 colum = getenv ("COLUMNS");
2709 if (colum != NULL)
2710 columns = atoi (colum);
2711 if (columns == 0)
2712 columns = 80;
2714 t = 0;
2715 while (bfd_target_vector[t] != NULL)
2717 int oldt = t, wid;
2719 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2720 ++t;
2721 while (wid < columns && bfd_target_vector[t] != NULL)
2723 int newwid;
2725 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2726 if (newwid >= columns)
2727 break;
2728 wid = newwid;
2729 ++t;
2731 display_info_table (oldt, t);
2735 static void
2736 display_info ()
2738 printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
2739 display_target_list ();
2740 display_target_tables ();
2743 int main PARAMS ((int, char **));
2746 main (argc, argv)
2747 int argc;
2748 char **argv;
2750 int c;
2751 char *target = default_target;
2752 boolean seenflag = false;
2754 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2755 setlocale (LC_MESSAGES, "");
2756 #endif
2757 #if defined (HAVE_SETLOCALE)
2758 setlocale (LC_CTYPE, "");
2759 #endif
2760 bindtextdomain (PACKAGE, LOCALEDIR);
2761 textdomain (PACKAGE);
2763 program_name = *argv;
2764 xmalloc_set_program_name (program_name);
2766 START_PROGRESS (program_name, 0);
2768 bfd_init ();
2769 set_default_bfd_target ();
2771 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSj:wE:zgG",
2772 long_options, (int *) 0))
2773 != EOF)
2775 switch (c)
2777 case 0:
2778 break; /* We've been given a long option. */
2779 case 'm':
2780 machine = optarg;
2781 break;
2782 case 'M':
2783 disassembler_options = optarg;
2784 break;
2785 case 'j':
2786 only = optarg;
2787 break;
2788 case 'l':
2789 with_line_numbers = true;
2790 break;
2791 case 'b':
2792 target = optarg;
2793 break;
2794 case 'C':
2795 do_demangle = true;
2796 if (optarg != NULL)
2798 enum demangling_styles style;
2800 style = cplus_demangle_name_to_style (optarg);
2801 if (style == unknown_demangling)
2802 fatal (_("unknown demangling style `%s'"),
2803 optarg);
2805 cplus_demangle_set_style (style);
2807 break;
2808 case 'w':
2809 wide_output = true;
2810 break;
2811 case OPTION_ADJUST_VMA:
2812 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2813 break;
2814 case OPTION_START_ADDRESS:
2815 start_address = parse_vma (optarg, "--start-address");
2816 break;
2817 case OPTION_STOP_ADDRESS:
2818 stop_address = parse_vma (optarg, "--stop-address");
2819 break;
2820 case 'E':
2821 if (strcmp (optarg, "B") == 0)
2822 endian = BFD_ENDIAN_BIG;
2823 else if (strcmp (optarg, "L") == 0)
2824 endian = BFD_ENDIAN_LITTLE;
2825 else
2827 non_fatal (_("unrecognized -E option"));
2828 usage (stderr, 1);
2830 break;
2831 case OPTION_ENDIAN:
2832 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2833 endian = BFD_ENDIAN_BIG;
2834 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2835 endian = BFD_ENDIAN_LITTLE;
2836 else
2838 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2839 usage (stderr, 1);
2841 break;
2843 case 'f':
2844 dump_file_header = true;
2845 seenflag = true;
2846 break;
2847 case 'i':
2848 formats_info = true;
2849 seenflag = true;
2850 break;
2851 case 'p':
2852 dump_private_headers = true;
2853 seenflag = true;
2854 break;
2855 case 'x':
2856 dump_private_headers = true;
2857 dump_symtab = true;
2858 dump_reloc_info = true;
2859 dump_file_header = true;
2860 dump_ar_hdrs = true;
2861 dump_section_headers = true;
2862 seenflag = true;
2863 break;
2864 case 't':
2865 dump_symtab = true;
2866 seenflag = true;
2867 break;
2868 case 'T':
2869 dump_dynamic_symtab = true;
2870 seenflag = true;
2871 break;
2872 case 'd':
2873 disassemble = true;
2874 seenflag = true;
2875 break;
2876 case 'z':
2877 disassemble_zeroes = true;
2878 break;
2879 case 'D':
2880 disassemble = true;
2881 disassemble_all = true;
2882 seenflag = true;
2883 break;
2884 case 'S':
2885 disassemble = true;
2886 with_source_code = true;
2887 seenflag = true;
2888 break;
2889 case 'g':
2890 dump_debugging = 1;
2891 seenflag = true;
2892 break;
2893 case 'G':
2894 dump_stab_section_info = true;
2895 seenflag = true;
2896 break;
2897 case 's':
2898 dump_section_contents = true;
2899 seenflag = true;
2900 break;
2901 case 'r':
2902 dump_reloc_info = true;
2903 seenflag = true;
2904 break;
2905 case 'R':
2906 dump_dynamic_reloc_info = true;
2907 seenflag = true;
2908 break;
2909 case 'a':
2910 dump_ar_hdrs = true;
2911 seenflag = true;
2912 break;
2913 case 'h':
2914 dump_section_headers = true;
2915 seenflag = true;
2916 break;
2917 case 'H':
2918 usage (stdout, 0);
2919 seenflag = true;
2920 case 'v':
2921 case 'V':
2922 show_version = true;
2923 seenflag = true;
2924 break;
2926 default:
2927 usage (stderr, 1);
2931 if (show_version)
2932 print_version ("objdump");
2934 if (seenflag == false)
2935 usage (stderr, 2);
2937 if (formats_info)
2938 display_info ();
2939 else
2941 if (optind == argc)
2942 display_file ("a.out", target);
2943 else
2944 for (; optind < argc;)
2945 display_file (argv[optind++], target);
2948 END_PROGRESS (program_name);
2950 return exit_status;