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