Index: opcodes/ChangeLog
[deliverable/binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 /* Objdump overview.
23
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
28
29 The flow of execution is as follows:
30
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
33
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
37
38 3. The file's target architecture and binary file format are determnined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
40 called.
41
42 4. dump_bfd() in turn calls seperate functions to display the requested
43 item(s) of infomation(s). For example dissasemble_data() is called if
44 a disassmebly has been requested.
45
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling dissassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
50
51 #include "bfd.h"
52 #include "bfdver.h"
53 #include "progress.h"
54 #include "bucomm.h"
55 #include "budemang.h"
56 #include "getopt.h"
57 #include "safe-ctype.h"
58 #include "dis-asm.h"
59 #include "libiberty.h"
60 #include "demangle.h"
61 #include "debug.h"
62 #include "budbg.h"
63
64 /* Internal headers for the ELF .stab-dump code - sorry. */
65 #define BYTES_IN_WORD 32
66 #include "aout/aout64.h"
67
68 #ifdef NEED_DECLARATION_FPRINTF
69 /* This is needed by init_disassemble_info(). */
70 extern int fprintf (FILE *, const char *, ...);
71 #endif
72
73 /* Exit status. */
74 static int exit_status = 0;
75
76 static char *default_target = NULL; /* Default at runtime. */
77
78 /* The following variables are set based on arguments passed on command line. */
79 static int show_version = 0; /* Show the version number. */
80 static int dump_section_contents; /* -s */
81 static int dump_section_headers; /* -h */
82 static bfd_boolean dump_file_header; /* -f */
83 static int dump_symtab; /* -t */
84 static int dump_dynamic_symtab; /* -T */
85 static int dump_reloc_info; /* -r */
86 static int dump_dynamic_reloc_info; /* -R */
87 static int dump_ar_hdrs; /* -a */
88 static int dump_private_headers; /* -p */
89 static int prefix_addresses; /* --prefix-addresses */
90 static int with_line_numbers; /* -l */
91 static bfd_boolean with_source_code; /* -S */
92 static int show_raw_insn; /* --show-raw-insn */
93 static int dump_stab_section_info; /* --stabs */
94 static int do_demangle; /* -C, --demangle */
95 static bfd_boolean disassemble; /* -d */
96 static bfd_boolean disassemble_all; /* -D */
97 static int disassemble_zeroes; /* --disassemble-zeroes */
98 static bfd_boolean formats_info; /* -i */
99 static int wide_output; /* -w */
100 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
101 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
102 static int dump_debugging; /* --debugging */
103 static int dump_debugging_tags; /* --debugging-tags */
104 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
105 static int file_start_context = 0; /* --file-start-context */
106
107 /* Pointer to an array of section names provided by
108 one or more "-j secname" command line options. */
109 static char **only;
110 /* The total number of slots in the only[] array. */
111 static size_t only_size = 0;
112 /* The number of occupied slots in the only[] array. */
113 static size_t only_used = 0;
114
115 /* Variables for handling include file path table. */
116 static const char **include_paths;
117 static int include_path_count;
118
119 /* Extra info to pass to the section disassembler and address printing function. */
120 struct objdump_disasm_info
121 {
122 bfd * abfd;
123 asection * sec;
124 bfd_boolean require_sec;
125 arelent ** dynrelbuf;
126 long dynrelcount;
127 disassembler_ftype disassemble_fn;
128 };
129
130 /* Architecture to disassemble for, or default if NULL. */
131 static char *machine = NULL;
132
133 /* Target specific options to the disassembler. */
134 static char *disassembler_options = NULL;
135
136 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
137 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
138
139 /* The symbol table. */
140 static asymbol **syms;
141
142 /* Number of symbols in `syms'. */
143 static long symcount = 0;
144
145 /* The sorted symbol table. */
146 static asymbol **sorted_syms;
147
148 /* Number of symbols in `sorted_syms'. */
149 static long sorted_symcount = 0;
150
151 /* The dynamic symbol table. */
152 static asymbol **dynsyms;
153
154 /* Number of symbols in `dynsyms'. */
155 static long dynsymcount = 0;
156
157 static bfd_byte *stabs;
158 static bfd_size_type stab_size;
159
160 static char *strtab;
161 static bfd_size_type stabstr_size;
162 \f
163 static void
164 usage (FILE *stream, int status)
165 {
166 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
167 fprintf (stream, _(" Display information from object <file(s)>.\n"));
168 fprintf (stream, _(" At least one of the following switches must be given:\n"));
169 fprintf (stream, _("\
170 -a, --archive-headers Display archive header information\n\
171 -f, --file-headers Display the contents of the overall file header\n\
172 -p, --private-headers Display object format specific file header contents\n\
173 -h, --[section-]headers Display the contents of the section headers\n\
174 -x, --all-headers Display the contents of all headers\n\
175 -d, --disassemble Display assembler contents of executable sections\n\
176 -D, --disassemble-all Display assembler contents of all sections\n\
177 -S, --source Intermix source code with disassembly\n\
178 -s, --full-contents Display the full contents of all sections requested\n\
179 -g, --debugging Display debug information in object file\n\
180 -e, --debugging-tags Display debug information using ctags style\n\
181 -G, --stabs Display (in raw form) any STABS info in the file\n\
182 -t, --syms Display the contents of the symbol table(s)\n\
183 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
184 -r, --reloc Display the relocation entries in the file\n\
185 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
186 -v, --version Display this program's version number\n\
187 -i, --info List object formats and architectures supported\n\
188 -H, --help Display this information\n\
189 "));
190 if (status != 2)
191 {
192 fprintf (stream, _("\n The following switches are optional:\n"));
193 fprintf (stream, _("\
194 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
195 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
196 -j, --section=NAME Only display information for section NAME\n\
197 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
198 -EB --endian=big Assume big endian format when disassembling\n\
199 -EL --endian=little Assume little endian format when disassembling\n\
200 --file-start-context Include context from start of file (with -S)\n\
201 -I, --include=DIR Add DIR to search list for source files\n\
202 -l, --line-numbers Include line numbers and filenames in output\n\
203 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
204 The STYLE, if specified, can be `auto', `gnu',\n\
205 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
206 or `gnat'\n\
207 -w, --wide Format output for more than 80 columns\n\
208 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
209 --start-address=ADDR Only process data whose address is >= ADDR\n\
210 --stop-address=ADDR Only process data whose address is <= ADDR\n\
211 --prefix-addresses Print complete address alongside disassembly\n\
212 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
213 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
214 \n"));
215 list_supported_targets (program_name, stream);
216 list_supported_architectures (program_name, stream);
217
218 disassembler_usage (stream);
219 }
220 if (status == 0)
221 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
222 exit (status);
223 }
224
225 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
226 enum option_values
227 {
228 OPTION_ENDIAN=150,
229 OPTION_START_ADDRESS,
230 OPTION_STOP_ADDRESS,
231 OPTION_ADJUST_VMA
232 };
233
234 static struct option long_options[]=
235 {
236 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
237 {"all-headers", no_argument, NULL, 'x'},
238 {"private-headers", no_argument, NULL, 'p'},
239 {"architecture", required_argument, NULL, 'm'},
240 {"archive-headers", no_argument, NULL, 'a'},
241 {"debugging", no_argument, NULL, 'g'},
242 {"debugging-tags", no_argument, NULL, 'e'},
243 {"demangle", optional_argument, NULL, 'C'},
244 {"disassemble", no_argument, NULL, 'd'},
245 {"disassemble-all", no_argument, NULL, 'D'},
246 {"disassembler-options", required_argument, NULL, 'M'},
247 {"disassemble-zeroes", no_argument, NULL, 'z'},
248 {"dynamic-reloc", no_argument, NULL, 'R'},
249 {"dynamic-syms", no_argument, NULL, 'T'},
250 {"endian", required_argument, NULL, OPTION_ENDIAN},
251 {"file-headers", no_argument, NULL, 'f'},
252 {"file-start-context", no_argument, &file_start_context, 1},
253 {"full-contents", no_argument, NULL, 's'},
254 {"headers", no_argument, NULL, 'h'},
255 {"help", no_argument, NULL, 'H'},
256 {"info", no_argument, NULL, 'i'},
257 {"line-numbers", no_argument, NULL, 'l'},
258 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
259 {"prefix-addresses", no_argument, &prefix_addresses, 1},
260 {"reloc", no_argument, NULL, 'r'},
261 {"section", required_argument, NULL, 'j'},
262 {"section-headers", no_argument, NULL, 'h'},
263 {"show-raw-insn", no_argument, &show_raw_insn, 1},
264 {"source", no_argument, NULL, 'S'},
265 {"include", required_argument, NULL, 'I'},
266 {"stabs", no_argument, NULL, 'G'},
267 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
268 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
269 {"syms", no_argument, NULL, 't'},
270 {"target", required_argument, NULL, 'b'},
271 {"version", no_argument, NULL, 'V'},
272 {"wide", no_argument, NULL, 'w'},
273 {0, no_argument, 0, 0}
274 };
275 \f
276 static void
277 nonfatal (const char *msg)
278 {
279 bfd_nonfatal (msg);
280 exit_status = 1;
281 }
282 \f
283 static void
284 dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, asection *section,
285 void *ignored ATTRIBUTE_UNUSED)
286 {
287 char *comma = "";
288 unsigned int opb = bfd_octets_per_byte (abfd);
289
290 printf ("%3d %-13s %08lx ", section->index,
291 bfd_get_section_name (abfd, section),
292 (unsigned long) bfd_section_size (abfd, section) / opb);
293 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
294 printf (" ");
295 bfd_printf_vma (abfd, section->lma);
296 printf (" %08lx 2**%u", (unsigned long) section->filepos,
297 bfd_get_section_alignment (abfd, section));
298 if (! wide_output)
299 printf ("\n ");
300 printf (" ");
301
302 #define PF(x, y) \
303 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
304
305 PF (SEC_HAS_CONTENTS, "CONTENTS");
306 PF (SEC_ALLOC, "ALLOC");
307 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
308 PF (SEC_LOAD, "LOAD");
309 PF (SEC_RELOC, "RELOC");
310 PF (SEC_READONLY, "READONLY");
311 PF (SEC_CODE, "CODE");
312 PF (SEC_DATA, "DATA");
313 PF (SEC_ROM, "ROM");
314 PF (SEC_DEBUGGING, "DEBUGGING");
315 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
316 PF (SEC_EXCLUDE, "EXCLUDE");
317 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
318 PF (SEC_BLOCK, "BLOCK");
319 PF (SEC_CLINK, "CLINK");
320 PF (SEC_SMALL_DATA, "SMALL_DATA");
321 PF (SEC_SHARED, "SHARED");
322 PF (SEC_ARCH_BIT_0, "ARCH_BIT_0");
323 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
324
325 if ((section->flags & SEC_LINK_ONCE) != 0)
326 {
327 const char *ls;
328
329 switch (section->flags & SEC_LINK_DUPLICATES)
330 {
331 default:
332 abort ();
333 case SEC_LINK_DUPLICATES_DISCARD:
334 ls = "LINK_ONCE_DISCARD";
335 break;
336 case SEC_LINK_DUPLICATES_ONE_ONLY:
337 ls = "LINK_ONCE_ONE_ONLY";
338 break;
339 case SEC_LINK_DUPLICATES_SAME_SIZE:
340 ls = "LINK_ONCE_SAME_SIZE";
341 break;
342 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
343 ls = "LINK_ONCE_SAME_CONTENTS";
344 break;
345 }
346 printf ("%s%s", comma, ls);
347
348 if (section->comdat != NULL)
349 printf (" (COMDAT %s %ld)", section->comdat->name,
350 section->comdat->symbol);
351
352 comma = ", ";
353 }
354
355 printf ("\n");
356 #undef PF
357 }
358
359 static void
360 dump_headers (bfd *abfd)
361 {
362 printf (_("Sections:\n"));
363
364 #ifndef BFD64
365 printf (_("Idx Name Size VMA LMA File off Algn"));
366 #else
367 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
368 if (bfd_get_arch_size (abfd) == 32)
369 printf (_("Idx Name Size VMA LMA File off Algn"));
370 else
371 printf (_("Idx Name Size VMA LMA File off Algn"));
372 #endif
373
374 if (wide_output)
375 printf (_(" Flags"));
376 if (abfd->flags & HAS_LOAD_PAGE)
377 printf (_(" Pg"));
378 printf ("\n");
379
380 bfd_map_over_sections (abfd, dump_section_header, NULL);
381 }
382 \f
383 static asymbol **
384 slurp_symtab (bfd *abfd)
385 {
386 asymbol **sy = NULL;
387 long storage;
388
389 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
390 {
391 symcount = 0;
392 return NULL;
393 }
394
395 storage = bfd_get_symtab_upper_bound (abfd);
396 if (storage < 0)
397 bfd_fatal (bfd_get_filename (abfd));
398 if (storage)
399 sy = xmalloc (storage);
400
401 symcount = bfd_canonicalize_symtab (abfd, sy);
402 if (symcount < 0)
403 bfd_fatal (bfd_get_filename (abfd));
404 return sy;
405 }
406
407 /* Read in the dynamic symbols. */
408
409 static asymbol **
410 slurp_dynamic_symtab (bfd *abfd)
411 {
412 asymbol **sy = NULL;
413 long storage;
414
415 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
416 if (storage < 0)
417 {
418 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
419 {
420 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
421 dynsymcount = 0;
422 return NULL;
423 }
424
425 bfd_fatal (bfd_get_filename (abfd));
426 }
427 if (storage)
428 sy = xmalloc (storage);
429
430 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
431 if (dynsymcount < 0)
432 bfd_fatal (bfd_get_filename (abfd));
433 return sy;
434 }
435
436 /* Filter out (in place) symbols that are useless for disassembly.
437 COUNT is the number of elements in SYMBOLS.
438 Return the number of useful symbols. */
439
440 static long
441 remove_useless_symbols (asymbol **symbols, long count)
442 {
443 asymbol **in_ptr = symbols, **out_ptr = symbols;
444
445 while (--count >= 0)
446 {
447 asymbol *sym = *in_ptr++;
448
449 if (sym->name == NULL || sym->name[0] == '\0')
450 continue;
451 if (sym->flags & (BSF_DEBUGGING))
452 continue;
453 if (bfd_is_und_section (sym->section)
454 || bfd_is_com_section (sym->section))
455 continue;
456
457 *out_ptr++ = sym;
458 }
459 return out_ptr - symbols;
460 }
461
462 /* Sort symbols into value order. */
463
464 static int
465 compare_symbols (const void *ap, const void *bp)
466 {
467 const asymbol *a = * (const asymbol **) ap;
468 const asymbol *b = * (const asymbol **) bp;
469 const char *an;
470 const char *bn;
471 size_t anl;
472 size_t bnl;
473 bfd_boolean af;
474 bfd_boolean bf;
475 flagword aflags;
476 flagword bflags;
477
478 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
479 return 1;
480 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
481 return -1;
482
483 if (a->section > b->section)
484 return 1;
485 else if (a->section < b->section)
486 return -1;
487
488 an = bfd_asymbol_name (a);
489 bn = bfd_asymbol_name (b);
490 anl = strlen (an);
491 bnl = strlen (bn);
492
493 /* The symbols gnu_compiled and gcc2_compiled convey no real
494 information, so put them after other symbols with the same value. */
495 af = (strstr (an, "gnu_compiled") != NULL
496 || strstr (an, "gcc2_compiled") != NULL);
497 bf = (strstr (bn, "gnu_compiled") != NULL
498 || strstr (bn, "gcc2_compiled") != NULL);
499
500 if (af && ! bf)
501 return 1;
502 if (! af && bf)
503 return -1;
504
505 /* We use a heuristic for the file name, to try to sort it after
506 more useful symbols. It may not work on non Unix systems, but it
507 doesn't really matter; the only difference is precisely which
508 symbol names get printed. */
509
510 #define file_symbol(s, sn, snl) \
511 (((s)->flags & BSF_FILE) != 0 \
512 || ((sn)[(snl) - 2] == '.' \
513 && ((sn)[(snl) - 1] == 'o' \
514 || (sn)[(snl) - 1] == 'a')))
515
516 af = file_symbol (a, an, anl);
517 bf = file_symbol (b, bn, bnl);
518
519 if (af && ! bf)
520 return 1;
521 if (! af && bf)
522 return -1;
523
524 /* Try to sort global symbols before local symbols before function
525 symbols before debugging symbols. */
526
527 aflags = a->flags;
528 bflags = b->flags;
529
530 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
531 {
532 if ((aflags & BSF_DEBUGGING) != 0)
533 return 1;
534 else
535 return -1;
536 }
537 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
538 {
539 if ((aflags & BSF_FUNCTION) != 0)
540 return -1;
541 else
542 return 1;
543 }
544 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
545 {
546 if ((aflags & BSF_LOCAL) != 0)
547 return 1;
548 else
549 return -1;
550 }
551 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
552 {
553 if ((aflags & BSF_GLOBAL) != 0)
554 return -1;
555 else
556 return 1;
557 }
558
559 /* Symbols that start with '.' might be section names, so sort them
560 after symbols that don't start with '.'. */
561 if (an[0] == '.' && bn[0] != '.')
562 return 1;
563 if (an[0] != '.' && bn[0] == '.')
564 return -1;
565
566 /* Finally, if we can't distinguish them in any other way, try to
567 get consistent results by sorting the symbols by name. */
568 return strcmp (an, bn);
569 }
570
571 /* Sort relocs into address order. */
572
573 static int
574 compare_relocs (const void *ap, const void *bp)
575 {
576 const arelent *a = * (const arelent **) ap;
577 const arelent *b = * (const arelent **) bp;
578
579 if (a->address > b->address)
580 return 1;
581 else if (a->address < b->address)
582 return -1;
583
584 /* So that associated relocations tied to the same address show up
585 in the correct order, we don't do any further sorting. */
586 if (a > b)
587 return 1;
588 else if (a < b)
589 return -1;
590 else
591 return 0;
592 }
593
594 /* Print an address (VMA) to the output stream in INFO.
595 If SKIP_ZEROES is TRUE, omit leading zeroes. */
596
597 static void
598 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
599 bfd_boolean skip_zeroes)
600 {
601 char buf[30];
602 char *p;
603 struct objdump_disasm_info *aux
604 = (struct objdump_disasm_info *) info->application_data;
605
606 bfd_sprintf_vma (aux->abfd, buf, vma);
607 if (! skip_zeroes)
608 p = buf;
609 else
610 {
611 for (p = buf; *p == '0'; ++p)
612 ;
613 if (*p == '\0')
614 --p;
615 }
616 (*info->fprintf_func) (info->stream, "%s", p);
617 }
618
619 /* Print the name of a symbol. */
620
621 static void
622 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
623 asymbol *sym)
624 {
625 char *alloc;
626 const char *name;
627
628 alloc = NULL;
629 name = bfd_asymbol_name (sym);
630 if (do_demangle && name[0] != '\0')
631 {
632 /* Demangle the name. */
633 alloc = demangle (abfd, name);
634 name = alloc;
635 }
636
637 if (info != NULL)
638 (*info->fprintf_func) (info->stream, "%s", name);
639 else
640 printf ("%s", name);
641
642 if (alloc != NULL)
643 free (alloc);
644 }
645
646 /* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC
647 is TRUE, then always require the symbol to be in the section. This
648 returns NULL if there is no suitable symbol. If PLACE is not NULL,
649 then *PLACE is set to the index of the symbol in sorted_syms. */
650
651 static asymbol *
652 find_symbol_for_address (bfd *abfd, asection *sec, bfd_vma vma,
653 bfd_boolean require_sec, long *place)
654 {
655 /* @@ Would it speed things up to cache the last two symbols returned,
656 and maybe their address ranges? For many processors, only one memory
657 operand can be present at a time, so the 2-entry cache wouldn't be
658 constantly churned by code doing heavy memory accesses. */
659
660 /* Indices in `sorted_syms'. */
661 long min = 0;
662 long max = sorted_symcount;
663 long thisplace;
664 unsigned int opb = bfd_octets_per_byte (abfd);
665
666 if (sorted_symcount < 1)
667 return NULL;
668
669 /* Perform a binary search looking for the closest symbol to the
670 required value. We are searching the range (min, max]. */
671 while (min + 1 < max)
672 {
673 asymbol *sym;
674
675 thisplace = (max + min) / 2;
676 sym = sorted_syms[thisplace];
677
678 if (bfd_asymbol_value (sym) > vma)
679 max = thisplace;
680 else if (bfd_asymbol_value (sym) < vma)
681 min = thisplace;
682 else
683 {
684 min = thisplace;
685 break;
686 }
687 }
688
689 /* The symbol we want is now in min, the low end of the range we
690 were searching. If there are several symbols with the same
691 value, we want the first one. */
692 thisplace = min;
693 while (thisplace > 0
694 && (bfd_asymbol_value (sorted_syms[thisplace])
695 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
696 --thisplace;
697
698 /* If the file is relocatable, and the symbol could be from this
699 section, prefer a symbol from this section over symbols from
700 others, even if the other symbol's value might be closer.
701
702 Note that this may be wrong for some symbol references if the
703 sections have overlapping memory ranges, but in that case there's
704 no way to tell what's desired without looking at the relocation
705 table. */
706 if (sorted_syms[thisplace]->section != sec
707 && (require_sec
708 || ((abfd->flags & HAS_RELOC) != 0
709 && vma >= bfd_get_section_vma (abfd, sec)
710 && vma < (bfd_get_section_vma (abfd, sec)
711 + bfd_section_size (abfd, sec) / opb))))
712 {
713 long i;
714
715 for (i = thisplace + 1; i < sorted_symcount; i++)
716 {
717 if (bfd_asymbol_value (sorted_syms[i])
718 != bfd_asymbol_value (sorted_syms[thisplace]))
719 break;
720 }
721
722 --i;
723
724 for (; i >= 0; i--)
725 {
726 if (sorted_syms[i]->section == sec
727 && (i == 0
728 || sorted_syms[i - 1]->section != sec
729 || (bfd_asymbol_value (sorted_syms[i])
730 != bfd_asymbol_value (sorted_syms[i - 1]))))
731 {
732 thisplace = i;
733 break;
734 }
735 }
736
737 if (sorted_syms[thisplace]->section != sec)
738 {
739 /* We didn't find a good symbol with a smaller value.
740 Look for one with a larger value. */
741 for (i = thisplace + 1; i < sorted_symcount; i++)
742 {
743 if (sorted_syms[i]->section == sec)
744 {
745 thisplace = i;
746 break;
747 }
748 }
749 }
750
751 if (sorted_syms[thisplace]->section != sec
752 && (require_sec
753 || ((abfd->flags & HAS_RELOC) != 0
754 && vma >= bfd_get_section_vma (abfd, sec)
755 && vma < (bfd_get_section_vma (abfd, sec)
756 + bfd_section_size (abfd, sec)))))
757 {
758 /* There is no suitable symbol. */
759 return NULL;
760 }
761 }
762
763 if (place != NULL)
764 *place = thisplace;
765
766 return sorted_syms[thisplace];
767 }
768
769 /* Print an address and the offset to the nearest symbol. */
770
771 static void
772 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
773 bfd_vma vma, struct disassemble_info *info,
774 bfd_boolean skip_zeroes)
775 {
776 objdump_print_value (vma, info, skip_zeroes);
777
778 if (sym == NULL)
779 {
780 bfd_vma secaddr;
781
782 (*info->fprintf_func) (info->stream, " <%s",
783 bfd_get_section_name (abfd, sec));
784 secaddr = bfd_get_section_vma (abfd, sec);
785 if (vma < secaddr)
786 {
787 (*info->fprintf_func) (info->stream, "-0x");
788 objdump_print_value (secaddr - vma, info, TRUE);
789 }
790 else if (vma > secaddr)
791 {
792 (*info->fprintf_func) (info->stream, "+0x");
793 objdump_print_value (vma - secaddr, info, TRUE);
794 }
795 (*info->fprintf_func) (info->stream, ">");
796 }
797 else
798 {
799 (*info->fprintf_func) (info->stream, " <");
800 objdump_print_symname (abfd, info, sym);
801 if (bfd_asymbol_value (sym) > vma)
802 {
803 (*info->fprintf_func) (info->stream, "-0x");
804 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
805 }
806 else if (vma > bfd_asymbol_value (sym))
807 {
808 (*info->fprintf_func) (info->stream, "+0x");
809 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
810 }
811 (*info->fprintf_func) (info->stream, ">");
812 }
813 }
814
815 /* Print an address (VMA), symbolically if possible.
816 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
817
818 static void
819 objdump_print_addr (bfd_vma vma, struct disassemble_info *info,
820 bfd_boolean skip_zeroes)
821 {
822 struct objdump_disasm_info *aux;
823 asymbol *sym;
824
825 if (sorted_symcount < 1)
826 {
827 (*info->fprintf_func) (info->stream, "0x");
828 objdump_print_value (vma, info, skip_zeroes);
829 return;
830 }
831
832 aux = (struct objdump_disasm_info *) info->application_data;
833 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
834 NULL);
835 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
836 skip_zeroes);
837 }
838
839 /* Print VMA to INFO. This function is passed to the disassembler
840 routine. */
841
842 static void
843 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
844 {
845 objdump_print_addr (vma, info, ! prefix_addresses);
846 }
847
848 /* Determine of the given address has a symbol associated with it. */
849
850 static int
851 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
852 {
853 struct objdump_disasm_info * aux;
854 asymbol * sym;
855
856 /* No symbols - do not bother checking. */
857 if (sorted_symcount < 1)
858 return 0;
859
860 aux = (struct objdump_disasm_info *) info->application_data;
861 sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
862 NULL);
863
864 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
865 }
866
867 /* Hold the last function name and the last line number we displayed
868 in a disassembly. */
869
870 static char *prev_functionname;
871 static unsigned int prev_line;
872
873 /* We keep a list of all files that we have seen when doing a
874 dissassembly with source, so that we know how much of the file to
875 display. This can be important for inlined functions. */
876
877 struct print_file_list
878 {
879 struct print_file_list *next;
880 const char *filename;
881 const char *modname;
882 unsigned int line;
883 FILE *f;
884 };
885
886 static struct print_file_list *print_files;
887
888 /* The number of preceding context lines to show when we start
889 displaying a file for the first time. */
890
891 #define SHOW_PRECEDING_CONTEXT_LINES (5)
892
893 /* Tries to open MODNAME, and if successful adds a node to print_files
894 linked list and returns that node. Returns NULL on failure. */
895
896 static struct print_file_list *
897 try_print_file_open (const char *origname, const char *modname)
898 {
899 struct print_file_list *p;
900 FILE *f;
901
902 f = fopen (modname, "r");
903 if (f == NULL)
904 return NULL;
905
906 if (print_files != NULL && print_files->f != NULL)
907 {
908 fclose (print_files->f);
909 print_files->f = NULL;
910 }
911
912 p = xmalloc (sizeof (struct print_file_list));
913 p->filename = origname;
914 p->modname = modname;
915 p->line = 0;
916 p->f = f;
917 p->next = print_files;
918 print_files = p;
919 return p;
920 }
921
922 /* If the the source file, as described in the symtab, is not found
923 try to locate it in one of the paths specified with -I
924 If found, add location to print_files linked list. */
925
926 static struct print_file_list *
927 update_source_path (const char *filename)
928 {
929 struct print_file_list *p;
930 const char *fname;
931 int i;
932
933 if (filename == NULL)
934 return NULL;
935
936 p = try_print_file_open (filename, filename);
937 if (p != NULL)
938 return p;
939
940 if (include_path_count == 0)
941 return NULL;
942
943 /* Get the name of the file. */
944 fname = strrchr (filename, '/');
945 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
946 {
947 /* We could have a mixed forward/back slash case. */
948 char *backslash = strrchr (filename, '\\');
949 if (fname == NULL || (backslash != NULL && backslash > fname))
950 fname = backslash;
951 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
952 fname = filename + 1;
953 }
954 #endif
955 if (fname == NULL)
956 fname = filename;
957 else
958 ++fname;
959
960 /* If file exists under a new path, we need to add it to the list
961 so that show_line knows about it. */
962 for (i = 0; i < include_path_count; i++)
963 {
964 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
965
966 p = try_print_file_open (filename, modname);
967 if (p)
968 return p;
969
970 free (modname);
971 }
972
973 return NULL;
974 }
975
976 /* Skip ahead to a given line in a file, optionally printing each
977 line. */
978
979 static void
980 skip_to_line (struct print_file_list *p, unsigned int line,
981 bfd_boolean show)
982 {
983 while (p->line < line)
984 {
985 char buf[100];
986
987 if (fgets (buf, sizeof buf, p->f) == NULL)
988 {
989 fclose (p->f);
990 p->f = NULL;
991 break;
992 }
993
994 if (show)
995 printf ("%s", buf);
996
997 if (strchr (buf, '\n') != NULL)
998 ++p->line;
999 }
1000 }
1001
1002 /* Show the line number, or the source line, in a dissassembly
1003 listing. */
1004
1005 static void
1006 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1007 {
1008 const char *filename;
1009 const char *functionname;
1010 unsigned int line;
1011
1012 if (! with_line_numbers && ! with_source_code)
1013 return;
1014
1015 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1016 &functionname, &line))
1017 return;
1018
1019 if (filename != NULL && *filename == '\0')
1020 filename = NULL;
1021 if (functionname != NULL && *functionname == '\0')
1022 functionname = NULL;
1023
1024 if (with_line_numbers)
1025 {
1026 if (functionname != NULL
1027 && (prev_functionname == NULL
1028 || strcmp (functionname, prev_functionname) != 0))
1029 printf ("%s():\n", functionname);
1030 if (line > 0 && line != prev_line)
1031 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1032 }
1033
1034 if (with_source_code
1035 && filename != NULL
1036 && line > 0)
1037 {
1038 struct print_file_list **pp, *p;
1039
1040 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1041 if (strcmp ((*pp)->filename, filename) == 0)
1042 break;
1043 p = *pp;
1044
1045 if (p != NULL)
1046 {
1047 if (p != print_files)
1048 {
1049 int l;
1050
1051 /* We have reencountered a file name which we saw
1052 earlier. This implies that either we are dumping out
1053 code from an included file, or the same file was
1054 linked in more than once. There are two common cases
1055 of an included file: inline functions in a header
1056 file, and a bison or flex skeleton file. In the
1057 former case we want to just start printing (but we
1058 back up a few lines to give context); in the latter
1059 case we want to continue from where we left off. I
1060 can't think of a good way to distinguish the cases,
1061 so I used a heuristic based on the file name. */
1062 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1063 l = p->line;
1064 else
1065 {
1066 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1067 if (l < 0)
1068 l = 0;
1069 }
1070
1071 if (p->f == NULL)
1072 {
1073 p->f = fopen (p->modname, "r");
1074 p->line = 0;
1075 }
1076 if (p->f != NULL)
1077 skip_to_line (p, l, FALSE);
1078
1079 if (print_files->f != NULL)
1080 {
1081 fclose (print_files->f);
1082 print_files->f = NULL;
1083 }
1084 }
1085
1086 if (p->f != NULL)
1087 {
1088 skip_to_line (p, line, TRUE);
1089 *pp = p->next;
1090 p->next = print_files;
1091 print_files = p;
1092 }
1093 }
1094 else
1095 {
1096 p = update_source_path (filename);
1097
1098 if (p != NULL)
1099 {
1100 int l;
1101
1102 if (file_start_context)
1103 l = 0;
1104 else
1105 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1106 if (l < 0)
1107 l = 0;
1108 skip_to_line (p, l, FALSE);
1109 if (p->f != NULL)
1110 skip_to_line (p, line, TRUE);
1111 }
1112 }
1113 }
1114
1115 if (functionname != NULL
1116 && (prev_functionname == NULL
1117 || strcmp (functionname, prev_functionname) != 0))
1118 {
1119 if (prev_functionname != NULL)
1120 free (prev_functionname);
1121 prev_functionname = xmalloc (strlen (functionname) + 1);
1122 strcpy (prev_functionname, functionname);
1123 }
1124
1125 if (line > 0 && line != prev_line)
1126 prev_line = line;
1127 }
1128
1129 /* Pseudo FILE object for strings. */
1130 typedef struct
1131 {
1132 char *buffer;
1133 size_t size;
1134 char *current;
1135 } SFILE;
1136
1137 /* sprintf to a "stream". */
1138
1139 static int
1140 objdump_sprintf (SFILE *f, const char *format, ...)
1141 {
1142 char *buf;
1143 size_t n;
1144 va_list args;
1145
1146 va_start (args, format);
1147
1148 vasprintf (&buf, format, args);
1149
1150 if (buf == NULL)
1151 {
1152 va_end (args);
1153 fatal (_("Out of virtual memory"));
1154 }
1155
1156 n = strlen (buf);
1157
1158 while ((size_t) ((f->buffer + f->size) - f->current) < n + 1)
1159 {
1160 size_t curroff;
1161
1162 curroff = f->current - f->buffer;
1163 f->size *= 2;
1164 f->buffer = xrealloc (f->buffer, f->size);
1165 f->current = f->buffer + curroff;
1166 }
1167
1168 memcpy (f->current, buf, n);
1169 f->current += n;
1170 f->current[0] = '\0';
1171
1172 free (buf);
1173
1174 va_end (args);
1175 return n;
1176 }
1177
1178 /* Returns TRUE if the specified section should be dumped. */
1179
1180 static bfd_boolean
1181 process_section_p (asection * section)
1182 {
1183 size_t i;
1184
1185 if (only == NULL)
1186 return TRUE;
1187
1188 for (i = 0; i < only_used; i++)
1189 if (strcmp (only [i], section->name) == 0)
1190 return TRUE;
1191
1192 return FALSE;
1193 }
1194
1195
1196 /* The number of zeroes we want to see before we start skipping them.
1197 The number is arbitrarily chosen. */
1198
1199 #ifndef SKIP_ZEROES
1200 #define SKIP_ZEROES (8)
1201 #endif
1202
1203 /* The number of zeroes to skip at the end of a section. If the
1204 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1205 SKIP_ZEROES, they will be disassembled. If there are fewer than
1206 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1207 attempt to avoid disassembling zeroes inserted by section
1208 alignment. */
1209
1210 #ifndef SKIP_ZEROES_AT_END
1211 #define SKIP_ZEROES_AT_END (3)
1212 #endif
1213
1214 /* Disassemble some data in memory between given values. */
1215
1216 static void
1217 disassemble_bytes (struct disassemble_info * info,
1218 disassembler_ftype disassemble_fn,
1219 bfd_boolean insns,
1220 bfd_byte * data,
1221 bfd_vma start_offset,
1222 bfd_vma stop_offset,
1223 bfd_vma rel_offset,
1224 arelent *** relppp,
1225 arelent ** relppend)
1226 {
1227 struct objdump_disasm_info *aux;
1228 asection *section;
1229 int octets_per_line;
1230 bfd_boolean done_dot;
1231 int skip_addr_chars;
1232 bfd_vma addr_offset;
1233 int opb = info->octets_per_byte;
1234
1235 aux = (struct objdump_disasm_info *) info->application_data;
1236 section = aux->sec;
1237
1238 if (insns)
1239 octets_per_line = 4;
1240 else
1241 octets_per_line = 16;
1242
1243 /* Figure out how many characters to skip at the start of an
1244 address, to make the disassembly look nicer. We discard leading
1245 zeroes in chunks of 4, ensuring that there is always a leading
1246 zero remaining. */
1247 skip_addr_chars = 0;
1248 if (! prefix_addresses)
1249 {
1250 char buf[30];
1251 char *s;
1252
1253 bfd_sprintf_vma
1254 (aux->abfd, buf,
1255 (section->vma
1256 + bfd_section_size (section->owner, section) / opb));
1257 s = buf;
1258 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1259 && s[4] == '0')
1260 {
1261 skip_addr_chars += 4;
1262 s += 4;
1263 }
1264 }
1265
1266 info->insn_info_valid = 0;
1267
1268 done_dot = FALSE;
1269 addr_offset = start_offset;
1270 while (addr_offset < stop_offset)
1271 {
1272 bfd_vma z;
1273 int octets = 0;
1274 bfd_boolean need_nl = FALSE;
1275
1276 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1277 print `...'. */
1278 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1279 if (data[z] != 0)
1280 break;
1281 if (! disassemble_zeroes
1282 && (info->insn_info_valid == 0
1283 || info->branch_delay_insns == 0)
1284 && (z - addr_offset * opb >= SKIP_ZEROES
1285 || (z == stop_offset * opb &&
1286 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1287 {
1288 printf ("\t...\n");
1289
1290 /* If there are more nonzero octets to follow, we only skip
1291 zeroes in multiples of 4, to try to avoid running over
1292 the start of an instruction which happens to start with
1293 zero. */
1294 if (z != stop_offset * opb)
1295 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1296
1297 octets = z - addr_offset * opb;
1298 }
1299 else
1300 {
1301 char buf[50];
1302 SFILE sfile;
1303 int bpc = 0;
1304 int pb = 0;
1305
1306 done_dot = FALSE;
1307
1308 if (with_line_numbers || with_source_code)
1309 /* The line number tables will refer to unadjusted
1310 section VMAs, so we must undo any VMA modifications
1311 when calling show_line. */
1312 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
1313
1314 if (! prefix_addresses)
1315 {
1316 char *s;
1317
1318 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1319 for (s = buf + skip_addr_chars; *s == '0'; s++)
1320 *s = ' ';
1321 if (*s == '\0')
1322 *--s = '0';
1323 printf ("%s:\t", buf + skip_addr_chars);
1324 }
1325 else
1326 {
1327 aux->require_sec = TRUE;
1328 objdump_print_address (section->vma + addr_offset, info);
1329 aux->require_sec = FALSE;
1330 putchar (' ');
1331 }
1332
1333 if (insns)
1334 {
1335 sfile.size = 120;
1336 sfile.buffer = xmalloc (sfile.size);
1337 sfile.current = sfile.buffer;
1338 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1339 info->stream = (FILE *) &sfile;
1340 info->bytes_per_line = 0;
1341 info->bytes_per_chunk = 0;
1342
1343 #ifdef DISASSEMBLER_NEEDS_RELOCS
1344 /* FIXME: This is wrong. It tests the number of octets
1345 in the last instruction, not the current one. */
1346 if (*relppp < relppend
1347 && (**relppp)->address >= rel_offset + addr_offset
1348 && ((**relppp)->address
1349 < rel_offset + addr_offset + octets / opb))
1350 info->flags = INSN_HAS_RELOC;
1351 else
1352 #endif
1353 info->flags = 0;
1354
1355 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1356 info->fprintf_func = (fprintf_ftype) fprintf;
1357 info->stream = stdout;
1358 if (info->bytes_per_line != 0)
1359 octets_per_line = info->bytes_per_line;
1360 if (octets < 0)
1361 {
1362 if (sfile.current != sfile.buffer)
1363 printf ("%s\n", sfile.buffer);
1364 free (sfile.buffer);
1365 break;
1366 }
1367 }
1368 else
1369 {
1370 bfd_vma j;
1371
1372 octets = octets_per_line;
1373 if (addr_offset + octets / opb > stop_offset)
1374 octets = (stop_offset - addr_offset) * opb;
1375
1376 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1377 {
1378 if (ISPRINT (data[j]))
1379 buf[j - addr_offset * opb] = data[j];
1380 else
1381 buf[j - addr_offset * opb] = '.';
1382 }
1383 buf[j - addr_offset * opb] = '\0';
1384 }
1385
1386 if (prefix_addresses
1387 ? show_raw_insn > 0
1388 : show_raw_insn >= 0)
1389 {
1390 bfd_vma j;
1391
1392 /* If ! prefix_addresses and ! wide_output, we print
1393 octets_per_line octets per line. */
1394 pb = octets;
1395 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1396 pb = octets_per_line;
1397
1398 if (info->bytes_per_chunk)
1399 bpc = info->bytes_per_chunk;
1400 else
1401 bpc = 1;
1402
1403 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1404 {
1405 int k;
1406 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1407 {
1408 for (k = bpc - 1; k >= 0; k--)
1409 printf ("%02x", (unsigned) data[j + k]);
1410 putchar (' ');
1411 }
1412 else
1413 {
1414 for (k = 0; k < bpc; k++)
1415 printf ("%02x", (unsigned) data[j + k]);
1416 putchar (' ');
1417 }
1418 }
1419
1420 for (; pb < octets_per_line; pb += bpc)
1421 {
1422 int k;
1423
1424 for (k = 0; k < bpc; k++)
1425 printf (" ");
1426 putchar (' ');
1427 }
1428
1429 /* Separate raw data from instruction by extra space. */
1430 if (insns)
1431 putchar ('\t');
1432 else
1433 printf (" ");
1434 }
1435
1436 if (! insns)
1437 printf ("%s", buf);
1438 else
1439 {
1440 printf ("%s", sfile.buffer);
1441 free (sfile.buffer);
1442 }
1443
1444 if (prefix_addresses
1445 ? show_raw_insn > 0
1446 : show_raw_insn >= 0)
1447 {
1448 while (pb < octets)
1449 {
1450 bfd_vma j;
1451 char *s;
1452
1453 putchar ('\n');
1454 j = addr_offset * opb + pb;
1455
1456 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1457 for (s = buf + skip_addr_chars; *s == '0'; s++)
1458 *s = ' ';
1459 if (*s == '\0')
1460 *--s = '0';
1461 printf ("%s:\t", buf + skip_addr_chars);
1462
1463 pb += octets_per_line;
1464 if (pb > octets)
1465 pb = octets;
1466 for (; j < addr_offset * opb + pb; j += bpc)
1467 {
1468 int k;
1469
1470 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1471 {
1472 for (k = bpc - 1; k >= 0; k--)
1473 printf ("%02x", (unsigned) data[j + k]);
1474 putchar (' ');
1475 }
1476 else
1477 {
1478 for (k = 0; k < bpc; k++)
1479 printf ("%02x", (unsigned) data[j + k]);
1480 putchar (' ');
1481 }
1482 }
1483 }
1484 }
1485
1486 if (!wide_output)
1487 putchar ('\n');
1488 else
1489 need_nl = TRUE;
1490 }
1491
1492 while ((*relppp) < relppend
1493 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1494 {
1495 if (dump_reloc_info || dump_dynamic_reloc_info)
1496 {
1497 arelent *q;
1498
1499 q = **relppp;
1500
1501 if (wide_output)
1502 putchar ('\t');
1503 else
1504 printf ("\t\t\t");
1505
1506 objdump_print_value (section->vma + q->address, info, TRUE);
1507
1508 printf (": %s\t", q->howto->name);
1509
1510 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1511 printf ("*unknown*");
1512 else
1513 {
1514 const char *sym_name;
1515
1516 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1517 if (sym_name != NULL && *sym_name != '\0')
1518 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1519 else
1520 {
1521 asection *sym_sec;
1522
1523 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1524 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1525 if (sym_name == NULL || *sym_name == '\0')
1526 sym_name = "*unknown*";
1527 printf ("%s", sym_name);
1528 }
1529 }
1530
1531 if (q->addend)
1532 {
1533 printf ("+0x");
1534 objdump_print_value (q->addend, info, TRUE);
1535 }
1536
1537 printf ("\n");
1538 need_nl = FALSE;
1539 }
1540 ++(*relppp);
1541 }
1542
1543 if (need_nl)
1544 printf ("\n");
1545
1546 addr_offset += octets / opb;
1547 }
1548 }
1549
1550 static void
1551 disassemble_section (bfd *abfd, asection *section, void *info)
1552 {
1553 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1554 struct objdump_disasm_info * paux = (struct objdump_disasm_info *) pinfo->application_data;
1555 unsigned int opb = pinfo->octets_per_byte;
1556 bfd_byte * data = NULL;
1557 bfd_size_type datasize = 0;
1558 arelent ** rel_pp = NULL;
1559 arelent ** rel_ppstart = NULL;
1560 arelent ** rel_ppend;
1561 unsigned long stop_offset;
1562 asymbol * sym = NULL;
1563 long place = 0;
1564 long rel_count;
1565 bfd_vma rel_offset;
1566 unsigned long addr_offset;
1567
1568 /* Sections that do not contain machine
1569 code are not normally disassembled. */
1570 if (! disassemble_all
1571 && only == NULL
1572 && (section->flags & SEC_CODE) == 0)
1573 return;
1574
1575 if (! process_section_p (section))
1576 return;
1577
1578 datasize = bfd_get_section_size_before_reloc (section);
1579 if (datasize == 0)
1580 return;
1581
1582 /* Decide which set of relocs to use. Load them if necessary. */
1583 if (paux->dynrelbuf)
1584 {
1585 rel_pp = paux->dynrelbuf;
1586 rel_count = paux->dynrelcount;
1587 /* Dynamic reloc addresses are absolute, non-dynamic are section
1588 relative. REL_OFFSET specifies the reloc address corresponnding
1589 to the start of this section. */
1590 rel_offset = pinfo->buffer_vma;
1591 }
1592 else
1593 {
1594 rel_count = 0;
1595 rel_pp = NULL;
1596 rel_offset = 0;
1597
1598 if ((section->flags & SEC_RELOC) != 0
1599 #ifndef DISASSEMBLER_NEEDS_RELOCS
1600 && dump_reloc_info
1601 #endif
1602 )
1603 {
1604 long relsize;
1605
1606 relsize = bfd_get_reloc_upper_bound (abfd, section);
1607 if (relsize < 0)
1608 bfd_fatal (bfd_get_filename (abfd));
1609
1610 if (relsize > 0)
1611 {
1612 rel_ppstart = rel_pp = xmalloc (relsize);
1613 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1614 if (rel_count < 0)
1615 bfd_fatal (bfd_get_filename (abfd));
1616
1617 /* Sort the relocs by address. */
1618 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1619 }
1620 }
1621
1622 }
1623 rel_ppend = rel_pp + rel_count;
1624
1625 data = xmalloc (datasize);
1626
1627 bfd_get_section_contents (abfd, section, data, 0, datasize);
1628
1629 paux->sec = section;
1630 pinfo->buffer = data;
1631 pinfo->buffer_vma = section->vma;
1632 pinfo->buffer_length = datasize;
1633 pinfo->section = section;
1634
1635 if (start_address == (bfd_vma) -1
1636 || start_address < pinfo->buffer_vma)
1637 addr_offset = 0;
1638 else
1639 addr_offset = start_address - pinfo->buffer_vma;
1640
1641 if (stop_address == (bfd_vma) -1)
1642 stop_offset = datasize / opb;
1643 else
1644 {
1645 if (stop_address < pinfo->buffer_vma)
1646 stop_offset = 0;
1647 else
1648 stop_offset = stop_address - pinfo->buffer_vma;
1649 if (stop_offset > pinfo->buffer_length / opb)
1650 stop_offset = pinfo->buffer_length / opb;
1651 }
1652
1653 /* Skip over the relocs belonging to addresses below the
1654 start address. */
1655 while (rel_pp < rel_ppend
1656 && (*rel_pp)->address < rel_offset + addr_offset)
1657 ++rel_pp;
1658
1659 printf (_("Disassembly of section %s:\n"), section->name);
1660
1661 /* Find the nearest symbol forwards from our current position. */
1662 sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
1663 TRUE, &place);
1664
1665 /* Disassemble a block of instructions up to the address associated with
1666 the symbol we have just found. Then print the symbol and find the
1667 next symbol on. Repeat until we have disassembled the entire section
1668 or we have reached the end of the address range we are interested in. */
1669 while (addr_offset < stop_offset)
1670 {
1671 asymbol *nextsym;
1672 unsigned long nextstop_offset;
1673 bfd_boolean insns;
1674
1675 if (sym != NULL
1676 && bfd_asymbol_value (sym) <= section->vma + addr_offset)
1677 {
1678 int x;
1679
1680 for (x = place;
1681 (x < sorted_symcount
1682 && (bfd_asymbol_value (sorted_syms[x])
1683 <= section->vma + addr_offset));
1684 ++x)
1685 continue;
1686
1687 pinfo->symbols = & sorted_syms[place];
1688 pinfo->num_symbols = x - place;
1689 }
1690 else
1691 pinfo->symbols = NULL;
1692
1693 if (! prefix_addresses)
1694 {
1695 pinfo->fprintf_func (pinfo->stream, "\n");
1696 objdump_print_addr_with_sym (abfd, section, sym,
1697 section->vma + addr_offset,
1698 pinfo, FALSE);
1699 pinfo->fprintf_func (pinfo->stream, ":\n");
1700 }
1701
1702 if (sym != NULL
1703 && bfd_asymbol_value (sym) > section->vma + addr_offset)
1704 nextsym = sym;
1705 else if (sym == NULL)
1706 nextsym = NULL;
1707 else
1708 {
1709 /* Search forward for the next appropriate symbol in
1710 SECTION. Note that all the symbols are sorted
1711 together into one big array, and that some sections
1712 may have overlapping addresses. */
1713 while (place < sorted_symcount
1714 && (sorted_syms[place]->section != section
1715 || (bfd_asymbol_value (sorted_syms[place])
1716 <= bfd_asymbol_value (sym))))
1717 ++place;
1718 if (place >= sorted_symcount)
1719 nextsym = NULL;
1720 else
1721 nextsym = sorted_syms[place];
1722 }
1723
1724 if (sym != NULL
1725 && bfd_asymbol_value (sym) > section->vma + addr_offset)
1726 {
1727 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1728 if (nextstop_offset > stop_offset)
1729 nextstop_offset = stop_offset;
1730 }
1731 else if (nextsym == NULL)
1732 nextstop_offset = stop_offset;
1733 else
1734 {
1735 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1736 if (nextstop_offset > stop_offset)
1737 nextstop_offset = stop_offset;
1738 }
1739
1740 /* If a symbol is explicitly marked as being an object
1741 rather than a function, just dump the bytes without
1742 disassembling them. */
1743 if (disassemble_all
1744 || sym == NULL
1745 || bfd_asymbol_value (sym) > section->vma + addr_offset
1746 || ((sym->flags & BSF_OBJECT) == 0
1747 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1748 == NULL)
1749 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1750 == NULL))
1751 || (sym->flags & BSF_FUNCTION) != 0)
1752 insns = TRUE;
1753 else
1754 insns = FALSE;
1755
1756 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1757 addr_offset, nextstop_offset,
1758 rel_offset, &rel_pp, rel_ppend);
1759
1760 addr_offset = nextstop_offset;
1761 sym = nextsym;
1762 }
1763
1764 free (data);
1765
1766 if (rel_ppstart != NULL)
1767 free (rel_ppstart);
1768 }
1769
1770 /* Disassemble the contents of an object file. */
1771
1772 static void
1773 disassemble_data (bfd *abfd)
1774 {
1775 struct disassemble_info disasm_info;
1776 struct objdump_disasm_info aux;
1777
1778 print_files = NULL;
1779 prev_functionname = NULL;
1780 prev_line = -1;
1781
1782 /* We make a copy of syms to sort. We don't want to sort syms
1783 because that will screw up the relocs. */
1784 sorted_syms = xmalloc (symcount * sizeof (asymbol *));
1785 memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1786
1787 sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1788
1789 /* Sort the symbols into section and symbol order. */
1790 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1791
1792 init_disassemble_info (&disasm_info, stdout, fprintf);
1793
1794 disasm_info.application_data = (void *) &aux;
1795 aux.abfd = abfd;
1796 aux.require_sec = FALSE;
1797 aux.dynrelbuf = NULL;
1798 aux.dynrelcount = 0;
1799
1800 disasm_info.print_address_func = objdump_print_address;
1801 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1802
1803 if (machine != NULL)
1804 {
1805 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1806
1807 if (info == NULL)
1808 fatal (_("Can't use supplied machine %s"), machine);
1809
1810 abfd->arch_info = info;
1811 }
1812
1813 if (endian != BFD_ENDIAN_UNKNOWN)
1814 {
1815 struct bfd_target *xvec;
1816
1817 xvec = xmalloc (sizeof (struct bfd_target));
1818 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1819 xvec->byteorder = endian;
1820 abfd->xvec = xvec;
1821 }
1822
1823 /* Use libopcodes to locate a suitable disassembler. */
1824 aux.disassemble_fn = disassembler (abfd);
1825 if (!aux.disassemble_fn)
1826 {
1827 non_fatal (_("Can't disassemble for architecture %s\n"),
1828 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1829 exit_status = 1;
1830 return;
1831 }
1832
1833 disasm_info.flavour = bfd_get_flavour (abfd);
1834 disasm_info.arch = bfd_get_arch (abfd);
1835 disasm_info.mach = bfd_get_mach (abfd);
1836 disasm_info.disassembler_options = disassembler_options;
1837 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
1838
1839 if (bfd_big_endian (abfd))
1840 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1841 else if (bfd_little_endian (abfd))
1842 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1843 else
1844 /* ??? Aborting here seems too drastic. We could default to big or little
1845 instead. */
1846 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1847
1848 /* Pre-load the dynamic relocs if we are going
1849 to be dumping them along with the disassembly. */
1850 if (dump_dynamic_reloc_info)
1851 {
1852 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
1853
1854 if (relsize < 0)
1855 bfd_fatal (bfd_get_filename (abfd));
1856
1857 if (relsize > 0)
1858 {
1859 aux.dynrelbuf = xmalloc (relsize);
1860 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, aux.dynrelbuf, dynsyms);
1861 if (aux.dynrelcount < 0)
1862 bfd_fatal (bfd_get_filename (abfd));
1863
1864 /* Sort the relocs by address. */
1865 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *), compare_relocs);
1866 }
1867 }
1868
1869 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
1870
1871 if (aux.dynrelbuf != NULL)
1872 free (aux.dynrelbuf);
1873 free (sorted_syms);
1874 }
1875 \f
1876 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1877 and string table section STRSECT_NAME into `strtab'.
1878 If the section exists and was read, allocate the space and return TRUE.
1879 Otherwise return FALSE. */
1880
1881 static bfd_boolean
1882 read_section_stabs (bfd *abfd, const char *stabsect_name,
1883 const char *strsect_name)
1884 {
1885 asection *stabsect, *stabstrsect;
1886
1887 stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1888 if (stabsect == NULL)
1889 {
1890 printf (_("No %s section present\n\n"), stabsect_name);
1891 return FALSE;
1892 }
1893
1894 stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1895 if (stabstrsect == NULL)
1896 {
1897 non_fatal (_("%s has no %s section"),
1898 bfd_get_filename (abfd), strsect_name);
1899 exit_status = 1;
1900 return FALSE;
1901 }
1902
1903 stab_size = bfd_section_size (abfd, stabsect);
1904 stabstr_size = bfd_section_size (abfd, stabstrsect);
1905
1906 stabs = xmalloc (stab_size);
1907 strtab = xmalloc (stabstr_size);
1908
1909 if (! bfd_get_section_contents (abfd, stabsect, stabs, 0, stab_size))
1910 {
1911 non_fatal (_("Reading %s section of %s failed: %s"),
1912 stabsect_name, bfd_get_filename (abfd),
1913 bfd_errmsg (bfd_get_error ()));
1914 free (stabs);
1915 free (strtab);
1916 exit_status = 1;
1917 return FALSE;
1918 }
1919
1920 if (! bfd_get_section_contents (abfd, stabstrsect, (void *) strtab, 0,
1921 stabstr_size))
1922 {
1923 non_fatal (_("Reading %s section of %s failed: %s\n"),
1924 strsect_name, bfd_get_filename (abfd),
1925 bfd_errmsg (bfd_get_error ()));
1926 free (stabs);
1927 free (strtab);
1928 exit_status = 1;
1929 return FALSE;
1930 }
1931
1932 return TRUE;
1933 }
1934
1935 /* Stabs entries use a 12 byte format:
1936 4 byte string table index
1937 1 byte stab type
1938 1 byte stab other field
1939 2 byte stab desc field
1940 4 byte stab value
1941 FIXME: This will have to change for a 64 bit object format. */
1942
1943 #define STRDXOFF (0)
1944 #define TYPEOFF (4)
1945 #define OTHEROFF (5)
1946 #define DESCOFF (6)
1947 #define VALOFF (8)
1948 #define STABSIZE (12)
1949
1950 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1951 using string table section STRSECT_NAME (in `strtab'). */
1952
1953 static void
1954 print_section_stabs (bfd *abfd, const char *stabsect_name)
1955 {
1956 int i;
1957 unsigned file_string_table_offset = 0;
1958 unsigned next_file_string_table_offset = 0;
1959 bfd_byte *stabp, *stabs_end;
1960
1961 stabp = stabs;
1962 stabs_end = stabp + stab_size;
1963
1964 printf (_("Contents of %s section:\n\n"), stabsect_name);
1965 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1966
1967 /* Loop through all symbols and print them.
1968
1969 We start the index at -1 because there is a dummy symbol on
1970 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1971 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1972 {
1973 const char *name;
1974 unsigned long strx;
1975 unsigned char type, other;
1976 unsigned short desc;
1977 bfd_vma value;
1978
1979 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1980 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1981 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1982 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1983 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1984
1985 printf ("\n%-6d ", i);
1986 /* Either print the stab name, or, if unnamed, print its number
1987 again (makes consistent formatting for tools like awk). */
1988 name = bfd_get_stab_name (type);
1989 if (name != NULL)
1990 printf ("%-6s", name);
1991 else if (type == N_UNDF)
1992 printf ("HdrSym");
1993 else
1994 printf ("%-6d", type);
1995 printf (" %-6d %-6d ", other, desc);
1996 bfd_printf_vma (abfd, value);
1997 printf (" %-6lu", strx);
1998
1999 /* Symbols with type == 0 (N_UNDF) specify the length of the
2000 string table associated with this file. We use that info
2001 to know how to relocate the *next* file's string table indices. */
2002 if (type == N_UNDF)
2003 {
2004 file_string_table_offset = next_file_string_table_offset;
2005 next_file_string_table_offset += value;
2006 }
2007 else
2008 {
2009 /* Using the (possibly updated) string table offset, print the
2010 string (if any) associated with this symbol. */
2011 if ((strx + file_string_table_offset) < stabstr_size)
2012 printf (" %s", &strtab[strx + file_string_table_offset]);
2013 else
2014 printf (" *");
2015 }
2016 }
2017 printf ("\n\n");
2018 }
2019
2020 typedef struct
2021 {
2022 const char * section_name;
2023 const char * string_section_name;
2024 }
2025 stab_section_names;
2026
2027 static void
2028 find_stabs_section (bfd *abfd, asection *section, void *names)
2029 {
2030 int len;
2031 stab_section_names * sought = (stab_section_names *) names;
2032
2033 /* Check for section names for which stabsect_name is a prefix, to
2034 handle .stab0, etc. */
2035 len = strlen (sought->section_name);
2036
2037 /* If the prefix matches, and the files section name ends with a
2038 nul or a digit, then we match. I.e., we want either an exact
2039 match or a section followed by a number. */
2040 if (strncmp (sought->section_name, section->name, len) == 0
2041 && (section->name[len] == 0
2042 || ISDIGIT (section->name[len])))
2043 {
2044 if (read_section_stabs (abfd, section->name, sought->string_section_name))
2045 {
2046 print_section_stabs (abfd, section->name);
2047 free (stabs);
2048 free (strtab);
2049 }
2050 }
2051 }
2052
2053 static void
2054 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2055 {
2056 stab_section_names s;
2057
2058 s.section_name = stabsect_name;
2059 s.string_section_name = strsect_name;
2060
2061 bfd_map_over_sections (abfd, find_stabs_section, & s);
2062 }
2063
2064 /* Dump the any sections containing stabs debugging information. */
2065
2066 static void
2067 dump_stabs (bfd *abfd)
2068 {
2069 dump_stabs_section (abfd, ".stab", ".stabstr");
2070 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2071 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2072 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2073 }
2074 \f
2075 static void
2076 dump_bfd_header (bfd *abfd)
2077 {
2078 char *comma = "";
2079
2080 printf (_("architecture: %s, "),
2081 bfd_printable_arch_mach (bfd_get_arch (abfd),
2082 bfd_get_mach (abfd)));
2083 printf (_("flags 0x%08x:\n"), abfd->flags);
2084
2085 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2086 PF (HAS_RELOC, "HAS_RELOC");
2087 PF (EXEC_P, "EXEC_P");
2088 PF (HAS_LINENO, "HAS_LINENO");
2089 PF (HAS_DEBUG, "HAS_DEBUG");
2090 PF (HAS_SYMS, "HAS_SYMS");
2091 PF (HAS_LOCALS, "HAS_LOCALS");
2092 PF (DYNAMIC, "DYNAMIC");
2093 PF (WP_TEXT, "WP_TEXT");
2094 PF (D_PAGED, "D_PAGED");
2095 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2096 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2097 printf (_("\nstart address 0x"));
2098 bfd_printf_vma (abfd, abfd->start_address);
2099 printf ("\n");
2100 }
2101
2102 \f
2103 static void
2104 dump_bfd_private_header (bfd *abfd)
2105 {
2106 bfd_print_private_bfd_data (abfd, stdout);
2107 }
2108
2109 \f
2110 /* Display a section in hexadecimal format with associated characters.
2111 Each line prefixed by the zero padded address. */
2112
2113 static void
2114 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2115 {
2116 bfd_byte *data = 0;
2117 bfd_size_type datasize;
2118 bfd_size_type addr_offset;
2119 bfd_size_type start_offset;
2120 bfd_size_type stop_offset;
2121 unsigned int opb = bfd_octets_per_byte (abfd);
2122 /* Bytes per line. */
2123 const int onaline = 16;
2124 char buf[64];
2125 int count;
2126 int width;
2127
2128 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2129 return;
2130
2131 if (! process_section_p (section))
2132 return;
2133
2134 if ((datasize = bfd_section_size (abfd, section)) == 0)
2135 return;
2136
2137 printf (_("Contents of section %s:\n"), section->name);
2138
2139 data = xmalloc (datasize);
2140
2141 bfd_get_section_contents (abfd, section, data, 0, datasize);
2142
2143 /* Compute the address range to display. */
2144 if (start_address == (bfd_vma) -1
2145 || start_address < section->vma)
2146 start_offset = 0;
2147 else
2148 start_offset = start_address - section->vma;
2149
2150 if (stop_address == (bfd_vma) -1)
2151 stop_offset = datasize / opb;
2152 else
2153 {
2154 if (stop_address < section->vma)
2155 stop_offset = 0;
2156 else
2157 stop_offset = stop_address - section->vma;
2158
2159 if (stop_offset > datasize / opb)
2160 stop_offset = datasize / opb;
2161 }
2162
2163 width = 4;
2164
2165 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2166 if (strlen (buf) >= sizeof (buf))
2167 abort ();
2168
2169 count = 0;
2170 while (buf[count] == '0' && buf[count+1] != '\0')
2171 count++;
2172 count = strlen (buf) - count;
2173 if (count > width)
2174 width = count;
2175
2176 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2177 if (strlen (buf) >= sizeof (buf))
2178 abort ();
2179
2180 count = 0;
2181 while (buf[count] == '0' && buf[count+1] != '\0')
2182 count++;
2183 count = strlen (buf) - count;
2184 if (count > width)
2185 width = count;
2186
2187 for (addr_offset = start_offset;
2188 addr_offset < stop_offset; addr_offset += onaline / opb)
2189 {
2190 bfd_size_type j;
2191
2192 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2193 count = strlen (buf);
2194 if ((size_t) count >= sizeof (buf))
2195 abort ();
2196
2197 putchar (' ');
2198 while (count < width)
2199 {
2200 putchar ('0');
2201 count++;
2202 }
2203 fputs (buf + count - width, stdout);
2204 putchar (' ');
2205
2206 for (j = addr_offset * opb;
2207 j < addr_offset * opb + onaline; j++)
2208 {
2209 if (j < stop_offset * opb)
2210 printf ("%02x", (unsigned) (data[j]));
2211 else
2212 printf (" ");
2213 if ((j & 3) == 3)
2214 printf (" ");
2215 }
2216
2217 printf (" ");
2218 for (j = addr_offset * opb;
2219 j < addr_offset * opb + onaline; j++)
2220 {
2221 if (j >= stop_offset * opb)
2222 printf (" ");
2223 else
2224 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2225 }
2226 putchar ('\n');
2227 }
2228 free (data);
2229 }
2230
2231 /* Actually display the various requested regions. */
2232
2233 static void
2234 dump_data (bfd *abfd)
2235 {
2236 bfd_map_over_sections (abfd, dump_section, NULL);
2237 }
2238
2239 /* Should perhaps share code and display with nm? */
2240
2241 static void
2242 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2243 {
2244 asymbol **current;
2245 long max;
2246 long count;
2247
2248 if (dynamic)
2249 {
2250 current = dynsyms;
2251 max = dynsymcount;
2252 printf ("DYNAMIC SYMBOL TABLE:\n");
2253 }
2254 else
2255 {
2256 current = syms;
2257 max = symcount;
2258 printf ("SYMBOL TABLE:\n");
2259 }
2260
2261 if (max == 0)
2262 printf (_("no symbols\n"));
2263
2264 for (count = 0; count < max; count++)
2265 {
2266 bfd *cur_bfd;
2267
2268 if (*current == NULL)
2269 printf (_("no information for the %ld'th symbol"), count);
2270
2271 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2272 printf (_("could not determine the type of the %ld'th symbol"),
2273 count);
2274
2275 else
2276 {
2277 const char *name = (*current)->name;
2278
2279 if (do_demangle && name != NULL && *name != '\0')
2280 {
2281 char *alloc;
2282
2283 /* If we want to demangle the name, we demangle it
2284 here, and temporarily clobber it while calling
2285 bfd_print_symbol. FIXME: This is a gross hack. */
2286 alloc = demangle (cur_bfd, name);
2287 (*current)->name = alloc;
2288 bfd_print_symbol (cur_bfd, stdout, *current,
2289 bfd_print_symbol_all);
2290 (*current)->name = name;
2291 free (alloc);
2292 }
2293 else
2294 bfd_print_symbol (cur_bfd, stdout, *current,
2295 bfd_print_symbol_all);
2296 }
2297
2298 printf ("\n");
2299 current++;
2300 }
2301 printf ("\n\n");
2302 }
2303 \f
2304 static void
2305 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2306 {
2307 arelent **p;
2308 char *last_filename, *last_functionname;
2309 unsigned int last_line;
2310
2311 /* Get column headers lined up reasonably. */
2312 {
2313 static int width;
2314
2315 if (width == 0)
2316 {
2317 char buf[30];
2318
2319 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2320 width = strlen (buf) - 7;
2321 }
2322 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2323 }
2324
2325 last_filename = NULL;
2326 last_functionname = NULL;
2327 last_line = 0;
2328
2329 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2330 {
2331 arelent *q = *p;
2332 const char *filename, *functionname;
2333 unsigned int line;
2334 const char *sym_name;
2335 const char *section_name;
2336
2337 if (start_address != (bfd_vma) -1
2338 && q->address < start_address)
2339 continue;
2340 if (stop_address != (bfd_vma) -1
2341 && q->address > stop_address)
2342 continue;
2343
2344 if (with_line_numbers
2345 && sec != NULL
2346 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2347 &filename, &functionname, &line))
2348 {
2349 if (functionname != NULL
2350 && (last_functionname == NULL
2351 || strcmp (functionname, last_functionname) != 0))
2352 {
2353 printf ("%s():\n", functionname);
2354 if (last_functionname != NULL)
2355 free (last_functionname);
2356 last_functionname = xstrdup (functionname);
2357 }
2358
2359 if (line > 0
2360 && (line != last_line
2361 || (filename != NULL
2362 && last_filename != NULL
2363 && strcmp (filename, last_filename) != 0)))
2364 {
2365 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2366 last_line = line;
2367 if (last_filename != NULL)
2368 free (last_filename);
2369 if (filename == NULL)
2370 last_filename = NULL;
2371 else
2372 last_filename = xstrdup (filename);
2373 }
2374 }
2375
2376 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2377 {
2378 sym_name = (*(q->sym_ptr_ptr))->name;
2379 section_name = (*(q->sym_ptr_ptr))->section->name;
2380 }
2381 else
2382 {
2383 sym_name = NULL;
2384 section_name = NULL;
2385 }
2386
2387 if (sym_name)
2388 {
2389 bfd_printf_vma (abfd, q->address);
2390 if (q->howto->name)
2391 printf (" %-16s ", q->howto->name);
2392 else
2393 printf (" %-16d ", q->howto->type);
2394 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2395 }
2396 else
2397 {
2398 if (section_name == NULL)
2399 section_name = "*unknown*";
2400 bfd_printf_vma (abfd, q->address);
2401 printf (" %-16s [%s]",
2402 q->howto->name,
2403 section_name);
2404 }
2405
2406 if (q->addend)
2407 {
2408 printf ("+0x");
2409 bfd_printf_vma (abfd, q->addend);
2410 }
2411
2412 printf ("\n");
2413 }
2414 }
2415
2416 static void
2417 dump_relocs_in_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2418 {
2419 arelent **relpp;
2420 long relcount;
2421 long relsize;
2422
2423 if ( bfd_is_abs_section (section)
2424 || bfd_is_und_section (section)
2425 || bfd_is_com_section (section)
2426 || (! process_section_p (section))
2427 || ((section->flags & SEC_RELOC) == 0))
2428 return;
2429
2430 relsize = bfd_get_reloc_upper_bound (abfd, section);
2431 if (relsize < 0)
2432 bfd_fatal (bfd_get_filename (abfd));
2433
2434 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2435
2436 if (relsize == 0)
2437 {
2438 printf (" (none)\n\n");
2439 return;
2440 }
2441
2442 relpp = xmalloc (relsize);
2443 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2444
2445 if (relcount < 0)
2446 bfd_fatal (bfd_get_filename (abfd));
2447 else if (relcount == 0)
2448 printf (" (none)\n\n");
2449 else
2450 {
2451 printf ("\n");
2452 dump_reloc_set (abfd, section, relpp, relcount);
2453 printf ("\n\n");
2454 }
2455 free (relpp);
2456 }
2457
2458 static void
2459 dump_relocs (bfd *abfd)
2460 {
2461 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2462 }
2463
2464 static void
2465 dump_dynamic_relocs (bfd *abfd)
2466 {
2467 long relsize;
2468 arelent **relpp;
2469 long relcount;
2470
2471 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2472 if (relsize < 0)
2473 bfd_fatal (bfd_get_filename (abfd));
2474
2475 printf ("DYNAMIC RELOCATION RECORDS");
2476
2477 if (relsize == 0)
2478 printf (" (none)\n\n");
2479 else
2480 {
2481 relpp = xmalloc (relsize);
2482 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2483
2484 if (relcount < 0)
2485 bfd_fatal (bfd_get_filename (abfd));
2486 else if (relcount == 0)
2487 printf (" (none)\n\n");
2488 else
2489 {
2490 printf ("\n");
2491 dump_reloc_set (abfd, NULL, relpp, relcount);
2492 printf ("\n\n");
2493 }
2494 free (relpp);
2495 }
2496 }
2497
2498 /* Creates a table of paths, to search for source files. */
2499
2500 static void
2501 add_include_path (const char *path)
2502 {
2503 if (path[0] == 0)
2504 return;
2505 include_path_count++;
2506 include_paths = xrealloc (include_paths,
2507 include_path_count * sizeof (*include_paths));
2508 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2509 if (path[1] == ':' && path[2] == 0)
2510 path = concat (path, ".", (const char *) 0);
2511 #endif
2512 include_paths[include_path_count - 1] = path;
2513 }
2514
2515 static void
2516 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *dummy ATTRIBUTE_UNUSED)
2517 {
2518 section->vma += adjust_section_vma;
2519 section->lma += adjust_section_vma;
2520 }
2521
2522 /* Dump selected contents of ABFD. */
2523
2524 static void
2525 dump_bfd (bfd *abfd)
2526 {
2527 /* If we are adjusting section VMA's, change them all now. Changing
2528 the BFD information is a hack. However, we must do it, or
2529 bfd_find_nearest_line will not do the right thing. */
2530 if (adjust_section_vma != 0)
2531 bfd_map_over_sections (abfd, adjust_addresses, NULL);
2532
2533 if (! dump_debugging_tags)
2534 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2535 abfd->xvec->name);
2536 if (dump_ar_hdrs)
2537 print_arelt_descr (stdout, abfd, TRUE);
2538 if (dump_file_header)
2539 dump_bfd_header (abfd);
2540 if (dump_private_headers)
2541 dump_bfd_private_header (abfd);
2542 if (! dump_debugging_tags)
2543 putchar ('\n');
2544 if (dump_section_headers)
2545 dump_headers (abfd);
2546
2547 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2548 syms = slurp_symtab (abfd);
2549 if (dump_dynamic_symtab || dump_dynamic_reloc_info)
2550 dynsyms = slurp_dynamic_symtab (abfd);
2551
2552 if (dump_symtab)
2553 dump_symbols (abfd, FALSE);
2554 if (dump_dynamic_symtab)
2555 dump_symbols (abfd, TRUE);
2556 if (dump_stab_section_info)
2557 dump_stabs (abfd);
2558 if (dump_reloc_info && ! disassemble)
2559 dump_relocs (abfd);
2560 if (dump_dynamic_reloc_info && ! disassemble)
2561 dump_dynamic_relocs (abfd);
2562 if (dump_section_contents)
2563 dump_data (abfd);
2564 if (disassemble)
2565 disassemble_data (abfd);
2566
2567 if (dump_debugging)
2568 {
2569 void *dhandle;
2570
2571 dhandle = read_debugging_info (abfd, syms, symcount);
2572 if (dhandle != NULL)
2573 {
2574 if (! print_debugging_info (stdout, dhandle, abfd, syms, demangle,
2575 dump_debugging_tags ? TRUE : FALSE))
2576 {
2577 non_fatal (_("%s: printing debugging information failed"),
2578 bfd_get_filename (abfd));
2579 exit_status = 1;
2580 }
2581 }
2582 }
2583
2584 if (syms)
2585 {
2586 free (syms);
2587 syms = NULL;
2588 }
2589
2590 if (dynsyms)
2591 {
2592 free (dynsyms);
2593 dynsyms = NULL;
2594 }
2595 }
2596
2597 static void
2598 display_bfd (bfd *abfd)
2599 {
2600 char **matching;
2601
2602 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2603 {
2604 dump_bfd (abfd);
2605 return;
2606 }
2607
2608 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2609 {
2610 nonfatal (bfd_get_filename (abfd));
2611 list_matching_formats (matching);
2612 free (matching);
2613 return;
2614 }
2615
2616 if (bfd_get_error () != bfd_error_file_not_recognized)
2617 {
2618 nonfatal (bfd_get_filename (abfd));
2619 return;
2620 }
2621
2622 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2623 {
2624 dump_bfd (abfd);
2625 return;
2626 }
2627
2628 nonfatal (bfd_get_filename (abfd));
2629
2630 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2631 {
2632 list_matching_formats (matching);
2633 free (matching);
2634 }
2635 }
2636
2637 static void
2638 display_file (char *filename, char *target)
2639 {
2640 bfd *file, *arfile = NULL;
2641
2642 file = bfd_openr (filename, target);
2643 if (file == NULL)
2644 {
2645 nonfatal (filename);
2646 return;
2647 }
2648
2649 /* If the file is an archive, process all of its elements. */
2650 if (bfd_check_format (file, bfd_archive))
2651 {
2652 bfd *last_arfile = NULL;
2653
2654 printf (_("In archive %s:\n"), bfd_get_filename (file));
2655 for (;;)
2656 {
2657 bfd_set_error (bfd_error_no_error);
2658
2659 arfile = bfd_openr_next_archived_file (file, arfile);
2660 if (arfile == NULL)
2661 {
2662 if (bfd_get_error () != bfd_error_no_more_archived_files)
2663 nonfatal (bfd_get_filename (file));
2664 break;
2665 }
2666
2667 display_bfd (arfile);
2668
2669 if (last_arfile != NULL)
2670 bfd_close (last_arfile);
2671 last_arfile = arfile;
2672 }
2673
2674 if (last_arfile != NULL)
2675 bfd_close (last_arfile);
2676 }
2677 else
2678 display_bfd (file);
2679
2680 bfd_close (file);
2681 }
2682 \f
2683 int
2684 main (int argc, char **argv)
2685 {
2686 int c;
2687 char *target = default_target;
2688 bfd_boolean seenflag = FALSE;
2689
2690 #if defined (HAVE_SETLOCALE)
2691 #if defined (HAVE_LC_MESSAGES)
2692 setlocale (LC_MESSAGES, "");
2693 #endif
2694 setlocale (LC_CTYPE, "");
2695 #endif
2696
2697 bindtextdomain (PACKAGE, LOCALEDIR);
2698 textdomain (PACKAGE);
2699
2700 program_name = *argv;
2701 xmalloc_set_program_name (program_name);
2702
2703 START_PROGRESS (program_name, 0);
2704
2705 bfd_init ();
2706 set_default_bfd_target ();
2707
2708 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeG",
2709 long_options, (int *) 0))
2710 != EOF)
2711 {
2712 switch (c)
2713 {
2714 case 0:
2715 break; /* We've been given a long option. */
2716 case 'm':
2717 machine = optarg;
2718 break;
2719 case 'M':
2720 if (disassembler_options)
2721 /* Ignore potential memory leak for now. */
2722 disassembler_options = concat (disassembler_options, ",",
2723 optarg, NULL);
2724 else
2725 disassembler_options = optarg;
2726 break;
2727 case 'j':
2728 if (only_used == only_size)
2729 {
2730 only_size += 8;
2731 only = xrealloc (only, only_size * sizeof (char *));
2732 }
2733 only [only_used++] = optarg;
2734 break;
2735 case 'l':
2736 with_line_numbers = TRUE;
2737 break;
2738 case 'b':
2739 target = optarg;
2740 break;
2741 case 'C':
2742 do_demangle = TRUE;
2743 if (optarg != NULL)
2744 {
2745 enum demangling_styles style;
2746
2747 style = cplus_demangle_name_to_style (optarg);
2748 if (style == unknown_demangling)
2749 fatal (_("unknown demangling style `%s'"),
2750 optarg);
2751
2752 cplus_demangle_set_style (style);
2753 }
2754 break;
2755 case 'w':
2756 wide_output = TRUE;
2757 break;
2758 case OPTION_ADJUST_VMA:
2759 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2760 break;
2761 case OPTION_START_ADDRESS:
2762 start_address = parse_vma (optarg, "--start-address");
2763 break;
2764 case OPTION_STOP_ADDRESS:
2765 stop_address = parse_vma (optarg, "--stop-address");
2766 break;
2767 case 'E':
2768 if (strcmp (optarg, "B") == 0)
2769 endian = BFD_ENDIAN_BIG;
2770 else if (strcmp (optarg, "L") == 0)
2771 endian = BFD_ENDIAN_LITTLE;
2772 else
2773 {
2774 non_fatal (_("unrecognized -E option"));
2775 usage (stderr, 1);
2776 }
2777 break;
2778 case OPTION_ENDIAN:
2779 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2780 endian = BFD_ENDIAN_BIG;
2781 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2782 endian = BFD_ENDIAN_LITTLE;
2783 else
2784 {
2785 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2786 usage (stderr, 1);
2787 }
2788 break;
2789
2790 case 'f':
2791 dump_file_header = TRUE;
2792 seenflag = TRUE;
2793 break;
2794 case 'i':
2795 formats_info = TRUE;
2796 seenflag = TRUE;
2797 break;
2798 case 'I':
2799 add_include_path (optarg);
2800 break;
2801 case 'p':
2802 dump_private_headers = TRUE;
2803 seenflag = TRUE;
2804 break;
2805 case 'x':
2806 dump_private_headers = TRUE;
2807 dump_symtab = TRUE;
2808 dump_reloc_info = TRUE;
2809 dump_file_header = TRUE;
2810 dump_ar_hdrs = TRUE;
2811 dump_section_headers = TRUE;
2812 seenflag = TRUE;
2813 break;
2814 case 't':
2815 dump_symtab = TRUE;
2816 seenflag = TRUE;
2817 break;
2818 case 'T':
2819 dump_dynamic_symtab = TRUE;
2820 seenflag = TRUE;
2821 break;
2822 case 'd':
2823 disassemble = TRUE;
2824 seenflag = TRUE;
2825 break;
2826 case 'z':
2827 disassemble_zeroes = TRUE;
2828 break;
2829 case 'D':
2830 disassemble = TRUE;
2831 disassemble_all = TRUE;
2832 seenflag = TRUE;
2833 break;
2834 case 'S':
2835 disassemble = TRUE;
2836 with_source_code = TRUE;
2837 seenflag = TRUE;
2838 break;
2839 case 'g':
2840 dump_debugging = 1;
2841 seenflag = TRUE;
2842 break;
2843 case 'e':
2844 dump_debugging = 1;
2845 dump_debugging_tags = 1;
2846 do_demangle = TRUE;
2847 seenflag = TRUE;
2848 break;
2849 case 'G':
2850 dump_stab_section_info = TRUE;
2851 seenflag = TRUE;
2852 break;
2853 case 's':
2854 dump_section_contents = TRUE;
2855 seenflag = TRUE;
2856 break;
2857 case 'r':
2858 dump_reloc_info = TRUE;
2859 seenflag = TRUE;
2860 break;
2861 case 'R':
2862 dump_dynamic_reloc_info = TRUE;
2863 seenflag = TRUE;
2864 break;
2865 case 'a':
2866 dump_ar_hdrs = TRUE;
2867 seenflag = TRUE;
2868 break;
2869 case 'h':
2870 dump_section_headers = TRUE;
2871 seenflag = TRUE;
2872 break;
2873 case 'H':
2874 usage (stdout, 0);
2875 seenflag = TRUE;
2876 case 'v':
2877 case 'V':
2878 show_version = TRUE;
2879 seenflag = TRUE;
2880 break;
2881
2882 default:
2883 usage (stderr, 1);
2884 }
2885 }
2886
2887 if (show_version)
2888 print_version ("objdump");
2889
2890 if (!seenflag)
2891 usage (stderr, 2);
2892
2893 if (formats_info)
2894 exit_status = display_info ();
2895 else
2896 {
2897 if (optind == argc)
2898 display_file ("a.out", target);
2899 else
2900 for (; optind < argc;)
2901 display_file (argv[optind++], target);
2902 }
2903
2904 END_PROGRESS (program_name);
2905
2906 return exit_status;
2907 }
This page took 0.145792 seconds and 5 git commands to generate.