1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright (C) 1991-2024 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
24 #include "aout/stab_gnu.h"
25 #include "aout/ranlib.h"
27 #include "libiberty.h"
29 #include "elf/common.h"
30 #define DO_NOT_DEFINE_AOUTHDR
31 #define DO_NOT_DEFINE_FILHDR
32 #define DO_NOT_DEFINE_LINENO
33 #define DO_NOT_DEFINE_SCNHDR
34 #include "coff/external.h"
35 #include "coff/internal.h"
38 #include "demanguse.h"
39 #include "plugin-api.h"
41 #include "safe-ctype.h"
44 #define streq(a,b) (strcmp ((a),(b)) == 0)
47 /* When sorting by size, we use this structure to hold the size and a
48 pointer to the minisymbol. */
56 /* line number related info cached in bfd usrdata. */
65 unsigned int seccount
;
68 struct extended_symbol_info
72 elf_symbol_type
*elfinfo
;
73 coff_symbol_type
*coffinfo
;
74 /* FIXME: We should add more fields for Type, Line, Section. */
76 #define SYM_VALUE(sym) (sym->sinfo->value)
77 #define SYM_TYPE(sym) (sym->sinfo->type)
78 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
79 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
80 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
81 #define SYM_SIZE(sym) \
82 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
84 /* The output formatting functions. */
85 static void print_object_filename_bsd (const char *);
86 static void print_object_filename_sysv (const char *);
87 static void print_object_filename_posix (const char *);
88 static void do_not_print_object_filename (const char *);
90 static void print_archive_filename_bsd (const char *);
91 static void print_archive_filename_sysv (const char *);
92 static void print_archive_filename_posix (const char *);
93 static void do_not_print_archive_filename (const char *);
95 static void print_archive_member_bsd (const char *, const char *);
96 static void print_archive_member_sysv (const char *, const char *);
97 static void print_archive_member_posix (const char *, const char *);
98 static void do_not_print_archive_member (const char *, const char *);
100 static void print_symbol_filename_bsd (bfd
*, bfd
*);
101 static void print_symbol_filename_sysv (bfd
*, bfd
*);
102 static void print_symbol_filename_posix (bfd
*, bfd
*);
103 static void do_not_print_symbol_filename (bfd
*, bfd
*);
105 static void print_symbol_info_bsd (struct extended_symbol_info
*, bfd
*);
106 static void print_symbol_info_sysv (struct extended_symbol_info
*, bfd
*);
107 static void print_symbol_info_posix (struct extended_symbol_info
*, bfd
*);
108 static void just_print_symbol_name (struct extended_symbol_info
*, bfd
*);
110 static void print_value (bfd
*, bfd_vma
);
112 /* Support for different output formats. */
115 /* Print the name of an object file given on the command line. */
116 void (*print_object_filename
) (const char *);
118 /* Print the name of an archive file given on the command line. */
119 void (*print_archive_filename
) (const char *);
121 /* Print the name of an archive member file. */
122 void (*print_archive_member
) (const char *, const char *);
124 /* Print the name of the file (and archive, if there is one)
125 containing a symbol. */
126 void (*print_symbol_filename
) (bfd
*, bfd
*);
128 /* Print a line of information about a symbol. */
129 void (*print_symbol_info
) (struct extended_symbol_info
*, bfd
*);
132 /* Indices in `formats'. */
142 #define FORMAT_DEFAULT FORMAT_BSD
144 static const struct output_fns formats
[FORMAT_MAX
] =
146 {print_object_filename_bsd
,
147 print_archive_filename_bsd
,
148 print_archive_member_bsd
,
149 print_symbol_filename_bsd
,
150 print_symbol_info_bsd
},
151 {print_object_filename_sysv
,
152 print_archive_filename_sysv
,
153 print_archive_member_sysv
,
154 print_symbol_filename_sysv
,
155 print_symbol_info_sysv
},
156 {print_object_filename_posix
,
157 print_archive_filename_posix
,
158 print_archive_member_posix
,
159 print_symbol_filename_posix
,
160 print_symbol_info_posix
},
161 {do_not_print_object_filename
,
162 do_not_print_archive_filename
,
163 do_not_print_archive_member
,
164 do_not_print_symbol_filename
,
165 just_print_symbol_name
}
169 /* The output format to use. */
170 static const struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
171 static unsigned int print_format
= FORMAT_DEFAULT
;
172 static char print_format_string
[10];
174 /* Command options. */
176 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
177 static int external_only
= 0; /* Print external symbols only. */
178 static int defined_only
= 0; /* Print defined symbols only. */
179 static int non_weak
= 0; /* Ignore weak symbols. */
180 static int no_sort
= 0; /* Don't sort; print syms in order found. */
181 static int print_debug_syms
= 0;/* Print debugger-only symbols too. */
182 static int print_armap
= 0; /* Describe __.SYMDEF data in archive files. */
183 static int print_size
= 0; /* Print size of defined symbols. */
184 static int reverse_sort
= 0; /* Sort in downward(alpha or numeric) order. */
185 static int sort_numerically
= 0;/* Sort in numeric rather than alpha order. */
186 static int sort_by_size
= 0; /* Sort by size of symbol. */
187 static int undefined_only
= 0; /* Print undefined symbols only. */
188 static int dynamic
= 0; /* Print dynamic symbols. */
189 static int show_version
= 0; /* Show the version number. */
190 static int show_synthetic
= 0; /* Display synthesized symbols too. */
191 static int line_numbers
= 0; /* Print line numbers for symbols. */
192 static int allow_special_symbols
= 0; /* Allow special symbols. */
193 static int with_symbol_versions
= -1; /* Output symbol version information. */
194 static int quiet
= 0; /* Suppress "no symbols" diagnostic. */
196 /* The characters to use for global and local ifunc symbols. */
197 #if DEFAULT_F_FOR_IFUNC_SYMBOLS
198 static const char * ifunc_type_chars
= "Ff";
200 static const char * ifunc_type_chars
= NULL
;
203 static int demangle_flags
= DMGL_ANSI
| DMGL_PARAMS
;
205 /* When to print the names of files. Not mutually exclusive in SYSV format. */
206 static int filename_per_file
= 0; /* Once per file, on its own line. */
207 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
209 static int print_width
= 0;
210 static int print_radix
= 16;
211 /* Print formats for printing stab info. */
212 static char other_format
[] = "%02x";
213 static char desc_format
[] = "%04x";
215 static char *target
= NULL
;
216 #if BFD_SUPPORTS_PLUGINS
217 static const char *plugin_target
= "plugin";
219 static const char *plugin_target
= NULL
;
222 typedef enum unicode_display_type
230 } unicode_display_type
;
232 static unicode_display_type unicode_display
= unicode_default
;
234 enum long_option_values
239 OPTION_RECURSE_LIMIT
,
240 OPTION_NO_RECURSE_LIMIT
,
246 static struct option long_options
[] =
248 {"debug-syms", no_argument
, &print_debug_syms
, 1},
249 {"demangle", optional_argument
, 0, 'C'},
250 {"dynamic", no_argument
, &dynamic
, 1},
251 {"extern-only", no_argument
, &external_only
, 1},
252 {"format", required_argument
, 0, 'f'},
253 {"help", no_argument
, 0, 'h'},
254 {"ifunc-chars", required_argument
, 0, OPTION_IFUNC_CHARS
},
255 {"just-symbols", no_argument
, 0, 'j'},
256 {"line-numbers", no_argument
, 0, 'l'},
257 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
258 {"no-demangle", no_argument
, &do_demangle
, 0},
259 {"no-recurse-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
260 {"no-recursion-limit", no_argument
, NULL
, OPTION_NO_RECURSE_LIMIT
},
261 {"no-sort", no_argument
, 0, 'p'},
262 {"numeric-sort", no_argument
, 0, 'n'},
263 {"plugin", required_argument
, 0, OPTION_PLUGIN
},
264 {"portability", no_argument
, 0, 'P'},
265 {"print-armap", no_argument
, &print_armap
, 1},
266 {"print-file-name", no_argument
, 0, 'o'},
267 {"print-size", no_argument
, 0, 'S'},
268 {"quiet", no_argument
, 0, OPTION_QUIET
},
269 {"radix", required_argument
, 0, 't'},
270 {"recurse-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
271 {"recursion-limit", no_argument
, NULL
, OPTION_RECURSE_LIMIT
},
272 {"reverse-sort", no_argument
, &reverse_sort
, 1},
273 {"size-sort", no_argument
, 0, OPTION_SIZE_SORT
},
274 {"special-syms", no_argument
, &allow_special_symbols
, 1},
275 {"synthetic", no_argument
, &show_synthetic
, 1},
276 {"target", required_argument
, 0, OPTION_TARGET
},
277 {"defined-only", no_argument
, 0, 'U'},
278 {"undefined-only", no_argument
, 0, 'u'},
279 {"unicode", required_argument
, NULL
, OPTION_UNICODE
},
280 {"version", no_argument
, &show_version
, 1},
281 {"no-weak", no_argument
, 0, 'W'},
282 {"with-symbol-versions", no_argument
, &with_symbol_versions
, 1},
283 {"without-symbol-versions", no_argument
, &with_symbol_versions
, 0},
284 {0, no_argument
, 0, 0}
287 /* Some error-reporting functions. */
289 ATTRIBUTE_NORETURN
static void
290 usage (FILE *stream
, int status
)
292 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
293 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
294 fprintf (stream
, _(" The options are:\n"));
295 fprintf (stream
, _("\
296 -a, --debug-syms Display debugger-only symbols\n"));
297 fprintf (stream
, _("\
298 -A, --print-file-name Print name of the input file before every symbol\n"));
299 fprintf (stream
, _("\
300 -B Same as --format=bsd\n"));
301 fprintf (stream
, _("\
302 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n"));
303 display_demangler_styles (stream
, _("\
305 fprintf (stream
, _("\
306 --no-demangle Do not demangle low-level symbol names\n"));
307 fprintf (stream
, _("\
308 --recurse-limit Enable a demangling recursion limit. (default)\n"));
309 fprintf (stream
, _("\
310 --no-recurse-limit Disable a demangling recursion limit.\n"));
311 fprintf (stream
, _("\
312 -D, --dynamic Display dynamic symbols instead of normal symbols\n"));
313 fprintf (stream
, _("\
315 fprintf (stream
, _("\
316 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
317 `sysv', `posix' or 'just-symbols'.\n\
318 The default is `bsd'\n"));
319 fprintf (stream
, _("\
320 -g, --extern-only Display only external symbols\n"));
321 fprintf (stream
, _("\
322 --ifunc-chars=CHARS Characters to use when displaying ifunc symbols\n"));
323 fprintf (stream
, _("\
324 -j, --just-symbols Same as --format=just-symbols\n"));
325 fprintf (stream
, _("\
326 -l, --line-numbers Use debugging information to find a filename and\n\
327 line number for each symbol\n"));
328 fprintf (stream
, _("\
329 -n, --numeric-sort Sort symbols numerically by address\n"));
330 fprintf (stream
, _("\
332 fprintf (stream
, _("\
333 -p, --no-sort Do not sort the symbols\n"));
334 fprintf (stream
, _("\
335 -P, --portability Same as --format=posix\n"));
336 fprintf (stream
, _("\
337 -r, --reverse-sort Reverse the sense of the sort\n"));
338 #if BFD_SUPPORTS_PLUGINS
339 fprintf (stream
, _("\
340 --plugin NAME Load the specified plugin\n"));
342 fprintf (stream
, _("\
343 -S, --print-size Print size of defined symbols\n"));
344 fprintf (stream
, _("\
345 -s, --print-armap Include index for symbols from archive members\n"));
346 fprintf (stream
, _("\
347 --quiet Suppress \"no symbols\" diagnostic\n"));
348 fprintf (stream
, _("\
349 --size-sort Sort symbols by size\n"));
350 fprintf (stream
, _("\
351 --special-syms Include special symbols in the output\n"));
352 fprintf (stream
, _("\
353 --synthetic Display synthetic symbols as well\n"));
354 fprintf (stream
, _("\
355 -t, --radix=RADIX Use RADIX for printing symbol values\n"));
356 fprintf (stream
, _("\
357 --target=BFDNAME Specify the target object format as BFDNAME\n"));
358 fprintf (stream
, _("\
359 -u, --undefined-only Display only undefined symbols\n"));
360 fprintf (stream
, _("\
361 -U, --defined-only Display only defined symbols\n"));
362 fprintf (stream
, _("\
363 --unicode={default|show|invalid|hex|escape|highlight}\n\
364 Specify how to treat UTF-8 encoded unicode characters\n"));
365 fprintf (stream
, _("\
366 -W, --no-weak Ignore weak symbols\n"));
367 fprintf (stream
, _("\
368 --without-symbol-versions Do not display version strings after symbol names\n"));
369 fprintf (stream
, _("\
370 -X 32_64 (ignored)\n"));
371 fprintf (stream
, _("\
372 @FILE Read options from FILE\n"));
373 fprintf (stream
, _("\
374 -h, --help Display this information\n"));
375 fprintf (stream
, _("\
376 -V, --version Display this program's version number\n"));
378 list_supported_targets (program_name
, stream
);
379 if (REPORT_BUGS_TO
[0] && status
== 0)
380 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
384 /* Set the radix for the symbol value and size according to RADIX. */
387 set_print_radix (char *radix
)
391 case 'x': print_radix
= 16; break;
392 case 'd': print_radix
= 10; break;
393 case 'o': print_radix
= 8; break;
396 fatal (_("%s: invalid radix"), radix
);
399 other_format
[3] = desc_format
[3] = *radix
;
403 set_output_format (char *f
)
423 i
= FORMAT_JUST_SYMBOLS
;
426 fatal (_("%s: invalid output format"), f
);
428 format
= &formats
[i
];
433 get_elf_symbol_type (unsigned int type
)
439 case STT_NOTYPE
: return "NOTYPE";
440 case STT_OBJECT
: return "OBJECT";
441 case STT_FUNC
: return "FUNC";
442 case STT_SECTION
: return "SECTION";
443 case STT_FILE
: return "FILE";
444 case STT_COMMON
: return "COMMON";
445 case STT_TLS
: return "TLS";
449 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
450 bufp
= xasprintf (_("<processor specific>: %d"), type
);
451 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
452 bufp
= xasprintf (_("<OS specific>: %d"), type
);
454 bufp
= xasprintf (_("<unknown>: %d"), type
);
459 get_coff_symbol_type (const struct internal_syment
*sym
)
463 switch (sym
->n_sclass
)
465 case C_BLOCK
: return "Block";
466 case C_FILE
: return "File";
467 case C_LINE
: return "Line";
473 switch (DTYPE(sym
->n_type
))
475 case DT_FCN
: return "Function";
476 case DT_PTR
: return "Pointer";
477 case DT_ARY
: return "Array";
481 bufp
= xasprintf (_("<unknown>: %d/%d"), sym
->n_sclass
, sym
->n_type
);
485 /* Convert a potential UTF-8 encoded sequence in IN into characters in OUT.
486 The conversion format is controlled by the unicode_display variable.
487 Returns the number of characters added to OUT.
488 Returns the number of bytes consumed from IN in CONSUMED.
489 Always consumes at least one byte and displays at least one character. */
492 display_utf8 (const unsigned char * in
, char * out
, unsigned int * consumed
)
494 char * orig_out
= out
;
495 unsigned int nchars
= 0;
498 if (unicode_display
== unicode_default
)
504 if ((in
[1] & 0xc0) != 0x80)
507 if ((in
[0] & 0x20) == 0)
513 if ((in
[2] & 0xc0) != 0x80)
516 if ((in
[0] & 0x10) == 0)
522 if ((in
[3] & 0xc0) != 0x80)
528 switch (unicode_display
)
531 /* Copy the bytes into the output buffer as is. */
532 memcpy (out
, in
, nchars
);
536 case unicode_invalid
:
538 *out
++ = unicode_display
== unicode_hex
? '<' : '{';
541 for (j
= 0; j
< nchars
; j
++)
542 out
+= sprintf (out
, "%02x", in
[j
]);
543 *out
++ = unicode_display
== unicode_hex
? '>' : '}';
546 case unicode_highlight
:
548 out
+= sprintf (out
, "\x1B[31;47m"); /* Red. */
554 out
+= sprintf (out
, "\\u%02x%02x",
555 ((in
[0] & 0x1c) >> 2),
556 ((in
[0] & 0x03) << 6) | (in
[1] & 0x3f));
560 out
+= sprintf (out
, "\\u%02x%02x",
561 ((in
[0] & 0x0f) << 4) | ((in
[1] & 0x3c) >> 2),
562 ((in
[1] & 0x03) << 6) | ((in
[2] & 0x3f)));
566 out
+= sprintf (out
, "\\u%02x%02x%02x",
567 ((in
[0] & 0x07) << 6) | ((in
[1] & 0x3c) >> 2),
568 ((in
[1] & 0x03) << 6) | ((in
[2] & 0x3c) >> 2),
569 ((in
[2] & 0x03) << 6) | ((in
[3] & 0x3f)));
576 if (unicode_display
== unicode_highlight
&& isatty (1))
577 out
+= sprintf (out
, "\x1B[0m"); /* Default colour. */
586 return out
- orig_out
;
589 /* Not a valid UTF-8 sequence. */
595 /* Convert any UTF-8 encoded characters in NAME into the form specified by
596 unicode_display. Also converts control characters. Returns a static
597 buffer if conversion was necessary.
598 Code stolen from objdump.c:sanitize_string(). */
601 convert_utf8 (const char * in
)
603 static char * buffer
= NULL
;
604 static size_t buffer_len
= 0;
605 const char * original
= in
;
612 /* See if any conversion is necessary.
613 In the majority of cases it will not be needed. */
616 unsigned char c
= *in
++;
624 if (unicode_display
!= unicode_default
&& c
>= 0xc0)
629 /* Copy the input, translating as needed. */
631 /* For 2 char unicode, max out is 12 (colour escapes) + 6, ie. 9 per in
632 For hex, max out is 8 for 2 char unicode, ie. 4 per in.
633 3 and 4 char unicode produce less output for input. */
634 size_t max_needed
= strlen (in
) * 9 + 1;
635 if (buffer_len
< max_needed
)
637 buffer_len
= max_needed
;
639 buffer
= xmalloc (buffer_len
);
645 unsigned char c
= *in
++;
655 else if (unicode_display
!= unicode_default
&& c
>= 0xc0)
657 unsigned int num_consumed
;
659 out
+= display_utf8 ((const unsigned char *) --in
, out
, &num_consumed
);
671 /* Print symbol name NAME, read from ABFD, with printf format FORM,
672 demangling it if requested. */
675 print_symname (const char *form
, struct extended_symbol_info
*info
,
676 const char *name
, bfd
*abfd
)
682 name
= info
->sinfo
->name
;
684 if (!with_symbol_versions
685 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
687 atver
= strchr (name
, '@');
692 if (do_demangle
&& *name
)
694 alloc
= bfd_demangle (abfd
, name
, demangle_flags
);
699 if (unicode_display
!= unicode_default
)
701 name
= convert_utf8 (name
);
704 if (info
!= NULL
&& info
->elfinfo
&& with_symbol_versions
)
706 const char *version_string
;
710 = bfd_get_symbol_version_string (abfd
, &info
->elfinfo
->symbol
,
712 if (version_string
&& version_string
[0])
714 const char *at
= "@@";
715 if (hidden
|| bfd_is_und_section (info
->elfinfo
->symbol
.section
))
717 alloc
= reconcat (alloc
, name
, at
, version_string
, NULL
);
729 print_symdef_entry (bfd
*abfd
)
731 symindex idx
= BFD_NO_MORE_SYMBOLS
;
733 bool everprinted
= false;
735 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
736 idx
!= BFD_NO_MORE_SYMBOLS
;
737 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
741 printf (_("\nArchive index:\n"));
744 if (thesym
->name
!= NULL
)
746 print_symname ("%s", NULL
, thesym
->name
, abfd
);
747 bfd
*elt
= bfd_get_elt_at_index (abfd
, idx
);
749 printf (" in %s\n", bfd_get_filename (elt
));
757 /* True when we can report missing plugin error. */
758 bool report_plugin_err
= true;
760 /* Choose which symbol entries to print;
761 compact them downward to get rid of the rest.
762 Return the number of symbols to be printed. */
765 filter_symbols (bfd
*abfd
, bool is_dynamic
, void *minisyms
,
766 long symcount
, unsigned int size
)
768 bfd_byte
*from
, *fromend
, *to
;
771 store
= bfd_make_empty_symbol (abfd
);
773 bfd_fatal (bfd_get_filename (abfd
));
775 from
= (bfd_byte
*) minisyms
;
776 fromend
= from
+ symcount
* size
;
777 to
= (bfd_byte
*) minisyms
;
779 for (; from
< fromend
; from
+= size
)
784 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
, store
);
788 if (sym
->name
!= NULL
789 && sym
->name
[0] == '_'
790 && sym
->name
[1] == '_'
791 && strcmp (sym
->name
+ (sym
->name
[2] == '_'), "__gnu_lto_slim") == 0
792 && report_plugin_err
)
794 report_plugin_err
= false;
795 non_fatal (_("%s: plugin needed to handle lto object"),
796 bfd_get_filename (abfd
));
800 keep
= bfd_is_und_section (sym
->section
);
801 else if (external_only
)
802 /* PR binutls/12753: Unique symbols are global too. */
803 keep
= ((sym
->flags
& (BSF_GLOBAL
805 | BSF_GNU_UNIQUE
)) != 0
806 || bfd_is_und_section (sym
->section
)
807 || bfd_is_com_section (sym
->section
));
809 keep
= ((sym
->flags
& BSF_WEAK
) == 0);
814 && ! print_debug_syms
815 && (sym
->flags
& BSF_DEBUGGING
) != 0)
820 && (bfd_is_abs_section (sym
->section
)
821 || bfd_is_und_section (sym
->section
)))
827 if (bfd_is_und_section (sym
->section
))
832 && bfd_is_target_special_symbol (abfd
, sym
)
833 && ! allow_special_symbols
)
839 memcpy (to
, from
, size
);
844 return (to
- (bfd_byte
*) minisyms
) / size
;
847 /* These globals are used to pass information into the sorting
849 static bfd
*sort_bfd
;
850 static bool sort_dynamic
;
851 static asymbol
*sort_x
;
852 static asymbol
*sort_y
;
854 /* Symbol-sorting predicates */
855 #define valueof(x) ((x)->section->vma + (x)->value)
857 /* Numeric sorts. Undefined symbols are always considered "less than"
858 defined symbols with zero values. Common symbols are not treated
859 specially -- i.e., their sizes are used as their "values". */
862 non_numeric_forward (const void *P_x
, const void *P_y
)
867 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
868 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
869 if (x
== NULL
|| y
== NULL
)
870 bfd_fatal (bfd_get_filename (sort_bfd
));
872 xn
= bfd_asymbol_name (x
);
873 yn
= bfd_asymbol_name (y
);
880 /* Solaris 2.5 has a bug in strcoll.
881 strcoll returns invalid values when confronted with empty strings. */
887 return strcoll (xn
, yn
);
891 non_numeric_reverse (const void *x
, const void *y
)
893 return - non_numeric_forward (x
, y
);
897 numeric_forward (const void *P_x
, const void *P_y
)
902 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
903 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
904 if (x
== NULL
|| y
== NULL
)
905 bfd_fatal (bfd_get_filename (sort_bfd
));
907 xs
= bfd_asymbol_section (x
);
908 ys
= bfd_asymbol_section (y
);
910 if (bfd_is_und_section (xs
))
912 if (! bfd_is_und_section (ys
))
915 else if (bfd_is_und_section (ys
))
917 else if (valueof (x
) != valueof (y
))
918 return valueof (x
) < valueof (y
) ? -1 : 1;
920 return non_numeric_forward (P_x
, P_y
);
924 numeric_reverse (const void *x
, const void *y
)
926 return - numeric_forward (x
, y
);
929 static int (*(sorters
[2][2])) (const void *, const void *) =
931 { non_numeric_forward
, non_numeric_reverse
},
932 { numeric_forward
, numeric_reverse
}
935 /* This sort routine is used by sort_symbols_by_size. It is similar
936 to numeric_forward, but when symbols have the same value it sorts
937 by section VMA. This simplifies the sort_symbols_by_size code
938 which handles symbols at the end of sections. Also, this routine
939 tries to sort file names before other symbols with the same value.
940 That will make the file name have a zero size, which will make
941 sort_symbols_by_size choose the non file name symbol, leading to
942 more meaningful output. For similar reasons, this code sorts
943 gnu_compiled_* and gcc2_compiled before other symbols with the same
947 size_forward1 (const void *P_x
, const void *P_y
)
955 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
956 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
957 if (x
== NULL
|| y
== NULL
)
958 bfd_fatal (bfd_get_filename (sort_bfd
));
960 xs
= bfd_asymbol_section (x
);
961 ys
= bfd_asymbol_section (y
);
963 if (bfd_is_und_section (xs
))
965 if (bfd_is_und_section (ys
))
968 if (valueof (x
) != valueof (y
))
969 return valueof (x
) < valueof (y
) ? -1 : 1;
971 if (xs
->vma
!= ys
->vma
)
972 return xs
->vma
< ys
->vma
? -1 : 1;
974 xn
= bfd_asymbol_name (x
);
975 yn
= bfd_asymbol_name (y
);
979 /* The symbols gnu_compiled and gcc2_compiled convey even less
980 information than the file name, so sort them out first. */
982 xf
= (strstr (xn
, "gnu_compiled") != NULL
983 || strstr (xn
, "gcc2_compiled") != NULL
);
984 yf
= (strstr (yn
, "gnu_compiled") != NULL
985 || strstr (yn
, "gcc2_compiled") != NULL
);
992 /* We use a heuristic for the file name. It may not work on non
993 Unix systems, but it doesn't really matter; the only difference
994 is precisely which symbol names get printed. */
996 #define file_symbol(s, sn, snl) \
997 (((s)->flags & BSF_FILE) != 0 \
999 && (sn)[(snl) - 2] == '.' \
1000 && ((sn)[(snl) - 1] == 'o' \
1001 || (sn)[(snl) - 1] == 'a')))
1003 xf
= file_symbol (x
, xn
, xnl
);
1004 yf
= file_symbol (y
, yn
, ynl
);
1011 return non_numeric_forward (P_x
, P_y
);
1014 /* This sort routine is used by sort_symbols_by_size. It is sorting
1015 an array of size_sym structures into size order. */
1018 size_forward2 (const void *P_x
, const void *P_y
)
1020 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
1021 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
1023 if (x
->size
< y
->size
)
1024 return reverse_sort
? 1 : -1;
1025 else if (x
->size
> y
->size
)
1026 return reverse_sort
? -1 : 1;
1028 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
1031 /* Sort the symbols by size. ELF provides a size but for other formats
1032 we have to make a guess by assuming that the difference between the
1033 address of a symbol and the address of the next higher symbol is the
1037 sort_symbols_by_size (bfd
*abfd
, bool is_dynamic
, void *minisyms
,
1038 long symcount
, unsigned int size
,
1039 struct size_sym
**symsizesp
)
1041 struct size_sym
*symsizes
;
1042 bfd_byte
*from
, *fromend
;
1043 asymbol
*sym
= NULL
;
1044 asymbol
*store_sym
, *store_next
;
1046 qsort (minisyms
, symcount
, size
, size_forward1
);
1048 /* We are going to return a special set of symbols and sizes to
1050 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
1051 *symsizesp
= symsizes
;
1053 /* Note that filter_symbols has already removed all absolute and
1054 undefined symbols. Here we remove all symbols whose size winds
1056 from
= (bfd_byte
*) minisyms
;
1057 fromend
= from
+ symcount
* size
;
1060 store_next
= sort_y
;
1064 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, (const void *) from
,
1067 bfd_fatal (bfd_get_filename (abfd
));
1070 for (; from
< fromend
; from
+= size
)
1077 if (from
+ size
< fromend
)
1079 next
= bfd_minisymbol_to_symbol (abfd
,
1081 (const void *) (from
+ size
),
1084 bfd_fatal (bfd_get_filename (abfd
));
1089 sec
= bfd_asymbol_section (sym
);
1091 /* Synthetic symbols don't have a full type set of data available, thus
1092 we can't rely on that information for the symbol size. Ditto for
1093 bfd/section.c:global_syms like *ABS*. */
1094 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
1095 && bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
1096 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
1097 else if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) == 0
1098 && bfd_is_com_section (sec
))
1102 if (from
+ size
< fromend
1103 && sec
== bfd_asymbol_section (next
))
1104 sz
= valueof (next
) - valueof (sym
);
1106 sz
= (bfd_section_vma (sec
)
1107 + bfd_section_size (sec
)
1113 symsizes
->minisym
= (const void *) from
;
1114 symsizes
->size
= sz
;
1121 store_sym
= store_next
;
1125 symcount
= symsizes
- *symsizesp
;
1127 /* We must now sort again by size. */
1128 qsort ((void *) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
1133 /* This function is used to get the relocs for a particular section.
1134 It is called via bfd_map_over_sections. */
1137 get_relocs (bfd
*abfd
, asection
*sec
, void *dataarg
)
1139 struct lineno_cache
*data
= (struct lineno_cache
*) dataarg
;
1142 *data
->relocs
= NULL
;
1143 *data
->relcount
= 0;
1145 if ((sec
->flags
& SEC_RELOC
) != 0)
1147 long relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1150 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1151 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1162 free_lineno_cache (bfd
*abfd
)
1164 struct lineno_cache
*lc
= bfd_usrdata (abfd
);
1169 for (unsigned int i
= 0; i
< lc
->seccount
; i
++)
1170 free (lc
->relocs
[i
]);
1171 free (lc
->relcount
);
1176 bfd_set_usrdata (abfd
, NULL
);
1180 /* Print a single symbol. */
1183 print_symbol (bfd
* abfd
,
1188 symbol_info syminfo
;
1189 struct extended_symbol_info info
;
1191 format
->print_symbol_filename (archive_bfd
, abfd
);
1193 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1195 /* PR 22967 - Distinguish between local and global ifunc symbols. */
1196 if (syminfo
.type
== 'i'
1197 && sym
->flags
& BSF_GNU_INDIRECT_FUNCTION
)
1199 if (ifunc_type_chars
== NULL
|| ifunc_type_chars
[0] == 0)
1200 ; /* Change nothing. */
1201 else if (sym
->flags
& BSF_GLOBAL
)
1202 syminfo
.type
= ifunc_type_chars
[0];
1203 else if (ifunc_type_chars
[1] != 0)
1204 syminfo
.type
= ifunc_type_chars
[1];
1207 info
.sinfo
= &syminfo
;
1209 /* Synthetic symbols do not have a full symbol type set of data available.
1210 Nor do bfd/section.c:global_syms like *ABS*. */
1211 if ((sym
->flags
& (BSF_SECTION_SYM
| BSF_SYNTHETIC
)) != 0)
1213 info
.elfinfo
= NULL
;
1214 info
.coffinfo
= NULL
;
1218 info
.elfinfo
= elf_symbol_from (sym
);
1219 info
.coffinfo
= coff_symbol_from (sym
);
1222 format
->print_symbol_info (&info
, abfd
);
1224 const char *symname
= bfd_asymbol_name (sym
);
1225 if (line_numbers
&& symname
!= NULL
&& symname
[0] != 0)
1227 struct lineno_cache
*lc
= bfd_usrdata (abfd
);
1228 const char *filename
, *functionname
;
1229 unsigned int lineno
;
1231 /* We need to get the canonical symbols in order to call
1232 bfd_find_nearest_line. This is inefficient, but, then, you
1233 don't have to use --line-numbers. */
1236 lc
= xcalloc (1, sizeof (*lc
));
1237 bfd_set_usrdata (abfd
, lc
);
1239 if (lc
->syms
== NULL
&& lc
->symcount
== 0)
1241 long symsize
= bfd_get_symtab_upper_bound (abfd
);
1246 lc
->syms
= xmalloc (symsize
);
1247 lc
->symcount
= bfd_canonicalize_symtab (abfd
, lc
->syms
);
1251 if (lc
->symcount
<= 0)
1253 else if (bfd_is_und_section (bfd_asymbol_section (sym
)))
1257 /* For an undefined symbol, we try to find a reloc for the
1258 symbol, and print the line number of the reloc. */
1259 if (lc
->relocs
== NULL
)
1261 unsigned int seccount
= bfd_count_sections (abfd
);
1262 lc
->seccount
= seccount
;
1263 lc
->secs
= xmalloc (seccount
* sizeof (*lc
->secs
));
1264 lc
->relocs
= xmalloc (seccount
* sizeof (*lc
->relocs
));
1265 lc
->relcount
= xmalloc (seccount
* sizeof (*lc
->relcount
));
1267 struct lineno_cache rinfo
= *lc
;
1268 bfd_map_over_sections (abfd
, get_relocs
, &rinfo
);
1271 for (i
= 0; i
< lc
->seccount
; i
++)
1275 for (j
= 0; j
< lc
->relcount
[i
]; j
++)
1279 r
= lc
->relocs
[i
][j
];
1280 if (r
->sym_ptr_ptr
!= NULL
1281 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1282 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1283 && bfd_asymbol_name (*r
->sym_ptr_ptr
) != NULL
1285 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1286 && bfd_find_nearest_line (abfd
, lc
->secs
[i
], lc
->syms
,
1287 r
->address
, &filename
,
1288 &functionname
, &lineno
)
1289 && filename
!= NULL
)
1291 /* We only print the first one we find. */
1292 printf ("\t%s:%u", filename
, lineno
);
1299 else if (bfd_asymbol_section (sym
)->owner
== abfd
)
1301 if ((bfd_find_line (abfd
, lc
->syms
, sym
, &filename
, &lineno
)
1302 || bfd_find_nearest_line (abfd
, bfd_asymbol_section (sym
),
1303 lc
->syms
, sym
->value
, &filename
,
1304 &functionname
, &lineno
))
1307 printf ("\t%s:%u", filename
, lineno
);
1314 /* Print the symbols when sorting by size. */
1317 print_size_symbols (bfd
*abfd
,
1319 struct size_sym
*symsizes
,
1324 struct size_sym
*from
;
1325 struct size_sym
*fromend
;
1327 store
= bfd_make_empty_symbol (abfd
);
1329 bfd_fatal (bfd_get_filename (abfd
));
1332 fromend
= from
+ symcount
;
1334 for (; from
< fromend
; from
++)
1338 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
->minisym
, store
);
1340 bfd_fatal (bfd_get_filename (abfd
));
1342 print_symbol (abfd
, sym
, from
->size
, archive_bfd
);
1347 /* Print the symbols of ABFD that are held in MINISYMS.
1349 If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD.
1351 SYMCOUNT is the number of symbols in MINISYMS.
1353 SIZE is the size of a symbol in MINISYMS. */
1356 print_symbols (bfd
*abfd
,
1367 store
= bfd_make_empty_symbol (abfd
);
1369 bfd_fatal (bfd_get_filename (abfd
));
1371 from
= (bfd_byte
*) minisyms
;
1372 fromend
= from
+ symcount
* size
;
1374 for (; from
< fromend
; from
+= size
)
1378 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
, store
);
1380 bfd_fatal (bfd_get_filename (abfd
));
1382 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
1386 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
1389 display_rel_file (bfd
*abfd
, bfd
*archive_bfd
)
1394 struct size_sym
*symsizes
;
1395 asymbol
*synthsyms
= NULL
;
1399 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
1402 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1407 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
1411 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1415 if (show_synthetic
&& size
== sizeof (asymbol
*))
1417 asymbol
**static_syms
= NULL
;
1418 asymbol
**dyn_syms
= NULL
;
1419 long static_count
= 0;
1425 dyn_count
= symcount
;
1426 dyn_syms
= (asymbol
**) minisyms
;
1430 long storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
1432 static_count
= symcount
;
1433 static_syms
= (asymbol
**) minisyms
;
1437 dyn_syms
= (asymbol
**) xmalloc (storage
);
1438 dyn_count
= bfd_canonicalize_dynamic_symtab (abfd
, dyn_syms
);
1444 synth_count
= bfd_get_synthetic_symtab (abfd
, static_count
, static_syms
,
1445 dyn_count
, dyn_syms
, &synthsyms
);
1446 if (synth_count
> 0)
1451 minisyms
= xrealloc (minisyms
,
1452 (symcount
+ synth_count
+ 1) * sizeof (*symp
));
1453 symp
= (asymbol
**) minisyms
+ symcount
;
1454 for (i
= 0; i
< synth_count
; i
++)
1455 *symp
++ = synthsyms
+ i
;
1457 symcount
+= synth_count
;
1459 if (!dynamic
&& dyn_syms
!= NULL
)
1463 /* lto_type is set to lto_non_ir_object when a bfd is loaded with a
1464 compiler LTO plugin. */
1465 if (bfd_get_lto_type (abfd
) == lto_slim_ir_object
)
1467 report_plugin_err
= false;
1468 non_fatal (_("%s: plugin needed to handle lto object"),
1469 bfd_get_filename (abfd
));
1472 /* Discard the symbols we don't want to print.
1473 It's OK to do this in place; we'll free the storage anyway
1474 (after printing). */
1476 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1482 sort_dynamic
= dynamic
;
1483 sort_x
= bfd_make_empty_symbol (abfd
);
1484 sort_y
= bfd_make_empty_symbol (abfd
);
1485 if (sort_x
== NULL
|| sort_y
== NULL
)
1486 bfd_fatal (bfd_get_filename (abfd
));
1489 qsort (minisyms
, symcount
, size
,
1490 sorters
[sort_numerically
][reverse_sort
]);
1492 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1497 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1499 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1507 /* Construct a formatting string for printing symbol values. */
1510 set_print_format (bfd
*file
)
1512 print_width
= bfd_get_arch_size (file
);
1514 if (print_width
== -1)
1517 Guess the target's bitsize based on its name.
1518 We assume here than any 64-bit format will include
1519 "64" somewhere in its name. The only known exception
1520 is the MMO object file format. */
1521 if (strstr (bfd_get_target (file
), "64") != NULL
1522 || strcmp (bfd_get_target (file
), "mmo") == 0)
1528 char *p
= print_format_string
;
1530 if (print_format
== FORMAT_POSIX
|| print_format
== FORMAT_JUST_SYMBOLS
)
1532 /* POSIX compatible output does not have any padding. */
1534 else if (print_width
== 32)
1539 else /* print_width == 64. */
1546 if (print_width
== 32)
1548 switch (print_radix
)
1550 case 8: strcpy (p
, PRIo32
); break;
1551 case 10: strcpy (p
, PRId32
); break;
1552 case 16: strcpy (p
, PRIx32
); break;
1557 switch (print_radix
)
1559 case 8: strcpy (p
, PRIo64
); break;
1560 case 10: strcpy (p
, PRId64
); break;
1561 case 16: strcpy (p
, PRIx64
); break;
1567 display_archive (bfd
*file
)
1570 bfd
*last_arfile
= NULL
;
1573 format
->print_archive_filename (bfd_get_filename (file
));
1576 print_symdef_entry (file
);
1580 arfile
= bfd_openr_next_archived_file (file
, arfile
);
1584 if (bfd_get_error () != bfd_error_no_more_archived_files
)
1585 bfd_nonfatal (bfd_get_filename (file
));
1589 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
1591 set_print_format (arfile
);
1592 format
->print_archive_member (bfd_get_filename (file
),
1593 bfd_get_filename (arfile
));
1594 display_rel_file (arfile
, file
);
1598 bfd_nonfatal (bfd_get_filename (arfile
));
1599 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1600 list_matching_formats (matching
);
1603 if (last_arfile
!= NULL
)
1605 free_lineno_cache (last_arfile
);
1606 bfd_close (last_arfile
);
1607 if (arfile
== last_arfile
)
1610 last_arfile
= arfile
;
1613 if (last_arfile
!= NULL
)
1615 free_lineno_cache (last_arfile
);
1616 bfd_close (last_arfile
);
1621 display_file (char *filename
)
1627 if (get_file_size (filename
) < 1)
1630 file
= bfd_openr (filename
, target
? target
: plugin_target
);
1633 bfd_nonfatal (filename
);
1637 /* If printing line numbers, decompress the debug sections. */
1639 file
->flags
|= BFD_DECOMPRESS
;
1641 if (bfd_check_format (file
, bfd_archive
))
1643 display_archive (file
);
1645 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
1647 set_print_format (file
);
1648 format
->print_object_filename (filename
);
1649 display_rel_file (file
, NULL
);
1653 bfd_nonfatal (filename
);
1654 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1655 list_matching_formats (matching
);
1659 free_lineno_cache (file
);
1660 if (!bfd_close (file
))
1666 /* The following 3 groups of functions are called unconditionally,
1667 once at the start of processing each file of the appropriate type.
1668 They should check `filename_per_file' and `filename_per_symbol',
1669 as appropriate for their output format, to determine whether to
1672 /* Print the name of an object file given on the command line. */
1675 print_object_filename_bsd (const char *filename
)
1677 if (filename_per_file
&& !filename_per_symbol
)
1678 printf ("\n%s:\n", filename
);
1682 print_object_filename_sysv (const char *filename
)
1685 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1687 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1688 if (print_width
== 32)
1690 Name Value Class Type Size Line Section\n\n"));
1693 Name Value Class Type Size Line Section\n\n"));
1697 print_object_filename_posix (const char *filename
)
1699 if (filename_per_file
&& !filename_per_symbol
)
1700 printf ("%s:\n", filename
);
1704 do_not_print_object_filename (const char *filename ATTRIBUTE_UNUSED
)
1708 /* Print the name of an archive file given on the command line. */
1711 print_archive_filename_bsd (const char *filename
)
1713 if (filename_per_file
)
1714 printf ("\n%s:\n", filename
);
1718 print_archive_filename_sysv (const char *filename ATTRIBUTE_UNUSED
)
1723 print_archive_filename_posix (const char *filename ATTRIBUTE_UNUSED
)
1728 do_not_print_archive_filename (const char *filename ATTRIBUTE_UNUSED
)
1732 /* Print the name of an archive member file. */
1735 print_archive_member_bsd (const char *archive ATTRIBUTE_UNUSED
,
1736 const char *filename
)
1738 if (!filename_per_symbol
)
1739 printf ("\n%s:\n", filename
);
1743 print_archive_member_sysv (const char *archive
, const char *filename
)
1746 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1748 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1749 if (print_width
== 32)
1751 Name Value Class Type Size Line Section\n\n"));
1754 Name Value Class Type Size Line Section\n\n"));
1758 print_archive_member_posix (const char *archive
, const char *filename
)
1760 if (!filename_per_symbol
)
1761 printf ("%s[%s]:\n", archive
, filename
);
1765 do_not_print_archive_member (const char *archive ATTRIBUTE_UNUSED
,
1766 const char *filename ATTRIBUTE_UNUSED
)
1771 /* Print the name of the file (and archive, if there is one)
1772 containing a symbol. */
1775 print_symbol_filename_bsd (bfd
*archive_bfd
, bfd
*abfd
)
1777 if (filename_per_symbol
)
1780 printf ("%s:", bfd_get_filename (archive_bfd
));
1781 printf ("%s:", bfd_get_filename (abfd
));
1786 print_symbol_filename_sysv (bfd
*archive_bfd
, bfd
*abfd
)
1788 if (filename_per_symbol
)
1791 printf ("%s:", bfd_get_filename (archive_bfd
));
1792 printf ("%s:", bfd_get_filename (abfd
));
1797 print_symbol_filename_posix (bfd
*archive_bfd
, bfd
*abfd
)
1799 if (filename_per_symbol
)
1802 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1803 bfd_get_filename (abfd
));
1805 printf ("%s: ", bfd_get_filename (abfd
));
1810 do_not_print_symbol_filename (bfd
*archive_bfd ATTRIBUTE_UNUSED
,
1811 bfd
*abfd ATTRIBUTE_UNUSED
)
1816 /* Print a symbol value. */
1819 print_value (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_vma val
)
1821 switch (print_width
)
1824 printf (print_format_string
, (uint32_t) val
);
1828 printf (print_format_string
, (uint64_t) val
);
1832 fatal (_("Print width has not been initialized (%d)"), print_width
);
1837 /* Print a line of information about a symbol. */
1840 print_symbol_info_bsd (struct extended_symbol_info
*info
, bfd
*abfd
)
1842 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1844 if (print_width
== 64)
1850 /* Normally we print the value of the symbol. If we are printing the
1851 size or sorting by size then we print its size, except for the
1852 (weird) special case where both flags are defined, in which case we
1853 print both values. This conforms to documented behaviour. */
1854 if (sort_by_size
&& !print_size
)
1855 print_value (abfd
, SYM_SIZE (info
));
1857 print_value (abfd
, SYM_VALUE (info
));
1858 if (print_size
&& SYM_SIZE (info
))
1861 print_value (abfd
, SYM_SIZE (info
));
1865 printf (" %c", SYM_TYPE (info
));
1867 if (SYM_TYPE (info
) == '-')
1871 printf (other_format
, SYM_STAB_OTHER (info
));
1873 printf (desc_format
, SYM_STAB_DESC (info
));
1874 printf (" %5s", SYM_STAB_NAME (info
));
1876 print_symname (" %s", info
, NULL
, abfd
);
1880 print_symbol_info_sysv (struct extended_symbol_info
*info
, bfd
*abfd
)
1882 print_symname ("%-20s|", info
, NULL
, abfd
);
1884 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1886 if (print_width
== 32)
1892 print_value (abfd
, SYM_VALUE (info
));
1894 printf ("| %c |", SYM_TYPE (info
));
1896 if (SYM_TYPE (info
) == '-')
1899 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type. */
1900 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size. */
1901 printf ("| |"); /* Line, Section. */
1905 /* Type, Size, Line, Section */
1908 get_elf_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1909 else if (info
->coffinfo
)
1911 get_coff_symbol_type (&info
->coffinfo
->native
->u
.syment
));
1915 if (SYM_SIZE (info
))
1916 print_value (abfd
, SYM_SIZE (info
));
1919 if (print_width
== 32)
1926 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1927 else if (info
->coffinfo
)
1928 printf("| |%s", info
->coffinfo
->symbol
.section
->name
);
1935 print_symbol_info_posix (struct extended_symbol_info
*info
, bfd
*abfd
)
1937 print_symname ("%s ", info
, NULL
, abfd
);
1938 printf ("%c ", SYM_TYPE (info
));
1940 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1944 print_value (abfd
, SYM_VALUE (info
));
1946 if (SYM_SIZE (info
))
1947 print_value (abfd
, SYM_SIZE (info
));
1952 just_print_symbol_name (struct extended_symbol_info
*info
, bfd
*abfd
)
1954 print_symname ("%s", info
, NULL
, abfd
);
1958 main (int argc
, char **argv
)
1963 #ifdef HAVE_LC_MESSAGES
1964 setlocale (LC_MESSAGES
, "");
1966 setlocale (LC_CTYPE
, "");
1967 setlocale (LC_COLLATE
, "");
1968 bindtextdomain (PACKAGE
, LOCALEDIR
);
1969 textdomain (PACKAGE
);
1971 program_name
= *argv
;
1972 xmalloc_set_program_name (program_name
);
1973 bfd_set_error_program_name (program_name
);
1974 #if BFD_SUPPORTS_PLUGINS
1975 bfd_plugin_set_program_name (program_name
);
1978 expandargv (&argc
, &argv
);
1980 if (bfd_init () != BFD_INIT_MAGIC
)
1981 fatal (_("fatal error: libbfd ABI mismatch"));
1982 set_default_bfd_target ();
1984 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhjJlnopPrSst:uUvVvWX:",
1985 long_options
, (int *) 0)) != EOF
)
1990 print_debug_syms
= 1;
1994 filename_per_symbol
= 1;
1996 case 'B': /* For MIPS compatibility. */
1997 set_output_format ("bsd");
2003 enum demangling_styles style
;
2005 style
= cplus_demangle_name_to_style (optarg
);
2006 if (style
== unknown_demangling
)
2007 fatal (_("unknown demangling style `%s'"),
2010 cplus_demangle_set_style (style
);
2013 case OPTION_RECURSE_LIMIT
:
2014 demangle_flags
&= ~ DMGL_NO_RECURSE_LIMIT
;
2016 case OPTION_NO_RECURSE_LIMIT
:
2017 demangle_flags
|= DMGL_NO_RECURSE_LIMIT
;
2026 /* Ignored for HP/UX compatibility. */
2029 set_output_format (optarg
);
2043 sort_numerically
= 1;
2048 sort_numerically
= 0;
2051 case OPTION_SIZE_SORT
:
2053 sort_numerically
= 0;
2057 set_output_format ("posix");
2060 set_output_format ("just-symbols");
2072 set_print_radix (optarg
);
2083 case OPTION_UNICODE
:
2084 if (streq (optarg
, "default") || streq (optarg
, "d"))
2085 unicode_display
= unicode_default
;
2086 else if (streq (optarg
, "locale") || streq (optarg
, "l"))
2087 unicode_display
= unicode_locale
;
2088 else if (streq (optarg
, "escape") || streq (optarg
, "e"))
2089 unicode_display
= unicode_escape
;
2090 else if (streq (optarg
, "invalid") || streq (optarg
, "i"))
2091 unicode_display
= unicode_invalid
;
2092 else if (streq (optarg
, "hex") || streq (optarg
, "x"))
2093 unicode_display
= unicode_hex
;
2094 else if (streq (optarg
, "highlight") || streq (optarg
, "h"))
2095 unicode_display
= unicode_highlight
;
2097 fatal (_("invalid argument to -U/--unicode: %s"), optarg
);
2107 /* Ignored for (partial) AIX compatibility. On AIX, the
2108 argument has values 32, 64, or 32_64, and specifies that
2109 only 32-bit, only 64-bit, or both kinds of objects should
2110 be examined. The default is 32. So plain AIX nm on a
2111 library archive with both kinds of objects will ignore
2112 the 64-bit ones. For GNU nm, the default is and always
2113 has been -X 32_64, and other options are not supported. */
2114 if (strcmp (optarg
, "32_64") != 0)
2115 fatal (_("Only -X 32_64 is supported"));
2118 case OPTION_TARGET
: /* --target */
2122 case OPTION_PLUGIN
: /* --plugin */
2123 #if BFD_SUPPORTS_PLUGINS
2124 bfd_plugin_set_plugin (optarg
);
2126 fatal (_("sorry - this program has been built without plugin support\n"));
2130 case OPTION_IFUNC_CHARS
:
2131 ifunc_type_chars
= optarg
;
2134 case 0: /* A long option that just sets a flag. */
2143 print_version ("nm");
2145 if (sort_by_size
&& undefined_only
)
2147 non_fatal (_("Using the --size-sort and --undefined-only options together"));
2148 non_fatal (_("will produce no output, since undefined symbols have no size."));
2152 /* OK, all options now parsed. If no filename specified, do a.out. */
2154 return !display_file ("a.out");
2158 if (argc
- optind
> 1)
2159 filename_per_file
= 1;
2161 /* We were given several filenames to do. */
2162 while (optind
< argc
)
2164 if (!display_file (argv
[optind
++]))