1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
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
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
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.
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
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 #include "aout/stab_gnu.h"
26 #include "aout/ranlib.h"
28 #include "libiberty.h"
30 #include "elf/common.h"
31 #define DO_NOT_DEFINE_AOUTHDR
32 #define DO_NOT_DEFINE_FILHDR
33 #define DO_NOT_DEFINE_LINENO
34 #define DO_NOT_DEFINE_SCNHDR
35 #include "coff/external.h"
36 #include "coff/internal.h"
39 #include "plugin-api.h"
42 /* When sorting by size, we use this structure to hold the size and a
43 pointer to the minisymbol. */
51 /* When fetching relocs, we use this structure to pass information to
54 struct get_relocs_info
62 struct extended_symbol_info
66 elf_symbol_type
*elfinfo
;
67 coff_symbol_type
*coffinfo
;
68 /* FIXME: We should add more fields for Type, Line, Section. */
70 #define SYM_NAME(sym) (sym->sinfo->name)
71 #define SYM_VALUE(sym) (sym->sinfo->value)
72 #define SYM_TYPE(sym) (sym->sinfo->type)
73 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
74 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
75 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
76 #define SYM_SIZE(sym) \
77 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
79 /* The output formatting functions. */
80 static void print_object_filename_bsd (char *);
81 static void print_object_filename_sysv (char *);
82 static void print_object_filename_posix (char *);
83 static void print_archive_filename_bsd (char *);
84 static void print_archive_filename_sysv (char *);
85 static void print_archive_filename_posix (char *);
86 static void print_archive_member_bsd (char *, const char *);
87 static void print_archive_member_sysv (char *, const char *);
88 static void print_archive_member_posix (char *, const char *);
89 static void print_symbol_filename_bsd (bfd
*, bfd
*);
90 static void print_symbol_filename_sysv (bfd
*, bfd
*);
91 static void print_symbol_filename_posix (bfd
*, bfd
*);
92 static void print_value (bfd
*, bfd_vma
);
93 static void print_symbol_info_bsd (struct extended_symbol_info
*, bfd
*);
94 static void print_symbol_info_sysv (struct extended_symbol_info
*, bfd
*);
95 static void print_symbol_info_posix (struct extended_symbol_info
*, bfd
*);
97 /* Support for different output formats. */
100 /* Print the name of an object file given on the command line. */
101 void (*print_object_filename
) (char *);
103 /* Print the name of an archive file given on the command line. */
104 void (*print_archive_filename
) (char *);
106 /* Print the name of an archive member file. */
107 void (*print_archive_member
) (char *, const char *);
109 /* Print the name of the file (and archive, if there is one)
110 containing a symbol. */
111 void (*print_symbol_filename
) (bfd
*, bfd
*);
113 /* Print a line of information about a symbol. */
114 void (*print_symbol_info
) (struct extended_symbol_info
*, bfd
*);
117 static struct output_fns formats
[] =
119 {print_object_filename_bsd
,
120 print_archive_filename_bsd
,
121 print_archive_member_bsd
,
122 print_symbol_filename_bsd
,
123 print_symbol_info_bsd
},
124 {print_object_filename_sysv
,
125 print_archive_filename_sysv
,
126 print_archive_member_sysv
,
127 print_symbol_filename_sysv
,
128 print_symbol_info_sysv
},
129 {print_object_filename_posix
,
130 print_archive_filename_posix
,
131 print_archive_member_posix
,
132 print_symbol_filename_posix
,
133 print_symbol_info_posix
}
136 /* Indices in `formats'. */
138 #define FORMAT_SYSV 1
139 #define FORMAT_POSIX 2
140 #define FORMAT_DEFAULT FORMAT_BSD
142 /* The output format to use. */
143 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
144 static unsigned int print_format
= FORMAT_DEFAULT
;
146 /* Command options. */
148 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
149 static int external_only
= 0; /* Print external symbols only. */
150 static int defined_only
= 0; /* Print defined symbols only. */
151 static int no_sort
= 0; /* Don't sort; print syms in order found. */
152 static int print_debug_syms
= 0;/* Print debugger-only symbols too. */
153 static int print_armap
= 0; /* Describe __.SYMDEF data in archive files. */
154 static int print_size
= 0; /* Print size of defined symbols. */
155 static int reverse_sort
= 0; /* Sort in downward(alpha or numeric) order. */
156 static int sort_numerically
= 0;/* Sort in numeric rather than alpha order. */
157 static int sort_by_size
= 0; /* Sort by size of symbol. */
158 static int undefined_only
= 0; /* Print undefined symbols only. */
159 static int dynamic
= 0; /* Print dynamic symbols. */
160 static int show_version
= 0; /* Show the version number. */
161 static int show_synthetic
= 0; /* Display synthesized symbols too. */
162 static int line_numbers
= 0; /* Print line numbers for symbols. */
163 static int allow_special_symbols
= 0; /* Allow special symbols. */
164 static int with_symbol_versions
= 0; /* Include symbol version information in the output. */
166 static int demangle_flags
= DMGL_ANSI
| DMGL_PARAMS
;
168 /* When to print the names of files. Not mutually exclusive in SYSV format. */
169 static int filename_per_file
= 0; /* Once per file, on its own line. */
170 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
172 static int print_width
= 0;
173 static int print_radix
= 16;
174 /* Print formats for printing stab info. */
175 static char other_format
[] = "%02x";
176 static char desc_format
[] = "%04x";
178 static char *target
= NULL
;
179 #if BFD_SUPPORTS_PLUGINS
180 static const char *plugin_target
= "plugin";
182 static const char *plugin_target
= NULL
;
185 /* Used to cache the line numbers for a BFD. */
186 static bfd
*lineno_cache_bfd
;
187 static bfd
*lineno_cache_rel_bfd
;
189 enum long_option_values
194 OPTION_RECURSE_LIMIT
,
195 OPTION_NO_RECURSE_LIMIT
198 static struct option long_options
[] =
200 {"debug-syms", no_argument
, &print_debug_syms
, 1},
201 {"demangle", optional_argument
, 0, 'C'},
202 {"dynamic", no_argument
, &dynamic
, 1},
203 {"extern-only", no_argument
, &external_only
, 1},
204 {"format", required_argument
, 0, 'f'},
205 {"help", no_argument
, 0, 'h'},
206 {"line-numbers", no_argument
, 0, 'l'},
207 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
208 {"no-demangle", no_argument
, &do_demangle
, 0},
209 {"no-recurse-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
210 {"no-recursion-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
211 {"no-sort", no_argument
, 0, 'p'},
212 {"numeric-sort", no_argument
, 0, 'n'},
213 {"plugin", required_argument
, 0, OPTION_PLUGIN
},
214 {"portability", no_argument
, 0, 'P'},
215 {"print-armap", no_argument
, &print_armap
, 1},
216 {"print-file-name", no_argument
, 0, 'o'},
217 {"print-size", no_argument
, 0, 'S'},
218 {"radix", required_argument
, 0, 't'},
219 {"recurse-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
220 {"recursion-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
221 {"reverse-sort", no_argument
, &reverse_sort
, 1},
222 {"size-sort", no_argument
, 0, OPTION_SIZE_SORT
},
223 {"special-syms", no_argument
, &allow_special_symbols
, 1},
224 {"synthetic", no_argument
, &show_synthetic
, 1},
225 {"target", required_argument
, 0, OPTION_TARGET
},
226 {"defined-only", no_argument
, &defined_only
, 1},
227 {"undefined-only", no_argument
, &undefined_only
, 1},
228 {"version", no_argument
, &show_version
, 1},
229 {"with-symbol-versions", no_argument
, &with_symbol_versions
, 1},
230 {0, no_argument
, 0, 0}
233 /* Some error-reporting functions. */
235 ATTRIBUTE_NORETURN
static void
236 usage (FILE *stream
, int status
)
238 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
239 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
240 fprintf (stream
, _(" The options are:\n\
241 -a, --debug-syms Display debugger-only symbols\n\
242 -A, --print-file-name Print name of the input file before every symbol\n\
243 -B Same as --format=bsd\n\
244 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
245 The STYLE, if specified, can be `auto' (the default),\n\
246 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
248 --no-demangle Do not demangle low-level symbol names\n\
249 --recurse-limit Enable a demangling recursion limit. This is the default.\n\
250 --no-recurse-limit Disable a demangling recursion limit.\n\
251 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
252 --defined-only Display only defined symbols\n\
254 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
255 `sysv' or `posix'. The default is `bsd'\n\
256 -g, --extern-only Display only external symbols\n\
257 -l, --line-numbers Use debugging information to find a filename and\n\
258 line number for each symbol\n\
259 -n, --numeric-sort Sort symbols numerically by address\n\
261 -p, --no-sort Do not sort the symbols\n\
262 -P, --portability Same as --format=posix\n\
263 -r, --reverse-sort Reverse the sense of the sort\n"));
264 #if BFD_SUPPORTS_PLUGINS
265 fprintf (stream
, _("\
266 --plugin NAME Load the specified plugin\n"));
268 fprintf (stream
, _("\
269 -S, --print-size Print size of defined symbols\n\
270 -s, --print-armap Include index for symbols from archive members\n\
271 --size-sort Sort symbols by size\n\
272 --special-syms Include special symbols in the output\n\
273 --synthetic Display synthetic symbols as well\n\
274 -t, --radix=RADIX Use RADIX for printing symbol values\n\
275 --target=BFDNAME Specify the target object format as BFDNAME\n\
276 -u, --undefined-only Display only undefined symbols\n\
277 --with-symbol-versions Display version strings after symbol names\n\
278 -X 32_64 (ignored)\n\
279 @FILE Read options from FILE\n\
280 -h, --help Display this information\n\
281 -V, --version Display this program's version number\n\
283 list_supported_targets (program_name
, stream
);
284 if (REPORT_BUGS_TO
[0] && status
== 0)
285 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
289 /* Set the radix for the symbol value and size according to RADIX. */
292 set_print_radix (char *radix
)
296 case 'x': print_radix
= 16; break;
297 case 'd': print_radix
= 10; break;
298 case 'o': print_radix
= 8; break;
301 fatal (_("%s: invalid radix"), radix
);
304 other_format
[3] = desc_format
[3] = *radix
;
308 set_output_format (char *f
)
327 fatal (_("%s: invalid output format"), f
);
329 format
= &formats
[i
];
334 get_elf_symbol_type (unsigned int type
)
341 case STT_NOTYPE
: return "NOTYPE";
342 case STT_OBJECT
: return "OBJECT";
343 case STT_FUNC
: return "FUNC";
344 case STT_SECTION
: return "SECTION";
345 case STT_FILE
: return "FILE";
346 case STT_COMMON
: return "COMMON";
347 case STT_TLS
: return "TLS";
351 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
352 n
= asprintf (&bufp
, _("<processor specific>: %d"), type
);
353 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
354 n
= asprintf (&bufp
, _("<OS specific>: %d"), type
);
356 n
= asprintf (&bufp
, _("<unknown>: %d"), type
);
358 fatal ("%s", xstrerror (errno
));
363 get_coff_symbol_type (const struct internal_syment
*sym
)
368 switch (sym
->n_sclass
)
370 case C_BLOCK
: return "Block";
371 case C_FILE
: return "File";
372 case C_LINE
: return "Line";
378 switch (DTYPE(sym
->n_type
))
380 case DT_FCN
: return "Function";
381 case DT_PTR
: return "Pointer";
382 case DT_ARY
: return "Array";
386 n
= asprintf (&bufp
, _("<unknown>: %d/%d"), sym
->n_sclass
, sym
->n_type
);
388 fatal ("%s", xstrerror (errno
));
392 /* Print symbol name NAME, read from ABFD, with printf format FORM,
393 demangling it if requested. */
396 print_symname (const char *form
, const char *name
, bfd
*abfd
)
398 if (do_demangle
&& *name
)
400 char *res
= bfd_demangle (abfd
, name
, demangle_flags
);
414 print_symdef_entry (bfd
*abfd
)
416 symindex idx
= BFD_NO_MORE_SYMBOLS
;
418 bfd_boolean everprinted
= FALSE
;
420 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
421 idx
!= BFD_NO_MORE_SYMBOLS
;
422 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
427 printf (_("\nArchive index:\n"));
430 elt
= bfd_get_elt_at_index (abfd
, idx
);
432 bfd_fatal ("bfd_get_elt_at_index");
433 if (thesym
->name
!= (char *) NULL
)
435 print_symname ("%s", thesym
->name
, abfd
);
436 printf (" in %s\n", bfd_get_filename (elt
));
441 /* Choose which symbol entries to print;
442 compact them downward to get rid of the rest.
443 Return the number of symbols to be printed. */
446 filter_symbols (bfd
*abfd
, bfd_boolean is_dynamic
, void *minisyms
,
447 long symcount
, unsigned int size
)
449 bfd_byte
*from
, *fromend
, *to
;
452 store
= bfd_make_empty_symbol (abfd
);
454 bfd_fatal (bfd_get_filename (abfd
));
456 from
= (bfd_byte
*) minisyms
;
457 fromend
= from
+ symcount
* size
;
458 to
= (bfd_byte
*) minisyms
;
460 for (; from
< fromend
; from
+= size
)
467 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, (const void *) from
, store
);
469 bfd_fatal (bfd_get_filename (abfd
));
471 if (sym
->name
[0] == '_'
472 && sym
->name
[1] == '_'
473 && strcmp (sym
->name
+ (sym
->name
[2] == '_'), "__gnu_lto_slim") == 0)
474 non_fatal (_("%s: plugin needed to handle lto object"),
475 bfd_get_filename (abfd
));
478 keep
= bfd_is_und_section (sym
->section
);
479 else if (external_only
)
480 /* PR binutls/12753: Unique symbols are global too. */
481 keep
= ((sym
->flags
& (BSF_GLOBAL
483 | BSF_GNU_UNIQUE
)) != 0
484 || bfd_is_und_section (sym
->section
)
485 || bfd_is_com_section (sym
->section
));
490 && ! print_debug_syms
491 && (sym
->flags
& BSF_DEBUGGING
) != 0)
496 && (bfd_is_abs_section (sym
->section
)
497 || bfd_is_und_section (sym
->section
)))
503 if (bfd_is_und_section (sym
->section
))
508 && bfd_is_target_special_symbol (abfd
, sym
)
509 && ! allow_special_symbols
)
515 memcpy (to
, from
, size
);
520 return (to
- (bfd_byte
*) minisyms
) / size
;
523 /* These globals are used to pass information into the sorting
525 static bfd
*sort_bfd
;
526 static bfd_boolean sort_dynamic
;
527 static asymbol
*sort_x
;
528 static asymbol
*sort_y
;
530 /* Symbol-sorting predicates */
531 #define valueof(x) ((x)->section->vma + (x)->value)
533 /* Numeric sorts. Undefined symbols are always considered "less than"
534 defined symbols with zero values. Common symbols are not treated
535 specially -- i.e., their sizes are used as their "values". */
538 non_numeric_forward (const void *P_x
, const void *P_y
)
543 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
544 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
545 if (x
== NULL
|| y
== NULL
)
546 bfd_fatal (bfd_get_filename (sort_bfd
));
548 xn
= bfd_asymbol_name (x
);
549 yn
= bfd_asymbol_name (y
);
557 /* Solaris 2.5 has a bug in strcoll.
558 strcoll returns invalid values when confronted with empty strings. */
564 return strcoll (xn
, yn
);
566 return strcmp (xn
, yn
);
571 non_numeric_reverse (const void *x
, const void *y
)
573 return - non_numeric_forward (x
, y
);
577 numeric_forward (const void *P_x
, const void *P_y
)
582 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
583 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
584 if (x
== NULL
|| y
== NULL
)
585 bfd_fatal (bfd_get_filename (sort_bfd
));
587 xs
= bfd_get_section (x
);
588 ys
= bfd_get_section (y
);
590 if (bfd_is_und_section (xs
))
592 if (! bfd_is_und_section (ys
))
595 else if (bfd_is_und_section (ys
))
597 else if (valueof (x
) != valueof (y
))
598 return valueof (x
) < valueof (y
) ? -1 : 1;
600 return non_numeric_forward (P_x
, P_y
);
604 numeric_reverse (const void *x
, const void *y
)
606 return - numeric_forward (x
, y
);
609 static int (*(sorters
[2][2])) (const void *, const void *) =
611 { non_numeric_forward
, non_numeric_reverse
},
612 { numeric_forward
, numeric_reverse
}
615 /* This sort routine is used by sort_symbols_by_size. It is similar
616 to numeric_forward, but when symbols have the same value it sorts
617 by section VMA. This simplifies the sort_symbols_by_size code
618 which handles symbols at the end of sections. Also, this routine
619 tries to sort file names before other symbols with the same value.
620 That will make the file name have a zero size, which will make
621 sort_symbols_by_size choose the non file name symbol, leading to
622 more meaningful output. For similar reasons, this code sorts
623 gnu_compiled_* and gcc2_compiled before other symbols with the same
627 size_forward1 (const void *P_x
, const void *P_y
)
635 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
636 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
637 if (x
== NULL
|| y
== NULL
)
638 bfd_fatal (bfd_get_filename (sort_bfd
));
640 xs
= bfd_get_section (x
);
641 ys
= bfd_get_section (y
);
643 if (bfd_is_und_section (xs
))
645 if (bfd_is_und_section (ys
))
648 if (valueof (x
) != valueof (y
))
649 return valueof (x
) < valueof (y
) ? -1 : 1;
651 if (xs
->vma
!= ys
->vma
)
652 return xs
->vma
< ys
->vma
? -1 : 1;
654 xn
= bfd_asymbol_name (x
);
655 yn
= bfd_asymbol_name (y
);
659 /* The symbols gnu_compiled and gcc2_compiled convey even less
660 information than the file name, so sort them out first. */
662 xf
= (strstr (xn
, "gnu_compiled") != NULL
663 || strstr (xn
, "gcc2_compiled") != NULL
);
664 yf
= (strstr (yn
, "gnu_compiled") != NULL
665 || strstr (yn
, "gcc2_compiled") != NULL
);
672 /* We use a heuristic for the file name. It may not work on non
673 Unix systems, but it doesn't really matter; the only difference
674 is precisely which symbol names get printed. */
676 #define file_symbol(s, sn, snl) \
677 (((s)->flags & BSF_FILE) != 0 \
679 && (sn)[(snl) - 2] == '.' \
680 && ((sn)[(snl) - 1] == 'o' \
681 || (sn)[(snl) - 1] == 'a')))
683 xf
= file_symbol (x
, xn
, xnl
);
684 yf
= file_symbol (y
, yn
, ynl
);
691 return non_numeric_forward (P_x
, P_y
);
694 /* This sort routine is used by sort_symbols_by_size. It is sorting
695 an array of size_sym structures into size order. */
698 size_forward2 (const void *P_x
, const void *P_y
)
700 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
701 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
703 if (x
->size
< y
->size
)
704 return reverse_sort
? 1 : -1;
705 else if (x
->size
> y
->size
)
706 return reverse_sort
? -1 : 1;
708 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
711 /* Sort the symbols by size. ELF provides a size but for other formats
712 we have to make a guess by assuming that the difference between the
713 address of a symbol and the address of the next higher symbol is the
717 sort_symbols_by_size (bfd
*abfd
, bfd_boolean is_dynamic
, void *minisyms
,
718 long symcount
, unsigned int size
,
719 struct size_sym
**symsizesp
)
721 struct size_sym
*symsizes
;
722 bfd_byte
*from
, *fromend
;
724 asymbol
*store_sym
, *store_next
;
726 qsort (minisyms
, symcount
, size
, size_forward1
);
728 /* We are going to return a special set of symbols and sizes to
730 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
731 *symsizesp
= symsizes
;
733 /* Note that filter_symbols has already removed all absolute and
734 undefined symbols. Here we remove all symbols whose size winds
736 from
= (bfd_byte
*) minisyms
;
737 fromend
= from
+ symcount
* size
;
744 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, (const void *) from
,
747 bfd_fatal (bfd_get_filename (abfd
));
750 for (; from
< fromend
; from
+= size
)
757 if (from
+ size
< fromend
)
759 next
= bfd_minisymbol_to_symbol (abfd
,
761 (const void *) (from
+ size
),
764 bfd_fatal (bfd_get_filename (abfd
));
769 sec
= bfd_get_section (sym
);
771 /* Synthetic symbols don't have a full type set of data available, thus
772 we can't rely on that information for the symbol size. Ditto for
773 bfd/section.c:global_syms like *ABS*. */
774 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
775 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
776 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
777 else if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
778 && bfd_is_com_section (sec
))
782 if (from
+ size
< fromend
783 && sec
== bfd_get_section (next
))
784 sz
= valueof (next
) - valueof (sym
);
786 sz
= (bfd_get_section_vma (abfd
, sec
)
787 + bfd_section_size (abfd
, sec
)
793 symsizes
->minisym
= (const void *) from
;
801 store_sym
= store_next
;
805 symcount
= symsizes
- *symsizesp
;
807 /* We must now sort again by size. */
808 qsort ((void *) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
813 /* This function is used to get the relocs for a particular section.
814 It is called via bfd_map_over_sections. */
817 get_relocs (bfd
*abfd
, asection
*sec
, void *dataarg
)
819 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
823 if ((sec
->flags
& SEC_RELOC
) == 0)
825 *data
->relocs
= NULL
;
832 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
834 bfd_fatal (bfd_get_filename (abfd
));
836 *data
->relocs
= (arelent
**) xmalloc (relsize
);
837 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
839 if (*data
->relcount
< 0)
840 bfd_fatal (bfd_get_filename (abfd
));
848 /* Print a single symbol. */
851 print_symbol (bfd
* abfd
,
857 struct extended_symbol_info info
;
861 format
->print_symbol_filename (archive_bfd
, abfd
);
863 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
865 info
.sinfo
= &syminfo
;
867 /* Synthetic symbols do not have a full symbol type set of data available.
868 Nor do bfd/section.c:global_syms like *ABS*. */
869 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) != 0)
872 info
.coffinfo
= NULL
;
876 info
.elfinfo
= elf_symbol_from (abfd
, sym
);
877 info
.coffinfo
= coff_symbol_from (sym
);
880 format
->print_symbol_info (&info
, abfd
);
882 if (with_symbol_versions
)
884 const char * version_string
= NULL
;
885 bfd_boolean hidden
= FALSE
;
887 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0)
888 version_string
= bfd_get_symbol_version_string (abfd
, sym
, &hidden
);
890 if (bfd_is_und_section (bfd_get_section (sym
)))
893 if (version_string
&& *version_string
!= '\0')
894 printf (hidden
? "@%s" : "@@%s", version_string
);
899 static asymbol
**syms
;
900 static long symcount
;
901 const char *filename
, *functionname
;
904 /* We need to get the canonical symbols in order to call
905 bfd_find_nearest_line. This is inefficient, but, then, you
906 don't have to use --line-numbers. */
907 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
916 symsize
= bfd_get_symtab_upper_bound (abfd
);
918 bfd_fatal (bfd_get_filename (abfd
));
919 syms
= (asymbol
**) xmalloc (symsize
);
920 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
922 bfd_fatal (bfd_get_filename (abfd
));
923 lineno_cache_bfd
= abfd
;
926 if (bfd_is_und_section (bfd_get_section (sym
)))
928 static asection
**secs
;
929 static arelent
***relocs
;
930 static long *relcount
;
931 static unsigned int seccount
;
935 /* For an undefined symbol, we try to find a reloc for the
936 symbol, and print the line number of the reloc. */
937 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
939 for (i
= 0; i
< seccount
; i
++)
940 if (relocs
[i
] != NULL
)
952 struct get_relocs_info rinfo
;
954 seccount
= bfd_count_sections (abfd
);
956 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
957 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
958 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
961 rinfo
.relocs
= relocs
;
962 rinfo
.relcount
= relcount
;
964 bfd_map_over_sections (abfd
, get_relocs
, (void *) &rinfo
);
965 lineno_cache_rel_bfd
= abfd
;
968 symname
= bfd_asymbol_name (sym
);
969 for (i
= 0; i
< seccount
; i
++)
973 for (j
= 0; j
< relcount
[i
]; j
++)
978 if (r
->sym_ptr_ptr
!= NULL
979 && (*r
->sym_ptr_ptr
)->section
== sym
->section
980 && (*r
->sym_ptr_ptr
)->value
== sym
->value
982 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
983 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
984 r
->address
, &filename
,
985 &functionname
, &lineno
)
988 /* We only print the first one we find. */
989 printf ("\t%s:%u", filename
, lineno
);
996 else if (bfd_get_section (sym
)->owner
== abfd
)
998 if ((bfd_find_line (abfd
, syms
, sym
, &filename
, &lineno
)
999 || bfd_find_nearest_line (abfd
, bfd_get_section (sym
),
1000 syms
, sym
->value
, &filename
,
1001 &functionname
, &lineno
))
1004 printf ("\t%s:%u", filename
, lineno
);
1011 /* Print the symbols when sorting by size. */
1014 print_size_symbols (bfd
* abfd
,
1015 bfd_boolean is_dynamic
,
1016 struct size_sym
* symsizes
,
1021 struct size_sym
*from
;
1022 struct size_sym
*fromend
;
1024 store
= bfd_make_empty_symbol (abfd
);
1026 bfd_fatal (bfd_get_filename (abfd
));
1029 fromend
= from
+ symcount
;
1031 for (; from
< fromend
; from
++)
1035 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
->minisym
, store
);
1037 bfd_fatal (bfd_get_filename (abfd
));
1039 print_symbol (abfd
, sym
, from
->size
, archive_bfd
);
1044 /* Print the symbols of ABFD that are held in MINISYMS.
1046 If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.
1048 SYMCOUNT is the number of symbols in MINISYMS.
1050 SIZE is the size of a symbol in MINISYMS. */
1053 print_symbols (bfd
* abfd
,
1054 bfd_boolean is_dynamic
,
1064 store
= bfd_make_empty_symbol (abfd
);
1066 bfd_fatal (bfd_get_filename (abfd
));
1068 from
= (bfd_byte
*) minisyms
;
1069 fromend
= from
+ symcount
* size
;
1071 for (; from
< fromend
; from
+= size
)
1075 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
, store
);
1077 bfd_fatal (bfd_get_filename (abfd
));
1079 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
1083 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
1086 display_rel_file (bfd
*abfd
, bfd
*archive_bfd
)
1091 struct size_sym
*symsizes
;
1092 asymbol
*synthsyms
= NULL
;
1096 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
1098 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1103 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
1106 if (dynamic
&& bfd_get_error () == bfd_error_no_symbols
)
1108 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1112 bfd_fatal (bfd_get_filename (abfd
));
1117 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1121 if (show_synthetic
&& size
== sizeof (asymbol
*))
1123 asymbol
**static_syms
= NULL
;
1124 asymbol
**dyn_syms
= NULL
;
1125 long static_count
= 0;
1131 dyn_count
= symcount
;
1132 dyn_syms
= (asymbol
**) minisyms
;
1136 long storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
1138 static_count
= symcount
;
1139 static_syms
= (asymbol
**) minisyms
;
1143 dyn_syms
= (asymbol
**) xmalloc (storage
);
1144 dyn_count
= bfd_canonicalize_dynamic_symtab (abfd
, dyn_syms
);
1146 bfd_fatal (bfd_get_filename (abfd
));
1150 synth_count
= bfd_get_synthetic_symtab (abfd
, static_count
, static_syms
,
1151 dyn_count
, dyn_syms
, &synthsyms
);
1152 if (synth_count
> 0)
1157 minisyms
= xrealloc (minisyms
,
1158 (symcount
+ synth_count
+ 1) * sizeof (*symp
));
1159 symp
= (asymbol
**) minisyms
+ symcount
;
1160 for (i
= 0; i
< synth_count
; i
++)
1161 *symp
++ = synthsyms
+ i
;
1163 symcount
+= synth_count
;
1167 /* Discard the symbols we don't want to print.
1168 It's OK to do this in place; we'll free the storage anyway
1169 (after printing). */
1171 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1177 sort_dynamic
= dynamic
;
1178 sort_x
= bfd_make_empty_symbol (abfd
);
1179 sort_y
= bfd_make_empty_symbol (abfd
);
1180 if (sort_x
== NULL
|| sort_y
== NULL
)
1181 bfd_fatal (bfd_get_filename (abfd
));
1184 qsort (minisyms
, symcount
, size
,
1185 sorters
[sort_numerically
][reverse_sort
]);
1187 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1192 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1194 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1203 set_print_width (bfd
*file
)
1205 print_width
= bfd_get_arch_size (file
);
1207 if (print_width
== -1)
1210 Guess the target's bitsize based on its name.
1211 We assume here than any 64-bit format will include
1212 "64" somewhere in its name. The only known exception
1213 is the MMO object file format. */
1214 if (strstr (bfd_get_target (file
), "64") != NULL
1215 || strcmp (bfd_get_target (file
), "mmo") == 0)
1223 display_archive (bfd
*file
)
1226 bfd
*last_arfile
= NULL
;
1229 format
->print_archive_filename (bfd_get_filename (file
));
1232 print_symdef_entry (file
);
1238 arfile
= bfd_openr_next_archived_file (file
, arfile
);
1242 if (bfd_get_error () != bfd_error_no_more_archived_files
)
1243 bfd_fatal (bfd_get_filename (file
));
1247 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
1249 set_print_width (arfile
);
1250 format
->print_archive_member (bfd_get_filename (file
),
1251 bfd_get_filename (arfile
));
1252 display_rel_file (arfile
, file
);
1256 bfd_nonfatal (bfd_get_filename (arfile
));
1257 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1259 list_matching_formats (matching
);
1264 if (last_arfile
!= NULL
)
1266 bfd_close (last_arfile
);
1267 lineno_cache_bfd
= NULL
;
1268 lineno_cache_rel_bfd
= NULL
;
1269 if (arfile
== last_arfile
)
1272 last_arfile
= arfile
;
1275 if (last_arfile
!= NULL
)
1277 bfd_close (last_arfile
);
1278 lineno_cache_bfd
= NULL
;
1279 lineno_cache_rel_bfd
= NULL
;
1284 display_file (char *filename
)
1286 bfd_boolean retval
= TRUE
;
1290 if (get_file_size (filename
) < 1)
1293 file
= bfd_openr (filename
, target
? target
: plugin_target
);
1296 bfd_nonfatal (filename
);
1300 /* If printing line numbers, decompress the debug sections. */
1302 file
->flags
|= BFD_DECOMPRESS
;
1304 if (bfd_check_format (file
, bfd_archive
))
1306 display_archive (file
);
1308 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
1310 set_print_width (file
);
1311 format
->print_object_filename (filename
);
1312 display_rel_file (file
, NULL
);
1316 bfd_nonfatal (filename
);
1317 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1319 list_matching_formats (matching
);
1325 if (!bfd_close (file
))
1326 bfd_fatal (filename
);
1328 lineno_cache_bfd
= NULL
;
1329 lineno_cache_rel_bfd
= NULL
;
1334 /* The following 3 groups of functions are called unconditionally,
1335 once at the start of processing each file of the appropriate type.
1336 They should check `filename_per_file' and `filename_per_symbol',
1337 as appropriate for their output format, to determine whether to
1340 /* Print the name of an object file given on the command line. */
1343 print_object_filename_bsd (char *filename
)
1345 if (filename_per_file
&& !filename_per_symbol
)
1346 printf ("\n%s:\n", filename
);
1350 print_object_filename_sysv (char *filename
)
1353 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1355 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1356 if (print_width
== 32)
1358 Name Value Class Type Size Line Section\n\n"));
1361 Name Value Class Type Size Line Section\n\n"));
1365 print_object_filename_posix (char *filename
)
1367 if (filename_per_file
&& !filename_per_symbol
)
1368 printf ("%s:\n", filename
);
1371 /* Print the name of an archive file given on the command line. */
1374 print_archive_filename_bsd (char *filename
)
1376 if (filename_per_file
)
1377 printf ("\n%s:\n", filename
);
1381 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED
)
1386 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED
)
1390 /* Print the name of an archive member file. */
1393 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED
,
1394 const char *filename
)
1396 if (!filename_per_symbol
)
1397 printf ("\n%s:\n", filename
);
1401 print_archive_member_sysv (char *archive
, const char *filename
)
1404 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1406 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1407 if (print_width
== 32)
1409 Name Value Class Type Size Line Section\n\n"));
1412 Name Value Class Type Size Line Section\n\n"));
1416 print_archive_member_posix (char *archive
, const char *filename
)
1418 if (!filename_per_symbol
)
1419 printf ("%s[%s]:\n", archive
, filename
);
1422 /* Print the name of the file (and archive, if there is one)
1423 containing a symbol. */
1426 print_symbol_filename_bsd (bfd
*archive_bfd
, bfd
*abfd
)
1428 if (filename_per_symbol
)
1431 printf ("%s:", bfd_get_filename (archive_bfd
));
1432 printf ("%s:", bfd_get_filename (abfd
));
1437 print_symbol_filename_sysv (bfd
*archive_bfd
, bfd
*abfd
)
1439 if (filename_per_symbol
)
1442 printf ("%s:", bfd_get_filename (archive_bfd
));
1443 printf ("%s:", bfd_get_filename (abfd
));
1448 print_symbol_filename_posix (bfd
*archive_bfd
, bfd
*abfd
)
1450 if (filename_per_symbol
)
1453 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1454 bfd_get_filename (abfd
));
1456 printf ("%s: ", bfd_get_filename (abfd
));
1460 /* Construct a formatting string for printing symbol values. */
1463 get_print_format (void)
1465 static const char * saved_format
= NULL
;
1467 /* See if we have already constructed the format. */
1469 return saved_format
;
1471 const char * padding
;
1472 if (print_format
== FORMAT_POSIX
)
1474 /* POSIX compatible output does not have any padding. */
1477 else if (print_width
== 32)
1481 else /* print_width == 64 */
1486 const char * length
= "l";
1487 if (print_width
== 64)
1489 #if BFD_HOST_64BIT_LONG
1491 #elif BFD_HOST_64BIT_LONG_LONG
1500 const char * radix
= NULL
;
1501 switch (print_radix
)
1503 case 8: radix
= "o"; break;
1504 case 10: radix
= "d"; break;
1505 case 16: radix
= "x"; break;
1508 saved_format
= concat ("%", padding
, length
, radix
, NULL
);
1509 return saved_format
;
1512 /* Print a symbol value. */
1515 print_value (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_vma val
)
1517 switch (print_width
)
1520 printf (get_print_format (), (unsigned long) val
);
1524 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1525 printf (get_print_format (), val
);
1527 /* We have a 64 bit value to print, but the host is only 32 bit. */
1528 if (print_radix
== 16)
1529 bfd_fprintf_vma (abfd
, stdout
, val
);
1535 s
= buf
+ sizeof buf
;
1539 *--s
= (val
% print_radix
) + '0';
1542 while ((buf
+ sizeof buf
- 1) - s
< 16)
1550 fatal (_("Print width has not been initialized (%d)"), print_width
);
1555 /* Print a line of information about a symbol. */
1558 print_symbol_info_bsd (struct extended_symbol_info
*info
, bfd
*abfd
)
1560 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1562 if (print_width
== 64)
1568 /* Normally we print the value of the symbol. If we are printing the
1569 size or sorting by size then we print its size, except for the
1570 (weird) special case where both flags are defined, in which case we
1571 print both values. This conforms to documented behaviour. */
1572 if (sort_by_size
&& !print_size
)
1573 print_value (abfd
, SYM_SIZE (info
));
1575 print_value (abfd
, SYM_VALUE (info
));
1576 if (print_size
&& SYM_SIZE (info
))
1579 print_value (abfd
, SYM_SIZE (info
));
1583 printf (" %c", SYM_TYPE (info
));
1585 if (SYM_TYPE (info
) == '-')
1589 printf (other_format
, SYM_STAB_OTHER (info
));
1591 printf (desc_format
, SYM_STAB_DESC (info
));
1592 printf (" %5s", SYM_STAB_NAME (info
));
1594 print_symname (" %s", SYM_NAME (info
), abfd
);
1598 print_symbol_info_sysv (struct extended_symbol_info
*info
, bfd
*abfd
)
1600 print_symname ("%-20s|", SYM_NAME (info
), abfd
);
1602 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1604 if (print_width
== 32)
1610 print_value (abfd
, SYM_VALUE (info
));
1612 printf ("| %c |", SYM_TYPE (info
));
1614 if (SYM_TYPE (info
) == '-')
1617 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type. */
1618 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size. */
1619 printf ("| |"); /* Line, Section. */
1623 /* Type, Size, Line, Section */
1626 get_elf_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1627 else if (info
->coffinfo
)
1629 get_coff_symbol_type (&info
->coffinfo
->native
->u
.syment
));
1633 if (SYM_SIZE (info
))
1634 print_value (abfd
, SYM_SIZE (info
));
1637 if (print_width
== 32)
1644 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1645 else if (info
->coffinfo
)
1646 printf("| |%s", info
->coffinfo
->symbol
.section
->name
);
1653 print_symbol_info_posix (struct extended_symbol_info
*info
, bfd
*abfd
)
1655 print_symname ("%s ", SYM_NAME (info
), abfd
);
1656 printf ("%c ", SYM_TYPE (info
));
1658 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1662 print_value (abfd
, SYM_VALUE (info
));
1664 if (SYM_SIZE (info
))
1665 print_value (abfd
, SYM_SIZE (info
));
1670 main (int argc
, char **argv
)
1675 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1676 setlocale (LC_MESSAGES
, "");
1678 #if defined (HAVE_SETLOCALE)
1679 setlocale (LC_CTYPE
, "");
1680 setlocale (LC_COLLATE
, "");
1682 bindtextdomain (PACKAGE
, LOCALEDIR
);
1683 textdomain (PACKAGE
);
1685 program_name
= *argv
;
1686 xmalloc_set_program_name (program_name
);
1687 bfd_set_error_program_name (program_name
);
1688 #if BFD_SUPPORTS_PLUGINS
1689 bfd_plugin_set_program_name (program_name
);
1692 START_PROGRESS (program_name
, 0);
1694 expandargv (&argc
, &argv
);
1696 if (bfd_init () != BFD_INIT_MAGIC
)
1697 fatal (_("fatal error: libbfd ABI mismatch"));
1698 set_default_bfd_target ();
1700 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhlnopPrSst:uvVvX:",
1701 long_options
, (int *) 0)) != EOF
)
1706 print_debug_syms
= 1;
1710 filename_per_symbol
= 1;
1712 case 'B': /* For MIPS compatibility. */
1713 set_output_format ("bsd");
1719 enum demangling_styles style
;
1721 style
= cplus_demangle_name_to_style (optarg
);
1722 if (style
== unknown_demangling
)
1723 fatal (_("unknown demangling style `%s'"),
1726 cplus_demangle_set_style (style
);
1729 case OPTION_RECURSE_LIMIT
:
1730 demangle_flags
&= ~ DMGL_NO_RECURSE_LIMIT
;
1732 case OPTION_NO_RECURSE_LIMIT
:
1733 demangle_flags
|= DMGL_NO_RECURSE_LIMIT
;
1739 /* Ignored for HP/UX compatibility. */
1742 set_output_format (optarg
);
1756 sort_numerically
= 1;
1761 sort_numerically
= 0;
1764 case OPTION_SIZE_SORT
:
1766 sort_numerically
= 0;
1770 set_output_format ("posix");
1782 set_print_radix (optarg
);
1791 /* Ignored for (partial) AIX compatibility. On AIX, the
1792 argument has values 32, 64, or 32_64, and specifies that
1793 only 32-bit, only 64-bit, or both kinds of objects should
1794 be examined. The default is 32. So plain AIX nm on a
1795 library archive with both kinds of objects will ignore
1796 the 64-bit ones. For GNU nm, the default is and always
1797 has been -X 32_64, and other options are not supported. */
1798 if (strcmp (optarg
, "32_64") != 0)
1799 fatal (_("Only -X 32_64 is supported"));
1802 case OPTION_TARGET
: /* --target */
1806 case OPTION_PLUGIN
: /* --plugin */
1807 #if BFD_SUPPORTS_PLUGINS
1808 bfd_plugin_set_plugin (optarg
);
1810 fatal (_("sorry - this program has been built without plugin support\n"));
1814 case 0: /* A long option that just sets a flag. */
1823 print_version ("nm");
1825 if (sort_by_size
&& undefined_only
)
1827 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1828 non_fatal (_("will produce no output, since undefined symbols have no size."));
1832 /* OK, all options now parsed. If no filename specified, do a.out. */
1834 return !display_file ("a.out");
1838 if (argc
- optind
> 1)
1839 filename_per_file
= 1;
1841 /* We were given several filenames to do. */
1842 while (optind
< argc
)
1845 if (!display_file (argv
[optind
++]))
1849 END_PROGRESS (program_name
);