* binutils.all/objdump.exp: Trim list of format names expected, and accept any
[deliverable/binutils-gdb.git] / binutils / objdump.c
CommitLineData
d20f480f 1/* objdump.c -- dump information about an object file.
b3a2b497 2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
2fa0b342 3
b3a2b497 4This file is part of GNU Binutils.
2fa0b342 5
b3a2b497 6This program is free software; you can redistribute it and/or modify
2fa0b342 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
b3a2b497 11This program is distributed in the hope that it will be useful,
2fa0b342
DHW
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
b3a2b497
ILT
17along with this program; if not, write to the Free Software
18Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
2fa0b342 19
2fa0b342 20#include "bfd.h"
d20f480f 21#include "sysdep.h"
2fa0b342 22#include "getopt.h"
e1ec9f07 23#include "bucomm.h"
2fa0b342
DHW
24#include <stdio.h>
25#include <ctype.h>
2e8adbd7 26#include "dis-asm.h"
2fa0b342 27
73b8f102
JG
28/* Internal headers for the ELF .stab-dump code - sorry. */
29#define BYTES_IN_WORD 32
30#include "aout/aout64.h"
31#include "elf/internal.h"
d086adf8 32extern Elf_Internal_Shdr *bfd_elf_find_section();
bf661056 33
80d19ec1 34#ifndef FPRINTF_ALREADY_DECLARED
6f575704 35extern int fprintf PARAMS ((FILE *, CONST char *, ...));
80d19ec1 36#endif
2fa0b342
DHW
37
38char *default_target = NULL; /* default at runtime */
39
e1ec9f07 40extern char *program_version;
2fa0b342 41
249c6fc0 42int show_version = 0; /* show the version number */
2fa0b342
DHW
43int dump_section_contents; /* -s */
44int dump_section_headers; /* -h */
45boolean dump_file_header; /* -f */
46int dump_symtab; /* -t */
47int dump_reloc_info; /* -r */
48int dump_ar_hdrs; /* -a */
aa0a709a 49int with_line_numbers; /* -l */
9b018ecd 50int dump_stab_section_info; /* --stabs */
aa0a709a 51boolean disassemble; /* -d */
e1ec9f07 52boolean formats_info; /* -i */
195d1adf
KR
53char *only; /* -j secname */
54
55struct objdump_disasm_info {
56 bfd *abfd;
57 asection *sec;
58};
2fa0b342 59
aa0a709a
SC
60char *machine = (char *) NULL;
61asymbol **syms;
2fa0b342 62
2fa0b342
DHW
63unsigned int storage;
64
65unsigned int symcount = 0;
66
d9971b83
KR
67/* Forward declarations. */
68
69static void
70display_file PARAMS ((char *filename, char *target));
71
72static void
73dump_data PARAMS ((bfd *abfd));
74
75static void
76dump_relocs PARAMS ((bfd *abfd));
77
78static void
79dump_symbols PARAMS ((bfd *abfd));
02a68547
ILT
80
81static void
82display_bfd PARAMS ((bfd *abfd));
d9971b83 83\f
2fa0b342 84void
b3a2b497
ILT
85usage (stream, status)
86 FILE *stream;
87 int status;
2fa0b342 88{
b3a2b497 89 fprintf (stream, "\
02a68547
ILT
90Usage: %s [-ahifdrtxsl] [-b bfdname] [-m machine] [-j section-name]\n\
91 [--archive-headers] [--target=bfdname] [--disassemble] [--file-headers]\n\
92 [--section-headers] [--headers] [--info] [--section=section-name]\n\
93 [--line-numbers] [--architecture=machine] [--reloc] [--full-contents]\n\
94 [--stabs] [--syms] [--all-headers] [--version] [--help] objfile...\n\
95at least one option besides -l (--line-numbers) must be given\n",
b3a2b497
ILT
96 program_name);
97 exit (status);
2fa0b342
DHW
98}
99
aa0a709a
SC
100static struct option long_options[]=
101{
02a68547
ILT
102 {"all-headers", no_argument, NULL, 'x'},
103 {"architecture", required_argument, NULL, 'm'},
104 {"archive-headers", no_argument, NULL, 'a'},
105 {"disassemble", no_argument, NULL, 'd'},
106 {"file-headers", no_argument, NULL, 'f'},
107 {"full-contents", no_argument, NULL, 's'},
108 {"headers", no_argument, NULL, 'h'},
109 {"help", no_argument, NULL, 'H'},
110 {"info", no_argument, NULL, 'i'},
111 {"line-numbers", no_argument, NULL, 'l'},
112 {"reloc", no_argument, NULL, 'r'},
113 {"section", required_argument, NULL, 'j'},
114 {"section-headers", no_argument, NULL, 'h'},
73b8f102 115 {"stabs", no_argument, &dump_stab_section_info, 1},
02a68547
ILT
116 {"syms", no_argument, NULL, 't'},
117 {"target", required_argument, NULL, 'b'},
118 {"version", no_argument, &show_version, 1},
d2442698
DM
119 {0, no_argument, 0, 0}
120};
2fa0b342
DHW
121
122
2fa0b342 123static void
aa0a709a
SC
124dump_headers (abfd)
125 bfd *abfd;
2fa0b342
DHW
126{
127 asection *section;
aa0a709a 128
2fa0b342
DHW
129 for (section = abfd->sections;
130 section != (asection *) NULL;
aa0a709a
SC
131 section = section->next)
132 {
133 char *comma = "";
134
2fa0b342 135#define PF(x,y) \
e779a58c
JG
136 if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; }
137
138
aa0a709a
SC
139 printf ("SECTION %d [%s]\t: size %08x",
140 section->index,
141 section->name,
142 (unsigned) bfd_get_section_size_before_reloc (section));
143 printf (" vma ");
144 printf_vma (section->vma);
145 printf (" align 2**%u\n ",
146 section->alignment_power);
147 PF (SEC_ALLOC, "ALLOC");
148 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
149 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
150 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
151 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
152 PF (SEC_LOAD, "LOAD");
153 PF (SEC_RELOC, "RELOC");
195d1adf 154#ifdef SEC_BALIGN
aa0a709a 155 PF (SEC_BALIGN, "BALIGN");
195d1adf 156#endif
aa0a709a
SC
157 PF (SEC_READONLY, "READONLY");
158 PF (SEC_CODE, "CODE");
159 PF (SEC_DATA, "DATA");
160 PF (SEC_ROM, "ROM");
80d19ec1 161 PF (SEC_DEBUGGING, "DEBUGGING");
aa0a709a 162 printf ("\n");
2fa0b342 163#undef PF
aa0a709a 164 }
2fa0b342
DHW
165}
166
167static asymbol **
aa0a709a
SC
168DEFUN (slurp_symtab, (abfd),
169 bfd * abfd)
2fa0b342 170{
aa0a709a 171 asymbol **sy = (asymbol **) NULL;
2fa0b342 172
aa0a709a
SC
173 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
174 {
175 (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
176 return (NULL);
177 }
178
179 storage = get_symtab_upper_bound (abfd);
180 if (storage)
181 {
02a68547 182 sy = (asymbol **) xmalloc (storage);
aa0a709a
SC
183 }
184 symcount = bfd_canonicalize_symtab (abfd, sy);
f50af42b
KR
185 if (symcount <= 0)
186 {
187 fprintf (stderr, "%s: Bad symbol table in \"%s\".\n",
188 program_name, bfd_get_filename (abfd));
189 exit (1);
190 }
aa0a709a 191 return sy;
2fa0b342 192}
aa0a709a 193
3ae36cb6
PB
194/* Filter out (in place) symbols that are useless for dis-assemble.
195 Return count of useful symbols. */
196
197int remove_useless_symbols (syms, count)
198 asymbol **syms;
199 int count;
200{
201 register asymbol **in_ptr = syms;
202 register asymbol **out_ptr = syms;
203
204 while ( --count >= 0 )
205 {
206 asymbol *sym = *in_ptr++;
207
208 if (sym->name == NULL || sym->name[0] == '\0')
209 continue;
210 if (sym->flags & (BSF_DEBUGGING))
211 continue;
212 if (sym->section == &bfd_und_section
213 || bfd_is_com_section (sym->section))
214 continue;
215
216 *out_ptr++ = sym;
217 }
218 return out_ptr - syms;
219}
220
221
2fa0b342 222/* Sort symbols into value order */
aa0a709a
SC
223static int
224comp (ap, bp)
770cde30
JG
225 PTR ap;
226 PTR bp;
2fa0b342 227{
770cde30
JG
228 asymbol *a = *(asymbol **)ap;
229 asymbol *b = *(asymbol **)bp;
2fa0b342 230
3ae36cb6
PB
231 if (a->value > b->value)
232 return 1;
233 else if (a->value < b->value)
234 return -1;
2fa0b342 235
3ae36cb6
PB
236 if (a->section > b->section)
237 return 1;
238 else if (a->section < b->section)
239 return -1;
240 return 0;
2fa0b342
DHW
241}
242
243/* Print the supplied address symbolically if possible */
244void
545a2768 245objdump_print_address (vma, info)
aa0a709a 246 bfd_vma vma;
545a2768 247 struct disassemble_info *info;
2fa0b342
DHW
248{
249 /* Perform a binary search looking for the closest symbol to
195d1adf
KR
250 the required value. */
251 /* @@ For relocateable files, should filter out symbols belonging to
252 the wrong section. Unfortunately, not enough information is supplied
253 to this routine to determine the correct section in all cases. */
254 /* @@ Would it speed things up to cache the last two symbols returned,
255 and maybe their address ranges? For many processors, only one memory
256 operand can be present at a time, so the 2-entry cache wouldn't be
257 constantly churned by code doing heavy memory accesses. */
2fa0b342
DHW
258
259 unsigned int min = 0;
260 unsigned int max = symcount;
261
262 unsigned int thisplace = 1;
aa0a709a 263 unsigned int oldthisplace;
2fa0b342
DHW
264
265 int vardiff;
2fa0b342 266
3ae36cb6
PB
267 fprintf_vma (info->stream, vma);
268
269 if (symcount > 0)
aa0a709a
SC
270 {
271 while (true)
272 {
3ae36cb6 273 asymbol *sym; asection *sym_sec;
aa0a709a
SC
274 oldthisplace = thisplace;
275 thisplace = (max + min) / 2;
276 if (thisplace == oldthisplace)
277 break;
3ae36cb6
PB
278 sym = syms[thisplace];
279 vardiff = sym->value - vma;
280 sym_sec = sym->section;
281
282 if (vardiff > 0)
283 max = thisplace;
284 else if (vardiff < 0)
285 min = thisplace;
aa0a709a 286 else
3ae36cb6 287 goto found;
aa0a709a
SC
288 }
289 /* We've run out of places to look, print the symbol before this one
290 see if this or the symbol before describes this location the best */
fc5d6074 291
aa0a709a
SC
292 if (thisplace != 0)
293 {
294 if (syms[thisplace - 1]->value - vma >
295 syms[thisplace]->value - vma)
296 {
297 /* Previous symbol is in correct section and is closer */
298 thisplace--;
299 }
300 }
fc5d6074 301
3ae36cb6 302 found:
195d1adf
KR
303 {
304 bfd_vma val = syms[thisplace]->value;
305 int i;
306 if (syms[thisplace]->flags & (BSF_LOCAL|BSF_DEBUGGING))
307 for (i = thisplace - 1; i >= 0; i--)
308 {
309 if (syms[i]->value == val
310 && (!(syms[i]->flags & (BSF_LOCAL|BSF_DEBUGGING))
311 || ((syms[thisplace]->flags & BSF_DEBUGGING)
312 && !(syms[i]->flags & BSF_DEBUGGING))))
313 {
314 thisplace = i;
315 break;
316 }
317 }
318 if (syms[thisplace]->flags & (BSF_LOCAL|BSF_DEBUGGING))
319 for (i = thisplace + 1; i < symcount; i++)
320 {
321 if (syms[i]->value == val
322 && (!(syms[i]->flags & (BSF_LOCAL|BSF_DEBUGGING))
323 || ((syms[thisplace]->flags & BSF_DEBUGGING)
324 && !(syms[i]->flags & BSF_DEBUGGING))))
325 {
326 thisplace = i;
327 break;
328 }
329 }
330 }
331 {
332 /* If the file is relocateable, and the symbol could be from this
333 section, prefer a symbol from this section over symbols from
334 others, even if the other symbol's value might be closer.
335
336 Note that this may be wrong for some symbol references if the
337 sections have overlapping memory ranges, but in that case there's
338 no way to tell what's desired without looking at the relocation
339 table. */
340 struct objdump_disasm_info *aux;
341 int i;
342
343 aux = (struct objdump_disasm_info *) info->application_data;
344 if (aux->abfd->flags & HAS_RELOC
345 && vma >= bfd_get_section_vma (aux->abfd, aux->sec)
346 && vma < (bfd_get_section_vma (aux->abfd, aux->sec)
347 + bfd_get_section_size_before_reloc (aux->sec))
348 && syms[thisplace]->section != aux->sec)
349 {
350 for (i = thisplace + 1; i < symcount; i++)
351 if (syms[i]->value != syms[thisplace]->value)
352 break;
353 while (--i >= 0)
354 if (syms[i]->section == aux->sec)
355 {
356 thisplace = i;
357 break;
358 }
359 }
360 }
3ae36cb6 361 fprintf (info->stream, " <%s", syms[thisplace]->name);
aa0a709a
SC
362 if (syms[thisplace]->value > vma)
363 {
d086adf8
KR
364 char buf[30], *p = buf;
365 sprintf_vma (buf, syms[thisplace]->value - vma);
366 while (*p == '0')
367 p++;
368 fprintf (info->stream, "-%s", p);
aa0a709a 369 }
3ae36cb6 370 else if (vma > syms[thisplace]->value)
aa0a709a 371 {
d086adf8
KR
372 char buf[30], *p = buf;
373 sprintf_vma (buf, vma - syms[thisplace]->value);
374 while (*p == '0')
375 p++;
376 fprintf (info->stream, "+%s", p);
aa0a709a 377 }
3ae36cb6 378 fprintf (info->stream, ">");
2fa0b342 379 }
2fa0b342
DHW
380}
381
195d1adf
KR
382#ifdef ARCH_all
383#define ARCH_a29k
384#define ARCH_alpha
385#define ARCH_h8300
386#define ARCH_h8500
387#define ARCH_hppa
388#define ARCH_i386
389#define ARCH_i960
390#define ARCH_m68k
391#define ARCH_m88k
392#define ARCH_mips
393#define ARCH_sh
394#define ARCH_sparc
395#define ARCH_z8k
396#endif
397
2fa0b342 398void
aa0a709a
SC
399disassemble_data (abfd)
400 bfd *abfd;
2fa0b342
DHW
401{
402 bfd_byte *data = NULL;
aa0a709a 403 bfd_arch_info_type *info;
fc5d6074
SC
404 bfd_size_type datasize = 0;
405 bfd_size_type i;
2e8adbd7
PB
406 unsigned int (*print) ()= 0; /* Old style */
407 disassembler_ftype disassemble = 0; /* New style */
2fa0b342 408 enum bfd_architecture a;
2e8adbd7 409 struct disassemble_info disasm_info;
195d1adf 410 struct objdump_disasm_info aux;
2e8adbd7
PB
411
412 int prevline;
413 CONST char *prev_function = "";
d20f480f 414
2fa0b342 415 asection *section;
aa0a709a 416
2fa0b342 417 /* Replace symbol section relative values with abs values */
96d7950b 418 boolean done_dot = false;
aa0a709a 419
2e8adbd7 420 INIT_DISASSEMBLE_INFO(disasm_info, stdout);
195d1adf
KR
421 disasm_info.application_data = (PTR) &aux;
422 aux.abfd = abfd;
545a2768 423 disasm_info.print_address_func = objdump_print_address;
2e8adbd7 424
aa0a709a
SC
425 for (i = 0; i < symcount; i++)
426 {
2fa0b342 427 syms[i]->value += syms[i]->section->vma;
aa0a709a 428 }
2fa0b342 429
3ae36cb6 430 symcount = remove_useless_symbols (syms, symcount);
2fa0b342
DHW
431
432 /* Sort the symbols into section and symbol order */
aa0a709a 433 (void) qsort (syms, symcount, sizeof (asymbol *), comp);
2fa0b342 434
aa0a709a
SC
435 if (machine != (char *) NULL)
436 {
437 info = bfd_scan_arch (machine);
438 if (info == 0)
439 {
440 fprintf (stderr, "%s: Can't use supplied machine %s\n",
441 program_name,
442 machine);
443 exit (1);
444 }
445 abfd->arch_info = info;
2fa0b342 446 }
e779a58c
JG
447
448 /* See if we can disassemble using bfd */
449
aa0a709a
SC
450 if (abfd->arch_info->disassemble)
451 {
452 print = abfd->arch_info->disassemble;
e779a58c 453 }
aa0a709a
SC
454 else
455 {
456 a = bfd_get_arch (abfd);
457 switch (a)
458 {
195d1adf
KR
459 /* If you add a case to this table, also add it to the
460 ARCH_all definition right above this function. */
461#ifdef ARCH_a29k
462 case bfd_arch_a29k:
463 /* As far as I know we only handle big-endian 29k objects. */
464 disassemble = print_insn_big_a29k;
aa0a709a 465 break;
195d1adf
KR
466#endif
467#ifdef ARCH_alpha
468 case bfd_arch_alpha:
469 disassemble = print_insn_alpha;
12da1775 470 break;
195d1adf
KR
471#endif
472#ifdef ARCH_h8300
3ae36cb6
PB
473 case bfd_arch_h8300:
474 if (bfd_get_mach(abfd) == bfd_mach_h8300h)
475 disassemble = print_insn_h8300h;
476 else
477 disassemble = print_insn_h8300;
478 break;
195d1adf
KR
479#endif
480#ifdef ARCH_h8500
481 case bfd_arch_h8500:
482 disassemble = print_insn_h8500;
6f575704 483 break;
195d1adf
KR
484#endif
485#ifdef ARCH_hppa
486 case bfd_arch_hppa:
487 disassemble = print_insn_hppa;
aa0a709a 488 break;
195d1adf
KR
489#endif
490#ifdef ARCH_i386
491 case bfd_arch_i386:
492 disassemble = print_insn_i386;
aa0a709a 493 break;
195d1adf
KR
494#endif
495#ifdef ARCH_i960
aa0a709a 496 case bfd_arch_i960:
545a2768 497 disassemble = print_insn_i960;
aa0a709a 498 break;
195d1adf
KR
499#endif
500#ifdef ARCH_m68k
501 case bfd_arch_m68k:
502 disassemble = print_insn_m68k;
503 break;
504#endif
505#ifdef ARCH_m88k
b3a2b497
ILT
506 case bfd_arch_m88k:
507 disassemble = print_insn_m88k;
508 break;
195d1adf
KR
509#endif
510#ifdef ARCH_mips
d9971b83 511 case bfd_arch_mips:
2e8adbd7
PB
512 if (abfd->xvec->byteorder_big_p)
513 disassemble = print_insn_big_mips;
514 else
515 disassemble = print_insn_little_mips;
d9971b83 516 break;
195d1adf
KR
517#endif
518#ifdef ARCH_sh
519 case bfd_arch_sh:
520 disassemble = print_insn_sh;
521 break;
522#endif
523#ifdef ARCH_sparc
524 case bfd_arch_sparc:
525 disassemble = print_insn_sparc;
526 break;
527#endif
528#ifdef ARCH_z8k
529 case bfd_arch_z8k:
530 if (bfd_get_mach(abfd) == bfd_mach_z8001)
531 disassemble = print_insn_z8001;
532 else
533 disassemble = print_insn_z8002;
534 break;
535#endif
aa0a709a
SC
536 default:
537 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
538 program_name,
539 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
540 exit (1);
541 }
2fa0b342 542
aa0a709a 543 }
2fa0b342
DHW
544
545 for (section = abfd->sections;
aa0a709a
SC
546 section != (asection *) NULL;
547 section = section->next)
65cceb78 548 {
195d1adf 549 aux.sec = section;
2fa0b342 550
aa0a709a
SC
551 if ((section->flags & SEC_LOAD)
552 && (only == (char *) NULL || strcmp (only, section->name) == 0))
553 {
554 printf ("Disassembly of section %s:\n", section->name);
2fa0b342 555
aa0a709a
SC
556 if (bfd_get_section_size_before_reloc (section) == 0)
557 continue;
2fa0b342 558
02a68547 559 data = (bfd_byte *) xmalloc ((size_t) bfd_get_section_size_before_reloc (section));
2fa0b342 560
aa0a709a 561 datasize = bfd_get_section_size_before_reloc (section);
2fa0b342 562
aa0a709a 563 bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc (section));
2fa0b342 564
5d0734a7
JK
565 disasm_info.buffer = data;
566 disasm_info.buffer_vma = section->vma;
567 disasm_info.buffer_length =
568 bfd_get_section_size_before_reloc (section);
aa0a709a 569 i = 0;
5d0734a7 570 while (i < disasm_info.buffer_length)
aa0a709a
SC
571 {
572 if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 &&
573 data[i + 3] == 0)
574 {
575 if (done_dot == false)
576 {
577 printf ("...\n");
578 done_dot = true;
65cceb78 579 }
aa0a709a 580 i += 4;
65cceb78 581 }
aa0a709a
SC
582 else
583 {
584 done_dot = false;
585 if (with_line_numbers)
586 {
aa0a709a
SC
587 CONST char *filename;
588 CONST char *functionname;
589 unsigned int line;
590
d9971b83
KR
591 if (bfd_find_nearest_line (abfd,
592 section,
593 syms,
594 section->vma + i,
595 &filename,
596 &functionname,
2e8adbd7 597 &line))
aa0a709a 598 {
2e8adbd7
PB
599 if (functionname && *functionname
600 && strcmp(functionname, prev_function))
601 {
602 printf ("%s():\n", functionname);
603 prev_function = functionname;
604 }
605 if (!filename)
606 filename = "???";
607 if (line && line != prevline)
608 {
609 printf ("%s:%u\n", filename, line);
610 prevline = line;
611 }
aa0a709a
SC
612 }
613 }
545a2768 614 objdump_print_address (section->vma + i, &disasm_info);
aa0a709a 615 printf (" ");
65cceb78 616
2e8adbd7 617 if (disassemble) /* New style */
5d0734a7
JK
618 {
619 int bytes = (*disassemble)(section->vma + i,
620 &disasm_info);
621 if (bytes < 0)
622 break;
623 i += bytes;
624 }
2e8adbd7 625 else /* Old style */
d9971b83
KR
626 i += print (section->vma + i,
627 data + i,
628 stdout);
aa0a709a
SC
629 putchar ('\n');
630 }
96d7950b 631 }
aa0a709a 632 free (data);
96d7950b 633 }
2fa0b342 634 }
2fa0b342 635}
73b8f102 636\f
73b8f102
JG
637
638/* Define a table of stab values and print-strings. We wish the initializer
639 could be a direct-mapped table, but instead we build one the first
640 time we need it. */
641
642#define STAB_STRING_LENGTH 6
643
644char stab_name[256][STAB_STRING_LENGTH];
645
646struct stab_print {
647 int value;
648 char string[STAB_STRING_LENGTH];
649};
650
651struct stab_print stab_print[] = {
652#define __define_stab(NAME, CODE, STRING) {CODE, STRING},
653#include "aout/stab.def"
654#undef __define_stab
02a68547 655 {0, ""}
73b8f102
JG
656};
657
9b018ecd 658void dump_stabs_1 ();
249c6fc0 659
9b018ecd 660/* This dumps the stabs section from object files that have a section that
73b8f102
JG
661 uses Sun stabs encoding. It has to use some hooks into BFD because
662 string table sections are not normally visible to BFD callers. */
663
664void
9b018ecd 665dump_stabs (abfd)
73b8f102
JG
666 bfd *abfd;
667{
249c6fc0 668 int i;
73b8f102
JG
669
670 /* Initialize stab name array if first time. */
671 if (stab_name[0][0] == 0)
672 {
673 /* Fill in numeric values for all possible strings. */
674 for (i = 0; i < 256; i++)
675 {
676 sprintf (stab_name[i], "%d", i);
677 }
678 for (i = 0; stab_print[i].string[0]; i++)
679 strcpy (stab_name[stab_print[i].value], stab_print[i].string);
680 }
681
9b018ecd
ILT
682 dump_stabs_1 (abfd, ".stab", ".stabstr");
683 dump_stabs_1 (abfd, ".stab.excl", ".stab.exclstr");
684 dump_stabs_1 (abfd, ".stab.index", ".stab.indexstr");
02a68547 685 dump_stabs_1 (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
249c6fc0
RS
686}
687
688void
9b018ecd 689dump_stabs_1 (abfd, name1, name2)
249c6fc0
RS
690 bfd *abfd;
691 char *name1; /* Section name of .stab */
692 char *name2; /* Section name of its string section */
693{
d086adf8 694 Elf_Internal_Shdr *stab_hdr, *stabstr_hdr;
9b018ecd 695 asection *stabsect, *stabstrsect;
249c6fc0
RS
696 char *strtab;
697 struct internal_nlist *stabs, *stabs_end;
698 int i;
9b018ecd 699 int stab_size, stabstr_size;
249c6fc0 700 unsigned file_string_table_offset, next_file_string_table_offset;
9b018ecd
ILT
701 int is_elf = (0 == strncmp ("elf", abfd->xvec->name, 3));
702
703 if (is_elf)
704 {
705 stab_hdr = bfd_elf_find_section (abfd, name1);
706 }
707 else
708 {
709 stabsect = bfd_get_section_by_name (abfd, name1);
710 }
249c6fc0 711
9b018ecd 712 if (is_elf ? (0 == stab_hdr) : (0 == stabsect))
73b8f102 713 {
9b018ecd 714 printf ("No %s section present.\n\n", name1);
73b8f102
JG
715 return;
716 }
717
9b018ecd
ILT
718 if (is_elf)
719 {
720 stabstr_hdr = bfd_elf_find_section (abfd, name2);
721 }
722 else
723 {
724 stabstrsect = bfd_get_section_by_name (abfd, name2);
725 }
726
727 if (is_elf ? (0 == stabstr_hdr) : (0 == stabstrsect))
73b8f102 728 {
249c6fc0
RS
729 fprintf (stderr, "%s: %s has no %s section.\n", program_name,
730 abfd->filename, name2);
73b8f102
JG
731 return;
732 }
9b018ecd
ILT
733
734 stab_size = (is_elf ? stab_hdr ->sh_size : bfd_section_size (abfd, stabsect));
735 stabstr_size = (is_elf ? stabstr_hdr->sh_size : bfd_section_size (abfd, stabstrsect));
73b8f102 736
9b018ecd
ILT
737 stabs = (struct internal_nlist *) xmalloc (stab_size);
738 strtab = (char *) xmalloc (stabstr_size);
739 stabs_end = (struct internal_nlist *) (stab_size + (char *) stabs);
73b8f102 740
9b018ecd 741 if (is_elf)
73b8f102 742 {
9b018ecd
ILT
743 if (bfd_seek (abfd, stab_hdr->sh_offset, SEEK_SET) < 0 ||
744 stab_size != bfd_read ((PTR) stabs, stab_size, 1, abfd))
745 {
746 fprintf (stderr, "%s: reading %s section of %s failed.\n",
747 program_name, name1,
748 abfd->filename);
749 return;
750 }
751 }
752 else
753 {
754 bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size);
73b8f102 755 }
2fa0b342 756
9b018ecd 757 if (is_elf)
73b8f102 758 {
9b018ecd
ILT
759 if (bfd_seek (abfd, stabstr_hdr->sh_offset, SEEK_SET) < 0 ||
760 stabstr_size != bfd_read ((PTR) strtab, stabstr_size, 1, abfd))
761 {
762 fprintf (stderr, "%s: reading %s section of %s failed.\n",
763 program_name, name2,
764 abfd->filename);
765 return;
766 }
767 }
768 else
769 {
770 bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0, stabstr_size);
73b8f102
JG
771 }
772
773#define SWAP_SYMBOL(symp, abfd) \
774 { \
775 (symp)->n_strx = bfd_h_get_32(abfd, \
776 (unsigned char *)&(symp)->n_strx); \
777 (symp)->n_desc = bfd_h_get_16 (abfd, \
778 (unsigned char *)&(symp)->n_desc); \
779 (symp)->n_value = bfd_h_get_32 (abfd, \
780 (unsigned char *)&(symp)->n_value); \
781 }
782
249c6fc0 783 printf ("Contents of %s section:\n\n", name1);
73b8f102
JG
784 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
785
249c6fc0
RS
786 file_string_table_offset = 0;
787 next_file_string_table_offset = 0;
788
789 /* Loop through all symbols and print them.
790
791 We start the index at -1 because there is a dummy symbol on
e1ec9f07 792 the front of stabs-in-{coff,elf} sections that supplies sizes. */
249c6fc0 793
73b8f102
JG
794 for (i = -1; stabs < stabs_end; stabs++, i++)
795 {
796 SWAP_SYMBOL (stabs, abfd);
02a68547 797 printf ("\n%-6d %-6s %-6d %-6d ", i,
73b8f102 798 stab_name [stabs->n_type],
02a68547
ILT
799 stabs->n_other, stabs->n_desc);
800 printf_vma (stabs->n_value);
801 printf (" %-6lu", stabs->n_strx);
249c6fc0
RS
802
803 /* Symbols with type == 0 (N_UNDF) specify the length of the
804 string table associated with this file. We use that info
805 to know how to relocate the *next* file's string table indices. */
806
807 if (stabs->n_type == N_UNDF)
808 {
809 file_string_table_offset = next_file_string_table_offset;
810 next_file_string_table_offset += stabs->n_value;
811 }
249c6fc0 812 else
e1ec9f07
SS
813 {
814 /* Now, using the possibly updated string table offset, print the
815 string (if any) associated with this symbol. */
816
817 if ((stabs->n_strx + file_string_table_offset) < stabstr_size)
818 printf (" %s", &strtab[stabs->n_strx + file_string_table_offset]);
819 else
820 printf (" *");
821 }
73b8f102
JG
822 }
823 printf ("\n\n");
824}
249c6fc0 825
02a68547 826static void
2fa0b342
DHW
827display_bfd (abfd)
828 bfd *abfd;
829{
830
aa0a709a
SC
831 if (!bfd_check_format (abfd, bfd_object))
832 {
b3a2b497
ILT
833 fprintf (stderr, "%s:%s: %s\n", program_name, abfd->filename,
834 bfd_errmsg (bfd_error));
aa0a709a
SC
835 return;
836 }
2fa0b342 837 printf ("\n%s: file format %s\n", abfd->filename, abfd->xvec->name);
aa0a709a
SC
838 if (dump_ar_hdrs)
839 print_arelt_descr (stdout, abfd, true);
2fa0b342 840
aa0a709a
SC
841 if (dump_file_header)
842 {
843 char *comma = "";
844
845 printf ("architecture: %s, ",
846 bfd_printable_arch_mach (bfd_get_arch (abfd),
847 bfd_get_mach (abfd)));
848 printf ("flags 0x%08x:\n", abfd->flags);
2fa0b342 849
2fa0b342 850#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
aa0a709a
SC
851 PF (HAS_RELOC, "HAS_RELOC");
852 PF (EXEC_P, "EXEC_P");
853 PF (HAS_LINENO, "HAS_LINENO");
854 PF (HAS_DEBUG, "HAS_DEBUG");
855 PF (HAS_SYMS, "HAS_SYMS");
856 PF (HAS_LOCALS, "HAS_LOCALS");
857 PF (DYNAMIC, "DYNAMIC");
858 PF (WP_TEXT, "WP_TEXT");
859 PF (D_PAGED, "D_PAGED");
249c6fc0 860 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
aa0a709a
SC
861 printf ("\nstart address 0x");
862 printf_vma (abfd->start_address);
863 }
864 printf ("\n");
2fa0b342
DHW
865
866 if (dump_section_headers)
aa0a709a
SC
867 dump_headers (abfd);
868 if (dump_symtab || dump_reloc_info || disassemble)
869 {
870 syms = slurp_symtab (abfd);
871 }
872 if (dump_symtab)
873 dump_symbols (abfd);
73b8f102 874 if (dump_stab_section_info)
9b018ecd 875 dump_stabs (abfd);
aa0a709a
SC
876 if (dump_reloc_info)
877 dump_relocs (abfd);
878 if (dump_section_contents)
879 dump_data (abfd);
3ae36cb6
PB
880 /* Note that disassemble_data re-orders the syms table, but that is
881 safe - as long as it is done last! */
aa0a709a
SC
882 if (disassemble)
883 disassemble_data (abfd);
2fa0b342
DHW
884}
885
d9971b83 886static void
2fa0b342
DHW
887display_file (filename, target)
888 char *filename;
889 char *target;
890{
891 bfd *file, *arfile = (bfd *) NULL;
892
893 file = bfd_openr (filename, target);
aa0a709a
SC
894 if (file == NULL)
895 {
d2442698 896 fprintf (stderr, "%s: ", program_name);
aa0a709a
SC
897 bfd_perror (filename);
898 return;
899 }
2fa0b342 900
aa0a709a
SC
901 if (bfd_check_format (file, bfd_archive) == true)
902 {
903 printf ("In archive %s:\n", bfd_get_filename (file));
904 for (;;)
905 {
906 bfd_error = no_error;
907
908 arfile = bfd_openr_next_archived_file (file, arfile);
909 if (arfile == NULL)
910 {
911 if (bfd_error != no_more_archived_files)
d2442698
DM
912 {
913 fprintf (stderr, "%s: ", program_name);
914 bfd_perror (bfd_get_filename (file));
915 }
aa0a709a
SC
916 return;
917 }
2fa0b342 918
aa0a709a
SC
919 display_bfd (arfile);
920 /* Don't close the archive elements; we need them for next_archive */
921 }
2fa0b342 922 }
2fa0b342 923 else
aa0a709a 924 display_bfd (file);
2fa0b342 925
aa0a709a 926 bfd_close (file);
2fa0b342
DHW
927}
928\f
929/* Actually display the various requested regions */
930
d9971b83 931static void
2fa0b342
DHW
932dump_data (abfd)
933 bfd *abfd;
934{
935 asection *section;
aa0a709a 936 bfd_byte *data = 0;
fc5d6074
SC
937 bfd_size_type datasize = 0;
938 bfd_size_type i;
2fa0b342
DHW
939
940 for (section = abfd->sections; section != NULL; section =
aa0a709a
SC
941 section->next)
942 {
943 int onaline = 16;
2fa0b342 944
aa0a709a
SC
945 if (only == (char *) NULL ||
946 strcmp (only, section->name) == 0)
60c80016 947 {
aa0a709a
SC
948 if (section->flags & SEC_HAS_CONTENTS)
949 {
950 printf ("Contents of section %s:\n", section->name);
951
9b018ecd 952 if (bfd_section_size (abfd, section) == 0)
aa0a709a 953 continue;
02a68547 954 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
9b018ecd 955 datasize = bfd_section_size (abfd, section);
2fa0b342 956
2fa0b342 957
9b018ecd 958 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2fa0b342 959
9b018ecd 960 for (i = 0; i < bfd_section_size (abfd, section); i += onaline)
aa0a709a
SC
961 {
962 bfd_size_type j;
963
964 printf (" %04lx ", (unsigned long int) (i + section->vma));
965 for (j = i; j < i + onaline; j++)
966 {
9b018ecd 967 if (j < bfd_section_size (abfd, section))
aa0a709a
SC
968 printf ("%02x", (unsigned) (data[j]));
969 else
970 printf (" ");
971 if ((j & 3) == 3)
972 printf (" ");
973 }
2fa0b342 974
aa0a709a
SC
975 printf (" ");
976 for (j = i; j < i + onaline; j++)
977 {
9b018ecd 978 if (j >= bfd_section_size (abfd, section))
aa0a709a
SC
979 printf (" ");
980 else
981 printf ("%c", isprint (data[j]) ? data[j] : '.');
982 }
983 putchar ('\n');
984 }
d9971b83 985 free (data);
60c80016 986 }
2fa0b342 987 }
2fa0b342 988 }
2fa0b342
DHW
989}
990
2fa0b342 991/* Should perhaps share code and display with nm? */
d9971b83 992static void
2fa0b342
DHW
993dump_symbols (abfd)
994 bfd *abfd;
995{
996
997 unsigned int count;
998 asymbol **current = syms;
2fa0b342 999
aa0a709a 1000 printf ("SYMBOL TABLE:\n");
e779a58c 1001
aa0a709a
SC
1002 for (count = 0; count < symcount; count++)
1003 {
2fa0b342 1004
d9971b83 1005 if (*current)
aa0a709a 1006 {
d9971b83
KR
1007 bfd *cur_bfd = bfd_asymbol_bfd(*current);
1008 if (cur_bfd)
1009 {
1010 bfd_print_symbol (cur_bfd,
1011 stdout,
1012 *current, bfd_print_symbol_all);
1013 printf ("\n");
1014 }
aa0a709a
SC
1015
1016 }
1017 current++;
2fa0b342 1018 }
aa0a709a
SC
1019 printf ("\n");
1020 printf ("\n");
2fa0b342
DHW
1021}
1022
d9971b83 1023static void
aa0a709a
SC
1024dump_relocs (abfd)
1025 bfd *abfd;
2fa0b342
DHW
1026{
1027 arelent **relpp;
1028 unsigned int relcount;
1029 asection *a;
aa0a709a
SC
1030
1031 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
1032 {
1033 if (a == &bfd_abs_section)
1034 continue;
1035 if (a == &bfd_und_section)
1036 continue;
d9971b83 1037 if (bfd_is_com_section (a))
aa0a709a
SC
1038 continue;
1039
195d1adf
KR
1040 if (only)
1041 {
1042 if (strcmp (only, a->name))
1043 continue;
1044 }
1045 else if ((a->flags & SEC_RELOC) == 0)
1046 continue;
1047
aa0a709a
SC
1048 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
1049
1050 if (bfd_get_reloc_upper_bound (abfd, a) == 0)
1051 {
1052 printf (" (none)\n\n");
d20f480f 1053 }
aa0a709a
SC
1054 else
1055 {
d20f480f
SC
1056 arelent **p;
1057
aa0a709a 1058 relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a));
3ae36cb6 1059 /* Note that this must be done *before* we sort the syms table. */
aa0a709a
SC
1060 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
1061 if (relcount == 0)
1062 {
1063 printf (" (none)\n\n");
d20f480f 1064 }
aa0a709a
SC
1065 else
1066 {
1067 printf ("\n");
195d1adf
KR
1068 /* Get column headers lined up reasonably. */
1069 {
1070 static int width;
1071 if (width == 0)
1072 {
1073 char buf[30];
1074 sprintf_vma (buf, (bfd_vma) -1);
1075 width = strlen (buf) - 7;
1076 }
1077 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
1078 }
d20f480f 1079
aa0a709a
SC
1080 for (p = relpp; relcount && *p != (arelent *) NULL; p++,
1081 relcount--)
1082 {
d20f480f
SC
1083 arelent *q = *p;
1084 CONST char *sym_name;
02a68547 1085 CONST char *section_name;
aa0a709a
SC
1086
1087 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
1088 {
1089 sym_name = (*(q->sym_ptr_ptr))->name;
02a68547 1090 section_name = (*(q->sym_ptr_ptr))->section->name;
d20f480f 1091 }
aa0a709a
SC
1092 else
1093 {
02a68547
ILT
1094 sym_name = NULL;
1095 section_name = NULL;
d20f480f 1096 }
aa0a709a
SC
1097 if (sym_name)
1098 {
1099 printf_vma (q->address);
195d1adf 1100 printf (" %-16s %s",
aa0a709a
SC
1101 q->howto->name,
1102 sym_name);
d20f480f 1103 }
aa0a709a
SC
1104 else
1105 {
02a68547
ILT
1106 if (section_name == (CONST char *) NULL)
1107 section_name = "*unknown*";
aa0a709a 1108 printf_vma (q->address);
195d1adf 1109 printf (" %-16s [%s]",
aa0a709a
SC
1110 q->howto->name,
1111 section_name);
d20f480f 1112 }
aa0a709a
SC
1113 if (q->addend)
1114 {
1115 printf ("+0x");
1116 printf_vma (q->addend);
d20f480f 1117 }
aa0a709a 1118 printf ("\n");
d20f480f 1119 }
aa0a709a
SC
1120 printf ("\n\n");
1121 free (relpp);
d20f480f 1122 }
2fa0b342 1123 }
2fa0b342 1124
d20f480f 1125 }
2fa0b342
DHW
1126}
1127
aa0a709a
SC
1128#ifdef unix
1129#define _DUMMY_NAME_ "/dev/null"
1130#else
1131#define _DUMMY_NAME_ "##dummy"
1132#endif
9872a49c 1133static void
aa0a709a
SC
1134DEFUN (display_info_table, (first, last),
1135 int first AND int last)
9872a49c 1136{
3fdbfe8d 1137 unsigned int i, j;
9872a49c
SC
1138 extern bfd_target *target_vector[];
1139
aa0a709a
SC
1140 printf ("\n%12s", " ");
1141 for (i = first; i++ < last && target_vector[i];)
1142 printf ("%s ", target_vector[i]->name);
1143 printf ("\n");
9872a49c 1144
aa0a709a
SC
1145 for (j = (int) bfd_arch_obscure + 1; (int) j < (int) bfd_arch_last; j++)
1146 if (strcmp (bfd_printable_arch_mach (j, 0), "UNKNOWN!") != 0)
e779a58c 1147 {
aa0a709a
SC
1148 printf ("%11s ", bfd_printable_arch_mach (j, 0));
1149 for (i = first; i++ < last && target_vector[i];)
1150 {
1151 bfd_target *p = target_vector[i];
1152 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
1153 int l = strlen (p->name);
249c6fc0
RS
1154 int ok;
1155 bfd_set_format (abfd, bfd_object);
1156 ok = bfd_set_arch_mach (abfd, j, 0);
aa0a709a
SC
1157
1158 if (ok)
1159 printf ("%s ", p->name);
1160 else
e779a58c 1161 {
aa0a709a
SC
1162 while (l--)
1163 printf ("%c", ok ? '*' : '-');
1164 printf (" ");
e779a58c 1165 }
e779a58c 1166 }
aa0a709a 1167 printf ("\n");
e779a58c 1168 }
9872a49c 1169}
aa0a709a
SC
1170
1171static void
1172DEFUN_VOID (display_info)
1173{
1174 char *colum;
1175 unsigned int i, j, columns;
1176 extern bfd_target *target_vector[];
1177 extern char *getenv ();
1178
1179 printf ("BFD header file version %s\n", BFD_VERSION);
1180 for (i = 0; target_vector[i]; i++)
1181 {
1182 bfd_target *p = target_vector[i];
1183 bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name);
249c6fc0 1184 bfd_set_format (abfd, bfd_object);
aa0a709a
SC
1185 printf ("%s\n (header %s, data %s)\n", p->name,
1186 p->header_byteorder_big_p ? "big endian" : "little endian",
1187 p->byteorder_big_p ? "big endian" : "little endian");
1188 for (j = (int) bfd_arch_obscure + 1; j < (int) bfd_arch_last; j++)
1189 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) j, 0))
1190 printf (" %s\n",
1191 bfd_printable_arch_mach ((enum bfd_architecture) j, 0));
1192 }
1193 columns = 0;
02a68547 1194 if ((colum = getenv ("COLUMNS")) != (char *) NULL)
aa0a709a
SC
1195 columns = atoi (colum);
1196 if (!columns)
1197 columns = 80;
1198 for (i = 0; target_vector[i];)
1199 {
1200 int old;
1201 old = i;
1202 for (j = 12; target_vector[i] && j < columns; i++)
1203 j += strlen (target_vector[i]->name) + 1;
1204 i--;
1205 if (old == i)
1206 break;
1207 display_info_table (old, i);
1208 }
1209}
1210
2fa0b342
DHW
1211/** main and like trivia */
1212int
1213main (argc, argv)
1214 int argc;
1215 char **argv;
1216{
1217 int c;
1218 extern int optind;
1219 extern char *optarg;
1220 char *target = default_target;
1221 boolean seenflag = false;
2fa0b342 1222
aa0a709a 1223 bfd_init ();
2fa0b342
DHW
1224 program_name = *argv;
1225
d2442698
DM
1226 while ((c = getopt_long (argc, argv, "ib:m:Vdlfahrtxsj:", long_options,
1227 (int *) 0))
aa0a709a
SC
1228 != EOF)
1229 {
1230 seenflag = true;
1231 switch (c)
1232 {
b3a2b497
ILT
1233 case 0:
1234 break; /* we've been given a long option */
aa0a709a
SC
1235 case 'm':
1236 machine = optarg;
1237 break;
1238 case 'j':
1239 only = optarg;
1240 break;
1241 case 'l':
1242 with_line_numbers = 1;
1243 break;
1244 case 'b':
1245 target = optarg;
1246 break;
1247 case 'f':
1248 dump_file_header = true;
1249 break;
1250 case 'i':
e1ec9f07 1251 formats_info = true;
aa0a709a
SC
1252 break;
1253 case 'x':
1254 dump_symtab = 1;
1255 dump_reloc_info = 1;
1256 dump_file_header = true;
1257 dump_ar_hdrs = 1;
1258 dump_section_headers = 1;
1259 break;
aa0a709a
SC
1260 case 't':
1261 dump_symtab = 1;
1262 break;
1263 case 'd':
1264 disassemble = true;
1265 break;
1266 case 's':
1267 dump_section_contents = 1;
1268 break;
1269 case 'r':
1270 dump_reloc_info = 1;
1271 break;
1272 case 'a':
1273 dump_ar_hdrs = 1;
1274 break;
1275 case 'h':
1276 dump_section_headers = 1;
1277 break;
b3a2b497
ILT
1278 case 'H':
1279 usage (stdout, 0);
249c6fc0
RS
1280 case 'V':
1281 show_version = 1;
1282 break;
aa0a709a 1283 default:
b3a2b497 1284 usage (stderr, 1);
aa0a709a 1285 }
2fa0b342 1286 }
2fa0b342 1287
249c6fc0 1288 if (show_version)
b3a2b497
ILT
1289 {
1290 printf ("GNU %s version %s\n", program_name, program_version);
1291 exit (0);
1292 }
249c6fc0 1293
2fa0b342 1294 if (seenflag == false)
b3a2b497 1295 usage (stderr, 1);
2fa0b342 1296
e1ec9f07 1297 if (formats_info)
aa0a709a
SC
1298 {
1299 display_info ();
1300 }
1301 else
1302 {
1303 if (optind == argc)
1304 display_file ("a.out", target);
1305 else
1306 for (; optind < argc;)
1307 display_file (argv[optind++], target);
1308 }
2fa0b342
DHW
1309 return 0;
1310}
This page took 0.160083 seconds and 4 git commands to generate.