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