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