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