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