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