Don't include libbfd.h outside of bfd, part 5
[deliverable/binutils-gdb.git] / binutils / nm.c
CommitLineData
252b5132 1/* nm.c -- Describe symbol table of a rel file.
6f2750fe 2 Copyright (C) 1991-2016 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
32866df7 8 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
b43b5d5f
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
3db64b00 21#include "sysdep.h"
252b5132
RH
22#include "bfd.h"
23#include "progress.h"
252b5132
RH
24#include "getopt.h"
25#include "aout/stab_gnu.h"
26#include "aout/ranlib.h"
27#include "demangle.h"
28#include "libiberty.h"
6ab6b380 29#include "elf-bfd.h"
33f5f537 30#include "elf/common.h"
552e55ed
JB
31#define DO_NOT_DEFINE_AOUTHDR
32#define DO_NOT_DEFINE_FILHDR
33#define DO_NOT_DEFINE_LINENO
34#define DO_NOT_DEFINE_SCNHDR
35#include "coff/external.h"
36#include "coff/internal.h"
37#include "libcoff.h"
3db64b00 38#include "bucomm.h"
ce3c775b 39#include "plugin.h"
252b5132
RH
40
41/* When sorting by size, we use this structure to hold the size and a
42 pointer to the minisymbol. */
43
44struct size_sym
45{
2da42df6 46 const void *minisym;
252b5132
RH
47 bfd_vma size;
48};
49
50/* When fetching relocs, we use this structure to pass information to
51 get_relocs. */
52
53struct get_relocs_info
54{
55 asection **secs;
56 arelent ***relocs;
57 long *relcount;
58 asymbol **syms;
59};
60
9710509e 61struct extended_symbol_info
977f7911
NC
62{
63 symbol_info *sinfo;
64 bfd_vma ssize;
33f5f537 65 elf_symbol_type *elfinfo;
552e55ed 66 coff_symbol_type *coffinfo;
977f7911
NC
67 /* FIXME: We should add more fields for Type, Line, Section. */
68};
69#define SYM_NAME(sym) (sym->sinfo->name)
70#define SYM_VALUE(sym) (sym->sinfo->value)
71#define SYM_TYPE(sym) (sym->sinfo->type)
72#define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
73#define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
74#define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
33f5f537
L
75#define SYM_SIZE(sym) \
76 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
977f7911 77
252b5132 78/* The output formatting functions. */
2da42df6
AJ
79static void print_object_filename_bsd (char *);
80static void print_object_filename_sysv (char *);
81static void print_object_filename_posix (char *);
82static void print_archive_filename_bsd (char *);
83static void print_archive_filename_sysv (char *);
84static void print_archive_filename_posix (char *);
85static void print_archive_member_bsd (char *, const char *);
86static void print_archive_member_sysv (char *, const char *);
87static void print_archive_member_posix (char *, const char *);
88static void print_symbol_filename_bsd (bfd *, bfd *);
89static void print_symbol_filename_sysv (bfd *, bfd *);
90static void print_symbol_filename_posix (bfd *, bfd *);
91static void print_value (bfd *, bfd_vma);
92static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *);
93static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *);
94static void print_symbol_info_posix (struct extended_symbol_info *, bfd *);
252b5132
RH
95
96/* Support for different output formats. */
97struct output_fns
98 {
99 /* Print the name of an object file given on the command line. */
2da42df6 100 void (*print_object_filename) (char *);
252b5132
RH
101
102 /* Print the name of an archive file given on the command line. */
2da42df6 103 void (*print_archive_filename) (char *);
252b5132
RH
104
105 /* Print the name of an archive member file. */
2da42df6 106 void (*print_archive_member) (char *, const char *);
252b5132
RH
107
108 /* Print the name of the file (and archive, if there is one)
109 containing a symbol. */
2da42df6 110 void (*print_symbol_filename) (bfd *, bfd *);
252b5132
RH
111
112 /* Print a line of information about a symbol. */
2da42df6 113 void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
252b5132 114 };
977f7911 115
252b5132
RH
116static struct output_fns formats[] =
117{
118 {print_object_filename_bsd,
119 print_archive_filename_bsd,
120 print_archive_member_bsd,
121 print_symbol_filename_bsd,
122 print_symbol_info_bsd},
123 {print_object_filename_sysv,
124 print_archive_filename_sysv,
125 print_archive_member_sysv,
126 print_symbol_filename_sysv,
127 print_symbol_info_sysv},
128 {print_object_filename_posix,
129 print_archive_filename_posix,
130 print_archive_member_posix,
131 print_symbol_filename_posix,
132 print_symbol_info_posix}
133};
134
135/* Indices in `formats'. */
136#define FORMAT_BSD 0
137#define FORMAT_SYSV 1
138#define FORMAT_POSIX 2
139#define FORMAT_DEFAULT FORMAT_BSD
140
141/* The output format to use. */
142static struct output_fns *format = &formats[FORMAT_DEFAULT];
143
252b5132
RH
144/* Command options. */
145
146static int do_demangle = 0; /* Pretty print C++ symbol names. */
977f7911
NC
147static int external_only = 0; /* Print external symbols only. */
148static int defined_only = 0; /* Print defined symbols only. */
149static int no_sort = 0; /* Don't sort; print syms in order found. */
150static int print_debug_syms = 0;/* Print debugger-only symbols too. */
151static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
72797995 152static int print_size = 0; /* Print size of defined symbols. */
977f7911
NC
153static int reverse_sort = 0; /* Sort in downward(alpha or numeric) order. */
154static int sort_numerically = 0;/* Sort in numeric rather than alpha order. */
155static int sort_by_size = 0; /* Sort by size of symbol. */
156static int undefined_only = 0; /* Print undefined symbols only. */
157static int dynamic = 0; /* Print dynamic symbols. */
158static int show_version = 0; /* Show the version number. */
159static int show_stats = 0; /* Show statistics. */
0873df2a 160static int show_synthetic = 0; /* Display synthesized symbols too. */
977f7911 161static int line_numbers = 0; /* Print line numbers for symbols. */
3c9458e9 162static int allow_special_symbols = 0; /* Allow special symbols. */
252b5132
RH
163
164/* When to print the names of files. Not mutually exclusive in SYSV format. */
165static int filename_per_file = 0; /* Once per file, on its own line. */
166static int filename_per_symbol = 0; /* Once per symbol, at start of line. */
167
168/* Print formats for printing a symbol value. */
970ccc77 169static char value_format_32bit[] = "%08lx";
39dbeff8 170#if BFD_HOST_64BIT_LONG
970ccc77 171static char value_format_64bit[] = "%016lx";
39dbeff8 172#elif BFD_HOST_64BIT_LONG_LONG
a46d1146 173#ifndef __MSVCRT__
39dbeff8 174static char value_format_64bit[] = "%016llx";
a46d1146
JM
175#else
176static char value_format_64bit[] = "%016I64x";
177#endif
39dbeff8 178#endif
970ccc77 179static int print_width = 0;
252b5132
RH
180static int print_radix = 16;
181/* Print formats for printing stab info. */
182static char other_format[] = "%02x";
183static char desc_format[] = "%04x";
184
185static char *target = NULL;
92b1b678
MT
186#if BFD_SUPPORTS_PLUGINS
187static const char *plugin_target = "plugin";
188#else
189static const char *plugin_target = NULL;
190#endif
252b5132
RH
191
192/* Used to cache the line numbers for a BFD. */
193static bfd *lineno_cache_bfd;
194static bfd *lineno_cache_rel_bfd;
195
c20f4f8c 196#define OPTION_TARGET 200
ddb1377c
AM
197#define OPTION_PLUGIN (OPTION_TARGET + 1)
198#define OPTION_SIZE_SORT (OPTION_PLUGIN + 1)
c20f4f8c 199
252b5132
RH
200static struct option long_options[] =
201{
202 {"debug-syms", no_argument, &print_debug_syms, 1},
28c309a2 203 {"demangle", optional_argument, 0, 'C'},
252b5132
RH
204 {"dynamic", no_argument, &dynamic, 1},
205 {"extern-only", no_argument, &external_only, 1},
206 {"format", required_argument, 0, 'f'},
207 {"help", no_argument, 0, 'h'},
208 {"line-numbers", no_argument, 0, 'l'},
209 {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
210 {"no-demangle", no_argument, &do_demangle, 0},
ddb1377c
AM
211 {"no-sort", no_argument, 0, 'p'},
212 {"numeric-sort", no_argument, 0, 'n'},
ce3c775b 213 {"plugin", required_argument, 0, OPTION_PLUGIN},
252b5132
RH
214 {"portability", no_argument, 0, 'P'},
215 {"print-armap", no_argument, &print_armap, 1},
216 {"print-file-name", no_argument, 0, 'o'},
72797995 217 {"print-size", no_argument, 0, 'S'},
252b5132
RH
218 {"radix", required_argument, 0, 't'},
219 {"reverse-sort", no_argument, &reverse_sort, 1},
ddb1377c 220 {"size-sort", no_argument, 0, OPTION_SIZE_SORT},
3c9458e9 221 {"special-syms", no_argument, &allow_special_symbols, 1},
252b5132 222 {"stats", no_argument, &show_stats, 1},
0873df2a 223 {"synthetic", no_argument, &show_synthetic, 1},
c20f4f8c 224 {"target", required_argument, 0, OPTION_TARGET},
252b5132
RH
225 {"defined-only", no_argument, &defined_only, 1},
226 {"undefined-only", no_argument, &undefined_only, 1},
227 {"version", no_argument, &show_version, 1},
228 {0, no_argument, 0, 0}
229};
230\f
977f7911 231/* Some error-reporting functions. */
252b5132
RH
232
233static void
2da42df6 234usage (FILE *stream, int status)
252b5132 235{
8b53311e
NC
236 fprintf (stream, _("Usage: %s [option(s)] [file(s)]\n"), program_name);
237 fprintf (stream, _(" List symbols in [file(s)] (a.out by default).\n"));
238 fprintf (stream, _(" The options are:\n\
b56f55ce
NC
239 -a, --debug-syms Display debugger-only symbols\n\
240 -A, --print-file-name Print name of the input file before every symbol\n\
241 -B Same as --format=bsd\n\
28c309a2
NC
242 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
243 The STYLE, if specified, can be `auto' (the default),\n\
f0c8c24a
NC
244 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
245 or `gnat'\n\
b56f55ce
NC
246 --no-demangle Do not demangle low-level symbol names\n\
247 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
248 --defined-only Display only defined symbols\n\
249 -e (ignored)\n\
250 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
251 `sysv' or `posix'. The default is `bsd'\n\
252 -g, --extern-only Display only external symbols\n\
b56f55ce
NC
253 -l, --line-numbers Use debugging information to find a filename and\n\
254 line number for each symbol\n\
255 -n, --numeric-sort Sort symbols numerically by address\n\
256 -o Same as -A\n\
257 -p, --no-sort Do not sort the symbols\n\
258 -P, --portability Same as --format=posix\n\
d46fc8e8 259 -r, --reverse-sort Reverse the sense of the sort\n"));
ce3c775b 260#if BFD_SUPPORTS_PLUGINS
d46fc8e8
NC
261 fprintf (stream, _("\
262 --plugin NAME Load the specified plugin\n"));
ce3c775b 263#endif
d46fc8e8 264 fprintf (stream, _("\
d2ca6b5b 265 -S, --print-size Print size of defined symbols\n\
b56f55ce
NC
266 -s, --print-armap Include index for symbols from archive members\n\
267 --size-sort Sort symbols by size\n\
61bbd35b 268 --special-syms Include special symbols in the output\n\
0873df2a 269 --synthetic Display synthetic symbols as well\n\
b56f55ce
NC
270 -t, --radix=RADIX Use RADIX for printing symbol values\n\
271 --target=BFDNAME Specify the target object format as BFDNAME\n\
272 -u, --undefined-only Display only undefined symbols\n\
6e800839 273 -X 32_64 (ignored)\n\
07012eee 274 @FILE Read options from FILE\n\
8b53311e
NC
275 -h, --help Display this information\n\
276 -V, --version Display this program's version number\n\
b56f55ce 277\n"));
252b5132 278 list_supported_targets (program_name, stream);
92f01d61 279 if (REPORT_BUGS_TO[0] && status == 0)
b56f55ce 280 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
252b5132
RH
281 exit (status);
282}
283
284/* Set the radix for the symbol value and size according to RADIX. */
285
286static void
2da42df6 287set_print_radix (char *radix)
252b5132
RH
288{
289 switch (*radix)
290 {
291 case 'x':
292 break;
293 case 'd':
294 case 'o':
295 if (*radix == 'd')
296 print_radix = 10;
297 else
298 print_radix = 8;
970ccc77 299 value_format_32bit[4] = *radix;
39dbeff8 300#if BFD_HOST_64BIT_LONG
970ccc77 301 value_format_64bit[5] = *radix;
39dbeff8 302#elif BFD_HOST_64BIT_LONG_LONG
a46d1146 303#ifndef __MSVCRT__
39dbeff8 304 value_format_64bit[6] = *radix;
a46d1146
JM
305#else
306 value_format_64bit[7] = *radix;
307#endif
39dbeff8 308#endif
252b5132
RH
309 other_format[3] = desc_format[3] = *radix;
310 break;
311 default:
37cc8ec1 312 fatal (_("%s: invalid radix"), radix);
252b5132
RH
313 }
314}
315
316static void
2da42df6 317set_output_format (char *f)
252b5132
RH
318{
319 int i;
320
321 switch (*f)
322 {
323 case 'b':
324 case 'B':
325 i = FORMAT_BSD;
326 break;
327 case 'p':
328 case 'P':
329 i = FORMAT_POSIX;
330 break;
331 case 's':
332 case 'S':
333 i = FORMAT_SYSV;
334 break;
335 default:
37cc8ec1 336 fatal (_("%s: invalid output format"), f);
252b5132
RH
337 }
338 format = &formats[i];
339}
340\f
33f5f537 341static const char *
552e55ed 342get_elf_symbol_type (unsigned int type)
33f5f537
L
343{
344 static char buff [32];
345
346 switch (type)
347 {
348 case STT_NOTYPE: return "NOTYPE";
349 case STT_OBJECT: return "OBJECT";
350 case STT_FUNC: return "FUNC";
351 case STT_SECTION: return "SECTION";
352 case STT_FILE: return "FILE";
353 case STT_COMMON: return "COMMON";
354 case STT_TLS: return "TLS";
355 default:
356 if (type >= STT_LOPROC && type <= STT_HIPROC)
357 sprintf (buff, _("<processor specific>: %d"), type);
358 else if (type >= STT_LOOS && type <= STT_HIOS)
359 sprintf (buff, _("<OS specific>: %d"), type);
360 else
361 sprintf (buff, _("<unknown>: %d"), type);
362 return buff;
363 }
364}
552e55ed
JB
365
366static const char *
367get_coff_symbol_type (const struct internal_syment *sym)
368{
369 static char buff [32];
370
371 switch (sym->n_sclass)
372 {
373 case C_BLOCK: return "Block";
374 case C_FILE: return "File";
375 case C_LINE: return "Line";
376 }
377
378 if (!sym->n_type)
379 return "None";
380
381 switch (DTYPE(sym->n_type))
382 {
383 case DT_FCN: return "Function";
384 case DT_PTR: return "Pointer";
385 case DT_ARY: return "Array";
386 }
387
388 sprintf (buff, _("<unknown>: %d/%d"), sym->n_sclass, sym->n_type);
389 return buff;
390}
382c1116 391\f
91d6fa6a 392/* Print symbol name NAME, read from ABFD, with printf format FORM,
382c1116 393 demangling it if requested. */
33f5f537 394
252b5132 395static void
91d6fa6a 396print_symname (const char *form, const char *name, bfd *abfd)
252b5132 397{
382c1116 398 if (do_demangle && *name)
252b5132 399 {
ed180cc5
AM
400 char *res = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
401
402 if (res != NULL)
403 {
91d6fa6a 404 printf (form, res);
ed180cc5
AM
405 free (res);
406 return;
407 }
382c1116 408 }
252b5132 409
91d6fa6a 410 printf (form, name);
382c1116 411}
252b5132 412
382c1116
NC
413static void
414print_symdef_entry (bfd *abfd)
415{
416 symindex idx = BFD_NO_MORE_SYMBOLS;
417 carsym *thesym;
418 bfd_boolean everprinted = FALSE;
33f5f537 419
382c1116
NC
420 for (idx = bfd_get_next_mapent (abfd, idx, &thesym);
421 idx != BFD_NO_MORE_SYMBOLS;
422 idx = bfd_get_next_mapent (abfd, idx, &thesym))
423 {
424 bfd *elt;
425 if (!everprinted)
252b5132 426 {
382c1116
NC
427 printf (_("\nArchive index:\n"));
428 everprinted = TRUE;
252b5132 429 }
382c1116
NC
430 elt = bfd_get_elt_at_index (abfd, idx);
431 if (elt == NULL)
432 bfd_fatal ("bfd_get_elt_at_index");
433 if (thesym->name != (char *) NULL)
252b5132 434 {
382c1116
NC
435 print_symname ("%s", thesym->name, abfd);
436 printf (" in %s\n", bfd_get_filename (elt));
252b5132 437 }
252b5132
RH
438 }
439}
382c1116
NC
440\f
441/* Choose which symbol entries to print;
442 compact them downward to get rid of the rest.
443 Return the number of symbols to be printed. */
252b5132 444
382c1116 445static long
91d6fa6a 446filter_symbols (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
382c1116 447 long symcount, unsigned int size)
252b5132 448{
382c1116
NC
449 bfd_byte *from, *fromend, *to;
450 asymbol *store;
252b5132 451
382c1116
NC
452 store = bfd_make_empty_symbol (abfd);
453 if (store == NULL)
454 bfd_fatal (bfd_get_filename (abfd));
f24ddbdd 455
382c1116
NC
456 from = (bfd_byte *) minisyms;
457 fromend = from + symcount * size;
458 to = (bfd_byte *) minisyms;
252b5132 459
382c1116 460 for (; from < fromend; from += size)
252b5132 461 {
382c1116
NC
462 int keep = 0;
463 asymbol *sym;
33f5f537 464
382c1116
NC
465 PROGRESS (1);
466
91d6fa6a 467 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from, store);
382c1116
NC
468 if (sym == NULL)
469 bfd_fatal (bfd_get_filename (abfd));
470
b794fc1d
AM
471 if (strcmp (sym->name, "__gnu_lto_slim") == 0)
472 non_fatal (_("%s: plugin needed to handle lto object"),
473 bfd_get_filename (abfd));
474
382c1116
NC
475 if (undefined_only)
476 keep = bfd_is_und_section (sym->section);
477 else if (external_only)
6a1b08f5
L
478 /* PR binutls/12753: Unique symbols are global too. */
479 keep = ((sym->flags & (BSF_GLOBAL
480 | BSF_WEAK
481 | BSF_GNU_UNIQUE)) != 0
382c1116
NC
482 || bfd_is_und_section (sym->section)
483 || bfd_is_com_section (sym->section));
484 else
485 keep = 1;
486
487 if (keep
488 && ! print_debug_syms
489 && (sym->flags & BSF_DEBUGGING) != 0)
490 keep = 0;
491
492 if (keep
493 && sort_by_size
494 && (bfd_is_abs_section (sym->section)
495 || bfd_is_und_section (sym->section)))
496 keep = 0;
497
498 if (keep
499 && defined_only)
252b5132 500 {
382c1116
NC
501 if (bfd_is_und_section (sym->section))
502 keep = 0;
252b5132 503 }
252b5132 504
3c9458e9
NC
505 if (keep
506 && bfd_is_target_special_symbol (abfd, sym)
507 && ! allow_special_symbols)
508 keep = 0;
509
382c1116
NC
510 if (keep)
511 {
ede76260
HPN
512 if (to != from)
513 memcpy (to, from, size);
382c1116
NC
514 to += size;
515 }
516 }
252b5132 517
382c1116 518 return (to - (bfd_byte *) minisyms) / size;
252b5132
RH
519}
520\f
521/* These globals are used to pass information into the sorting
522 routines. */
523static bfd *sort_bfd;
b34976b6 524static bfd_boolean sort_dynamic;
252b5132
RH
525static asymbol *sort_x;
526static asymbol *sort_y;
527
528/* Symbol-sorting predicates */
529#define valueof(x) ((x)->section->vma + (x)->value)
530
531/* Numeric sorts. Undefined symbols are always considered "less than"
532 defined symbols with zero values. Common symbols are not treated
533 specially -- i.e., their sizes are used as their "values". */
534
252b5132 535static int
2da42df6 536non_numeric_forward (const void *P_x, const void *P_y)
252b5132
RH
537{
538 asymbol *x, *y;
539 const char *xn, *yn;
540
541 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
542 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
543 if (x == NULL || y == NULL)
544 bfd_fatal (bfd_get_filename (sort_bfd));
545
546 xn = bfd_asymbol_name (x);
547 yn = bfd_asymbol_name (y);
548
9710509e
AM
549 if (yn == NULL)
550 return xn != NULL;
551 if (xn == NULL)
552 return -1;
553
554#ifdef HAVE_STRCOLL
555 /* Solaris 2.5 has a bug in strcoll.
556 strcoll returns invalid values when confronted with empty strings. */
557 if (*yn == '\0')
558 return *xn != '\0';
559 if (*xn == '\0')
560 return -1;
561
562 return strcoll (xn, yn);
563#else
564 return strcmp (xn, yn);
565#endif
252b5132
RH
566}
567
568static int
2da42df6 569non_numeric_reverse (const void *x, const void *y)
252b5132
RH
570{
571 return - non_numeric_forward (x, y);
572}
573
382c1116
NC
574static int
575numeric_forward (const void *P_x, const void *P_y)
576{
577 asymbol *x, *y;
578 asection *xs, *ys;
579
580 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
581 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
582 if (x == NULL || y == NULL)
583 bfd_fatal (bfd_get_filename (sort_bfd));
584
585 xs = bfd_get_section (x);
586 ys = bfd_get_section (y);
587
588 if (bfd_is_und_section (xs))
589 {
590 if (! bfd_is_und_section (ys))
591 return -1;
592 }
593 else if (bfd_is_und_section (ys))
594 return 1;
595 else if (valueof (x) != valueof (y))
596 return valueof (x) < valueof (y) ? -1 : 1;
597
598 return non_numeric_forward (P_x, P_y);
599}
600
601static int
602numeric_reverse (const void *x, const void *y)
603{
604 return - numeric_forward (x, y);
605}
606
2da42df6 607static int (*(sorters[2][2])) (const void *, const void *) =
252b5132
RH
608{
609 { non_numeric_forward, non_numeric_reverse },
610 { numeric_forward, numeric_reverse }
611};
612
613/* This sort routine is used by sort_symbols_by_size. It is similar
614 to numeric_forward, but when symbols have the same value it sorts
615 by section VMA. This simplifies the sort_symbols_by_size code
616 which handles symbols at the end of sections. Also, this routine
617 tries to sort file names before other symbols with the same value.
618 That will make the file name have a zero size, which will make
619 sort_symbols_by_size choose the non file name symbol, leading to
620 more meaningful output. For similar reasons, this code sorts
621 gnu_compiled_* and gcc2_compiled before other symbols with the same
622 value. */
623
624static int
2da42df6 625size_forward1 (const void *P_x, const void *P_y)
252b5132
RH
626{
627 asymbol *x, *y;
628 asection *xs, *ys;
629 const char *xn, *yn;
630 size_t xnl, ynl;
631 int xf, yf;
632
633 x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x);
634 y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y);
635 if (x == NULL || y == NULL)
636 bfd_fatal (bfd_get_filename (sort_bfd));
637
638 xs = bfd_get_section (x);
639 ys = bfd_get_section (y);
640
641 if (bfd_is_und_section (xs))
642 abort ();
643 if (bfd_is_und_section (ys))
644 abort ();
645
646 if (valueof (x) != valueof (y))
647 return valueof (x) < valueof (y) ? -1 : 1;
648
649 if (xs->vma != ys->vma)
650 return xs->vma < ys->vma ? -1 : 1;
651
652 xn = bfd_asymbol_name (x);
653 yn = bfd_asymbol_name (y);
654 xnl = strlen (xn);
655 ynl = strlen (yn);
656
657 /* The symbols gnu_compiled and gcc2_compiled convey even less
658 information than the file name, so sort them out first. */
659
660 xf = (strstr (xn, "gnu_compiled") != NULL
661 || strstr (xn, "gcc2_compiled") != NULL);
662 yf = (strstr (yn, "gnu_compiled") != NULL
663 || strstr (yn, "gcc2_compiled") != NULL);
664
665 if (xf && ! yf)
666 return -1;
667 if (! xf && yf)
668 return 1;
669
670 /* We use a heuristic for the file name. It may not work on non
671 Unix systems, but it doesn't really matter; the only difference
672 is precisely which symbol names get printed. */
673
674#define file_symbol(s, sn, snl) \
675 (((s)->flags & BSF_FILE) != 0 \
676 || ((sn)[(snl) - 2] == '.' \
677 && ((sn)[(snl) - 1] == 'o' \
678 || (sn)[(snl) - 1] == 'a')))
679
680 xf = file_symbol (x, xn, xnl);
681 yf = file_symbol (y, yn, ynl);
682
683 if (xf && ! yf)
684 return -1;
685 if (! xf && yf)
686 return 1;
687
688 return non_numeric_forward (P_x, P_y);
689}
690
691/* This sort routine is used by sort_symbols_by_size. It is sorting
692 an array of size_sym structures into size order. */
693
694static int
2da42df6 695size_forward2 (const void *P_x, const void *P_y)
252b5132
RH
696{
697 const struct size_sym *x = (const struct size_sym *) P_x;
698 const struct size_sym *y = (const struct size_sym *) P_y;
699
700 if (x->size < y->size)
701 return reverse_sort ? 1 : -1;
702 else if (x->size > y->size)
703 return reverse_sort ? -1 : 1;
704 else
705 return sorters[0][reverse_sort] (x->minisym, y->minisym);
706}
707
6ab6b380
NC
708/* Sort the symbols by size. ELF provides a size but for other formats
709 we have to make a guess by assuming that the difference between the
710 address of a symbol and the address of the next higher symbol is the
711 size. */
252b5132
RH
712
713static long
91d6fa6a 714sort_symbols_by_size (bfd *abfd, bfd_boolean is_dynamic, void *minisyms,
2da42df6
AJ
715 long symcount, unsigned int size,
716 struct size_sym **symsizesp)
252b5132
RH
717{
718 struct size_sym *symsizes;
719 bfd_byte *from, *fromend;
720 asymbol *sym = NULL;
721 asymbol *store_sym, *store_next;
722
723 qsort (minisyms, symcount, size, size_forward1);
724
725 /* We are going to return a special set of symbols and sizes to
726 print. */
3f5e193b 727 symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym));
252b5132
RH
728 *symsizesp = symsizes;
729
730 /* Note that filter_symbols has already removed all absolute and
731 undefined symbols. Here we remove all symbols whose size winds
732 up as zero. */
252b5132
RH
733 from = (bfd_byte *) minisyms;
734 fromend = from + symcount * size;
735
736 store_sym = sort_x;
737 store_next = sort_y;
738
739 if (from < fromend)
740 {
91d6fa6a 741 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, (const void *) from,
252b5132
RH
742 store_sym);
743 if (sym == NULL)
744 bfd_fatal (bfd_get_filename (abfd));
745 }
746
747 for (; from < fromend; from += size)
748 {
749 asymbol *next;
750 asection *sec;
751 bfd_vma sz;
752 asymbol *temp;
753
754 if (from + size < fromend)
755 {
756 next = bfd_minisymbol_to_symbol (abfd,
91d6fa6a 757 is_dynamic,
2da42df6 758 (const void *) (from + size),
252b5132
RH
759 store_next);
760 if (next == NULL)
761 bfd_fatal (bfd_get_filename (abfd));
762 }
763 else
764 next = NULL;
765
766 sec = bfd_get_section (sym);
767
9710509e 768 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
6ab6b380
NC
769 sz = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
770 else if (bfd_is_com_section (sec))
252b5132
RH
771 sz = sym->value;
772 else
773 {
774 if (from + size < fromend
775 && sec == bfd_get_section (next))
776 sz = valueof (next) - valueof (sym);
777 else
778 sz = (bfd_get_section_vma (abfd, sec)
779 + bfd_section_size (abfd, sec)
780 - valueof (sym));
781 }
782
783 if (sz != 0)
784 {
2da42df6 785 symsizes->minisym = (const void *) from;
252b5132
RH
786 symsizes->size = sz;
787 ++symsizes;
788 }
789
790 sym = next;
791
792 temp = store_sym;
793 store_sym = store_next;
794 store_next = temp;
795 }
796
797 symcount = symsizes - *symsizesp;
798
799 /* We must now sort again by size. */
2da42df6 800 qsort ((void *) *symsizesp, symcount, sizeof (struct size_sym), size_forward2);
252b5132
RH
801
802 return symcount;
803}
382c1116
NC
804
805/* This function is used to get the relocs for a particular section.
806 It is called via bfd_map_over_sections. */
252b5132
RH
807
808static void
382c1116 809get_relocs (bfd *abfd, asection *sec, void *dataarg)
252b5132 810{
382c1116 811 struct get_relocs_info *data = (struct get_relocs_info *) dataarg;
252b5132 812
382c1116
NC
813 *data->secs = sec;
814
815 if ((sec->flags & SEC_RELOC) == 0)
252b5132 816 {
382c1116
NC
817 *data->relocs = NULL;
818 *data->relcount = 0;
252b5132 819 }
382c1116
NC
820 else
821 {
822 long relsize;
252b5132 823
382c1116
NC
824 relsize = bfd_get_reloc_upper_bound (abfd, sec);
825 if (relsize < 0)
826 bfd_fatal (bfd_get_filename (abfd));
252b5132 827
3f5e193b 828 *data->relocs = (arelent **) xmalloc (relsize);
382c1116
NC
829 *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs,
830 data->syms);
831 if (*data->relcount < 0)
832 bfd_fatal (bfd_get_filename (abfd));
68a4c073 833 }
252b5132 834
382c1116
NC
835 ++data->secs;
836 ++data->relocs;
837 ++data->relcount;
838}
839
840/* Print a single symbol. */
841
842static void
896ca098
NC
843print_symbol (bfd * abfd,
844 asymbol * sym,
845 bfd_vma ssize,
846 bfd * archive_bfd,
847 bfd_boolean is_synthetic)
382c1116
NC
848{
849 symbol_info syminfo;
850 struct extended_symbol_info info;
851
852 PROGRESS (1);
853
854 format->print_symbol_filename (archive_bfd, abfd);
855
856 bfd_get_symbol_info (abfd, sym, &syminfo);
896ca098 857
382c1116
NC
858 info.sinfo = &syminfo;
859 info.ssize = ssize;
552e55ed
JB
860 /* Synthetic symbols do not have a full symbol type set of data available. */
861 if (is_synthetic)
862 {
863 info.elfinfo = NULL;
864 info.coffinfo = NULL;
865 }
866 else
867 {
868 info.elfinfo = elf_symbol_from (abfd, sym);
869 info.coffinfo = coff_symbol_from (sym);
870 }
896ca098 871
382c1116
NC
872 format->print_symbol_info (&info, abfd);
873
874 if (line_numbers)
0873df2a 875 {
382c1116
NC
876 static asymbol **syms;
877 static long symcount;
878 const char *filename, *functionname;
879 unsigned int lineno;
0873df2a 880
382c1116
NC
881 /* We need to get the canonical symbols in order to call
882 bfd_find_nearest_line. This is inefficient, but, then, you
883 don't have to use --line-numbers. */
884 if (abfd != lineno_cache_bfd && syms != NULL)
0873df2a 885 {
382c1116
NC
886 free (syms);
887 syms = NULL;
0873df2a 888 }
382c1116 889 if (syms == NULL)
0873df2a 890 {
382c1116
NC
891 long symsize;
892
893 symsize = bfd_get_symtab_upper_bound (abfd);
894 if (symsize < 0)
895 bfd_fatal (bfd_get_filename (abfd));
3f5e193b 896 syms = (asymbol **) xmalloc (symsize);
382c1116
NC
897 symcount = bfd_canonicalize_symtab (abfd, syms);
898 if (symcount < 0)
899 bfd_fatal (bfd_get_filename (abfd));
900 lineno_cache_bfd = abfd;
0873df2a 901 }
0873df2a 902
382c1116
NC
903 if (bfd_is_und_section (bfd_get_section (sym)))
904 {
905 static asection **secs;
906 static arelent ***relocs;
907 static long *relcount;
908 static unsigned int seccount;
909 unsigned int i;
910 const char *symname;
0873df2a 911
382c1116
NC
912 /* For an undefined symbol, we try to find a reloc for the
913 symbol, and print the line number of the reloc. */
914 if (abfd != lineno_cache_rel_bfd && relocs != NULL)
915 {
916 for (i = 0; i < seccount; i++)
917 if (relocs[i] != NULL)
918 free (relocs[i]);
919 free (secs);
920 free (relocs);
921 free (relcount);
922 secs = NULL;
923 relocs = NULL;
924 relcount = NULL;
925 }
252b5132 926
382c1116
NC
927 if (relocs == NULL)
928 {
91d6fa6a 929 struct get_relocs_info rinfo;
252b5132 930
382c1116 931 seccount = bfd_count_sections (abfd);
252b5132 932
3f5e193b
NC
933 secs = (asection **) xmalloc (seccount * sizeof *secs);
934 relocs = (arelent ***) xmalloc (seccount * sizeof *relocs);
935 relcount = (long *) xmalloc (seccount * sizeof *relcount);
252b5132 936
91d6fa6a
NC
937 rinfo.secs = secs;
938 rinfo.relocs = relocs;
939 rinfo.relcount = relcount;
940 rinfo.syms = syms;
941 bfd_map_over_sections (abfd, get_relocs, (void *) &rinfo);
382c1116
NC
942 lineno_cache_rel_bfd = abfd;
943 }
252b5132 944
382c1116
NC
945 symname = bfd_asymbol_name (sym);
946 for (i = 0; i < seccount; i++)
947 {
948 long j;
949
950 for (j = 0; j < relcount[i]; j++)
951 {
952 arelent *r;
953
954 r = relocs[i][j];
955 if (r->sym_ptr_ptr != NULL
956 && (*r->sym_ptr_ptr)->section == sym->section
957 && (*r->sym_ptr_ptr)->value == sym->value
958 && strcmp (symname,
959 bfd_asymbol_name (*r->sym_ptr_ptr)) == 0
960 && bfd_find_nearest_line (abfd, secs[i], syms,
961 r->address, &filename,
962 &functionname, &lineno)
963 && filename != NULL)
964 {
965 /* We only print the first one we find. */
966 printf ("\t%s:%u", filename, lineno);
967 i = seccount;
968 break;
969 }
970 }
971 }
972 }
973 else if (bfd_get_section (sym)->owner == abfd)
974 {
5420f73d
L
975 if ((bfd_find_line (abfd, syms, sym, &filename, &lineno)
976 || bfd_find_nearest_line (abfd, bfd_get_section (sym),
977 syms, sym->value, &filename,
978 &functionname, &lineno))
382c1116
NC
979 && filename != NULL
980 && lineno != 0)
981 printf ("\t%s:%u", filename, lineno);
982 }
983 }
984
985 putchar ('\n');
252b5132
RH
986}
987\f
382c1116 988/* Print the symbols when sorting by size. */
252b5132 989
382c1116 990static void
896ca098
NC
991print_size_symbols (bfd * abfd,
992 bfd_boolean is_dynamic,
993 struct size_sym * symsizes,
994 long symcount,
995 long synth_count,
996 bfd * archive_bfd)
252b5132 997{
252b5132 998 asymbol *store;
896ca098
NC
999 struct size_sym *from;
1000 struct size_sym *fromend;
1001 struct size_sym *fromsynth;
252b5132
RH
1002
1003 store = bfd_make_empty_symbol (abfd);
1004 if (store == NULL)
1005 bfd_fatal (bfd_get_filename (abfd));
1006
382c1116
NC
1007 from = symsizes;
1008 fromend = from + symcount;
896ca098
NC
1009 fromsynth = symsizes + (symcount - synth_count);
1010
382c1116 1011 for (; from < fromend; from++)
252b5132 1012 {
252b5132
RH
1013 asymbol *sym;
1014
91d6fa6a 1015 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from->minisym, store);
252b5132
RH
1016 if (sym == NULL)
1017 bfd_fatal (bfd_get_filename (abfd));
1018
896ca098 1019 print_symbol (abfd, sym, from->size, archive_bfd, from >= fromsynth);
252b5132 1020 }
252b5132
RH
1021}
1022
382c1116 1023\f
896ca098
NC
1024/* Print the symbols of ABFD that are held in MINISYMS.
1025
1026 If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.
1027
1028 SYMCOUNT is the number of symbols in MINISYMS and SYNTH_COUNT
1029 is the number of these that are synthetic. Synthetic symbols,
1030 if any are present, always come at the end of the MINISYMS.
3aade688 1031
896ca098 1032 SIZE is the size of a symbol in MINISYMS. */
252b5132
RH
1033
1034static void
896ca098
NC
1035print_symbols (bfd * abfd,
1036 bfd_boolean is_dynamic,
1037 void * minisyms,
1038 long symcount,
1039 long synth_count,
1040 unsigned int size,
1041 bfd * archive_bfd)
252b5132
RH
1042{
1043 asymbol *store;
896ca098
NC
1044 bfd_byte *from;
1045 bfd_byte *fromend;
1046 bfd_byte *fromsynth;
252b5132
RH
1047
1048 store = bfd_make_empty_symbol (abfd);
1049 if (store == NULL)
1050 bfd_fatal (bfd_get_filename (abfd));
1051
1052 from = (bfd_byte *) minisyms;
1053 fromend = from + symcount * size;
896ca098
NC
1054 fromsynth = (bfd_byte *) minisyms + ((symcount - synth_count) * size);
1055
252b5132
RH
1056 for (; from < fromend; from += size)
1057 {
1058 asymbol *sym;
1059
91d6fa6a 1060 sym = bfd_minisymbol_to_symbol (abfd, is_dynamic, from, store);
252b5132
RH
1061 if (sym == NULL)
1062 bfd_fatal (bfd_get_filename (abfd));
1063
896ca098 1064 print_symbol (abfd, sym, (bfd_vma) 0, archive_bfd, from >= fromsynth);
252b5132
RH
1065 }
1066}
1067
382c1116 1068/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
252b5132 1069
0af11b59 1070static void
382c1116 1071display_rel_file (bfd *abfd, bfd *archive_bfd)
252b5132 1072{
382c1116 1073 long symcount;
896ca098 1074 long synth_count = 0;
382c1116
NC
1075 void *minisyms;
1076 unsigned int size;
1077 struct size_sym *symsizes;
252b5132 1078
382c1116
NC
1079 if (! dynamic)
1080 {
1081 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1082 {
1083 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1084 return;
1085 }
1086 }
1087
1088 symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size);
1089 if (symcount < 0)
bf26dcc6
NC
1090 {
1091 if (dynamic && bfd_get_error () == bfd_error_no_symbols)
1092 {
1093 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1094 return;
1095 }
9993a355 1096
bf26dcc6
NC
1097 bfd_fatal (bfd_get_filename (abfd));
1098 }
252b5132 1099
382c1116 1100 if (symcount == 0)
252b5132 1101 {
382c1116
NC
1102 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd));
1103 return;
1104 }
3aade688 1105
382c1116
NC
1106 if (show_synthetic && size == sizeof (asymbol *))
1107 {
1108 asymbol *synthsyms;
382c1116
NC
1109 asymbol **static_syms = NULL;
1110 asymbol **dyn_syms = NULL;
1111 long static_count = 0;
1112 long dyn_count = 0;
252b5132 1113
382c1116
NC
1114 if (dynamic)
1115 {
1116 dyn_count = symcount;
3f5e193b 1117 dyn_syms = (asymbol **) minisyms;
382c1116 1118 }
977f7911 1119 else
382c1116 1120 {
8615f3f2
AM
1121 long storage = bfd_get_dynamic_symtab_upper_bound (abfd);
1122
382c1116 1123 static_count = symcount;
3f5e193b 1124 static_syms = (asymbol **) minisyms;
8615f3f2
AM
1125
1126 if (storage > 0)
1127 {
3f5e193b 1128 dyn_syms = (asymbol **) xmalloc (storage);
8615f3f2
AM
1129 dyn_count = bfd_canonicalize_dynamic_symtab (abfd, dyn_syms);
1130 if (dyn_count < 0)
1131 bfd_fatal (bfd_get_filename (abfd));
1132 }
382c1116 1133 }
896ca098 1134
382c1116
NC
1135 synth_count = bfd_get_synthetic_symtab (abfd, static_count, static_syms,
1136 dyn_count, dyn_syms, &synthsyms);
1137 if (synth_count > 0)
1138 {
1139 asymbol **symp;
1140 void *new_mini;
1141 long i;
977f7911 1142
382c1116 1143 new_mini = xmalloc ((symcount + synth_count + 1) * sizeof (*symp));
3f5e193b 1144 symp = (asymbol **) new_mini;
382c1116
NC
1145 memcpy (symp, minisyms, symcount * sizeof (*symp));
1146 symp += symcount;
1147 for (i = 0; i < synth_count; i++)
1148 *symp++ = synthsyms + i;
1149 *symp = 0;
1150 minisyms = new_mini;
1151 symcount += synth_count;
1152 }
252b5132 1153 }
252b5132 1154
382c1116
NC
1155 /* Discard the symbols we don't want to print.
1156 It's OK to do this in place; we'll free the storage anyway
1157 (after printing). */
252b5132 1158
382c1116 1159 symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size);
2da42df6 1160
382c1116
NC
1161 symsizes = NULL;
1162 if (! no_sort)
1163 {
1164 sort_bfd = abfd;
1165 sort_dynamic = dynamic;
1166 sort_x = bfd_make_empty_symbol (abfd);
1167 sort_y = bfd_make_empty_symbol (abfd);
1168 if (sort_x == NULL || sort_y == NULL)
1169 bfd_fatal (bfd_get_filename (abfd));
252b5132 1170
382c1116
NC
1171 if (! sort_by_size)
1172 qsort (minisyms, symcount, size,
1173 sorters[sort_numerically][reverse_sort]);
1174 else
1175 symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount,
1176 size, &symsizes);
1177 }
252b5132 1178
382c1116 1179 if (! sort_by_size)
896ca098 1180 print_symbols (abfd, dynamic, minisyms, symcount, synth_count, size, archive_bfd);
252b5132 1181 else
896ca098 1182 print_size_symbols (abfd, dynamic, symsizes, symcount, synth_count, archive_bfd);
252b5132 1183
382c1116 1184 free (minisyms);
497b9b32 1185 free (symsizes);
382c1116
NC
1186}
1187
970ccc77
NC
1188static void
1189set_print_width (bfd *file)
1190{
1191 print_width = bfd_get_arch_size (file);
1192
1193 if (print_width == -1)
1194 {
1195 /* PR binutils/4292
1196 Guess the target's bitsize based on its name.
1197 We assume here than any 64-bit format will include
1198 "64" somewhere in its name. The only known exception
1199 is the MMO object file format. */
1200 if (strstr (bfd_get_target (file), "64") != NULL
1201 || strcmp (bfd_get_target (file), "mmo") == 0)
1202 print_width = 64;
1203 else
1204 print_width = 32;
1205 }
1206}
1207
382c1116
NC
1208static void
1209display_archive (bfd *file)
1210{
1211 bfd *arfile = NULL;
1212 bfd *last_arfile = NULL;
1213 char **matching;
1214
1215 format->print_archive_filename (bfd_get_filename (file));
1216
1217 if (print_armap)
1218 print_symdef_entry (file);
1219
1220 for (;;)
252b5132 1221 {
382c1116 1222 PROGRESS (1);
252b5132 1223
382c1116
NC
1224 arfile = bfd_openr_next_archived_file (file, arfile);
1225
1226 if (arfile == NULL)
252b5132 1227 {
382c1116
NC
1228 if (bfd_get_error () != bfd_error_no_more_archived_files)
1229 bfd_fatal (bfd_get_filename (file));
1230 break;
252b5132 1231 }
382c1116
NC
1232
1233 if (bfd_check_format_matches (arfile, bfd_object, &matching))
252b5132 1234 {
970ccc77 1235 set_print_width (arfile);
382c1116
NC
1236 format->print_archive_member (bfd_get_filename (file),
1237 bfd_get_filename (arfile));
1238 display_rel_file (arfile, file);
252b5132 1239 }
382c1116 1240 else
252b5132 1241 {
382c1116
NC
1242 bfd_nonfatal (bfd_get_filename (arfile));
1243 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
252b5132 1244 {
382c1116
NC
1245 list_matching_formats (matching);
1246 free (matching);
252b5132 1247 }
382c1116 1248 }
252b5132 1249
382c1116
NC
1250 if (last_arfile != NULL)
1251 {
1252 bfd_close (last_arfile);
1253 lineno_cache_bfd = NULL;
1254 lineno_cache_rel_bfd = NULL;
896ca098
NC
1255 if (arfile == last_arfile)
1256 return;
382c1116
NC
1257 }
1258 last_arfile = arfile;
1259 }
252b5132 1260
382c1116
NC
1261 if (last_arfile != NULL)
1262 {
1263 bfd_close (last_arfile);
1264 lineno_cache_bfd = NULL;
1265 lineno_cache_rel_bfd = NULL;
1266 }
1267}
252b5132 1268
382c1116
NC
1269static bfd_boolean
1270display_file (char *filename)
1271{
1272 bfd_boolean retval = TRUE;
1273 bfd *file;
1274 char **matching;
252b5132 1275
382c1116
NC
1276 if (get_file_size (filename) < 1)
1277 return FALSE;
252b5132 1278
a4b8af35 1279 file = bfd_openr (filename, target ? target : plugin_target);
382c1116
NC
1280 if (file == NULL)
1281 {
1282 bfd_nonfatal (filename);
1283 return FALSE;
1284 }
252b5132 1285
b76e66d3
CC
1286 /* If printing line numbers, decompress the debug sections. */
1287 if (line_numbers)
1288 file->flags |= BFD_DECOMPRESS;
1289
382c1116
NC
1290 if (bfd_check_format (file, bfd_archive))
1291 {
1292 display_archive (file);
1293 }
1294 else if (bfd_check_format_matches (file, bfd_object, &matching))
1295 {
970ccc77 1296 set_print_width (file);
382c1116
NC
1297 format->print_object_filename (filename);
1298 display_rel_file (file, NULL);
1299 }
1300 else
1301 {
1302 bfd_nonfatal (filename);
1303 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
252b5132 1304 {
382c1116
NC
1305 list_matching_formats (matching);
1306 free (matching);
252b5132 1307 }
382c1116 1308 retval = FALSE;
252b5132
RH
1309 }
1310
382c1116
NC
1311 if (!bfd_close (file))
1312 bfd_fatal (filename);
1313
1314 lineno_cache_bfd = NULL;
1315 lineno_cache_rel_bfd = NULL;
1316
1317 return retval;
252b5132
RH
1318}
1319\f
1320/* The following 3 groups of functions are called unconditionally,
1321 once at the start of processing each file of the appropriate type.
1322 They should check `filename_per_file' and `filename_per_symbol',
1323 as appropriate for their output format, to determine whether to
1324 print anything. */
1325\f
1326/* Print the name of an object file given on the command line. */
1327
1328static void
2da42df6 1329print_object_filename_bsd (char *filename)
252b5132
RH
1330{
1331 if (filename_per_file && !filename_per_symbol)
1332 printf ("\n%s:\n", filename);
1333}
1334
1335static void
2da42df6 1336print_object_filename_sysv (char *filename)
252b5132
RH
1337{
1338 if (undefined_only)
1339 printf (_("\n\nUndefined symbols from %s:\n\n"), filename);
1340 else
1341 printf (_("\n\nSymbols from %s:\n\n"), filename);
970ccc77 1342 if (print_width == 32)
33f5f537
L
1343 printf (_("\
1344Name Value Class Type Size Line Section\n\n"));
1345 else
1346 printf (_("\
1347Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1348}
1349
1350static void
2da42df6 1351print_object_filename_posix (char *filename)
252b5132
RH
1352{
1353 if (filename_per_file && !filename_per_symbol)
1354 printf ("%s:\n", filename);
1355}
1356\f
1357/* Print the name of an archive file given on the command line. */
1358
1359static void
2da42df6 1360print_archive_filename_bsd (char *filename)
252b5132
RH
1361{
1362 if (filename_per_file)
1363 printf ("\n%s:\n", filename);
1364}
1365
1366static void
2da42df6 1367print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1368{
1369}
1370
1371static void
2da42df6 1372print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED)
252b5132
RH
1373{
1374}
1375\f
1376/* Print the name of an archive member file. */
1377
1378static void
2da42df6
AJ
1379print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED,
1380 const char *filename)
252b5132
RH
1381{
1382 if (!filename_per_symbol)
1383 printf ("\n%s:\n", filename);
1384}
1385
1386static void
2da42df6 1387print_archive_member_sysv (char *archive, const char *filename)
252b5132
RH
1388{
1389 if (undefined_only)
1390 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename);
1391 else
1392 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename);
970ccc77 1393 if (print_width == 32)
33f5f537
L
1394 printf (_("\
1395Name Value Class Type Size Line Section\n\n"));
1396 else
1397 printf (_("\
1398Name Value Class Type Size Line Section\n\n"));
252b5132
RH
1399}
1400
1401static void
2da42df6 1402print_archive_member_posix (char *archive, const char *filename)
252b5132
RH
1403{
1404 if (!filename_per_symbol)
1405 printf ("%s[%s]:\n", archive, filename);
1406}
1407\f
1408/* Print the name of the file (and archive, if there is one)
1409 containing a symbol. */
1410
1411static void
2da42df6 1412print_symbol_filename_bsd (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1413{
1414 if (filename_per_symbol)
1415 {
1416 if (archive_bfd)
1417 printf ("%s:", bfd_get_filename (archive_bfd));
1418 printf ("%s:", bfd_get_filename (abfd));
1419 }
1420}
1421
1422static void
2da42df6 1423print_symbol_filename_sysv (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1424{
1425 if (filename_per_symbol)
1426 {
1427 if (archive_bfd)
1428 printf ("%s:", bfd_get_filename (archive_bfd));
1429 printf ("%s:", bfd_get_filename (abfd));
1430 }
1431}
1432
1433static void
2da42df6 1434print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
252b5132
RH
1435{
1436 if (filename_per_symbol)
1437 {
1438 if (archive_bfd)
1439 printf ("%s[%s]: ", bfd_get_filename (archive_bfd),
1440 bfd_get_filename (abfd));
1441 else
1442 printf ("%s: ", bfd_get_filename (abfd));
1443 }
1444}
1445\f
1446/* Print a symbol value. */
1447
1448static void
2da42df6 1449print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
252b5132 1450{
970ccc77 1451 switch (print_width)
252b5132 1452 {
970ccc77 1453 case 32:
be26064b 1454 printf (value_format_32bit, (unsigned long) val);
970ccc77 1455 break;
252b5132 1456
970ccc77 1457 case 64:
39dbeff8 1458#if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
970ccc77
NC
1459 printf (value_format_64bit, val);
1460#else
1461 /* We have a 64 bit value to print, but the host is only 32 bit. */
1462 if (print_radix == 16)
1463 bfd_fprintf_vma (abfd, stdout, val);
1464 else
252b5132 1465 {
970ccc77
NC
1466 char buf[30];
1467 char *s;
1468
1469 s = buf + sizeof buf;
1470 *--s = '\0';
1471 while (val > 0)
1472 {
1473 *--s = (val % print_radix) + '0';
1474 val /= print_radix;
1475 }
1476 while ((buf + sizeof buf - 1) - s < 16)
1477 *--s = '0';
1478 printf ("%s", s);
252b5132 1479 }
252b5132 1480#endif
970ccc77
NC
1481 break;
1482
1483 default:
1484 fatal (_("Print width has not been initialized (%d)"), print_width);
1485 break;
1486 }
252b5132
RH
1487}
1488
1489/* Print a line of information about a symbol. */
1490
1491static void
2da42df6 1492print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
252b5132 1493{
977f7911 1494 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132 1495 {
970ccc77 1496 if (print_width == 64)
62a5a82d 1497 printf (" ");
21211521 1498 printf (" ");
252b5132
RH
1499 }
1500 else
977f7911 1501 {
06a30c77 1502 /* Normally we print the value of the symbol. If we are printing the
50c2245b 1503 size or sorting by size then we print its size, except for the
06a30c77
NC
1504 (weird) special case where both flags are defined, in which case we
1505 print both values. This conforms to documented behaviour. */
1506 if (sort_by_size && !print_size)
1507 print_value (abfd, SYM_SIZE (info));
1508 else
1509 print_value (abfd, SYM_VALUE (info));
72797995 1510 if (print_size && SYM_SIZE (info))
977f7911 1511 {
06a30c77 1512 printf (" ");
977f7911
NC
1513 print_value (abfd, SYM_SIZE (info));
1514 }
1515 }
1516
1517 printf (" %c", SYM_TYPE (info));
1518
1519 if (SYM_TYPE (info) == '-')
252b5132
RH
1520 {
1521 /* A stab. */
1522 printf (" ");
977f7911 1523 printf (other_format, SYM_STAB_OTHER (info));
252b5132 1524 printf (" ");
977f7911
NC
1525 printf (desc_format, SYM_STAB_DESC (info));
1526 printf (" %5s", SYM_STAB_NAME (info));
252b5132 1527 }
977f7911 1528 print_symname (" %s", SYM_NAME (info), abfd);
252b5132
RH
1529}
1530
1531static void
2da42df6 1532print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
252b5132 1533{
977f7911
NC
1534 print_symname ("%-20s|", SYM_NAME (info), abfd);
1535
1536 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
33f5f537 1537 {
970ccc77 1538 if (print_width == 32)
33f5f537
L
1539 printf (" ");
1540 else
1541 printf (" ");
1542 }
252b5132 1543 else
977f7911
NC
1544 print_value (abfd, SYM_VALUE (info));
1545
1546 printf ("| %c |", SYM_TYPE (info));
1547
1548 if (SYM_TYPE (info) == '-')
252b5132
RH
1549 {
1550 /* A stab. */
e3b83c8f
NC
1551 printf ("%18s| ", SYM_STAB_NAME (info)); /* (C) Type. */
1552 printf (desc_format, SYM_STAB_DESC (info)); /* Size. */
1553 printf ("| |"); /* Line, Section. */
252b5132
RH
1554 }
1555 else
9710509e 1556 {
977f7911 1557 /* Type, Size, Line, Section */
33f5f537
L
1558 if (info->elfinfo)
1559 printf ("%18s|",
552e55ed
JB
1560 get_elf_symbol_type (ELF_ST_TYPE (info->elfinfo->internal_elf_sym.st_info)));
1561 else if (info->coffinfo)
1562 printf ("%18s|",
1563 get_coff_symbol_type (&info->coffinfo->native->u.syment));
33f5f537
L
1564 else
1565 printf (" |");
977f7911
NC
1566
1567 if (SYM_SIZE (info))
1568 print_value (abfd, SYM_SIZE (info));
1569 else
33f5f537 1570 {
970ccc77 1571 if (print_width == 32)
33f5f537
L
1572 printf (" ");
1573 else
1574 printf (" ");
1575 }
977f7911 1576
33f5f537
L
1577 if (info->elfinfo)
1578 printf("| |%s", info->elfinfo->symbol.section->name);
552e55ed
JB
1579 else if (info->coffinfo)
1580 printf("| |%s", info->coffinfo->symbol.section->name);
33f5f537
L
1581 else
1582 printf("| |");
977f7911 1583 }
252b5132
RH
1584}
1585
1586static void
2da42df6 1587print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
252b5132 1588{
977f7911
NC
1589 print_symname ("%s ", SYM_NAME (info), abfd);
1590 printf ("%c ", SYM_TYPE (info));
1591
1592 if (bfd_is_undefined_symclass (SYM_TYPE (info)))
252b5132
RH
1593 printf (" ");
1594 else
977f7911
NC
1595 {
1596 print_value (abfd, SYM_VALUE (info));
1597 printf (" ");
1598 if (SYM_SIZE (info))
1599 print_value (abfd, SYM_SIZE (info));
1600 }
252b5132
RH
1601}
1602\f
382c1116
NC
1603int
1604main (int argc, char **argv)
252b5132 1605{
382c1116
NC
1606 int c;
1607 int retval;
252b5132 1608
382c1116
NC
1609#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1610 setlocale (LC_MESSAGES, "");
1611#endif
1612#if defined (HAVE_SETLOCALE)
1613 setlocale (LC_CTYPE, "");
1614 setlocale (LC_COLLATE, "");
1615#endif
1616 bindtextdomain (PACKAGE, LOCALEDIR);
1617 textdomain (PACKAGE);
1618
1619 program_name = *argv;
1620 xmalloc_set_program_name (program_name);
86eafac0 1621 bfd_set_error_program_name (program_name);
fc579192
NC
1622#if BFD_SUPPORTS_PLUGINS
1623 bfd_plugin_set_program_name (program_name);
1624#endif
382c1116
NC
1625
1626 START_PROGRESS (program_name, 0);
1627
869b9d07
MM
1628 expandargv (&argc, &argv);
1629
382c1116
NC
1630 bfd_init ();
1631 set_default_bfd_target ();
1632
1633 while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:",
1634 long_options, (int *) 0)) != EOF)
252b5132 1635 {
382c1116 1636 switch (c)
252b5132 1637 {
382c1116
NC
1638 case 'a':
1639 print_debug_syms = 1;
1640 break;
1641 case 'A':
1642 case 'o':
1643 filename_per_symbol = 1;
1644 break;
1645 case 'B': /* For MIPS compatibility. */
1646 set_output_format ("bsd");
1647 break;
1648 case 'C':
1649 do_demangle = 1;
1650 if (optarg != NULL)
1651 {
1652 enum demangling_styles style;
1653
1654 style = cplus_demangle_name_to_style (optarg);
1655 if (style == unknown_demangling)
1656 fatal (_("unknown demangling style `%s'"),
1657 optarg);
1658
1659 cplus_demangle_set_style (style);
1660 }
1661 break;
1662 case 'D':
1663 dynamic = 1;
1664 break;
1665 case 'e':
1666 /* Ignored for HP/UX compatibility. */
1667 break;
1668 case 'f':
1669 set_output_format (optarg);
1670 break;
1671 case 'g':
1672 external_only = 1;
1673 break;
1674 case 'H':
1675 case 'h':
1676 usage (stdout, 0);
1677 case 'l':
1678 line_numbers = 1;
1679 break;
1680 case 'n':
1681 case 'v':
ddb1377c 1682 no_sort = 0;
382c1116 1683 sort_numerically = 1;
ddb1377c 1684 sort_by_size = 0;
382c1116
NC
1685 break;
1686 case 'p':
1687 no_sort = 1;
ddb1377c
AM
1688 sort_numerically = 0;
1689 sort_by_size = 0;
1690 break;
1691 case OPTION_SIZE_SORT:
1692 no_sort = 0;
1693 sort_numerically = 0;
1694 sort_by_size = 1;
382c1116
NC
1695 break;
1696 case 'P':
1697 set_output_format ("posix");
1698 break;
1699 case 'r':
1700 reverse_sort = 1;
1701 break;
1702 case 's':
1703 print_armap = 1;
1704 break;
1705 case 'S':
1706 print_size = 1;
1707 break;
1708 case 't':
1709 set_print_radix (optarg);
1710 break;
1711 case 'u':
1712 undefined_only = 1;
1713 break;
1714 case 'V':
1715 show_version = 1;
1716 break;
1717 case 'X':
1718 /* Ignored for (partial) AIX compatibility. On AIX, the
1719 argument has values 32, 64, or 32_64, and specifies that
1720 only 32-bit, only 64-bit, or both kinds of objects should
1721 be examined. The default is 32. So plain AIX nm on a
1722 library archive with both kinds of objects will ignore
1723 the 64-bit ones. For GNU nm, the default is and always
1724 has been -X 32_64, and other options are not supported. */
1725 if (strcmp (optarg, "32_64") != 0)
1726 fatal (_("Only -X 32_64 is supported"));
1727 break;
1728
1729 case OPTION_TARGET: /* --target */
1730 target = optarg;
1731 break;
1732
ce3c775b
NC
1733 case OPTION_PLUGIN: /* --plugin */
1734#if BFD_SUPPORTS_PLUGINS
1735 bfd_plugin_set_plugin (optarg);
1736#else
1737 fatal (_("sorry - this program has been built without plugin support\n"));
1738#endif
1739 break;
1740
382c1116
NC
1741 case 0: /* A long option that just sets a flag. */
1742 break;
1743
1744 default:
1745 usage (stderr, 1);
252b5132
RH
1746 }
1747 }
252b5132 1748
382c1116
NC
1749 if (show_version)
1750 print_version ("nm");
252b5132 1751
382c1116 1752 if (sort_by_size && undefined_only)
252b5132 1753 {
382c1116
NC
1754 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1755 non_fatal (_("will produce no output, since undefined symbols have no size."));
1756 return 0;
252b5132 1757 }
382c1116
NC
1758
1759 /* OK, all options now parsed. If no filename specified, do a.out. */
1760 if (optind == argc)
1761 return !display_file ("a.out");
1762
1763 retval = 0;
1764
1765 if (argc - optind > 1)
1766 filename_per_file = 1;
1767
1768 /* We were given several filenames to do. */
1769 while (optind < argc)
252b5132 1770 {
382c1116
NC
1771 PROGRESS (1);
1772 if (!display_file (argv[optind++]))
1773 retval++;
1774 }
252b5132 1775
382c1116 1776 END_PROGRESS (program_name);
252b5132 1777
382c1116
NC
1778#ifdef HAVE_SBRK
1779 if (show_stats)
1780 {
1781 char *lim = (char *) sbrk (0);
1782
1783 non_fatal (_("data size %ld"), (long) (lim - (char *) &environ));
252b5132 1784 }
382c1116 1785#endif
252b5132 1786
382c1116
NC
1787 exit (retval);
1788 return retval;
252b5132 1789}
This page took 0.736173 seconds and 4 git commands to generate.