]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/objdump.c
Fix up warning on SunOS
[thirdparty/binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3
4 This file is part of GNU Binutils.
5
6 This program 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)
9 any later version.
10
11 This program 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.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "bfd.h"
21 #include "getopt.h"
22 #include "progress.h"
23 #include "bucomm.h"
24 #include <ctype.h>
25 #include "dis-asm.h"
26 #include "libiberty.h"
27 #include "debug.h"
28 #include "budbg.h"
29
30 /* Internal headers for the ELF .stab-dump code - sorry. */
31 #define BYTES_IN_WORD 32
32 #include "aout/aout64.h"
33
34 #ifdef NEED_DECLARATION_FPRINTF
35 /* This is needed by INIT_DISASSEMBLE_INFO. */
36 extern int fprintf PARAMS ((FILE *, const char *));
37 #endif
38
39 char *default_target = NULL; /* default at runtime */
40
41 extern char *program_version;
42
43 int show_version = 0; /* show the version number */
44 int dump_section_contents; /* -s */
45 int dump_section_headers; /* -h */
46 boolean dump_file_header; /* -f */
47 int dump_symtab; /* -t */
48 int dump_dynamic_symtab; /* -T */
49 int dump_reloc_info; /* -r */
50 int dump_dynamic_reloc_info; /* -R */
51 int dump_ar_hdrs; /* -a */
52 int dump_private_headers; /* -p */
53 int with_line_numbers; /* -l */
54 boolean with_source_code; /* -S */
55 int show_raw_insn; /* --show-raw-insn */
56 int dump_stab_section_info; /* --stabs */
57 boolean disassemble; /* -d */
58 boolean disassemble_all; /* -D */
59 boolean formats_info; /* -i */
60 char *only; /* -j secname */
61 int wide_output; /* -w */
62 bfd_vma start_address = (bfd_vma) -1; /* --start-address */
63 bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
64 int dump_debugging; /* --debugging */
65
66 /* Extra info to pass to the disassembler address printing function. */
67 struct objdump_disasm_info {
68 bfd *abfd;
69 asection *sec;
70 boolean require_sec;
71 };
72
73 /* Architecture to disassemble for, or default if NULL. */
74 char *machine = (char *) NULL;
75
76 /* The symbol table. */
77 asymbol **syms;
78
79 /* Number of symbols in `syms'. */
80 long symcount = 0;
81
82 /* The sorted symbol table. */
83 asymbol **sorted_syms;
84
85 /* Number of symbols in `sorted_syms'. */
86 long sorted_symcount = 0;
87
88 /* The dynamic symbol table. */
89 asymbol **dynsyms;
90
91 /* Number of symbols in `dynsyms'. */
92 long dynsymcount = 0;
93
94 /* Forward declarations. */
95
96 static void
97 display_file PARAMS ((char *filename, char *target));
98
99 static void
100 dump_data PARAMS ((bfd *abfd));
101
102 static void
103 dump_relocs PARAMS ((bfd *abfd));
104
105 static void
106 dump_dynamic_relocs PARAMS ((bfd * abfd));
107
108 static void
109 dump_reloc_set PARAMS ((bfd *, arelent **, long));
110
111 static void
112 dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
113
114 static void
115 display_bfd PARAMS ((bfd *abfd));
116
117 static void
118 objdump_print_value PARAMS ((bfd_vma, FILE *));
119
120 static void
121 objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
122
123 static void
124 show_line PARAMS ((bfd *, asection *, bfd_vma));
125
126 static const char *
127 endian_string PARAMS ((enum bfd_endian));
128 \f
129 void
130 usage (stream, status)
131 FILE *stream;
132 int status;
133 {
134 fprintf (stream, "\
135 Usage: %s [-ahifdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\
136 [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
137 [--disassemble-all] [--file-headers] [--section-headers] [--headers]\n\
138 [--info] [--section=section-name] [--line-numbers] [--source]\n",
139 program_name);
140 fprintf (stream, "\
141 [--architecture=machine] [--reloc] [--full-contents] [--stabs]\n\
142 [--syms] [--all-headers] [--dynamic-syms] [--dynamic-reloc]\n\
143 [--wide] [--version] [--help] [--private-headers]\n\
144 [--start-address=addr] [--stop-address=addr]\n\
145 [--show-raw-insn] objfile...\n\
146 at least one option besides -l (--line-numbers) must be given\n");
147 list_supported_targets (program_name, stream);
148 exit (status);
149 }
150
151 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
152
153 #define OPTION_START_ADDRESS (150)
154 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
155
156 static struct option long_options[]=
157 {
158 {"all-headers", no_argument, NULL, 'x'},
159 {"private-headers", no_argument, NULL, 'p'},
160 {"architecture", required_argument, NULL, 'm'},
161 {"archive-headers", no_argument, NULL, 'a'},
162 {"debugging", no_argument, &dump_debugging, 1},
163 {"disassemble", no_argument, NULL, 'd'},
164 {"disassemble-all", no_argument, NULL, 'D'},
165 {"dynamic-reloc", no_argument, NULL, 'R'},
166 {"dynamic-syms", no_argument, NULL, 'T'},
167 {"file-headers", no_argument, NULL, 'f'},
168 {"full-contents", no_argument, NULL, 's'},
169 {"headers", no_argument, NULL, 'h'},
170 {"help", no_argument, NULL, 'H'},
171 {"info", no_argument, NULL, 'i'},
172 {"line-numbers", no_argument, NULL, 'l'},
173 {"reloc", no_argument, NULL, 'r'},
174 {"section", required_argument, NULL, 'j'},
175 {"section-headers", no_argument, NULL, 'h'},
176 {"show-raw-insn", no_argument, &show_raw_insn, 1},
177 {"source", no_argument, NULL, 'S'},
178 {"stabs", no_argument, &dump_stab_section_info, 1},
179 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
180 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
181 {"syms", no_argument, NULL, 't'},
182 {"target", required_argument, NULL, 'b'},
183 {"version", no_argument, &show_version, 1},
184 {"wide", no_argument, &wide_output, 'w'},
185 {0, no_argument, 0, 0}
186 };
187 \f
188 static void
189 dump_section_header (abfd, section, ignored)
190 bfd *abfd;
191 asection *section;
192 PTR ignored;
193 {
194 char *comma = "";
195
196 printf ("%3d %-14s%08lx ", section->index,
197 bfd_get_section_name (abfd, section),
198 (unsigned long) bfd_section_size (abfd, section));
199 printf_vma (bfd_get_section_vma (abfd, section));
200 printf (" ");
201 printf_vma (section->lma);
202 printf (" %08lx 2**%u", section->filepos,
203 bfd_get_section_alignment (abfd, section));
204 if (! wide_output)
205 printf ("\n ");
206 printf (" ");
207
208 #define PF(x, y) \
209 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
210
211 PF (SEC_HAS_CONTENTS, "CONTENTS");
212 PF (SEC_ALLOC, "ALLOC");
213 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
214 PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
215 PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
216 PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
217 PF (SEC_LOAD, "LOAD");
218 PF (SEC_RELOC, "RELOC");
219 #ifdef SEC_BALIGN
220 PF (SEC_BALIGN, "BALIGN");
221 #endif
222 PF (SEC_READONLY, "READONLY");
223 PF (SEC_CODE, "CODE");
224 PF (SEC_DATA, "DATA");
225 PF (SEC_ROM, "ROM");
226 PF (SEC_DEBUGGING, "DEBUGGING");
227 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
228 PF (SEC_EXCLUDE, "EXCLUDE");
229 PF (SEC_SORT_ENTRIES, "SORT ENTRIES");
230 printf ("\n");
231 #undef PF
232 }
233
234 static void
235 dump_headers (abfd)
236 bfd *abfd;
237 {
238 printf ("Sections:\n");
239 #ifndef BFD64
240 printf ("Idx Name Size VMA LMA File off Algn\n");
241 #else
242 printf ("Idx Name Size VMA LMA File off Algn\n");
243 #endif
244 bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
245 }
246 \f
247 static asymbol **
248 slurp_symtab (abfd)
249 bfd *abfd;
250 {
251 asymbol **sy = (asymbol **) NULL;
252 long storage;
253
254 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
255 {
256 printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
257 symcount = 0;
258 return NULL;
259 }
260
261 storage = bfd_get_symtab_upper_bound (abfd);
262 if (storage < 0)
263 bfd_fatal (bfd_get_filename (abfd));
264
265 if (storage)
266 {
267 sy = (asymbol **) xmalloc (storage);
268 }
269 symcount = bfd_canonicalize_symtab (abfd, sy);
270 if (symcount < 0)
271 bfd_fatal (bfd_get_filename (abfd));
272 if (symcount == 0)
273 fprintf (stderr, "%s: %s: No symbols\n",
274 program_name, bfd_get_filename (abfd));
275 return sy;
276 }
277
278 /* Read in the dynamic symbols. */
279
280 static asymbol **
281 slurp_dynamic_symtab (abfd)
282 bfd *abfd;
283 {
284 asymbol **sy = (asymbol **) NULL;
285 long storage;
286
287 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
288 if (storage < 0)
289 {
290 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
291 {
292 fprintf (stderr, "%s: %s: not a dynamic object\n",
293 program_name, bfd_get_filename (abfd));
294 dynsymcount = 0;
295 return NULL;
296 }
297
298 bfd_fatal (bfd_get_filename (abfd));
299 }
300
301 if (storage)
302 {
303 sy = (asymbol **) xmalloc (storage);
304 }
305 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
306 if (dynsymcount < 0)
307 bfd_fatal (bfd_get_filename (abfd));
308 if (dynsymcount == 0)
309 fprintf (stderr, "%s: %s: No dynamic symbols\n",
310 program_name, bfd_get_filename (abfd));
311 return sy;
312 }
313
314 /* Filter out (in place) symbols that are useless for disassembly.
315 COUNT is the number of elements in SYMBOLS.
316 Return the number of useful symbols. */
317
318 long
319 remove_useless_symbols (symbols, count)
320 asymbol **symbols;
321 long count;
322 {
323 register asymbol **in_ptr = symbols, **out_ptr = symbols;
324
325 while (--count >= 0)
326 {
327 asymbol *sym = *in_ptr++;
328
329 if (sym->name == NULL || sym->name[0] == '\0')
330 continue;
331 if (sym->flags & (BSF_DEBUGGING))
332 continue;
333 if (bfd_is_und_section (sym->section)
334 || bfd_is_com_section (sym->section))
335 continue;
336
337 *out_ptr++ = sym;
338 }
339 return out_ptr - symbols;
340 }
341
342 /* Sort symbols into value order. */
343
344 static int
345 compare_symbols (ap, bp)
346 const PTR ap;
347 const PTR bp;
348 {
349 const asymbol *a = *(const asymbol **)ap;
350 const asymbol *b = *(const asymbol **)bp;
351 const char *an, *bn;
352 size_t anl, bnl;
353 boolean af, bf;
354 flagword aflags, bflags;
355
356 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
357 return 1;
358 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
359 return -1;
360
361 if (a->section > b->section)
362 return 1;
363 else if (a->section < b->section)
364 return -1;
365
366 an = bfd_asymbol_name (a);
367 bn = bfd_asymbol_name (b);
368 anl = strlen (an);
369 bnl = strlen (bn);
370
371 /* The symbols gnu_compiled and gcc2_compiled convey no real
372 information, so put them after other symbols with the same value. */
373
374 af = (strstr (an, "gnu_compiled") != NULL
375 || strstr (an, "gcc2_compiled") != NULL);
376 bf = (strstr (bn, "gnu_compiled") != NULL
377 || strstr (bn, "gcc2_compiled") != NULL);
378
379 if (af && ! bf)
380 return 1;
381 if (! af && bf)
382 return -1;
383
384 /* We use a heuristic for the file name, to try to sort it after
385 more useful symbols. It may not work on non Unix systems, but it
386 doesn't really matter; the only difference is precisely which
387 symbol names get printed. */
388
389 #define file_symbol(s, sn, snl) \
390 (((s)->flags & BSF_FILE) != 0 \
391 || ((sn)[(snl) - 2] == '.' \
392 && ((sn)[(snl) - 1] == 'o' \
393 || (sn)[(snl) - 1] == 'a')))
394
395 af = file_symbol (a, an, anl);
396 bf = file_symbol (b, bn, bnl);
397
398 if (af && ! bf)
399 return 1;
400 if (! af && bf)
401 return -1;
402
403 /* Finally, try to sort global symbols before local symbols before
404 debugging symbols. */
405
406 aflags = a->flags;
407 bflags = b->flags;
408
409 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
410 {
411 if ((aflags & BSF_DEBUGGING) != 0)
412 return 1;
413 else
414 return -1;
415 }
416 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
417 {
418 if ((aflags & BSF_LOCAL) != 0)
419 return 1;
420 else
421 return -1;
422 }
423
424 return 0;
425 }
426
427 /* Sort relocs into address order. */
428
429 static int
430 compare_relocs (ap, bp)
431 const PTR ap;
432 const PTR bp;
433 {
434 const arelent *a = *(const arelent **)ap;
435 const arelent *b = *(const arelent **)bp;
436
437 if (a->address > b->address)
438 return 1;
439 else if (a->address < b->address)
440 return -1;
441
442 /* So that associated relocations tied to the same address show up
443 in the correct order, we don't do any further sorting. */
444 if (a > b)
445 return 1;
446 else if (a < b)
447 return -1;
448 else
449 return 0;
450 }
451
452 /* Print VMA to STREAM with no leading zeroes. */
453
454 static void
455 objdump_print_value (vma, stream)
456 bfd_vma vma;
457 FILE *stream;
458 {
459 char buf[30];
460 char *p;
461
462 sprintf_vma (buf, vma);
463 for (p = buf; *p == '0'; ++p)
464 ;
465 fprintf (stream, "%s", p);
466 }
467
468 /* Print VMA symbolically to INFO if possible. */
469
470 static void
471 objdump_print_address (vma, info)
472 bfd_vma vma;
473 struct disassemble_info *info;
474 {
475 /* @@ Would it speed things up to cache the last two symbols returned,
476 and maybe their address ranges? For many processors, only one memory
477 operand can be present at a time, so the 2-entry cache wouldn't be
478 constantly churned by code doing heavy memory accesses. */
479
480 /* Indices in `sorted_syms'. */
481 long min = 0;
482 long max = sorted_symcount;
483 long thisplace;
484
485 fprintf_vma (info->stream, vma);
486
487 if (sorted_symcount < 1)
488 return;
489
490 /* Perform a binary search looking for the closest symbol to the
491 required value. We are searching the range (min, max]. */
492 while (min + 1 < max)
493 {
494 asymbol *sym;
495
496 thisplace = (max + min) / 2;
497 sym = sorted_syms[thisplace];
498
499 if (bfd_asymbol_value (sym) > vma)
500 max = thisplace;
501 else if (bfd_asymbol_value (sym) < vma)
502 min = thisplace;
503 else
504 {
505 min = thisplace;
506 break;
507 }
508 }
509
510 /* The symbol we want is now in min, the low end of the range we
511 were searching. If there are several symbols with the same
512 value, we want the first one. */
513 thisplace = min;
514 while (thisplace > 0
515 && (bfd_asymbol_value (sorted_syms[thisplace])
516 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
517 --thisplace;
518
519 {
520 /* If the file is relocateable, and the symbol could be from this
521 section, prefer a symbol from this section over symbols from
522 others, even if the other symbol's value might be closer.
523
524 Note that this may be wrong for some symbol references if the
525 sections have overlapping memory ranges, but in that case there's
526 no way to tell what's desired without looking at the relocation
527 table. */
528 struct objdump_disasm_info *aux;
529 long i;
530
531 aux = (struct objdump_disasm_info *) info->application_data;
532 if (sorted_syms[thisplace]->section != aux->sec
533 && (aux->require_sec
534 || ((aux->abfd->flags & HAS_RELOC) != 0
535 && vma >= bfd_get_section_vma (aux->abfd, aux->sec)
536 && vma < (bfd_get_section_vma (aux->abfd, aux->sec)
537 + bfd_section_size (aux->abfd, aux->sec)))))
538 {
539 for (i = thisplace + 1; i < sorted_symcount; i++)
540 {
541 if (bfd_asymbol_value (sorted_syms[i])
542 != bfd_asymbol_value (sorted_syms[thisplace]))
543 break;
544 }
545 --i;
546 for (; i >= 0; i--)
547 {
548 if (sorted_syms[i]->section == aux->sec
549 && (i == 0
550 || sorted_syms[i - 1]->section != aux->sec
551 || (bfd_asymbol_value (sorted_syms[i])
552 != bfd_asymbol_value (sorted_syms[i - 1]))))
553 {
554 thisplace = i;
555 break;
556 }
557 }
558
559 if (sorted_syms[thisplace]->section != aux->sec)
560 {
561 /* We didn't find a good symbol with a smaller value.
562 Look for one with a larger value. */
563 for (i = thisplace + 1; i < sorted_symcount; i++)
564 {
565 if (sorted_syms[i]->section == aux->sec)
566 {
567 thisplace = i;
568 break;
569 }
570 }
571 }
572
573 if (sorted_syms[thisplace]->section != aux->sec
574 && (aux->require_sec
575 || ((aux->abfd->flags & HAS_RELOC) != 0
576 && vma >= bfd_get_section_vma (aux->abfd, aux->sec)
577 && vma < (bfd_get_section_vma (aux->abfd, aux->sec)
578 + bfd_section_size (aux->abfd, aux->sec)))))
579 {
580 bfd_vma secaddr;
581
582 fprintf (info->stream, " <%s",
583 bfd_get_section_name (aux->abfd, aux->sec));
584 secaddr = bfd_get_section_vma (aux->abfd, aux->sec);
585 if (vma < secaddr)
586 {
587 fprintf (info->stream, "-");
588 objdump_print_value (secaddr - vma, info->stream);
589 }
590 else if (vma > secaddr)
591 {
592 fprintf (info->stream, "+");
593 objdump_print_value (vma - secaddr, info->stream);
594 }
595 fprintf (info->stream, ">");
596 return;
597 }
598 }
599 }
600
601 fprintf (info->stream, " <%s", sorted_syms[thisplace]->name);
602 if (bfd_asymbol_value (sorted_syms[thisplace]) > vma)
603 {
604 fprintf (info->stream, "-");
605 objdump_print_value (bfd_asymbol_value (sorted_syms[thisplace]) - vma,
606 info->stream);
607 }
608 else if (vma > bfd_asymbol_value (sorted_syms[thisplace]))
609 {
610 fprintf (info->stream, "+");
611 objdump_print_value (vma - bfd_asymbol_value (sorted_syms[thisplace]),
612 info->stream);
613 }
614 fprintf (info->stream, ">");
615 }
616
617 /* Hold the last function name and the last line number we displayed
618 in a disassembly. */
619
620 static char *prev_functionname;
621 static unsigned int prev_line;
622
623 /* We keep a list of all files that we have seen when doing a
624 dissassembly with source, so that we know how much of the file to
625 display. This can be important for inlined functions. */
626
627 struct print_file_list
628 {
629 struct print_file_list *next;
630 char *filename;
631 unsigned int line;
632 FILE *f;
633 };
634
635 static struct print_file_list *print_files;
636
637 /* The number of preceding context lines to show when we start
638 displaying a file for the first time. */
639
640 #define SHOW_PRECEDING_CONTEXT_LINES (5)
641
642 /* Skip ahead to a given line in a file, optionally printing each
643 line. */
644
645 static void
646 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
647
648 static void
649 skip_to_line (p, line, show)
650 struct print_file_list *p;
651 unsigned int line;
652 boolean show;
653 {
654 while (p->line < line)
655 {
656 char buf[100];
657
658 if (fgets (buf, sizeof buf, p->f) == NULL)
659 {
660 fclose (p->f);
661 p->f = NULL;
662 break;
663 }
664
665 if (show)
666 printf ("%s", buf);
667
668 if (strchr (buf, '\n') != NULL)
669 ++p->line;
670 }
671 }
672
673 /* Show the line number, or the source line, in a dissassembly
674 listing. */
675
676 static void
677 show_line (abfd, section, off)
678 bfd *abfd;
679 asection *section;
680 bfd_vma off;
681 {
682 CONST char *filename;
683 CONST char *functionname;
684 unsigned int line;
685
686 if (! with_line_numbers && ! with_source_code)
687 return;
688
689 if (! bfd_find_nearest_line (abfd, section, syms, off, &filename,
690 &functionname, &line))
691 return;
692
693 if (filename != NULL && *filename == '\0')
694 filename = NULL;
695 if (functionname != NULL && *functionname == '\0')
696 functionname = NULL;
697
698 if (with_line_numbers)
699 {
700 if (functionname != NULL
701 && (prev_functionname == NULL
702 || strcmp (functionname, prev_functionname) != 0))
703 printf ("%s():\n", functionname);
704 if (line > 0 && line != prev_line)
705 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
706 }
707
708 if (with_source_code
709 && filename != NULL
710 && line > 0)
711 {
712 struct print_file_list **pp, *p;
713
714 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
715 if (strcmp ((*pp)->filename, filename) == 0)
716 break;
717 p = *pp;
718
719 if (p != NULL)
720 {
721 if (p != print_files)
722 {
723 int l;
724
725 /* We have reencountered a file name which we saw
726 earlier. This implies that either we are dumping out
727 code from an included file, or the same file was
728 linked in more than once. There are two common cases
729 of an included file: inline functions in a header
730 file, and a bison or flex skeleton file. In the
731 former case we want to just start printing (but we
732 back up a few lines to give context); in the latter
733 case we want to continue from where we left off. I
734 can't think of a good way to distinguish the cases,
735 so I used a heuristic based on the file name. */
736 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
737 l = p->line;
738 else
739 {
740 l = line - SHOW_PRECEDING_CONTEXT_LINES;
741 if (l <= 0)
742 l = 1;
743 }
744
745 if (p->f == NULL)
746 {
747 p->f = fopen (p->filename, "r");
748 p->line = 0;
749 }
750 if (p->f != NULL)
751 skip_to_line (p, l, false);
752
753 if (print_files->f != NULL)
754 {
755 fclose (print_files->f);
756 print_files->f = NULL;
757 }
758 }
759
760 if (p->f != NULL)
761 {
762 skip_to_line (p, line, true);
763 *pp = p->next;
764 p->next = print_files;
765 print_files = p;
766 }
767 }
768 else
769 {
770 FILE *f;
771
772 f = fopen (filename, "r");
773 if (f != NULL)
774 {
775 int l;
776
777 p = ((struct print_file_list *)
778 xmalloc (sizeof (struct print_file_list)));
779 p->filename = xmalloc (strlen (filename) + 1);
780 strcpy (p->filename, filename);
781 p->line = 0;
782 p->f = f;
783
784 if (print_files != NULL && print_files->f != NULL)
785 {
786 fclose (print_files->f);
787 print_files->f = NULL;
788 }
789 p->next = print_files;
790 print_files = p;
791
792 l = line - SHOW_PRECEDING_CONTEXT_LINES;
793 if (l <= 0)
794 l = 1;
795 skip_to_line (p, l, false);
796 if (p->f != NULL)
797 skip_to_line (p, line, true);
798 }
799 }
800 }
801
802 if (functionname != NULL
803 && (prev_functionname == NULL
804 || strcmp (functionname, prev_functionname) != 0))
805 {
806 if (prev_functionname != NULL)
807 free (prev_functionname);
808 prev_functionname = xmalloc (strlen (functionname) + 1);
809 strcpy (prev_functionname, functionname);
810 }
811
812 if (line > 0 && line != prev_line)
813 prev_line = line;
814 }
815
816 void
817 disassemble_data (abfd)
818 bfd *abfd;
819 {
820 long i;
821 disassembler_ftype disassemble_fn = 0; /* New style */
822 struct disassemble_info disasm_info;
823 struct objdump_disasm_info aux;
824 asection *section;
825 boolean done_dot = false;
826
827 print_files = NULL;
828 prev_functionname = NULL;
829 prev_line = -1;
830
831 /* We make a copy of syms to sort. We don't want to sort syms
832 because that will screw up the relocs. */
833 sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
834 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
835
836 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
837
838 /* Sort the symbols into section and symbol order */
839 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
840
841 INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
842 disasm_info.application_data = (PTR) &aux;
843 aux.abfd = abfd;
844 disasm_info.print_address_func = objdump_print_address;
845 if (show_raw_insn)
846 disasm_info.flags |= DISASM_RAW_INSN_FLAG;
847
848 if (machine != (char *) NULL)
849 {
850 const bfd_arch_info_type *info = bfd_scan_arch (machine);
851 if (info == NULL)
852 {
853 fprintf (stderr, "%s: Can't use supplied machine %s\n",
854 program_name,
855 machine);
856 exit (1);
857 }
858 abfd->arch_info = info;
859 }
860
861 disassemble_fn = disassembler (abfd);
862 if (!disassemble_fn)
863 {
864 fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
865 program_name,
866 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
867 exit (1);
868 }
869
870 disasm_info.arch = bfd_get_arch (abfd);
871 disasm_info.mach = bfd_get_mach (abfd);
872 if (bfd_big_endian (abfd))
873 disasm_info.endian = BFD_ENDIAN_BIG;
874 else if (bfd_little_endian (abfd))
875 disasm_info.endian = BFD_ENDIAN_LITTLE;
876 else
877 /* ??? Aborting here seems too drastic. We could default to big or little
878 instead. */
879 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
880
881 for (section = abfd->sections;
882 section != (asection *) NULL;
883 section = section->next)
884 {
885 bfd_byte *data = NULL;
886 bfd_size_type datasize = 0;
887 arelent **relbuf = NULL;
888 arelent **relpp = NULL;
889 arelent **relppend = NULL;
890 long stop;
891
892 if ((section->flags & SEC_LOAD) == 0
893 || (! disassemble_all
894 && only == NULL
895 && (section->flags & SEC_CODE) == 0))
896 continue;
897 if (only != (char *) NULL && strcmp (only, section->name) != 0)
898 continue;
899
900 if (dump_reloc_info
901 && (section->flags & SEC_RELOC) != 0)
902 {
903 long relsize;
904
905 relsize = bfd_get_reloc_upper_bound (abfd, section);
906 if (relsize < 0)
907 bfd_fatal (bfd_get_filename (abfd));
908
909 if (relsize > 0)
910 {
911 long relcount;
912
913 relbuf = (arelent **) xmalloc (relsize);
914 relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
915 if (relcount < 0)
916 bfd_fatal (bfd_get_filename (abfd));
917
918 /* Sort the relocs by address. */
919 qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
920
921 relpp = relbuf;
922 relppend = relpp + relcount;
923 }
924 }
925
926 printf ("Disassembly of section %s:\n", section->name);
927
928 datasize = bfd_get_section_size_before_reloc (section);
929 if (datasize == 0)
930 continue;
931
932 data = (bfd_byte *) xmalloc ((size_t) datasize);
933
934 bfd_get_section_contents (abfd, section, data, 0, datasize);
935
936 aux.sec = section;
937 disasm_info.buffer = data;
938 disasm_info.buffer_vma = section->vma;
939 disasm_info.buffer_length = datasize;
940 if (start_address == (bfd_vma) -1
941 || start_address < disasm_info.buffer_vma)
942 i = 0;
943 else
944 i = start_address - disasm_info.buffer_vma;
945 if (stop_address == (bfd_vma) -1)
946 stop = datasize;
947 else
948 {
949 if (stop_address < disasm_info.buffer_vma)
950 stop = 0;
951 else
952 stop = stop_address - disasm_info.buffer_vma;
953 if (stop > disasm_info.buffer_length)
954 stop = disasm_info.buffer_length;
955 }
956 while (i < stop)
957 {
958 int bytes;
959 boolean need_nl = false;
960
961 if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 &&
962 data[i + 3] == 0)
963 {
964 if (done_dot == false)
965 {
966 printf ("...\n");
967 done_dot = true;
968 }
969 bytes = 4;
970 }
971 else
972 {
973 done_dot = false;
974 if (with_line_numbers || with_source_code)
975 show_line (abfd, section, i);
976 aux.require_sec = true;
977 objdump_print_address (section->vma + i, &disasm_info);
978 aux.require_sec = false;
979 putchar (' ');
980
981 bytes = (*disassemble_fn) (section->vma + i, &disasm_info);
982 if (bytes < 0)
983 break;
984
985 if (!wide_output)
986 putchar ('\n');
987 else
988 need_nl = true;
989 }
990
991 if (dump_reloc_info
992 && (section->flags & SEC_RELOC) != 0)
993 {
994 while (relpp < relppend
995 && ((*relpp)->address >= (bfd_vma) i
996 && (*relpp)->address < (bfd_vma) i + bytes))
997 {
998 arelent *q;
999 const char *sym_name;
1000
1001 q = *relpp;
1002
1003 printf ("\t\tRELOC: ");
1004
1005 printf_vma (section->vma + q->address);
1006
1007 printf (" %s ", q->howto->name);
1008
1009 if (q->sym_ptr_ptr != NULL
1010 && *q->sym_ptr_ptr != NULL)
1011 {
1012 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1013 if (sym_name == NULL || *sym_name == '\0')
1014 {
1015 asection *sym_sec;
1016
1017 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1018 sym_name = bfd_get_section_name (abfd, sym_sec);
1019 if (sym_name == NULL || *sym_name == '\0')
1020 sym_name = "*unknown*";
1021 }
1022 }
1023
1024 printf ("%s", sym_name);
1025
1026 if (q->addend)
1027 {
1028 printf ("+0x");
1029 printf_vma (q->addend);
1030 }
1031
1032 printf ("\n");
1033 need_nl = false;
1034 ++relpp;
1035 }
1036 }
1037
1038 if (need_nl)
1039 printf ("\n");
1040
1041 i += bytes;
1042 }
1043
1044 free (data);
1045 if (relbuf != NULL)
1046 free (relbuf);
1047 }
1048 free (sorted_syms);
1049 }
1050 \f
1051
1052 /* Define a table of stab values and print-strings. We wish the initializer
1053 could be a direct-mapped table, but instead we build one the first
1054 time we need it. */
1055
1056 char **stab_name;
1057
1058 struct stab_print {
1059 int value;
1060 char *string;
1061 };
1062
1063 struct stab_print stab_print[] = {
1064 #define __define_stab(NAME, CODE, STRING) {CODE, STRING},
1065 #include "aout/stab.def"
1066 #undef __define_stab
1067 {0, ""}
1068 };
1069
1070 void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1071 char *strsect_name));
1072
1073 /* Dump the stabs sections from an object file that has a section that
1074 uses Sun stabs encoding. It has to use some hooks into BFD because
1075 string table sections are not normally visible to BFD callers. */
1076
1077 void
1078 dump_stabs (abfd)
1079 bfd *abfd;
1080 {
1081 /* Allocate and initialize stab name array if first time. */
1082 if (stab_name == NULL)
1083 {
1084 int i;
1085
1086 stab_name = (char **) xmalloc (256 * sizeof(char *));
1087 /* Clear the array. */
1088 for (i = 0; i < 256; i++)
1089 stab_name[i] = NULL;
1090 /* Fill in the defined stabs. */
1091 for (i = 0; *stab_print[i].string; i++)
1092 stab_name[stab_print[i].value] = stab_print[i].string;
1093 }
1094
1095 dump_section_stabs (abfd, ".stab", ".stabstr");
1096 dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1097 dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1098 dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1099 }
1100
1101 static struct internal_nlist *stabs;
1102 static bfd_size_type stab_size;
1103
1104 static char *strtab;
1105 static bfd_size_type stabstr_size;
1106
1107 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1108 and string table section STRSECT_NAME into `strtab'.
1109 If the section exists and was read, allocate the space and return true.
1110 Otherwise return false. */
1111
1112 boolean
1113 read_section_stabs (abfd, stabsect_name, strsect_name)
1114 bfd *abfd;
1115 char *stabsect_name;
1116 char *strsect_name;
1117 {
1118 asection *stabsect, *stabstrsect;
1119
1120 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1121 if (0 == stabsect)
1122 {
1123 printf ("No %s section present\n\n", stabsect_name);
1124 return false;
1125 }
1126
1127 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1128 if (0 == stabstrsect)
1129 {
1130 fprintf (stderr, "%s: %s has no %s section\n", program_name,
1131 bfd_get_filename (abfd), strsect_name);
1132 return false;
1133 }
1134
1135 stab_size = bfd_section_size (abfd, stabsect);
1136 stabstr_size = bfd_section_size (abfd, stabstrsect);
1137
1138 stabs = (struct internal_nlist *) xmalloc (stab_size);
1139 strtab = (char *) xmalloc (stabstr_size);
1140
1141 if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1142 {
1143 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1144 program_name, stabsect_name, bfd_get_filename (abfd),
1145 bfd_errmsg (bfd_get_error ()));
1146 free (stabs);
1147 free (strtab);
1148 return false;
1149 }
1150
1151 if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1152 stabstr_size))
1153 {
1154 fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1155 program_name, strsect_name, bfd_get_filename (abfd),
1156 bfd_errmsg (bfd_get_error ()));
1157 free (stabs);
1158 free (strtab);
1159 return false;
1160 }
1161
1162 return true;
1163 }
1164
1165 #define SWAP_SYMBOL(symp, abfd) \
1166 { \
1167 (symp)->n_strx = bfd_h_get_32(abfd, \
1168 (unsigned char *)&(symp)->n_strx); \
1169 (symp)->n_desc = bfd_h_get_16 (abfd, \
1170 (unsigned char *)&(symp)->n_desc); \
1171 (symp)->n_value = bfd_h_get_32 (abfd, \
1172 (unsigned char *)&(symp)->n_value); \
1173 }
1174
1175 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1176 using string table section STRSECT_NAME (in `strtab'). */
1177
1178 void
1179 print_section_stabs (abfd, stabsect_name, strsect_name)
1180 bfd *abfd;
1181 char *stabsect_name;
1182 char *strsect_name;
1183 {
1184 int i;
1185 unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1186 struct internal_nlist *stabp = stabs,
1187 *stabs_end = (struct internal_nlist *) (stab_size + (char *) stabs);
1188
1189 printf ("Contents of %s section:\n\n", stabsect_name);
1190 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1191
1192 /* Loop through all symbols and print them.
1193
1194 We start the index at -1 because there is a dummy symbol on
1195 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1196
1197 for (i = -1; stabp < stabs_end; stabp++, i++)
1198 {
1199 SWAP_SYMBOL (stabp, abfd);
1200 printf ("\n%-6d ", i);
1201 /* Either print the stab name, or, if unnamed, print its number
1202 again (makes consistent formatting for tools like awk). */
1203 if (stab_name[stabp->n_type])
1204 printf ("%-6s", stab_name[stabp->n_type]);
1205 else if (stabp->n_type == N_UNDF)
1206 printf ("HdrSym");
1207 else
1208 printf ("%-6d", stabp->n_type);
1209 printf (" %-6d %-6d ", stabp->n_other, stabp->n_desc);
1210 printf_vma (stabp->n_value);
1211 printf (" %-6lu", stabp->n_strx);
1212
1213 /* Symbols with type == 0 (N_UNDF) specify the length of the
1214 string table associated with this file. We use that info
1215 to know how to relocate the *next* file's string table indices. */
1216
1217 if (stabp->n_type == N_UNDF)
1218 {
1219 file_string_table_offset = next_file_string_table_offset;
1220 next_file_string_table_offset += stabp->n_value;
1221 }
1222 else
1223 {
1224 /* Using the (possibly updated) string table offset, print the
1225 string (if any) associated with this symbol. */
1226
1227 if ((stabp->n_strx + file_string_table_offset) < stabstr_size)
1228 printf (" %s", &strtab[stabp->n_strx + file_string_table_offset]);
1229 else
1230 printf (" *");
1231 }
1232 }
1233 printf ("\n\n");
1234 }
1235
1236 void
1237 dump_section_stabs (abfd, stabsect_name, strsect_name)
1238 bfd *abfd;
1239 char *stabsect_name;
1240 char *strsect_name;
1241 {
1242 asection *s;
1243
1244 /* Check for section names for which stabsect_name is a prefix, to
1245 handle .stab0, etc. */
1246 for (s = abfd->sections;
1247 s != NULL;
1248 s = s->next)
1249 {
1250 if (strncmp (stabsect_name, s->name, strlen (stabsect_name)) == 0
1251 && strncmp (strsect_name, s->name, strlen (strsect_name)) != 0)
1252 {
1253 if (read_section_stabs (abfd, s->name, strsect_name))
1254 {
1255 print_section_stabs (abfd, s->name, strsect_name);
1256 free (stabs);
1257 free (strtab);
1258 }
1259 }
1260 }
1261 }
1262 \f
1263 static void
1264 dump_bfd_header (abfd)
1265 bfd *abfd;
1266 {
1267 char *comma = "";
1268
1269 printf ("architecture: %s, ",
1270 bfd_printable_arch_mach (bfd_get_arch (abfd),
1271 bfd_get_mach (abfd)));
1272 printf ("flags 0x%08x:\n", abfd->flags);
1273
1274 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1275 PF (HAS_RELOC, "HAS_RELOC");
1276 PF (EXEC_P, "EXEC_P");
1277 PF (HAS_LINENO, "HAS_LINENO");
1278 PF (HAS_DEBUG, "HAS_DEBUG");
1279 PF (HAS_SYMS, "HAS_SYMS");
1280 PF (HAS_LOCALS, "HAS_LOCALS");
1281 PF (DYNAMIC, "DYNAMIC");
1282 PF (WP_TEXT, "WP_TEXT");
1283 PF (D_PAGED, "D_PAGED");
1284 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1285 printf ("\nstart address 0x");
1286 printf_vma (abfd->start_address);
1287 }
1288 \f
1289 static void
1290 dump_bfd_private_header (abfd)
1291 bfd *abfd;
1292 {
1293 bfd_print_private_bfd_data (abfd, stdout);
1294 }
1295 static void
1296 display_bfd (abfd)
1297 bfd *abfd;
1298 {
1299 char **matching;
1300
1301 if (!bfd_check_format_matches (abfd, bfd_object, &matching))
1302 {
1303 bfd_nonfatal (bfd_get_filename (abfd));
1304 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1305 {
1306 list_matching_formats (matching);
1307 free (matching);
1308 }
1309 return;
1310 }
1311
1312 printf ("\n%s: file format %s\n", bfd_get_filename (abfd),
1313 abfd->xvec->name);
1314 if (dump_ar_hdrs)
1315 print_arelt_descr (stdout, abfd, true);
1316 if (dump_file_header)
1317 dump_bfd_header (abfd);
1318 if (dump_private_headers)
1319 dump_bfd_private_header (abfd);
1320 putchar ('\n');
1321 if (dump_section_headers)
1322 dump_headers (abfd);
1323 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
1324 {
1325 syms = slurp_symtab (abfd);
1326 }
1327 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
1328 {
1329 dynsyms = slurp_dynamic_symtab (abfd);
1330 }
1331 if (dump_symtab)
1332 dump_symbols (abfd, false);
1333 if (dump_dynamic_symtab)
1334 dump_symbols (abfd, true);
1335 if (dump_stab_section_info)
1336 dump_stabs (abfd);
1337 if (dump_reloc_info && ! disassemble)
1338 dump_relocs (abfd);
1339 if (dump_dynamic_reloc_info)
1340 dump_dynamic_relocs (abfd);
1341 if (dump_section_contents)
1342 dump_data (abfd);
1343 if (disassemble)
1344 disassemble_data (abfd);
1345 if (dump_debugging)
1346 {
1347 PTR dhandle;
1348
1349 dhandle = read_debugging_info (abfd, syms, symcount);
1350 if (dhandle != NULL)
1351 {
1352 if (! print_debugging_info (stdout, dhandle))
1353 fprintf (stderr, "%s: printing debugging information failed\n",
1354 bfd_get_filename (abfd));
1355 }
1356 }
1357 if (syms)
1358 {
1359 free (syms);
1360 syms = NULL;
1361 }
1362 if (dynsyms)
1363 {
1364 free (dynsyms);
1365 dynsyms = NULL;
1366 }
1367 }
1368
1369 static void
1370 display_file (filename, target)
1371 char *filename;
1372 char *target;
1373 {
1374 bfd *file, *arfile = (bfd *) NULL;
1375
1376 file = bfd_openr (filename, target);
1377 if (file == NULL)
1378 {
1379 bfd_nonfatal (filename);
1380 return;
1381 }
1382
1383 if (bfd_check_format (file, bfd_archive) == true)
1384 {
1385 bfd *last_arfile = NULL;
1386
1387 printf ("In archive %s:\n", bfd_get_filename (file));
1388 for (;;)
1389 {
1390 bfd_set_error (bfd_error_no_error);
1391
1392 arfile = bfd_openr_next_archived_file (file, arfile);
1393 if (arfile == NULL)
1394 {
1395 if (bfd_get_error () != bfd_error_no_more_archived_files)
1396 {
1397 bfd_nonfatal (bfd_get_filename (file));
1398 }
1399 break;
1400 }
1401
1402 display_bfd (arfile);
1403
1404 if (last_arfile != NULL)
1405 bfd_close (last_arfile);
1406 last_arfile = arfile;
1407 }
1408
1409 if (last_arfile != NULL)
1410 bfd_close (last_arfile);
1411 }
1412 else
1413 display_bfd (file);
1414
1415 bfd_close (file);
1416 }
1417 \f
1418 /* Actually display the various requested regions */
1419
1420 static void
1421 dump_data (abfd)
1422 bfd *abfd;
1423 {
1424 asection *section;
1425 bfd_byte *data = 0;
1426 bfd_size_type datasize = 0;
1427 bfd_size_type i;
1428 bfd_size_type start, stop;
1429
1430 for (section = abfd->sections; section != NULL; section =
1431 section->next)
1432 {
1433 int onaline = 16;
1434
1435 if (only == (char *) NULL ||
1436 strcmp (only, section->name) == 0)
1437 {
1438 if (section->flags & SEC_HAS_CONTENTS)
1439 {
1440 printf ("Contents of section %s:\n", section->name);
1441
1442 if (bfd_section_size (abfd, section) == 0)
1443 continue;
1444 data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
1445 datasize = bfd_section_size (abfd, section);
1446
1447
1448 bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
1449
1450 if (start_address == (bfd_vma) -1
1451 || start_address < section->vma)
1452 start = 0;
1453 else
1454 start = start_address - section->vma;
1455 if (stop_address == (bfd_vma) -1)
1456 stop = bfd_section_size (abfd, section);
1457 else
1458 {
1459 if (stop_address < section->vma)
1460 stop = 0;
1461 else
1462 stop = stop_address - section->vma;
1463 if (stop > bfd_section_size (abfd, section))
1464 stop = bfd_section_size (abfd, section);
1465 }
1466 for (i = start; i < stop; i += onaline)
1467 {
1468 bfd_size_type j;
1469
1470 printf (" %04lx ", (unsigned long int) (i + section->vma));
1471 for (j = i; j < i + onaline; j++)
1472 {
1473 if (j < stop)
1474 printf ("%02x", (unsigned) (data[j]));
1475 else
1476 printf (" ");
1477 if ((j & 3) == 3)
1478 printf (" ");
1479 }
1480
1481 printf (" ");
1482 for (j = i; j < i + onaline; j++)
1483 {
1484 if (j >= stop)
1485 printf (" ");
1486 else
1487 printf ("%c", isprint (data[j]) ? data[j] : '.');
1488 }
1489 putchar ('\n');
1490 }
1491 free (data);
1492 }
1493 }
1494 }
1495 }
1496
1497 /* Should perhaps share code and display with nm? */
1498 static void
1499 dump_symbols (abfd, dynamic)
1500 bfd *abfd;
1501 boolean dynamic;
1502 {
1503 asymbol **current;
1504 long max;
1505 long count;
1506
1507 if (dynamic)
1508 {
1509 current = dynsyms;
1510 max = dynsymcount;
1511 if (max == 0)
1512 return;
1513 printf ("DYNAMIC SYMBOL TABLE:\n");
1514 }
1515 else
1516 {
1517 current = syms;
1518 max = symcount;
1519 if (max == 0)
1520 return;
1521 printf ("SYMBOL TABLE:\n");
1522 }
1523
1524 for (count = 0; count < max; count++)
1525 {
1526 if (*current)
1527 {
1528 bfd *cur_bfd = bfd_asymbol_bfd(*current);
1529 if (cur_bfd)
1530 {
1531 bfd_print_symbol (cur_bfd,
1532 stdout,
1533 *current, bfd_print_symbol_all);
1534 printf ("\n");
1535 }
1536 }
1537 current++;
1538 }
1539 printf ("\n");
1540 printf ("\n");
1541 }
1542
1543 static void
1544 dump_relocs (abfd)
1545 bfd *abfd;
1546 {
1547 arelent **relpp;
1548 long relcount;
1549 asection *a;
1550
1551 for (a = abfd->sections; a != (asection *) NULL; a = a->next)
1552 {
1553 long relsize;
1554
1555 if (bfd_is_abs_section (a))
1556 continue;
1557 if (bfd_is_und_section (a))
1558 continue;
1559 if (bfd_is_com_section (a))
1560 continue;
1561
1562 if (only)
1563 {
1564 if (strcmp (only, a->name))
1565 continue;
1566 }
1567 else if ((a->flags & SEC_RELOC) == 0)
1568 continue;
1569
1570 relsize = bfd_get_reloc_upper_bound (abfd, a);
1571 if (relsize < 0)
1572 bfd_fatal (bfd_get_filename (abfd));
1573
1574 printf ("RELOCATION RECORDS FOR [%s]:", a->name);
1575
1576 if (relsize == 0)
1577 {
1578 printf (" (none)\n\n");
1579 }
1580 else
1581 {
1582 relpp = (arelent **) xmalloc (relsize);
1583 relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
1584 if (relcount < 0)
1585 bfd_fatal (bfd_get_filename (abfd));
1586 else if (relcount == 0)
1587 {
1588 printf (" (none)\n\n");
1589 }
1590 else
1591 {
1592 printf ("\n");
1593 dump_reloc_set (abfd, relpp, relcount);
1594 printf ("\n\n");
1595 }
1596 free (relpp);
1597 }
1598 }
1599 }
1600
1601 static void
1602 dump_dynamic_relocs (abfd)
1603 bfd *abfd;
1604 {
1605 long relsize;
1606 arelent **relpp;
1607 long relcount;
1608
1609 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
1610 if (relsize < 0)
1611 bfd_fatal (bfd_get_filename (abfd));
1612
1613 printf ("DYNAMIC RELOCATION RECORDS");
1614
1615 if (relsize == 0)
1616 {
1617 printf (" (none)\n\n");
1618 }
1619 else
1620 {
1621 relpp = (arelent **) xmalloc (relsize);
1622 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
1623 if (relcount < 0)
1624 bfd_fatal (bfd_get_filename (abfd));
1625 else if (relcount == 0)
1626 {
1627 printf (" (none)\n\n");
1628 }
1629 else
1630 {
1631 printf ("\n");
1632 dump_reloc_set (abfd, relpp, relcount);
1633 printf ("\n\n");
1634 }
1635 free (relpp);
1636 }
1637 }
1638
1639 static void
1640 dump_reloc_set (abfd, relpp, relcount)
1641 bfd *abfd;
1642 arelent **relpp;
1643 long relcount;
1644 {
1645 arelent **p;
1646
1647 /* Get column headers lined up reasonably. */
1648 {
1649 static int width;
1650 if (width == 0)
1651 {
1652 char buf[30];
1653 sprintf_vma (buf, (bfd_vma) -1);
1654 width = strlen (buf) - 7;
1655 }
1656 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
1657 }
1658
1659 for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
1660 {
1661 arelent *q = *p;
1662 CONST char *sym_name;
1663 CONST char *section_name;
1664
1665 if (start_address != (bfd_vma) -1
1666 && q->address < start_address)
1667 continue;
1668 if (stop_address != (bfd_vma) -1
1669 && q->address > stop_address)
1670 continue;
1671
1672 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
1673 {
1674 sym_name = (*(q->sym_ptr_ptr))->name;
1675 section_name = (*(q->sym_ptr_ptr))->section->name;
1676 }
1677 else
1678 {
1679 sym_name = NULL;
1680 section_name = NULL;
1681 }
1682 if (sym_name)
1683 {
1684 printf_vma (q->address);
1685 printf (" %-16s %s",
1686 q->howto->name,
1687 sym_name);
1688 }
1689 else
1690 {
1691 if (section_name == (CONST char *) NULL)
1692 section_name = "*unknown*";
1693 printf_vma (q->address);
1694 printf (" %-16s [%s]",
1695 q->howto->name,
1696 section_name);
1697 }
1698 if (q->addend)
1699 {
1700 printf ("+0x");
1701 printf_vma (q->addend);
1702 }
1703 printf ("\n");
1704 }
1705 }
1706 \f
1707 /* The length of the longest architecture name + 1. */
1708 #define LONGEST_ARCH sizeof("rs6000:6000")
1709
1710 #ifndef L_tmpnam
1711 #define L_tmpnam 25
1712 #endif
1713
1714 static const char *
1715 endian_string (endian)
1716 enum bfd_endian endian;
1717 {
1718 if (endian == BFD_ENDIAN_BIG)
1719 return "big endian";
1720 else if (endian == BFD_ENDIAN_LITTLE)
1721 return "little endian";
1722 else
1723 return "endianness unknown";
1724 }
1725
1726 /* List the targets that BFD is configured to support, each followed
1727 by its endianness and the architectures it supports. */
1728
1729 static void
1730 display_target_list ()
1731 {
1732 extern char *tmpnam ();
1733 extern bfd_target *bfd_target_vector[];
1734 char tmparg[L_tmpnam];
1735 char *dummy_name;
1736 int t;
1737
1738 dummy_name = tmpnam (tmparg);
1739 for (t = 0; bfd_target_vector[t]; t++)
1740 {
1741 bfd_target *p = bfd_target_vector[t];
1742 bfd *abfd = bfd_openw (dummy_name, p->name);
1743 int a;
1744
1745 printf ("%s\n (header %s, data %s)\n", p->name,
1746 endian_string (p->header_byteorder),
1747 endian_string (p->byteorder));
1748
1749 if (abfd == NULL)
1750 {
1751 bfd_nonfatal (dummy_name);
1752 continue;
1753 }
1754
1755 if (! bfd_set_format (abfd, bfd_object))
1756 {
1757 if (bfd_get_error () != bfd_error_invalid_operation)
1758 bfd_nonfatal (p->name);
1759 continue;
1760 }
1761
1762 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
1763 if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
1764 printf (" %s\n",
1765 bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
1766 }
1767 unlink (dummy_name);
1768 }
1769
1770 /* Print a table showing which architectures are supported for entries
1771 FIRST through LAST-1 of bfd_target_vector (targets across,
1772 architectures down). */
1773
1774 static void
1775 display_info_table (first, last)
1776 int first;
1777 int last;
1778 {
1779 extern bfd_target *bfd_target_vector[];
1780 extern char *tmpnam ();
1781 char tmparg[L_tmpnam];
1782 int t, a;
1783 char *dummy_name;
1784
1785 /* Print heading of target names. */
1786 printf ("\n%*s", (int) LONGEST_ARCH, " ");
1787 for (t = first; t < last && bfd_target_vector[t]; t++)
1788 printf ("%s ", bfd_target_vector[t]->name);
1789 putchar ('\n');
1790
1791 dummy_name = tmpnam (tmparg);
1792 for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
1793 if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
1794 {
1795 printf ("%*s ", (int) LONGEST_ARCH - 1,
1796 bfd_printable_arch_mach (a, 0));
1797 for (t = first; t < last && bfd_target_vector[t]; t++)
1798 {
1799 bfd_target *p = bfd_target_vector[t];
1800 boolean ok = true;
1801 bfd *abfd = bfd_openw (dummy_name, p->name);
1802
1803 if (abfd == NULL)
1804 {
1805 bfd_nonfatal (p->name);
1806 ok = false;
1807 }
1808
1809 if (ok)
1810 {
1811 if (! bfd_set_format (abfd, bfd_object))
1812 {
1813 if (bfd_get_error () != bfd_error_invalid_operation)
1814 bfd_nonfatal (p->name);
1815 ok = false;
1816 }
1817 }
1818
1819 if (ok)
1820 {
1821 if (! bfd_set_arch_mach (abfd, a, 0))
1822 ok = false;
1823 }
1824
1825 if (ok)
1826 printf ("%s ", p->name);
1827 else
1828 {
1829 int l = strlen (p->name);
1830 while (l--)
1831 putchar ('-');
1832 putchar (' ');
1833 }
1834 }
1835 putchar ('\n');
1836 }
1837 unlink (dummy_name);
1838 }
1839
1840 /* Print tables of all the target-architecture combinations that
1841 BFD has been configured to support. */
1842
1843 static void
1844 display_target_tables ()
1845 {
1846 int t, columns;
1847 extern bfd_target *bfd_target_vector[];
1848 char *colum;
1849 extern char *getenv ();
1850
1851 columns = 0;
1852 colum = getenv ("COLUMNS");
1853 if (colum != NULL)
1854 columns = atoi (colum);
1855 if (columns == 0)
1856 columns = 80;
1857
1858 t = 0;
1859 while (bfd_target_vector[t] != NULL)
1860 {
1861 int oldt = t, wid;
1862
1863 wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
1864 ++t;
1865 while (wid < columns && bfd_target_vector[t] != NULL)
1866 {
1867 int newwid;
1868
1869 newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
1870 if (newwid >= columns)
1871 break;
1872 wid = newwid;
1873 ++t;
1874 }
1875 display_info_table (oldt, t);
1876 }
1877 }
1878
1879 static void
1880 display_info ()
1881 {
1882 printf ("BFD header file version %s\n", BFD_VERSION);
1883 display_target_list ();
1884 display_target_tables ();
1885 }
1886
1887 int
1888 main (argc, argv)
1889 int argc;
1890 char **argv;
1891 {
1892 int c;
1893 char *target = default_target;
1894 boolean seenflag = false;
1895
1896 program_name = *argv;
1897 xmalloc_set_program_name (program_name);
1898
1899 START_PROGRESS (program_name, 0);
1900
1901 bfd_init ();
1902
1903 while ((c = getopt_long (argc, argv, "pib:m:VdDlfahrRtTxsSj:w", long_options,
1904 (int *) 0))
1905 != EOF)
1906 {
1907 if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
1908 seenflag = true;
1909 switch (c)
1910 {
1911 case 0:
1912 break; /* we've been given a long option */
1913 case 'm':
1914 machine = optarg;
1915 break;
1916 case 'j':
1917 only = optarg;
1918 break;
1919 case 'l':
1920 with_line_numbers = 1;
1921 break;
1922 case 'b':
1923 target = optarg;
1924 break;
1925 case 'f':
1926 dump_file_header = true;
1927 break;
1928 case 'i':
1929 formats_info = true;
1930 break;
1931 case 'p':
1932 dump_private_headers = 1;
1933 break;
1934 case 'x':
1935 dump_private_headers = 1;
1936 dump_symtab = 1;
1937 dump_reloc_info = 1;
1938 dump_file_header = true;
1939 dump_ar_hdrs = 1;
1940 dump_section_headers = 1;
1941 break;
1942 case 't':
1943 dump_symtab = 1;
1944 break;
1945 case 'T':
1946 dump_dynamic_symtab = 1;
1947 break;
1948 case 'd':
1949 disassemble = true;
1950 break;
1951 case 'D':
1952 disassemble = disassemble_all = true;
1953 break;
1954 case 'S':
1955 disassemble = true;
1956 with_source_code = true;
1957 break;
1958 case 's':
1959 dump_section_contents = 1;
1960 break;
1961 case 'r':
1962 dump_reloc_info = 1;
1963 break;
1964 case 'R':
1965 dump_dynamic_reloc_info = 1;
1966 break;
1967 case 'a':
1968 dump_ar_hdrs = 1;
1969 break;
1970 case 'h':
1971 dump_section_headers = 1;
1972 break;
1973 case 'H':
1974 usage (stdout, 0);
1975 case 'V':
1976 show_version = 1;
1977 break;
1978 case 'w':
1979 wide_output = 1;
1980 break;
1981 case OPTION_START_ADDRESS:
1982 start_address = parse_vma (optarg, "--start-address");
1983 break;
1984 case OPTION_STOP_ADDRESS:
1985 stop_address = parse_vma (optarg, "--stop-address");
1986 break;
1987 default:
1988 usage (stderr, 1);
1989 }
1990 }
1991
1992 if (show_version)
1993 {
1994 printf ("GNU %s version %s\n", program_name, program_version);
1995 exit (0);
1996 }
1997
1998 if (seenflag == false)
1999 usage (stderr, 1);
2000
2001 if (formats_info)
2002 {
2003 display_info ();
2004 }
2005 else
2006 {
2007 if (optind == argc)
2008 display_file ("a.out", target);
2009 else
2010 for (; optind < argc;)
2011 display_file (argv[optind++], target);
2012 }
2013
2014 END_PROGRESS (program_name);
2015
2016 return 0;
2017 }