1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Diddler.
6 BFD is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 BFD is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with BFD; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 * Until there is other documentation, refer to the manual page dump(1) in
22 * the system 5 program's reference manual
32 #define ELF_STAB_DISPLAY /* This code works, but uses internal
33 bfd and elf stuff. Flip this define
34 off if you need to just use generic
37 #ifdef ELF_STAB_DISPLAY
38 /* Internal headers for the ELF .stab-dump code - sorry. */
39 #define BYTES_IN_WORD 32
40 #include "aout/aout64.h"
41 #include "elf/internal.h"
42 extern Elf_Internal_Shdr *bfd_elf_find_section();
43 #endif /* ELF_STAB_DISPLAY */
45 extern char *xmalloc ();
47 char *default_target = NULL; /* default at runtime */
49 extern *program_version;
50 char *program_name = NULL;
52 int show_version = 0; /* show the version number */
53 int dump_section_contents; /* -s */
54 int dump_section_headers; /* -h */
55 boolean dump_file_header; /* -f */
56 int dump_symtab; /* -t */
57 int dump_reloc_info; /* -r */
58 int dump_ar_hdrs; /* -a */
59 int with_line_numbers; /* -l */
60 int dump_stab_section_info; /* -stabs */
61 boolean disassemble; /* -d */
62 boolean info; /* -i */
65 char *machine = (char *) NULL;
71 unsigned int symcount = 0;
73 /* Forward declarations. */
76 display_file PARAMS ((char *filename, char *target));
79 dump_data PARAMS ((bfd *abfd));
82 dump_relocs PARAMS ((bfd *abfd));
85 dump_symbols PARAMS ((bfd *abfd));
91 usage: %s [-ahifdrtxsl] [-m machine] [-j section_name]\n\
92 [--syms] [--reloc] [--header] [--version] obj ...\n",
97 static struct option long_options[]=
99 {"syms", no_argument, &dump_symtab, 1},
100 {"reloc", no_argument, &dump_reloc_info, 1},
101 {"header", no_argument, &dump_section_headers, 1},
102 {"version", no_argument, &show_version, 1},
103 #ifdef ELF_STAB_DISPLAY
104 {"stabs", no_argument, &dump_stab_section_info, 1},
106 {0, no_argument, 0, 0}};
115 for (section = abfd->sections;
116 section != (asection *) NULL;
117 section = section->next)
122 if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; }
125 printf ("SECTION %d [%s]\t: size %08x",
128 (unsigned) bfd_get_section_size_before_reloc (section));
130 printf_vma (section->vma);
131 printf (" align 2**%u\n ",
132 section->alignment_power);
133 PF (SEC_ALLOC, "ALLOC");
134 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
135 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
136 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
137 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
138 PF (SEC_LOAD, "LOAD");
139 PF (SEC_RELOC, "RELOC");
140 PF (SEC_BALIGN, "BALIGN");
141 PF (SEC_READONLY, "READONLY");
142 PF (SEC_CODE, "CODE");
143 PF (SEC_DATA, "DATA");
151 DEFUN (slurp_symtab, (abfd),
154 asymbol **sy = (asymbol **) NULL;
156 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
158 (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
162 storage = get_symtab_upper_bound (abfd);
165 sy = (asymbol **) malloc (storage);
168 fprintf (stderr, "%s: out of memory.\n", program_name);
172 symcount = bfd_canonicalize_symtab (abfd, sy);
176 /* Sort symbols into value order */
182 asymbol *a = *(asymbol **)ap;
183 asymbol *b = *(asymbol **)bp;
187 if (a->name == (char *) NULL || (a->flags & (BSF_DEBUGGING)))
190 a_bfd = bfd_asymbol_bfd(a);
191 if (b->name == (char *) NULL || (b->flags & (BSF_DEBUGGING)))
194 b_bfd = bfd_asymbol_bfd(b);
196 diff = a_bfd - b_bfd;
201 diff = a->value - b->value;
206 return a->section - b->section;
209 /* Print the supplied address symbolically if possible */
211 objdump_print_address (vma, info)
213 struct disassemble_info *info;
215 /* Perform a binary search looking for the closest symbol to
216 the required value */
218 unsigned int min = 0;
219 unsigned int max = symcount;
221 unsigned int thisplace = 1;
222 unsigned int oldthisplace;
228 fprintf_vma (info->stream, vma);
234 oldthisplace = thisplace;
235 thisplace = (max + min) / 2;
236 if (thisplace == oldthisplace)
238 vardiff = syms[thisplace]->value - vma;
241 /* Check that the value isn't merely a coincidence.
242 (if not checked, we might print some undefined symbol
243 for the address 0 rather than "main", for example. */
244 || !(syms[thisplace]->flags & (BSF_GLOBAL|BSF_LOCAL)))
257 /* Totally awesome! the exact right symbol */
258 CONST char *match_name = syms[thisplace]->name;
259 int sym_len = strlen (match_name);
261 /* Avoid "filename.o" as a match */
263 && match_name[sym_len - 2] == '.'
264 && match_name[sym_len - 1] == 'o'
265 && thisplace + 1 < symcount
266 && syms[thisplace + 1]->value == vma)
267 match_name = syms[thisplace + 1]->name;
268 /* Totally awesome! the exact right symbol */
269 fprintf_vma (info->stream, vma);
270 fprintf (info->stream, " (%s+)0000", syms[thisplace]->name);
274 /* We've run out of places to look, print the symbol before this one
275 see if this or the symbol before describes this location the best */
279 if (syms[thisplace - 1]->value - vma >
280 syms[thisplace]->value - vma)
282 /* Previous symbol is in correct section and is closer */
287 fprintf_vma (info->stream, vma);
288 if (syms[thisplace]->value > vma)
290 fprintf (info->stream, " (%s-)", syms[thisplace]->name);
291 fprintf (info->stream, "%04x", syms[thisplace]->value - vma);
295 fprintf (info->stream, " (%s+)", syms[thisplace]->name);
296 fprintf (info->stream, "%04x", vma - syms[thisplace]->value);
302 disassemble_data (abfd)
305 bfd_byte *data = NULL;
306 bfd_arch_info_type *info;
307 bfd_size_type datasize = 0;
309 unsigned int (*print) ()= 0; /* Old style */
310 disassembler_ftype disassemble = 0; /* New style */
311 unsigned int print_insn_h8300 ();
312 enum bfd_architecture a;
313 struct disassemble_info disasm_info;
316 CONST char *prev_function = "";
320 /* Replace symbol section relative values with abs values */
321 boolean done_dot = false;
323 INIT_DISASSEMBLE_INFO(disasm_info, stdout);
324 disasm_info.print_address_func = objdump_print_address;
326 for (i = 0; i < symcount; i++)
328 syms[i]->value += syms[i]->section->vma;
331 /* We keep a copy of the symbols in the original order */
332 syms2 = slurp_symtab (abfd);
334 /* Sort the symbols into section and symbol order */
335 (void) qsort (syms, symcount, sizeof (asymbol *), comp);
337 /* Find the first useless symbol */
341 for (i = 0; i < symcount; i++)
343 if (syms[i]->name == (char *) NULL
344 || (syms[i]->flags & BSF_DEBUGGING) != 0)
353 if (machine != (char *) NULL)
355 info = bfd_scan_arch (machine);
358 fprintf (stderr, "%s: Can't use supplied machine %s\n",
363 abfd->arch_info = info;
366 /* See if we can disassemble using bfd */
368 if (abfd->arch_info->disassemble)
370 print = abfd->arch_info->disassemble;
374 a = bfd_get_arch (abfd);
378 disassemble = print_insn_sparc;
381 if (bfd_get_mach(abfd) == bfd_mach_z8001)
382 disassemble = print_insn_z8001;
384 disassemble = print_insn_z8002;
387 disassemble = print_insn_i386;
390 disassemble = print_insn_h8500;
393 disassemble = print_insn_m68k;
396 /* As far as I know we only handle big-endian 29k objects. */
397 disassemble = print_insn_big_a29k;
400 disassemble = print_insn_i960;
403 if (abfd->xvec->byteorder_big_p)
404 disassemble = print_insn_big_mips;
406 disassemble = print_insn_little_mips;
409 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
411 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
417 for (section = abfd->sections;
418 section != (asection *) NULL;
419 section = section->next)
422 if ((section->flags & SEC_LOAD)
423 && (only == (char *) NULL || strcmp (only, section->name) == 0))
425 printf ("Disassembly of section %s:\n", section->name);
427 if (bfd_get_section_size_before_reloc (section) == 0)
430 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
432 if (data == (bfd_byte *) NULL)
434 fprintf (stderr, "%s: memory exhausted.\n", program_name);
437 datasize = bfd_get_section_size_before_reloc (section);
439 bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc (section));
441 disasm_info.buffer = data;
442 disasm_info.buffer_vma = section->vma;
443 disasm_info.buffer_length =
444 bfd_get_section_size_before_reloc (section);
446 while (i < disasm_info.buffer_length)
448 if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 &&
451 if (done_dot == false)
461 if (with_line_numbers)
463 CONST char *filename;
464 CONST char *functionname;
467 if (bfd_find_nearest_line (abfd,
475 if (functionname && *functionname
476 && strcmp(functionname, prev_function))
478 printf ("%s():\n", functionname);
479 prev_function = functionname;
483 if (line && line != prevline)
485 printf ("%s:%u\n", filename, line);
490 objdump_print_address (section->vma + i, &disasm_info);
493 if (disassemble) /* New style */
495 int bytes = (*disassemble)(section->vma + i,
502 i += print (section->vma + i,
513 #ifdef ELF_STAB_DISPLAY
515 /* Define a table of stab values and print-strings. We wish the initializer
516 could be a direct-mapped table, but instead we build one the first
519 #define STAB_STRING_LENGTH 6
521 char stab_name[256][STAB_STRING_LENGTH];
525 char string[STAB_STRING_LENGTH];
528 struct stab_print stab_print[] = {
529 #define __define_stab(NAME, CODE, STRING) {CODE, STRING},
530 #include "aout/stab.def"
535 void dump_elf_stabs_1 ();
537 /* This is a kludge for dumping the stabs section from an ELF file that
538 uses Sun stabs encoding. It has to use some hooks into BFD because
539 string table sections are not normally visible to BFD callers. */
542 dump_elf_stabs (abfd)
547 /* Initialize stab name array if first time. */
548 if (stab_name[0][0] == 0)
550 /* Fill in numeric values for all possible strings. */
551 for (i = 0; i < 256; i++)
553 sprintf (stab_name[i], "%d", i);
555 for (i = 0; stab_print[i].string[0]; i++)
556 strcpy (stab_name[stab_print[i].value], stab_print[i].string);
559 if (0 != strncmp ("elf", abfd->xvec->name, 3))
561 fprintf (stderr, "%s: %s is not in ELF format.\n", program_name,
566 dump_elf_stabs_1 (abfd, ".stab", ".stabstr");
567 dump_elf_stabs_1 (abfd, ".stab.excl", ".stab.exclstr");
568 dump_elf_stabs_1 (abfd, ".stab.index", ".stab.indexstr");
572 dump_elf_stabs_1 (abfd, name1, name2)
574 char *name1; /* Section name of .stab */
575 char *name2; /* Section name of its string section */
577 Elf_Internal_Shdr *stab_hdr, *stabstr_hdr;
579 struct internal_nlist *stabs, *stabs_end;
581 unsigned file_string_table_offset, next_file_string_table_offset;
583 stab_hdr = bfd_elf_find_section (abfd, name1);
586 printf ("Contents of %s section: none.\n\n", name1);
590 stabstr_hdr = bfd_elf_find_section (abfd, name2);
591 if (0 == stabstr_hdr)
593 fprintf (stderr, "%s: %s has no %s section.\n", program_name,
594 abfd->filename, name2);
598 stabs = (struct internal_nlist *) xmalloc (stab_hdr ->sh_size);
599 strtab = (char *) xmalloc (stabstr_hdr->sh_size);
600 stabs_end = (struct internal_nlist *) (stab_hdr->sh_size + (char *)stabs);
602 if (bfd_seek (abfd, stab_hdr->sh_offset, SEEK_SET) < 0 ||
603 stab_hdr->sh_size != bfd_read ((PTR)stabs, stab_hdr->sh_size, 1, abfd))
605 fprintf (stderr, "%s: reading %s section of %s failed.\n",
611 if (bfd_seek (abfd, stabstr_hdr->sh_offset, SEEK_SET) < 0 ||
612 stabstr_hdr->sh_size != bfd_read ((PTR)strtab, stabstr_hdr->sh_size,
615 fprintf (stderr, "%s: reading %s section of %s failed.\n",
621 #define SWAP_SYMBOL(symp, abfd) \
623 (symp)->n_strx = bfd_h_get_32(abfd, \
624 (unsigned char *)&(symp)->n_strx); \
625 (symp)->n_desc = bfd_h_get_16 (abfd, \
626 (unsigned char *)&(symp)->n_desc); \
627 (symp)->n_value = bfd_h_get_32 (abfd, \
628 (unsigned char *)&(symp)->n_value); \
631 printf ("Contents of %s section:\n\n", name1);
632 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
634 file_string_table_offset = 0;
635 next_file_string_table_offset = 0;
637 /* Loop through all symbols and print them.
639 We start the index at -1 because there is a dummy symbol on
640 the front of Sun's stabs-in-elf sections. */
642 for (i = -1; stabs < stabs_end; stabs++, i++)
644 SWAP_SYMBOL (stabs, abfd);
645 printf ("\n%-6d %-6s %-6d %-6d %08x %-6d", i,
646 stab_name [stabs->n_type],
647 stabs->n_other, stabs->n_desc, stabs->n_value,
650 /* Symbols with type == 0 (N_UNDF) specify the length of the
651 string table associated with this file. We use that info
652 to know how to relocate the *next* file's string table indices. */
654 if (stabs->n_type == N_UNDF)
656 file_string_table_offset = next_file_string_table_offset;
657 next_file_string_table_offset += stabs->n_value;
660 /* Now, using the possibly updated string table offset, print the
661 string (if any) associated with this symbol. */
663 if ((stabs->n_strx + file_string_table_offset) < stabstr_hdr->sh_size)
664 printf (" %s", &strtab[stabs->n_strx + file_string_table_offset]);
670 #endif /* ELF_STAB_DISPLAY */
676 if (!bfd_check_format (abfd, bfd_object))
678 fprintf (stderr, "%s: %s not an object file\n", program_name,
682 printf ("\n%s: file format %s\n", abfd->filename, abfd->xvec->name);
684 print_arelt_descr (stdout, abfd, true);
686 if (dump_file_header)
690 printf ("architecture: %s, ",
691 bfd_printable_arch_mach (bfd_get_arch (abfd),
692 bfd_get_mach (abfd)));
693 printf ("flags 0x%08x:\n", abfd->flags);
695 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
696 PF (HAS_RELOC, "HAS_RELOC");
697 PF (EXEC_P, "EXEC_P");
698 PF (HAS_LINENO, "HAS_LINENO");
699 PF (HAS_DEBUG, "HAS_DEBUG");
700 PF (HAS_SYMS, "HAS_SYMS");
701 PF (HAS_LOCALS, "HAS_LOCALS");
702 PF (DYNAMIC, "DYNAMIC");
703 PF (WP_TEXT, "WP_TEXT");
704 PF (D_PAGED, "D_PAGED");
705 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
706 printf ("\nstart address 0x");
707 printf_vma (abfd->start_address);
711 if (dump_section_headers)
713 if (dump_symtab || dump_reloc_info || disassemble)
715 syms = slurp_symtab (abfd);
719 #ifdef ELF_STAB_DISPLAY
720 if (dump_stab_section_info)
721 dump_elf_stabs (abfd);
725 if (dump_section_contents)
728 disassemble_data (abfd);
732 display_file (filename, target)
736 bfd *file, *arfile = (bfd *) NULL;
738 file = bfd_openr (filename, target);
741 bfd_perror (filename);
745 if (bfd_check_format (file, bfd_archive) == true)
747 printf ("In archive %s:\n", bfd_get_filename (file));
750 bfd_error = no_error;
752 arfile = bfd_openr_next_archived_file (file, arfile);
755 if (bfd_error != no_more_archived_files)
756 bfd_perror (bfd_get_filename (file));
760 display_bfd (arfile);
761 /* Don't close the archive elements; we need them for next_archive */
770 /* Actually display the various requested regions */
778 bfd_size_type datasize = 0;
781 for (section = abfd->sections; section != NULL; section =
786 if (only == (char *) NULL ||
787 strcmp (only, section->name) == 0)
789 if (section->flags & SEC_HAS_CONTENTS)
791 printf ("Contents of section %s:\n", section->name);
793 if (bfd_get_section_size_before_reloc (section) == 0)
795 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
796 if (data == (bfd_byte *) NULL)
798 fprintf (stderr, "%s: memory exhausted.\n", program_name);
801 datasize = bfd_get_section_size_before_reloc (section);
804 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_get_section_size_before_reloc (section));
806 for (i = 0; i < bfd_get_section_size_before_reloc (section); i += onaline)
810 printf (" %04lx ", (unsigned long int) (i + section->vma));
811 for (j = i; j < i + onaline; j++)
813 if (j < bfd_get_section_size_before_reloc (section))
814 printf ("%02x", (unsigned) (data[j]));
822 for (j = i; j < i + onaline; j++)
824 if (j >= bfd_get_section_size_before_reloc (section))
827 printf ("%c", isprint (data[j]) ? data[j] : '.');
837 /* Should perhaps share code and display with nm? */
844 asymbol **current = syms;
846 printf ("SYMBOL TABLE:\n");
848 for (count = 0; count < symcount; count++)
853 bfd *cur_bfd = bfd_asymbol_bfd(*current);
856 bfd_print_symbol (cur_bfd,
858 *current, bfd_print_symbol_all);
874 unsigned int relcount;
877 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
879 if (a == &bfd_abs_section)
881 if (a == &bfd_und_section)
883 if (bfd_is_com_section (a))
886 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
888 if (bfd_get_reloc_upper_bound (abfd, a) == 0)
890 printf (" (none)\n\n");
896 relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a));
897 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
900 printf (" (none)\n\n");
905 printf ("OFFSET TYPE VALUE \n");
907 for (p = relpp; relcount && *p != (arelent *) NULL; p++,
911 CONST char *sym_name;
913 /* CONST char *section_name = q->section == (asection *)NULL ? "*abs" :*/
914 /* q->section->name;*/
915 CONST char *section_name = (*(q->sym_ptr_ptr))->section->name;
917 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
919 sym_name = (*(q->sym_ptr_ptr))->name;
927 printf_vma (q->address);
934 printf_vma (q->address);
935 printf (" %-8s [%s]",
942 printf_vma (q->addend);
955 #define _DUMMY_NAME_ "/dev/null"
957 #define _DUMMY_NAME_ "##dummy"
960 DEFUN (display_info_table, (first, last),
961 int first AND int last)
964 extern bfd_target *target_vector[];
966 printf ("\n%12s", " ");
967 for (i = first; i++ < last && target_vector[i];)
968 printf ("%s ", target_vector[i]->name);
971 for (j = (int) bfd_arch_obscure + 1; (int) j < (int) bfd_arch_last; j++)
972 if (strcmp (bfd_printable_arch_mach (j, 0), "UNKNOWN!") != 0)
974 printf ("%11s ", bfd_printable_arch_mach (j, 0));
975 for (i = first; i++ < last && target_vector[i];)
977 bfd_target *p = target_vector[i];
978 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
979 int l = strlen (p->name);
981 bfd_set_format (abfd, bfd_object);
982 ok = bfd_set_arch_mach (abfd, j, 0);
985 printf ("%s ", p->name);
989 printf ("%c", ok ? '*' : '-');
998 DEFUN_VOID (display_info)
1001 unsigned int i, j, columns;
1002 extern bfd_target *target_vector[];
1003 extern char *getenv ();
1005 printf ("BFD header file version %s\n", BFD_VERSION);
1006 for (i = 0; target_vector[i]; i++)
1008 bfd_target *p = target_vector[i];
1009 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
1010 bfd_set_format (abfd, bfd_object);
1011 printf ("%s\n (header %s, data %s)\n", p->name,
1012 p->header_byteorder_big_p ? "big endian" : "little endian",
1013 p->byteorder_big_p ? "big endian" : "little endian");
1014 for (j = (int) bfd_arch_obscure + 1; j < (int) bfd_arch_last; j++)
1015 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) j, 0))
1017 bfd_printable_arch_mach ((enum bfd_architecture) j, 0));
1020 if (colum = getenv ("COLUMNS"))
1021 columns = atoi (colum);
1024 for (i = 0; target_vector[i];)
1028 for (j = 12; target_vector[i] && j < columns; i++)
1029 j += strlen (target_vector[i]->name) + 1;
1033 display_info_table (old, i);
1037 /** main and like trivia */
1045 extern char *optarg;
1046 char *target = default_target;
1047 boolean seenflag = false;
1051 program_name = *argv;
1053 while ((c = getopt_long (argc, argv, "ib:m:Vdlfahrtxsj:", long_options, &ind))
1066 with_line_numbers = 1;
1072 dump_file_header = true;
1079 dump_reloc_info = 1;
1080 dump_file_header = true;
1082 dump_section_headers = 1;
1085 break; /* we've been given a long option */
1093 dump_section_contents = 1;
1096 dump_reloc_info = 1;
1102 dump_section_headers = 1;
1113 printf ("%s version %s\n", program_name, program_version);
1115 if (seenflag == false)
1125 display_file ("a.out", target);
1127 for (; optind < argc;)
1128 display_file (argv[optind++], target);