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