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