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