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