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 ();
46 extern int fprintf PARAMS ((FILE *, CONST char *, ...));
48 char *default_target = NULL; /* default at runtime */
50 extern *program_version;
51 char *program_name = NULL;
53 int show_version = 0; /* show the version number */
54 int dump_section_contents; /* -s */
55 int dump_section_headers; /* -h */
56 boolean dump_file_header; /* -f */
57 int dump_symtab; /* -t */
58 int dump_reloc_info; /* -r */
59 int dump_ar_hdrs; /* -a */
60 int with_line_numbers; /* -l */
61 int dump_stab_section_info; /* -stabs */
62 boolean disassemble; /* -d */
63 boolean info; /* -i */
66 char *machine = (char *) NULL;
72 unsigned int symcount = 0;
74 /* Forward declarations. */
77 display_file PARAMS ((char *filename, char *target));
80 dump_data PARAMS ((bfd *abfd));
83 dump_relocs PARAMS ((bfd *abfd));
86 dump_symbols PARAMS ((bfd *abfd));
92 usage: %s [-ahifdrtxsl] [-m machine] [-j section_name]\n\
93 [--syms] [--reloc] [--header] [--version] obj ...\n",
98 static struct option long_options[]=
100 {"syms", no_argument, &dump_symtab, 1},
101 {"reloc", no_argument, &dump_reloc_info, 1},
102 {"header", no_argument, &dump_section_headers, 1},
103 {"version", no_argument, &show_version, 1},
104 #ifdef ELF_STAB_DISPLAY
105 {"stabs", no_argument, &dump_stab_section_info, 1},
107 {0, no_argument, 0, 0}};
116 for (section = abfd->sections;
117 section != (asection *) NULL;
118 section = section->next)
123 if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; }
126 printf ("SECTION %d [%s]\t: size %08x",
129 (unsigned) bfd_get_section_size_before_reloc (section));
131 printf_vma (section->vma);
132 printf (" align 2**%u\n ",
133 section->alignment_power);
134 PF (SEC_ALLOC, "ALLOC");
135 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
136 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
137 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
138 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
139 PF (SEC_LOAD, "LOAD");
140 PF (SEC_RELOC, "RELOC");
141 PF (SEC_BALIGN, "BALIGN");
142 PF (SEC_READONLY, "READONLY");
143 PF (SEC_CODE, "CODE");
144 PF (SEC_DATA, "DATA");
152 DEFUN (slurp_symtab, (abfd),
155 asymbol **sy = (asymbol **) NULL;
157 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
159 (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
163 storage = get_symtab_upper_bound (abfd);
166 sy = (asymbol **) malloc (storage);
169 fprintf (stderr, "%s: out of memory.\n", program_name);
173 symcount = bfd_canonicalize_symtab (abfd, sy);
177 /* Sort symbols into value order */
183 asymbol *a = *(asymbol **)ap;
184 asymbol *b = *(asymbol **)bp;
188 if (a->name == (char *) NULL || (a->flags & (BSF_DEBUGGING)))
191 a_bfd = bfd_asymbol_bfd(a);
192 if (b->name == (char *) NULL || (b->flags & (BSF_DEBUGGING)))
195 b_bfd = bfd_asymbol_bfd(b);
197 diff = a_bfd - b_bfd;
202 diff = a->value - b->value;
207 return a->section - b->section;
210 /* Print the supplied address symbolically if possible */
212 objdump_print_address (vma, info)
214 struct disassemble_info *info;
216 /* Perform a binary search looking for the closest symbol to
217 the required value */
219 unsigned int min = 0;
220 unsigned int max = symcount;
222 unsigned int thisplace = 1;
223 unsigned int oldthisplace;
229 fprintf_vma (info->stream, vma);
235 oldthisplace = thisplace;
236 thisplace = (max + min) / 2;
237 if (thisplace == oldthisplace)
239 vardiff = syms[thisplace]->value - vma;
242 /* Check that the value isn't merely a coincidence.
243 (if not checked, we might print some undefined symbol
244 for the address 0 rather than "main", for example. */
245 || !(syms[thisplace]->flags & (BSF_GLOBAL|BSF_LOCAL)))
258 /* Totally awesome! the exact right symbol */
259 CONST char *match_name = syms[thisplace]->name;
260 int sym_len = strlen (match_name);
262 /* Avoid "filename.o" as a match */
264 && match_name[sym_len - 2] == '.'
265 && match_name[sym_len - 1] == 'o'
266 && thisplace + 1 < symcount
267 && syms[thisplace + 1]->value == vma)
268 match_name = syms[thisplace + 1]->name;
269 /* Totally awesome! the exact right symbol */
270 fprintf_vma (info->stream, vma);
271 fprintf (info->stream, " (%s+)0000", syms[thisplace]->name);
275 /* We've run out of places to look, print the symbol before this one
276 see if this or the symbol before describes this location the best */
280 if (syms[thisplace - 1]->value - vma >
281 syms[thisplace]->value - vma)
283 /* Previous symbol is in correct section and is closer */
288 fprintf_vma (info->stream, vma);
289 if (syms[thisplace]->value > vma)
291 fprintf (info->stream, " (%s-)", syms[thisplace]->name);
292 fprintf (info->stream, "%04x", syms[thisplace]->value - vma);
296 fprintf (info->stream, " (%s+)", syms[thisplace]->name);
297 fprintf (info->stream, "%04x", vma - syms[thisplace]->value);
303 disassemble_data (abfd)
306 bfd_byte *data = NULL;
307 bfd_arch_info_type *info;
308 bfd_size_type datasize = 0;
310 unsigned int (*print) ()= 0; /* Old style */
311 disassembler_ftype disassemble = 0; /* New style */
312 unsigned int print_insn_h8300 ();
313 enum bfd_architecture a;
314 struct disassemble_info disasm_info;
317 CONST char *prev_function = "";
321 /* Replace symbol section relative values with abs values */
322 boolean done_dot = false;
324 INIT_DISASSEMBLE_INFO(disasm_info, stdout);
325 disasm_info.print_address_func = objdump_print_address;
327 for (i = 0; i < symcount; i++)
329 syms[i]->value += syms[i]->section->vma;
332 /* We keep a copy of the symbols in the original order */
333 syms2 = slurp_symtab (abfd);
335 /* Sort the symbols into section and symbol order */
336 (void) qsort (syms, symcount, sizeof (asymbol *), comp);
338 /* Find the first useless symbol */
342 for (i = 0; i < symcount; i++)
344 if (syms[i]->name == (char *) NULL
345 || (syms[i]->flags & BSF_DEBUGGING) != 0)
354 if (machine != (char *) NULL)
356 info = bfd_scan_arch (machine);
359 fprintf (stderr, "%s: Can't use supplied machine %s\n",
364 abfd->arch_info = info;
367 /* See if we can disassemble using bfd */
369 if (abfd->arch_info->disassemble)
371 print = abfd->arch_info->disassemble;
375 a = bfd_get_arch (abfd);
379 disassemble = print_insn_sparc;
382 if (bfd_get_mach(abfd) == bfd_mach_z8001)
383 disassemble = print_insn_z8001;
385 disassemble = print_insn_z8002;
388 disassemble = print_insn_i386;
391 disassemble = print_insn_h8500;
394 disassemble = print_insn_sh;
397 disassemble = print_insn_alpha;
400 disassemble = print_insn_m68k;
403 /* As far as I know we only handle big-endian 29k objects. */
404 disassemble = print_insn_big_a29k;
407 disassemble = print_insn_i960;
410 if (abfd->xvec->byteorder_big_p)
411 disassemble = print_insn_big_mips;
413 disassemble = print_insn_little_mips;
416 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
418 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
424 for (section = abfd->sections;
425 section != (asection *) NULL;
426 section = section->next)
429 if ((section->flags & SEC_LOAD)
430 && (only == (char *) NULL || strcmp (only, section->name) == 0))
432 printf ("Disassembly of section %s:\n", section->name);
434 if (bfd_get_section_size_before_reloc (section) == 0)
437 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
439 if (data == (bfd_byte *) NULL)
441 fprintf (stderr, "%s: memory exhausted.\n", program_name);
444 datasize = bfd_get_section_size_before_reloc (section);
446 bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc (section));
448 disasm_info.buffer = data;
449 disasm_info.buffer_vma = section->vma;
450 disasm_info.buffer_length =
451 bfd_get_section_size_before_reloc (section);
453 while (i < disasm_info.buffer_length)
455 if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 &&
458 if (done_dot == false)
468 if (with_line_numbers)
470 CONST char *filename;
471 CONST char *functionname;
474 if (bfd_find_nearest_line (abfd,
482 if (functionname && *functionname
483 && strcmp(functionname, prev_function))
485 printf ("%s():\n", functionname);
486 prev_function = functionname;
490 if (line && line != prevline)
492 printf ("%s:%u\n", filename, line);
497 objdump_print_address (section->vma + i, &disasm_info);
500 if (disassemble) /* New style */
502 int bytes = (*disassemble)(section->vma + i,
509 i += print (section->vma + i,
520 #ifdef ELF_STAB_DISPLAY
522 /* Define a table of stab values and print-strings. We wish the initializer
523 could be a direct-mapped table, but instead we build one the first
526 #define STAB_STRING_LENGTH 6
528 char stab_name[256][STAB_STRING_LENGTH];
532 char string[STAB_STRING_LENGTH];
535 struct stab_print stab_print[] = {
536 #define __define_stab(NAME, CODE, STRING) {CODE, STRING},
537 #include "aout/stab.def"
542 void dump_elf_stabs_1 ();
544 /* This is a kludge for dumping the stabs section from an ELF file that
545 uses Sun stabs encoding. It has to use some hooks into BFD because
546 string table sections are not normally visible to BFD callers. */
549 dump_elf_stabs (abfd)
554 /* Initialize stab name array if first time. */
555 if (stab_name[0][0] == 0)
557 /* Fill in numeric values for all possible strings. */
558 for (i = 0; i < 256; i++)
560 sprintf (stab_name[i], "%d", i);
562 for (i = 0; stab_print[i].string[0]; i++)
563 strcpy (stab_name[stab_print[i].value], stab_print[i].string);
566 if (0 != strncmp ("elf", abfd->xvec->name, 3))
568 fprintf (stderr, "%s: %s is not in ELF format.\n", program_name,
573 dump_elf_stabs_1 (abfd, ".stab", ".stabstr");
574 dump_elf_stabs_1 (abfd, ".stab.excl", ".stab.exclstr");
575 dump_elf_stabs_1 (abfd, ".stab.index", ".stab.indexstr");
579 dump_elf_stabs_1 (abfd, name1, name2)
581 char *name1; /* Section name of .stab */
582 char *name2; /* Section name of its string section */
584 Elf_Internal_Shdr *stab_hdr, *stabstr_hdr;
586 struct internal_nlist *stabs, *stabs_end;
588 unsigned file_string_table_offset, next_file_string_table_offset;
590 stab_hdr = bfd_elf_find_section (abfd, name1);
593 printf ("Contents of %s section: none.\n\n", name1);
597 stabstr_hdr = bfd_elf_find_section (abfd, name2);
598 if (0 == stabstr_hdr)
600 fprintf (stderr, "%s: %s has no %s section.\n", program_name,
601 abfd->filename, name2);
605 stabs = (struct internal_nlist *) xmalloc (stab_hdr ->sh_size);
606 strtab = (char *) xmalloc (stabstr_hdr->sh_size);
607 stabs_end = (struct internal_nlist *) (stab_hdr->sh_size + (char *)stabs);
609 if (bfd_seek (abfd, stab_hdr->sh_offset, SEEK_SET) < 0 ||
610 stab_hdr->sh_size != bfd_read ((PTR)stabs, stab_hdr->sh_size, 1, abfd))
612 fprintf (stderr, "%s: reading %s section of %s failed.\n",
618 if (bfd_seek (abfd, stabstr_hdr->sh_offset, SEEK_SET) < 0 ||
619 stabstr_hdr->sh_size != bfd_read ((PTR)strtab, stabstr_hdr->sh_size,
622 fprintf (stderr, "%s: reading %s section of %s failed.\n",
628 #define SWAP_SYMBOL(symp, abfd) \
630 (symp)->n_strx = bfd_h_get_32(abfd, \
631 (unsigned char *)&(symp)->n_strx); \
632 (symp)->n_desc = bfd_h_get_16 (abfd, \
633 (unsigned char *)&(symp)->n_desc); \
634 (symp)->n_value = bfd_h_get_32 (abfd, \
635 (unsigned char *)&(symp)->n_value); \
638 printf ("Contents of %s section:\n\n", name1);
639 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
641 file_string_table_offset = 0;
642 next_file_string_table_offset = 0;
644 /* Loop through all symbols and print them.
646 We start the index at -1 because there is a dummy symbol on
647 the front of Sun's stabs-in-elf sections. */
649 for (i = -1; stabs < stabs_end; stabs++, i++)
651 SWAP_SYMBOL (stabs, abfd);
652 printf ("\n%-6d %-6s %-6d %-6d %08x %-6d", i,
653 stab_name [stabs->n_type],
654 stabs->n_other, stabs->n_desc, stabs->n_value,
657 /* Symbols with type == 0 (N_UNDF) specify the length of the
658 string table associated with this file. We use that info
659 to know how to relocate the *next* file's string table indices. */
661 if (stabs->n_type == N_UNDF)
663 file_string_table_offset = next_file_string_table_offset;
664 next_file_string_table_offset += stabs->n_value;
667 /* Now, using the possibly updated string table offset, print the
668 string (if any) associated with this symbol. */
670 if ((stabs->n_strx + file_string_table_offset) < stabstr_hdr->sh_size)
671 printf (" %s", &strtab[stabs->n_strx + file_string_table_offset]);
677 #endif /* ELF_STAB_DISPLAY */
683 if (!bfd_check_format (abfd, bfd_object))
685 fprintf (stderr, "%s: %s not an object file\n", program_name,
689 printf ("\n%s: file format %s\n", abfd->filename, abfd->xvec->name);
691 print_arelt_descr (stdout, abfd, true);
693 if (dump_file_header)
697 printf ("architecture: %s, ",
698 bfd_printable_arch_mach (bfd_get_arch (abfd),
699 bfd_get_mach (abfd)));
700 printf ("flags 0x%08x:\n", abfd->flags);
702 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
703 PF (HAS_RELOC, "HAS_RELOC");
704 PF (EXEC_P, "EXEC_P");
705 PF (HAS_LINENO, "HAS_LINENO");
706 PF (HAS_DEBUG, "HAS_DEBUG");
707 PF (HAS_SYMS, "HAS_SYMS");
708 PF (HAS_LOCALS, "HAS_LOCALS");
709 PF (DYNAMIC, "DYNAMIC");
710 PF (WP_TEXT, "WP_TEXT");
711 PF (D_PAGED, "D_PAGED");
712 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
713 printf ("\nstart address 0x");
714 printf_vma (abfd->start_address);
718 if (dump_section_headers)
720 if (dump_symtab || dump_reloc_info || disassemble)
722 syms = slurp_symtab (abfd);
726 #ifdef ELF_STAB_DISPLAY
727 if (dump_stab_section_info)
728 dump_elf_stabs (abfd);
732 if (dump_section_contents)
735 disassemble_data (abfd);
739 display_file (filename, target)
743 bfd *file, *arfile = (bfd *) NULL;
745 file = bfd_openr (filename, target);
748 bfd_perror (filename);
752 if (bfd_check_format (file, bfd_archive) == true)
754 printf ("In archive %s:\n", bfd_get_filename (file));
757 bfd_error = no_error;
759 arfile = bfd_openr_next_archived_file (file, arfile);
762 if (bfd_error != no_more_archived_files)
763 bfd_perror (bfd_get_filename (file));
767 display_bfd (arfile);
768 /* Don't close the archive elements; we need them for next_archive */
777 /* Actually display the various requested regions */
785 bfd_size_type datasize = 0;
788 for (section = abfd->sections; section != NULL; section =
793 if (only == (char *) NULL ||
794 strcmp (only, section->name) == 0)
796 if (section->flags & SEC_HAS_CONTENTS)
798 printf ("Contents of section %s:\n", section->name);
800 if (bfd_get_section_size_before_reloc (section) == 0)
802 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
803 if (data == (bfd_byte *) NULL)
805 fprintf (stderr, "%s: memory exhausted.\n", program_name);
808 datasize = bfd_get_section_size_before_reloc (section);
811 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_get_section_size_before_reloc (section));
813 for (i = 0; i < bfd_get_section_size_before_reloc (section); i += onaline)
817 printf (" %04lx ", (unsigned long int) (i + section->vma));
818 for (j = i; j < i + onaline; j++)
820 if (j < bfd_get_section_size_before_reloc (section))
821 printf ("%02x", (unsigned) (data[j]));
829 for (j = i; j < i + onaline; j++)
831 if (j >= bfd_get_section_size_before_reloc (section))
834 printf ("%c", isprint (data[j]) ? data[j] : '.');
844 /* Should perhaps share code and display with nm? */
851 asymbol **current = syms;
853 printf ("SYMBOL TABLE:\n");
855 for (count = 0; count < symcount; count++)
860 bfd *cur_bfd = bfd_asymbol_bfd(*current);
863 bfd_print_symbol (cur_bfd,
865 *current, bfd_print_symbol_all);
881 unsigned int relcount;
884 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
886 if (a == &bfd_abs_section)
888 if (a == &bfd_und_section)
890 if (bfd_is_com_section (a))
893 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
895 if (bfd_get_reloc_upper_bound (abfd, a) == 0)
897 printf (" (none)\n\n");
903 relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a));
904 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
907 printf (" (none)\n\n");
912 printf ("OFFSET TYPE VALUE \n");
914 for (p = relpp; relcount && *p != (arelent *) NULL; p++,
918 CONST char *sym_name;
920 /* CONST char *section_name = q->section == (asection *)NULL ? "*abs" :*/
921 /* q->section->name;*/
922 CONST char *section_name = (*(q->sym_ptr_ptr))->section->name;
924 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
926 sym_name = (*(q->sym_ptr_ptr))->name;
934 printf_vma (q->address);
941 printf_vma (q->address);
942 printf (" %-8s [%s]",
949 printf_vma (q->addend);
962 #define _DUMMY_NAME_ "/dev/null"
964 #define _DUMMY_NAME_ "##dummy"
967 DEFUN (display_info_table, (first, last),
968 int first AND int last)
971 extern bfd_target *target_vector[];
973 printf ("\n%12s", " ");
974 for (i = first; i++ < last && target_vector[i];)
975 printf ("%s ", target_vector[i]->name);
978 for (j = (int) bfd_arch_obscure + 1; (int) j < (int) bfd_arch_last; j++)
979 if (strcmp (bfd_printable_arch_mach (j, 0), "UNKNOWN!") != 0)
981 printf ("%11s ", bfd_printable_arch_mach (j, 0));
982 for (i = first; i++ < last && target_vector[i];)
984 bfd_target *p = target_vector[i];
985 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
986 int l = strlen (p->name);
988 bfd_set_format (abfd, bfd_object);
989 ok = bfd_set_arch_mach (abfd, j, 0);
992 printf ("%s ", p->name);
996 printf ("%c", ok ? '*' : '-');
1005 DEFUN_VOID (display_info)
1008 unsigned int i, j, columns;
1009 extern bfd_target *target_vector[];
1010 extern char *getenv ();
1012 printf ("BFD header file version %s\n", BFD_VERSION);
1013 for (i = 0; target_vector[i]; i++)
1015 bfd_target *p = target_vector[i];
1016 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
1017 bfd_set_format (abfd, bfd_object);
1018 printf ("%s\n (header %s, data %s)\n", p->name,
1019 p->header_byteorder_big_p ? "big endian" : "little endian",
1020 p->byteorder_big_p ? "big endian" : "little endian");
1021 for (j = (int) bfd_arch_obscure + 1; j < (int) bfd_arch_last; j++)
1022 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) j, 0))
1024 bfd_printable_arch_mach ((enum bfd_architecture) j, 0));
1027 if (colum = getenv ("COLUMNS"))
1028 columns = atoi (colum);
1031 for (i = 0; target_vector[i];)
1035 for (j = 12; target_vector[i] && j < columns; i++)
1036 j += strlen (target_vector[i]->name) + 1;
1040 display_info_table (old, i);
1044 /** main and like trivia */
1052 extern char *optarg;
1053 char *target = default_target;
1054 boolean seenflag = false;
1058 program_name = *argv;
1060 while ((c = getopt_long (argc, argv, "ib:m:Vdlfahrtxsj:", long_options, &ind))
1073 with_line_numbers = 1;
1079 dump_file_header = true;
1086 dump_reloc_info = 1;
1087 dump_file_header = true;
1089 dump_section_headers = 1;
1092 break; /* we've been given a long option */
1100 dump_section_contents = 1;
1103 dump_reloc_info = 1;
1109 dump_section_headers = 1;
1120 printf ("%s version %s\n", program_name, program_version);
1122 if (seenflag == false)
1132 display_file ("a.out", target);
1134 for (; optind < argc;)
1135 display_file (argv[optind++], target);