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