* breakpoint.c (breakpoint_re_set_one): Fix storage leak.
[deliverable/binutils-gdb.git] / binutils / objdump.c
CommitLineData
d20f480f 1/* objdump.c -- dump information about an object file.
d9971b83 2 Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
2fa0b342
DHW
3
4This file is part of BFD, the Binary File Diddler.
5
6BFD is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
d20f480f 8the Free Software Foundation; either version 2, or (at your option)
2fa0b342
DHW
9any later version.
10
11BFD is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BFD; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
2fa0b342
DHW
20/*
21 * Until there is other documentation, refer to the manual page dump(1) in
22 * the system 5 program's reference manual
23 */
24
2fa0b342 25#include "bfd.h"
d20f480f 26#include "sysdep.h"
2fa0b342
DHW
27#include "getopt.h"
28#include <stdio.h>
29#include <ctype.h>
2e8adbd7 30#include "dis-asm.h"
2fa0b342 31
73b8f102
JG
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
35 BFD interfaces. */
36
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"
42extern Elf_Internal_Shdr *bfd_elf_find_section();
43#endif /* ELF_STAB_DISPLAY */
bf661056 44
2e8adbd7
PB
45extern char *xmalloc ();
46extern int fprintf ();
2fa0b342
DHW
47
48char *default_target = NULL; /* default at runtime */
49
249c6fc0 50extern *program_version;
2fa0b342
DHW
51char *program_name = NULL;
52
249c6fc0 53int show_version = 0; /* show the version number */
2fa0b342
DHW
54int dump_section_contents; /* -s */
55int dump_section_headers; /* -h */
56boolean dump_file_header; /* -f */
57int dump_symtab; /* -t */
58int dump_reloc_info; /* -r */
59int dump_ar_hdrs; /* -a */
aa0a709a 60int with_line_numbers; /* -l */
73b8f102 61int dump_stab_section_info; /* -stabs */
aa0a709a
SC
62boolean disassemble; /* -d */
63boolean info; /* -i */
2fa0b342
DHW
64char *only;
65
aa0a709a
SC
66char *machine = (char *) NULL;
67asymbol **syms;
68asymbol **syms2;
2fa0b342 69
2fa0b342
DHW
70unsigned int storage;
71
72unsigned int symcount = 0;
73
d9971b83
KR
74/* Forward declarations. */
75
76static void
77display_file PARAMS ((char *filename, char *target));
78
79static void
80dump_data PARAMS ((bfd *abfd));
81
82static void
83dump_relocs PARAMS ((bfd *abfd));
84
85static void
86dump_symbols PARAMS ((bfd *abfd));
87\f
2fa0b342
DHW
88void
89usage ()
90{
452b40b6
JK
91 fprintf (stderr, "\
92usage: %s [-ahifdrtxsl] [-m machine] [-j section_name]\n\
93 [--syms] [--reloc] [--header] [--version] obj ...\n",
2fa0b342
DHW
94 program_name);
95 exit (1);
96}
97
aa0a709a
SC
98static struct option long_options[]=
99{
100 {"syms", no_argument, &dump_symtab, 1},
101 {"reloc", no_argument, &dump_reloc_info, 1},
102 {"header", no_argument, &dump_section_headers, 1},
249c6fc0 103 {"version", no_argument, &show_version, 1},
73b8f102
JG
104#ifdef ELF_STAB_DISPLAY
105 {"stabs", no_argument, &dump_stab_section_info, 1},
106#endif
aa0a709a 107 {0, no_argument, 0, 0}};
2fa0b342
DHW
108
109
2fa0b342 110static void
aa0a709a
SC
111dump_headers (abfd)
112 bfd *abfd;
2fa0b342
DHW
113{
114 asection *section;
aa0a709a 115
2fa0b342
DHW
116 for (section = abfd->sections;
117 section != (asection *) NULL;
aa0a709a
SC
118 section = section->next)
119 {
120 char *comma = "";
121
2fa0b342 122#define PF(x,y) \
e779a58c
JG
123 if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; }
124
125
aa0a709a
SC
126 printf ("SECTION %d [%s]\t: size %08x",
127 section->index,
128 section->name,
129 (unsigned) bfd_get_section_size_before_reloc (section));
130 printf (" vma ");
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");
145 PF (SEC_ROM, "ROM");
146 printf ("\n");
2fa0b342 147#undef PF
aa0a709a 148 }
2fa0b342
DHW
149}
150
151static asymbol **
aa0a709a
SC
152DEFUN (slurp_symtab, (abfd),
153 bfd * abfd)
2fa0b342 154{
aa0a709a 155 asymbol **sy = (asymbol **) NULL;
2fa0b342 156
aa0a709a
SC
157 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
158 {
159 (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
160 return (NULL);
161 }
162
163 storage = get_symtab_upper_bound (abfd);
164 if (storage)
165 {
166 sy = (asymbol **) malloc (storage);
167 if (sy == NULL)
168 {
169 fprintf (stderr, "%s: out of memory.\n", program_name);
170 exit (1);
d20f480f 171 }
aa0a709a
SC
172 }
173 symcount = bfd_canonicalize_symtab (abfd, sy);
174 return sy;
2fa0b342 175}
aa0a709a 176
2fa0b342 177/* Sort symbols into value order */
aa0a709a
SC
178static int
179comp (ap, bp)
770cde30
JG
180 PTR ap;
181 PTR bp;
2fa0b342 182{
770cde30
JG
183 asymbol *a = *(asymbol **)ap;
184 asymbol *b = *(asymbol **)bp;
2fa0b342 185 int diff;
d9971b83 186 bfd *a_bfd, *b_bfd;
2fa0b342 187
aa0a709a 188 if (a->name == (char *) NULL || (a->flags & (BSF_DEBUGGING)))
d9971b83
KR
189 a_bfd = 0;
190 else
191 a_bfd = bfd_asymbol_bfd(a);
aa0a709a 192 if (b->name == (char *) NULL || (b->flags & (BSF_DEBUGGING)))
d9971b83
KR
193 b_bfd = 0;
194 else
195 b_bfd = bfd_asymbol_bfd(b);
2fa0b342 196
d9971b83 197 diff = a_bfd - b_bfd;
aa0a709a
SC
198 if (diff)
199 {
200 return -diff;
201 }
2fa0b342 202 diff = a->value - b->value;
aa0a709a
SC
203 if (diff)
204 {
205 return diff;
206 }
207 return a->section - b->section;
2fa0b342
DHW
208}
209
210/* Print the supplied address symbolically if possible */
211void
aa0a709a
SC
212print_address (vma, stream)
213 bfd_vma vma;
214 FILE *stream;
2fa0b342
DHW
215{
216 /* Perform a binary search looking for the closest symbol to
217 the required value */
218
219 unsigned int min = 0;
220 unsigned int max = symcount;
221
222 unsigned int thisplace = 1;
aa0a709a 223 unsigned int oldthisplace;
2fa0b342
DHW
224
225 int vardiff;
2fa0b342 226
aa0a709a
SC
227 if (symcount == 0)
228 {
229 fprintf_vma (stream, vma);
2fa0b342 230 }
aa0a709a
SC
231 else
232 {
233 while (true)
234 {
235 oldthisplace = thisplace;
236 thisplace = (max + min) / 2;
237 if (thisplace == oldthisplace)
238 break;
239 vardiff = syms[thisplace]->value - vma;
240
d9971b83
KR
241 if (vardiff
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)))
aa0a709a
SC
246 {
247 if (vardiff > 0)
248 {
249 max = thisplace;
250 }
251 else
252 {
253 min = thisplace;
254 }
255 }
256 else
257 {
258 /* Totally awesome! the exact right symbol */
259 CONST char *match_name = syms[thisplace]->name;
260 int sym_len = strlen (match_name);
261
262 /* Avoid "filename.o" as a match */
263 if (sym_len > 2
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 (stream, vma);
271 fprintf (stream, " (%s+)0000", syms[thisplace]->name);
272 return;
273 }
274 }
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 */
fc5d6074 277
aa0a709a
SC
278 if (thisplace != 0)
279 {
280 if (syms[thisplace - 1]->value - vma >
281 syms[thisplace]->value - vma)
282 {
283 /* Previous symbol is in correct section and is closer */
284 thisplace--;
285 }
286 }
fc5d6074 287
aa0a709a
SC
288 fprintf_vma (stream, vma);
289 if (syms[thisplace]->value > vma)
290 {
291 fprintf (stream, " (%s-)", syms[thisplace]->name);
292 fprintf (stream, "%04x", syms[thisplace]->value - vma);
293 }
294 else
295 {
296 fprintf (stream, " (%s+)", syms[thisplace]->name);
297 fprintf (stream, "%04x", vma - syms[thisplace]->value);
298 }
2fa0b342 299 }
2fa0b342
DHW
300}
301
302void
aa0a709a
SC
303disassemble_data (abfd)
304 bfd *abfd;
2fa0b342
DHW
305{
306 bfd_byte *data = NULL;
aa0a709a 307 bfd_arch_info_type *info;
fc5d6074
SC
308 bfd_size_type datasize = 0;
309 bfd_size_type i;
2e8adbd7
PB
310 unsigned int (*print) ()= 0; /* Old style */
311 disassembler_ftype disassemble = 0; /* New style */
aa0a709a
SC
312 unsigned int print_insn_a29k ();
313 unsigned int print_insn_i960 ();
314 unsigned int print_insn_sparc ();
aa0a709a 315 unsigned int print_insn_h8300 ();
2fa0b342 316 enum bfd_architecture a;
2e8adbd7
PB
317 struct disassemble_info disasm_info;
318
319 int prevline;
320 CONST char *prev_function = "";
d20f480f 321
2fa0b342 322 asection *section;
aa0a709a 323
2fa0b342 324 /* Replace symbol section relative values with abs values */
96d7950b 325 boolean done_dot = false;
aa0a709a 326
2e8adbd7
PB
327 INIT_DISASSEMBLE_INFO(disasm_info, stdout);
328
aa0a709a
SC
329 for (i = 0; i < symcount; i++)
330 {
2fa0b342 331 syms[i]->value += syms[i]->section->vma;
aa0a709a 332 }
2fa0b342
DHW
333
334 /* We keep a copy of the symbols in the original order */
aa0a709a 335 syms2 = slurp_symtab (abfd);
2fa0b342
DHW
336
337 /* Sort the symbols into section and symbol order */
aa0a709a 338 (void) qsort (syms, symcount, sizeof (asymbol *), comp);
2fa0b342
DHW
339
340 /* Find the first useless symbol */
aa0a709a
SC
341 {
342 unsigned int i;
2fa0b342 343
aa0a709a
SC
344 for (i = 0; i < symcount; i++)
345 {
d9971b83
KR
346 if (syms[i]->name == (char *) NULL
347 || (syms[i]->flags & BSF_DEBUGGING) != 0)
aa0a709a
SC
348 {
349 symcount = i;
350 break;
351 }
352 }
353 }
e779a58c
JG
354
355
aa0a709a
SC
356 if (machine != (char *) NULL)
357 {
358 info = bfd_scan_arch (machine);
359 if (info == 0)
360 {
361 fprintf (stderr, "%s: Can't use supplied machine %s\n",
362 program_name,
363 machine);
364 exit (1);
365 }
366 abfd->arch_info = info;
2fa0b342 367 }
e779a58c
JG
368
369 /* See if we can disassemble using bfd */
370
aa0a709a
SC
371 if (abfd->arch_info->disassemble)
372 {
373 print = abfd->arch_info->disassemble;
e779a58c 374 }
aa0a709a
SC
375 else
376 {
377 a = bfd_get_arch (abfd);
378 switch (a)
379 {
380 case bfd_arch_sparc:
381 print = print_insn_sparc;
382 break;
d9971b83
KR
383 case bfd_arch_z8k:
384 if (bfd_get_mach(abfd) == bfd_mach_z8001)
2e8adbd7 385 disassemble = print_insn_z8001;
d9971b83 386 else
2e8adbd7 387 disassemble = print_insn_z8002;
d9971b83 388 break;
aa0a709a 389 case bfd_arch_i386:
2e8adbd7 390 disassemble = print_insn_i386;
aa0a709a
SC
391 break;
392 case bfd_arch_m68k:
2e8adbd7 393 disassemble = print_insn_m68k;
aa0a709a
SC
394 break;
395 case bfd_arch_a29k:
396 print = print_insn_a29k;
397 break;
398 case bfd_arch_i960:
399 print = print_insn_i960;
400 break;
d9971b83 401 case bfd_arch_mips:
2e8adbd7
PB
402 if (abfd->xvec->byteorder_big_p)
403 disassemble = print_insn_big_mips;
404 else
405 disassemble = print_insn_little_mips;
d9971b83 406 break;
aa0a709a
SC
407 default:
408 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
409 program_name,
410 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
411 exit (1);
412 }
2fa0b342 413
aa0a709a 414 }
2fa0b342
DHW
415
416 for (section = abfd->sections;
aa0a709a
SC
417 section != (asection *) NULL;
418 section = section->next)
65cceb78 419 {
2fa0b342 420
aa0a709a
SC
421 if ((section->flags & SEC_LOAD)
422 && (only == (char *) NULL || strcmp (only, section->name) == 0))
423 {
424 printf ("Disassembly of section %s:\n", section->name);
2fa0b342 425
aa0a709a
SC
426 if (bfd_get_section_size_before_reloc (section) == 0)
427 continue;
2fa0b342 428
aa0a709a 429 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
2fa0b342 430
aa0a709a
SC
431 if (data == (bfd_byte *) NULL)
432 {
433 fprintf (stderr, "%s: memory exhausted.\n", program_name);
434 exit (1);
435 }
436 datasize = bfd_get_section_size_before_reloc (section);
2fa0b342 437
aa0a709a 438 bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc (section));
2fa0b342 439
aa0a709a
SC
440 i = 0;
441 while (i < bfd_get_section_size_before_reloc (section))
442 {
443 if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 &&
444 data[i + 3] == 0)
445 {
446 if (done_dot == false)
447 {
448 printf ("...\n");
449 done_dot = true;
65cceb78 450 }
aa0a709a 451 i += 4;
65cceb78 452 }
aa0a709a
SC
453 else
454 {
455 done_dot = false;
456 if (with_line_numbers)
457 {
aa0a709a
SC
458 CONST char *filename;
459 CONST char *functionname;
460 unsigned int line;
461
d9971b83
KR
462 if (bfd_find_nearest_line (abfd,
463 section,
464 syms,
465 section->vma + i,
466 &filename,
467 &functionname,
2e8adbd7 468 &line))
aa0a709a 469 {
2e8adbd7
PB
470 if (functionname && *functionname
471 && strcmp(functionname, prev_function))
472 {
473 printf ("%s():\n", functionname);
474 prev_function = functionname;
475 }
476 if (!filename)
477 filename = "???";
478 if (line && line != prevline)
479 {
480 printf ("%s:%u\n", filename, line);
481 prevline = line;
482 }
aa0a709a
SC
483 }
484 }
485 print_address (section->vma + i, stdout);
486 printf (" ");
65cceb78 487
2e8adbd7
PB
488 if (disassemble) /* New style */
489 i += (*disassemble)(section->vma + i,
490 data + i,
491 &disasm_info);
492 else /* Old style */
d9971b83
KR
493 i += print (section->vma + i,
494 data + i,
495 stdout);
aa0a709a
SC
496 putchar ('\n');
497 }
96d7950b 498 }
aa0a709a 499 free (data);
96d7950b 500 }
2fa0b342 501 }
2fa0b342 502}
73b8f102
JG
503\f
504#ifdef ELF_STAB_DISPLAY
505
506/* Define a table of stab values and print-strings. We wish the initializer
507 could be a direct-mapped table, but instead we build one the first
508 time we need it. */
509
510#define STAB_STRING_LENGTH 6
511
512char stab_name[256][STAB_STRING_LENGTH];
513
514struct stab_print {
515 int value;
516 char string[STAB_STRING_LENGTH];
517};
518
519struct stab_print stab_print[] = {
520#define __define_stab(NAME, CODE, STRING) {CODE, STRING},
521#include "aout/stab.def"
522#undef __define_stab
523 {0, 0}
524};
525
249c6fc0
RS
526void dump_elf_stabs_1 ();
527
73b8f102
JG
528/* This is a kludge for dumping the stabs section from an ELF file that
529 uses Sun stabs encoding. It has to use some hooks into BFD because
530 string table sections are not normally visible to BFD callers. */
531
532void
533dump_elf_stabs (abfd)
534 bfd *abfd;
535{
249c6fc0 536 int i;
73b8f102
JG
537
538 /* Initialize stab name array if first time. */
539 if (stab_name[0][0] == 0)
540 {
541 /* Fill in numeric values for all possible strings. */
542 for (i = 0; i < 256; i++)
543 {
544 sprintf (stab_name[i], "%d", i);
545 }
546 for (i = 0; stab_print[i].string[0]; i++)
547 strcpy (stab_name[stab_print[i].value], stab_print[i].string);
548 }
549
550 if (0 != strncmp ("elf", abfd->xvec->name, 3))
551 {
552 fprintf (stderr, "%s: %s is not in ELF format.\n", program_name,
553 abfd->filename);
554 return;
555 }
556
249c6fc0
RS
557 dump_elf_stabs_1 (abfd, ".stab", ".stabstr");
558 dump_elf_stabs_1 (abfd, ".stab.excl", ".stab.exclstr");
559 dump_elf_stabs_1 (abfd, ".stab.index", ".stab.indexstr");
560}
561
562void
563dump_elf_stabs_1 (abfd, name1, name2)
564 bfd *abfd;
565 char *name1; /* Section name of .stab */
566 char *name2; /* Section name of its string section */
567{
568 Elf_Internal_Shdr *stab_hdr, *stabstr_hdr;
569 char *strtab;
570 struct internal_nlist *stabs, *stabs_end;
571 int i;
572 unsigned file_string_table_offset, next_file_string_table_offset;
573
574 stab_hdr = bfd_elf_find_section (abfd, name1);
73b8f102
JG
575 if (0 == stab_hdr)
576 {
249c6fc0 577 printf ("Contents of %s section: none.\n\n", name1);
73b8f102
JG
578 return;
579 }
580
249c6fc0 581 stabstr_hdr = bfd_elf_find_section (abfd, name2);
73b8f102
JG
582 if (0 == stabstr_hdr)
583 {
249c6fc0
RS
584 fprintf (stderr, "%s: %s has no %s section.\n", program_name,
585 abfd->filename, name2);
73b8f102
JG
586 return;
587 }
588
589 stabs = (struct internal_nlist *) xmalloc (stab_hdr ->sh_size);
590 strtab = (char *) xmalloc (stabstr_hdr->sh_size);
591 stabs_end = (struct internal_nlist *) (stab_hdr->sh_size + (char *)stabs);
592
d9971b83 593 if (bfd_seek (abfd, stab_hdr->sh_offset, SEEK_SET) < 0 ||
73b8f102
JG
594 stab_hdr->sh_size != bfd_read ((PTR)stabs, stab_hdr->sh_size, 1, abfd))
595 {
249c6fc0
RS
596 fprintf (stderr, "%s: reading %s section of %s failed.\n",
597 program_name, name1,
73b8f102
JG
598 abfd->filename);
599 return;
600 }
2fa0b342 601
d9971b83 602 if (bfd_seek (abfd, stabstr_hdr->sh_offset, SEEK_SET) < 0 ||
73b8f102
JG
603 stabstr_hdr->sh_size != bfd_read ((PTR)strtab, stabstr_hdr->sh_size,
604 1, abfd))
605 {
249c6fc0
RS
606 fprintf (stderr, "%s: reading %s section of %s failed.\n",
607 program_name, name2,
73b8f102
JG
608 abfd->filename);
609 return;
610 }
611
612#define SWAP_SYMBOL(symp, abfd) \
613 { \
614 (symp)->n_strx = bfd_h_get_32(abfd, \
615 (unsigned char *)&(symp)->n_strx); \
616 (symp)->n_desc = bfd_h_get_16 (abfd, \
617 (unsigned char *)&(symp)->n_desc); \
618 (symp)->n_value = bfd_h_get_32 (abfd, \
619 (unsigned char *)&(symp)->n_value); \
620 }
621
249c6fc0 622 printf ("Contents of %s section:\n\n", name1);
73b8f102
JG
623 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
624
249c6fc0
RS
625 file_string_table_offset = 0;
626 next_file_string_table_offset = 0;
627
628 /* Loop through all symbols and print them.
629
630 We start the index at -1 because there is a dummy symbol on
73b8f102 631 the front of Sun's stabs-in-elf sections. */
249c6fc0 632
73b8f102
JG
633 for (i = -1; stabs < stabs_end; stabs++, i++)
634 {
635 SWAP_SYMBOL (stabs, abfd);
636 printf ("\n%-6d %-6s %-6d %-6d %08x %-6d", i,
637 stab_name [stabs->n_type],
638 stabs->n_other, stabs->n_desc, stabs->n_value,
639 stabs->n_strx);
249c6fc0
RS
640
641 /* Symbols with type == 0 (N_UNDF) specify the length of the
642 string table associated with this file. We use that info
643 to know how to relocate the *next* file's string table indices. */
644
645 if (stabs->n_type == N_UNDF)
646 {
647 file_string_table_offset = next_file_string_table_offset;
648 next_file_string_table_offset += stabs->n_value;
649 }
650
651 /* Now, using the possibly updated string table offset, print the
652 string (if any) associated with this symbol. */
653
654 if ((stabs->n_strx + file_string_table_offset) < stabstr_hdr->sh_size)
655 printf (" %s", &strtab[stabs->n_strx + file_string_table_offset]);
656 else
657 printf (" *");
73b8f102
JG
658 }
659 printf ("\n\n");
660}
661#endif /* ELF_STAB_DISPLAY */
249c6fc0 662
2fa0b342
DHW
663display_bfd (abfd)
664 bfd *abfd;
665{
666
aa0a709a
SC
667 if (!bfd_check_format (abfd, bfd_object))
668 {
669 fprintf (stderr, "%s: %s not an object file\n", program_name,
670 abfd->filename);
671 return;
672 }
2fa0b342 673 printf ("\n%s: file format %s\n", abfd->filename, abfd->xvec->name);
aa0a709a
SC
674 if (dump_ar_hdrs)
675 print_arelt_descr (stdout, abfd, true);
2fa0b342 676
aa0a709a
SC
677 if (dump_file_header)
678 {
679 char *comma = "";
680
681 printf ("architecture: %s, ",
682 bfd_printable_arch_mach (bfd_get_arch (abfd),
683 bfd_get_mach (abfd)));
684 printf ("flags 0x%08x:\n", abfd->flags);
2fa0b342 685
2fa0b342 686#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
aa0a709a
SC
687 PF (HAS_RELOC, "HAS_RELOC");
688 PF (EXEC_P, "EXEC_P");
689 PF (HAS_LINENO, "HAS_LINENO");
690 PF (HAS_DEBUG, "HAS_DEBUG");
691 PF (HAS_SYMS, "HAS_SYMS");
692 PF (HAS_LOCALS, "HAS_LOCALS");
693 PF (DYNAMIC, "DYNAMIC");
694 PF (WP_TEXT, "WP_TEXT");
695 PF (D_PAGED, "D_PAGED");
249c6fc0 696 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
aa0a709a
SC
697 printf ("\nstart address 0x");
698 printf_vma (abfd->start_address);
699 }
700 printf ("\n");
2fa0b342
DHW
701
702 if (dump_section_headers)
aa0a709a
SC
703 dump_headers (abfd);
704 if (dump_symtab || dump_reloc_info || disassemble)
705 {
706 syms = slurp_symtab (abfd);
707 }
708 if (dump_symtab)
709 dump_symbols (abfd);
73b8f102
JG
710#ifdef ELF_STAB_DISPLAY
711 if (dump_stab_section_info)
712 dump_elf_stabs (abfd);
713#endif
aa0a709a
SC
714 if (dump_reloc_info)
715 dump_relocs (abfd);
716 if (dump_section_contents)
717 dump_data (abfd);
718 if (disassemble)
719 disassemble_data (abfd);
2fa0b342
DHW
720}
721
d9971b83 722static void
2fa0b342
DHW
723display_file (filename, target)
724 char *filename;
725 char *target;
726{
727 bfd *file, *arfile = (bfd *) NULL;
728
729 file = bfd_openr (filename, target);
aa0a709a
SC
730 if (file == NULL)
731 {
732 bfd_perror (filename);
733 return;
734 }
2fa0b342 735
aa0a709a
SC
736 if (bfd_check_format (file, bfd_archive) == true)
737 {
738 printf ("In archive %s:\n", bfd_get_filename (file));
739 for (;;)
740 {
741 bfd_error = no_error;
742
743 arfile = bfd_openr_next_archived_file (file, arfile);
744 if (arfile == NULL)
745 {
746 if (bfd_error != no_more_archived_files)
747 bfd_perror (bfd_get_filename (file));
748 return;
749 }
2fa0b342 750
aa0a709a
SC
751 display_bfd (arfile);
752 /* Don't close the archive elements; we need them for next_archive */
753 }
2fa0b342 754 }
2fa0b342 755 else
aa0a709a 756 display_bfd (file);
2fa0b342 757
aa0a709a 758 bfd_close (file);
2fa0b342
DHW
759}
760\f
761/* Actually display the various requested regions */
762
d9971b83 763static void
2fa0b342
DHW
764dump_data (abfd)
765 bfd *abfd;
766{
767 asection *section;
aa0a709a 768 bfd_byte *data = 0;
fc5d6074
SC
769 bfd_size_type datasize = 0;
770 bfd_size_type i;
2fa0b342
DHW
771
772 for (section = abfd->sections; section != NULL; section =
aa0a709a
SC
773 section->next)
774 {
775 int onaline = 16;
2fa0b342 776
aa0a709a
SC
777 if (only == (char *) NULL ||
778 strcmp (only, section->name) == 0)
60c80016 779 {
aa0a709a
SC
780 if (section->flags & SEC_HAS_CONTENTS)
781 {
782 printf ("Contents of section %s:\n", section->name);
783
784 if (bfd_get_section_size_before_reloc (section) == 0)
785 continue;
786 data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section));
787 if (data == (bfd_byte *) NULL)
788 {
789 fprintf (stderr, "%s: memory exhausted.\n", program_name);
790 exit (1);
791 }
792 datasize = bfd_get_section_size_before_reloc (section);
2fa0b342 793
2fa0b342 794
aa0a709a 795 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_get_section_size_before_reloc (section));
2fa0b342 796
aa0a709a
SC
797 for (i = 0; i < bfd_get_section_size_before_reloc (section); i += onaline)
798 {
799 bfd_size_type j;
800
801 printf (" %04lx ", (unsigned long int) (i + section->vma));
802 for (j = i; j < i + onaline; j++)
803 {
804 if (j < bfd_get_section_size_before_reloc (section))
805 printf ("%02x", (unsigned) (data[j]));
806 else
807 printf (" ");
808 if ((j & 3) == 3)
809 printf (" ");
810 }
2fa0b342 811
aa0a709a
SC
812 printf (" ");
813 for (j = i; j < i + onaline; j++)
814 {
815 if (j >= bfd_get_section_size_before_reloc (section))
816 printf (" ");
817 else
818 printf ("%c", isprint (data[j]) ? data[j] : '.');
819 }
820 putchar ('\n');
821 }
d9971b83 822 free (data);
60c80016 823 }
2fa0b342 824 }
2fa0b342 825 }
2fa0b342
DHW
826}
827
2fa0b342 828/* Should perhaps share code and display with nm? */
d9971b83 829static void
2fa0b342
DHW
830dump_symbols (abfd)
831 bfd *abfd;
832{
833
834 unsigned int count;
835 asymbol **current = syms;
2fa0b342 836
aa0a709a 837 printf ("SYMBOL TABLE:\n");
e779a58c 838
aa0a709a
SC
839 for (count = 0; count < symcount; count++)
840 {
2fa0b342 841
d9971b83 842 if (*current)
aa0a709a 843 {
d9971b83
KR
844 bfd *cur_bfd = bfd_asymbol_bfd(*current);
845 if (cur_bfd)
846 {
847 bfd_print_symbol (cur_bfd,
848 stdout,
849 *current, bfd_print_symbol_all);
850 printf ("\n");
851 }
aa0a709a
SC
852
853 }
854 current++;
2fa0b342 855 }
aa0a709a
SC
856 printf ("\n");
857 printf ("\n");
2fa0b342
DHW
858}
859
d9971b83 860static void
aa0a709a
SC
861dump_relocs (abfd)
862 bfd *abfd;
2fa0b342
DHW
863{
864 arelent **relpp;
865 unsigned int relcount;
866 asection *a;
aa0a709a
SC
867
868 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
869 {
870 if (a == &bfd_abs_section)
871 continue;
872 if (a == &bfd_und_section)
873 continue;
d9971b83 874 if (bfd_is_com_section (a))
aa0a709a
SC
875 continue;
876
877 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
878
879 if (bfd_get_reloc_upper_bound (abfd, a) == 0)
880 {
881 printf (" (none)\n\n");
d20f480f 882 }
aa0a709a
SC
883 else
884 {
d20f480f
SC
885 arelent **p;
886
aa0a709a
SC
887 relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a));
888 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
889 if (relcount == 0)
890 {
891 printf (" (none)\n\n");
d20f480f 892 }
aa0a709a
SC
893 else
894 {
895 printf ("\n");
896 printf ("OFFSET TYPE VALUE \n");
d20f480f 897
aa0a709a
SC
898 for (p = relpp; relcount && *p != (arelent *) NULL; p++,
899 relcount--)
900 {
d20f480f
SC
901 arelent *q = *p;
902 CONST char *sym_name;
aa0a709a 903
d20f480f
SC
904 /* CONST char *section_name = q->section == (asection *)NULL ? "*abs" :*/
905 /* q->section->name;*/
aa0a709a
SC
906 CONST char *section_name = (*(q->sym_ptr_ptr))->section->name;
907
908 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
909 {
910 sym_name = (*(q->sym_ptr_ptr))->name;
d20f480f 911 }
aa0a709a
SC
912 else
913 {
d20f480f
SC
914 sym_name = 0;
915 }
aa0a709a
SC
916 if (sym_name)
917 {
918 printf_vma (q->address);
919 printf (" %-8s %s",
920 q->howto->name,
921 sym_name);
d20f480f 922 }
aa0a709a
SC
923 else
924 {
925 printf_vma (q->address);
926 printf (" %-8s [%s]",
927 q->howto->name,
928 section_name);
d20f480f 929 }
aa0a709a
SC
930 if (q->addend)
931 {
932 printf ("+0x");
933 printf_vma (q->addend);
d20f480f 934 }
aa0a709a 935 printf ("\n");
d20f480f 936 }
aa0a709a
SC
937 printf ("\n\n");
938 free (relpp);
d20f480f 939 }
2fa0b342 940 }
2fa0b342 941
d20f480f 942 }
2fa0b342
DHW
943}
944
aa0a709a
SC
945#ifdef unix
946#define _DUMMY_NAME_ "/dev/null"
947#else
948#define _DUMMY_NAME_ "##dummy"
949#endif
9872a49c 950static void
aa0a709a
SC
951DEFUN (display_info_table, (first, last),
952 int first AND int last)
9872a49c 953{
3fdbfe8d 954 unsigned int i, j;
9872a49c
SC
955 extern bfd_target *target_vector[];
956
aa0a709a
SC
957 printf ("\n%12s", " ");
958 for (i = first; i++ < last && target_vector[i];)
959 printf ("%s ", target_vector[i]->name);
960 printf ("\n");
9872a49c 961
aa0a709a
SC
962 for (j = (int) bfd_arch_obscure + 1; (int) j < (int) bfd_arch_last; j++)
963 if (strcmp (bfd_printable_arch_mach (j, 0), "UNKNOWN!") != 0)
e779a58c 964 {
aa0a709a
SC
965 printf ("%11s ", bfd_printable_arch_mach (j, 0));
966 for (i = first; i++ < last && target_vector[i];)
967 {
968 bfd_target *p = target_vector[i];
969 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
970 int l = strlen (p->name);
249c6fc0
RS
971 int ok;
972 bfd_set_format (abfd, bfd_object);
973 ok = bfd_set_arch_mach (abfd, j, 0);
aa0a709a
SC
974
975 if (ok)
976 printf ("%s ", p->name);
977 else
e779a58c 978 {
aa0a709a
SC
979 while (l--)
980 printf ("%c", ok ? '*' : '-');
981 printf (" ");
e779a58c 982 }
e779a58c 983 }
aa0a709a 984 printf ("\n");
e779a58c 985 }
9872a49c 986}
aa0a709a
SC
987
988static void
989DEFUN_VOID (display_info)
990{
991 char *colum;
992 unsigned int i, j, columns;
993 extern bfd_target *target_vector[];
994 extern char *getenv ();
995
996 printf ("BFD header file version %s\n", BFD_VERSION);
997 for (i = 0; target_vector[i]; i++)
998 {
999 bfd_target *p = target_vector[i];
1000 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
249c6fc0 1001 bfd_set_format (abfd, bfd_object);
aa0a709a
SC
1002 printf ("%s\n (header %s, data %s)\n", p->name,
1003 p->header_byteorder_big_p ? "big endian" : "little endian",
1004 p->byteorder_big_p ? "big endian" : "little endian");
1005 for (j = (int) bfd_arch_obscure + 1; j < (int) bfd_arch_last; j++)
1006 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) j, 0))
1007 printf (" %s\n",
1008 bfd_printable_arch_mach ((enum bfd_architecture) j, 0));
1009 }
1010 columns = 0;
1011 if (colum = getenv ("COLUMNS"))
1012 columns = atoi (colum);
1013 if (!columns)
1014 columns = 80;
1015 for (i = 0; target_vector[i];)
1016 {
1017 int old;
1018 old = i;
1019 for (j = 12; target_vector[i] && j < columns; i++)
1020 j += strlen (target_vector[i]->name) + 1;
1021 i--;
1022 if (old == i)
1023 break;
1024 display_info_table (old, i);
1025 }
1026}
1027
2fa0b342
DHW
1028/** main and like trivia */
1029int
1030main (argc, argv)
1031 int argc;
1032 char **argv;
1033{
1034 int c;
1035 extern int optind;
1036 extern char *optarg;
1037 char *target = default_target;
1038 boolean seenflag = false;
1039 int ind = 0;
1040
aa0a709a 1041 bfd_init ();
2fa0b342
DHW
1042 program_name = *argv;
1043
249c6fc0 1044 while ((c = getopt_long (argc, argv, "ib:m:Vdlfahrtxsj:", long_options, &ind))
aa0a709a
SC
1045 != EOF)
1046 {
1047 seenflag = true;
1048 switch (c)
1049 {
1050 case 'm':
1051 machine = optarg;
1052 break;
1053 case 'j':
1054 only = optarg;
1055 break;
1056 case 'l':
1057 with_line_numbers = 1;
1058 break;
1059 case 'b':
1060 target = optarg;
1061 break;
1062 case 'f':
1063 dump_file_header = true;
1064 break;
1065 case 'i':
1066 info = true;
1067 break;
1068 case 'x':
1069 dump_symtab = 1;
1070 dump_reloc_info = 1;
1071 dump_file_header = true;
1072 dump_ar_hdrs = 1;
1073 dump_section_headers = 1;
1074 break;
1075 case 0:
1076 break; /* we've been given a long option */
1077 case 't':
1078 dump_symtab = 1;
1079 break;
1080 case 'd':
1081 disassemble = true;
1082 break;
1083 case 's':
1084 dump_section_contents = 1;
1085 break;
1086 case 'r':
1087 dump_reloc_info = 1;
1088 break;
1089 case 'a':
1090 dump_ar_hdrs = 1;
1091 break;
1092 case 'h':
1093 dump_section_headers = 1;
1094 break;
249c6fc0
RS
1095 case 'V':
1096 show_version = 1;
1097 break;
aa0a709a
SC
1098 default:
1099 usage ();
1100 }
2fa0b342 1101 }
2fa0b342 1102
249c6fc0
RS
1103 if (show_version)
1104 printf ("%s version %s\n", program_name, program_version);
1105
2fa0b342
DHW
1106 if (seenflag == false)
1107 usage ();
1108
aa0a709a
SC
1109 if (info)
1110 {
1111 display_info ();
1112 }
1113 else
1114 {
1115 if (optind == argc)
1116 display_file ("a.out", target);
1117 else
1118 for (; optind < argc;)
1119 display_file (argv[optind++], target);
1120 }
2fa0b342
DHW
1121 return 0;
1122}
This page took 0.111918 seconds and 4 git commands to generate.