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