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, 2005, 2007
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
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 3 of the License, or
11 (at your option) any later version.
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.
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., 51 Franklin Street - Fifth Floor, Boston, MA
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
30 #include "libiberty.h"
32 #include "elf/common.h"
35 /* When sorting by size, we use this structure to hold the size and a
36 pointer to the minisymbol. */
44 /* When fetching relocs, we use this structure to pass information to
47 struct get_relocs_info
55 struct extended_symbol_info
59 elf_symbol_type
*elfinfo
;
60 /* FIXME: We should add more fields for Type, Line, Section. */
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)
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
*);
89 /* Support for different output formats. */
92 /* Print the name of an object file given on the command line. */
93 void (*print_object_filename
) (char *);
95 /* Print the name of an archive file given on the command line. */
96 void (*print_archive_filename
) (char *);
98 /* Print the name of an archive member file. */
99 void (*print_archive_member
) (char *, const char *);
101 /* Print the name of the file (and archive, if there is one)
102 containing a symbol. */
103 void (*print_symbol_filename
) (bfd
*, bfd
*);
105 /* Print a line of information about a symbol. */
106 void (*print_symbol_info
) (struct extended_symbol_info
*, bfd
*);
109 static struct output_fns formats
[] =
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
}
128 /* Indices in `formats'. */
130 #define FORMAT_SYSV 1
131 #define FORMAT_POSIX 2
132 #define FORMAT_DEFAULT FORMAT_BSD
134 /* The output format to use. */
135 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
137 /* Command options. */
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 static int allow_special_symbols
= 0; /* Allow special symbols. */
157 /* When to print the names of files. Not mutually exclusive in SYSV format. */
158 static int filename_per_file
= 0; /* Once per file, on its own line. */
159 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
161 /* Print formats for printing a symbol value. */
162 static char value_format_32bit
[] = "%08lx";
163 #if BFD_HOST_64BIT_LONG
164 static char value_format_64bit
[] = "%016lx";
165 #elif BFD_HOST_64BIT_LONG_LONG
166 static char value_format_64bit
[] = "%016llx";
168 static int print_width
= 0;
169 static int print_radix
= 16;
170 /* Print formats for printing stab info. */
171 static char other_format
[] = "%02x";
172 static char desc_format
[] = "%04x";
174 static char *target
= NULL
;
176 /* Used to cache the line numbers for a BFD. */
177 static bfd
*lineno_cache_bfd
;
178 static bfd
*lineno_cache_rel_bfd
;
180 #define OPTION_TARGET 200
182 static struct option long_options
[] =
184 {"debug-syms", no_argument
, &print_debug_syms
, 1},
185 {"demangle", optional_argument
, 0, 'C'},
186 {"dynamic", no_argument
, &dynamic
, 1},
187 {"extern-only", no_argument
, &external_only
, 1},
188 {"format", required_argument
, 0, 'f'},
189 {"help", no_argument
, 0, 'h'},
190 {"line-numbers", no_argument
, 0, 'l'},
191 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
192 {"no-demangle", no_argument
, &do_demangle
, 0},
193 {"no-sort", no_argument
, &no_sort
, 1},
194 {"numeric-sort", no_argument
, &sort_numerically
, 1},
195 {"portability", no_argument
, 0, 'P'},
196 {"print-armap", no_argument
, &print_armap
, 1},
197 {"print-file-name", no_argument
, 0, 'o'},
198 {"print-size", no_argument
, 0, 'S'},
199 {"radix", required_argument
, 0, 't'},
200 {"reverse-sort", no_argument
, &reverse_sort
, 1},
201 {"size-sort", no_argument
, &sort_by_size
, 1},
202 {"special-syms", no_argument
, &allow_special_symbols
, 1},
203 {"stats", no_argument
, &show_stats
, 1},
204 {"synthetic", no_argument
, &show_synthetic
, 1},
205 {"target", required_argument
, 0, OPTION_TARGET
},
206 {"defined-only", no_argument
, &defined_only
, 1},
207 {"undefined-only", no_argument
, &undefined_only
, 1},
208 {"version", no_argument
, &show_version
, 1},
209 {0, no_argument
, 0, 0}
212 /* Some error-reporting functions. */
215 usage (FILE *stream
, int status
)
217 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
218 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
219 fprintf (stream
, _(" The options are:\n\
220 -a, --debug-syms Display debugger-only symbols\n\
221 -A, --print-file-name Print name of the input file before every symbol\n\
222 -B Same as --format=bsd\n\
223 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
224 The STYLE, if specified, can be `auto' (the default),\n\
225 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
227 --no-demangle Do not demangle low-level symbol names\n\
228 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
229 --defined-only Display only defined symbols\n\
231 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
232 `sysv' or `posix'. The default is `bsd'\n\
233 -g, --extern-only Display only external symbols\n\
234 -l, --line-numbers Use debugging information to find a filename and\n\
235 line number for each symbol\n\
236 -n, --numeric-sort Sort symbols numerically by address\n\
238 -p, --no-sort Do not sort the symbols\n\
239 -P, --portability Same as --format=posix\n\
240 -r, --reverse-sort Reverse the sense of the sort\n\
241 -S, --print-size Print size of defined symbols\n\
242 -s, --print-armap Include index for symbols from archive members\n\
243 --size-sort Sort symbols by size\n\
244 --special-syms Include special symbols in the output\n\
245 --synthetic Display synthetic symbols as well\n\
246 -t, --radix=RADIX Use RADIX for printing symbol values\n\
247 --target=BFDNAME Specify the target object format as BFDNAME\n\
248 -u, --undefined-only Display only undefined symbols\n\
249 -X 32_64 (ignored)\n\
250 @FILE Read options from FILE\n\
251 -h, --help Display this information\n\
252 -V, --version Display this program's version number\n\
254 list_supported_targets (program_name
, stream
);
255 if (REPORT_BUGS_TO
[0] && status
== 0)
256 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
260 /* Set the radix for the symbol value and size according to RADIX. */
263 set_print_radix (char *radix
)
275 value_format_32bit
[4] = *radix
;
276 #if BFD_HOST_64BIT_LONG
277 value_format_64bit
[5] = *radix
;
278 #elif BFD_HOST_64BIT_LONG_LONG
279 value_format_64bit
[6] = *radix
;
281 other_format
[3] = desc_format
[3] = *radix
;
284 fatal (_("%s: invalid radix"), radix
);
289 set_output_format (char *f
)
308 fatal (_("%s: invalid output format"), f
);
310 format
= &formats
[i
];
314 get_symbol_type (unsigned int type
)
316 static char buff
[32];
320 case STT_NOTYPE
: return "NOTYPE";
321 case STT_OBJECT
: return "OBJECT";
322 case STT_FUNC
: return "FUNC";
323 case STT_SECTION
: return "SECTION";
324 case STT_FILE
: return "FILE";
325 case STT_COMMON
: return "COMMON";
326 case STT_TLS
: return "TLS";
328 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
329 sprintf (buff
, _("<processor specific>: %d"), type
);
330 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
331 sprintf (buff
, _("<OS specific>: %d"), type
);
333 sprintf (buff
, _("<unknown>: %d"), type
);
338 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
339 demangling it if requested. */
342 print_symname (const char *format
, const char *name
, bfd
*abfd
)
344 if (do_demangle
&& *name
)
346 char *res
= bfd_demangle (abfd
, name
, DMGL_ANSI
| DMGL_PARAMS
);
350 printf (format
, res
);
356 printf (format
, name
);
360 print_symdef_entry (bfd
*abfd
)
362 symindex idx
= BFD_NO_MORE_SYMBOLS
;
364 bfd_boolean everprinted
= FALSE
;
366 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
367 idx
!= BFD_NO_MORE_SYMBOLS
;
368 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
373 printf (_("\nArchive index:\n"));
376 elt
= bfd_get_elt_at_index (abfd
, idx
);
378 bfd_fatal ("bfd_get_elt_at_index");
379 if (thesym
->name
!= (char *) NULL
)
381 print_symname ("%s", thesym
->name
, abfd
);
382 printf (" in %s\n", bfd_get_filename (elt
));
387 /* Choose which symbol entries to print;
388 compact them downward to get rid of the rest.
389 Return the number of symbols to be printed. */
392 filter_symbols (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
,
393 long symcount
, unsigned int size
)
395 bfd_byte
*from
, *fromend
, *to
;
398 store
= bfd_make_empty_symbol (abfd
);
400 bfd_fatal (bfd_get_filename (abfd
));
402 from
= (bfd_byte
*) minisyms
;
403 fromend
= from
+ symcount
* size
;
404 to
= (bfd_byte
*) minisyms
;
406 for (; from
< fromend
; from
+= size
)
413 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const void *) from
, store
);
415 bfd_fatal (bfd_get_filename (abfd
));
418 keep
= bfd_is_und_section (sym
->section
);
419 else if (external_only
)
420 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
421 || (sym
->flags
& BSF_WEAK
) != 0
422 || bfd_is_und_section (sym
->section
)
423 || bfd_is_com_section (sym
->section
));
428 && ! print_debug_syms
429 && (sym
->flags
& BSF_DEBUGGING
) != 0)
434 && (bfd_is_abs_section (sym
->section
)
435 || bfd_is_und_section (sym
->section
)))
441 if (bfd_is_und_section (sym
->section
))
446 && bfd_is_target_special_symbol (abfd
, sym
)
447 && ! allow_special_symbols
)
453 memcpy (to
, from
, size
);
458 return (to
- (bfd_byte
*) minisyms
) / size
;
461 /* These globals are used to pass information into the sorting
463 static bfd
*sort_bfd
;
464 static bfd_boolean sort_dynamic
;
465 static asymbol
*sort_x
;
466 static asymbol
*sort_y
;
468 /* Symbol-sorting predicates */
469 #define valueof(x) ((x)->section->vma + (x)->value)
471 /* Numeric sorts. Undefined symbols are always considered "less than"
472 defined symbols with zero values. Common symbols are not treated
473 specially -- i.e., their sizes are used as their "values". */
476 non_numeric_forward (const void *P_x
, const void *P_y
)
481 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
482 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
483 if (x
== NULL
|| y
== NULL
)
484 bfd_fatal (bfd_get_filename (sort_bfd
));
486 xn
= bfd_asymbol_name (x
);
487 yn
= bfd_asymbol_name (y
);
495 /* Solaris 2.5 has a bug in strcoll.
496 strcoll returns invalid values when confronted with empty strings. */
502 return strcoll (xn
, yn
);
504 return strcmp (xn
, yn
);
509 non_numeric_reverse (const void *x
, const void *y
)
511 return - non_numeric_forward (x
, y
);
515 numeric_forward (const void *P_x
, const void *P_y
)
520 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
521 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
522 if (x
== NULL
|| y
== NULL
)
523 bfd_fatal (bfd_get_filename (sort_bfd
));
525 xs
= bfd_get_section (x
);
526 ys
= bfd_get_section (y
);
528 if (bfd_is_und_section (xs
))
530 if (! bfd_is_und_section (ys
))
533 else if (bfd_is_und_section (ys
))
535 else if (valueof (x
) != valueof (y
))
536 return valueof (x
) < valueof (y
) ? -1 : 1;
538 return non_numeric_forward (P_x
, P_y
);
542 numeric_reverse (const void *x
, const void *y
)
544 return - numeric_forward (x
, y
);
547 static int (*(sorters
[2][2])) (const void *, const void *) =
549 { non_numeric_forward
, non_numeric_reverse
},
550 { numeric_forward
, numeric_reverse
}
553 /* This sort routine is used by sort_symbols_by_size. It is similar
554 to numeric_forward, but when symbols have the same value it sorts
555 by section VMA. This simplifies the sort_symbols_by_size code
556 which handles symbols at the end of sections. Also, this routine
557 tries to sort file names before other symbols with the same value.
558 That will make the file name have a zero size, which will make
559 sort_symbols_by_size choose the non file name symbol, leading to
560 more meaningful output. For similar reasons, this code sorts
561 gnu_compiled_* and gcc2_compiled before other symbols with the same
565 size_forward1 (const void *P_x
, const void *P_y
)
573 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
574 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
575 if (x
== NULL
|| y
== NULL
)
576 bfd_fatal (bfd_get_filename (sort_bfd
));
578 xs
= bfd_get_section (x
);
579 ys
= bfd_get_section (y
);
581 if (bfd_is_und_section (xs
))
583 if (bfd_is_und_section (ys
))
586 if (valueof (x
) != valueof (y
))
587 return valueof (x
) < valueof (y
) ? -1 : 1;
589 if (xs
->vma
!= ys
->vma
)
590 return xs
->vma
< ys
->vma
? -1 : 1;
592 xn
= bfd_asymbol_name (x
);
593 yn
= bfd_asymbol_name (y
);
597 /* The symbols gnu_compiled and gcc2_compiled convey even less
598 information than the file name, so sort them out first. */
600 xf
= (strstr (xn
, "gnu_compiled") != NULL
601 || strstr (xn
, "gcc2_compiled") != NULL
);
602 yf
= (strstr (yn
, "gnu_compiled") != NULL
603 || strstr (yn
, "gcc2_compiled") != NULL
);
610 /* We use a heuristic for the file name. It may not work on non
611 Unix systems, but it doesn't really matter; the only difference
612 is precisely which symbol names get printed. */
614 #define file_symbol(s, sn, snl) \
615 (((s)->flags & BSF_FILE) != 0 \
616 || ((sn)[(snl) - 2] == '.' \
617 && ((sn)[(snl) - 1] == 'o' \
618 || (sn)[(snl) - 1] == 'a')))
620 xf
= file_symbol (x
, xn
, xnl
);
621 yf
= file_symbol (y
, yn
, ynl
);
628 return non_numeric_forward (P_x
, P_y
);
631 /* This sort routine is used by sort_symbols_by_size. It is sorting
632 an array of size_sym structures into size order. */
635 size_forward2 (const void *P_x
, const void *P_y
)
637 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
638 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
640 if (x
->size
< y
->size
)
641 return reverse_sort
? 1 : -1;
642 else if (x
->size
> y
->size
)
643 return reverse_sort
? -1 : 1;
645 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
648 /* Sort the symbols by size. ELF provides a size but for other formats
649 we have to make a guess by assuming that the difference between the
650 address of a symbol and the address of the next higher symbol is the
654 sort_symbols_by_size (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
,
655 long symcount
, unsigned int size
,
656 struct size_sym
**symsizesp
)
658 struct size_sym
*symsizes
;
659 bfd_byte
*from
, *fromend
;
661 asymbol
*store_sym
, *store_next
;
663 qsort (minisyms
, symcount
, size
, size_forward1
);
665 /* We are going to return a special set of symbols and sizes to
667 symsizes
= xmalloc (symcount
* sizeof (struct size_sym
));
668 *symsizesp
= symsizes
;
670 /* Note that filter_symbols has already removed all absolute and
671 undefined symbols. Here we remove all symbols whose size winds
673 from
= (bfd_byte
*) minisyms
;
674 fromend
= from
+ symcount
* size
;
681 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const void *) from
,
684 bfd_fatal (bfd_get_filename (abfd
));
687 for (; from
< fromend
; from
+= size
)
694 if (from
+ size
< fromend
)
696 next
= bfd_minisymbol_to_symbol (abfd
,
698 (const void *) (from
+ size
),
701 bfd_fatal (bfd_get_filename (abfd
));
706 sec
= bfd_get_section (sym
);
708 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
709 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
710 else if (bfd_is_com_section (sec
))
714 if (from
+ size
< fromend
715 && sec
== bfd_get_section (next
))
716 sz
= valueof (next
) - valueof (sym
);
718 sz
= (bfd_get_section_vma (abfd
, sec
)
719 + bfd_section_size (abfd
, sec
)
725 symsizes
->minisym
= (const void *) from
;
733 store_sym
= store_next
;
737 symcount
= symsizes
- *symsizesp
;
739 /* We must now sort again by size. */
740 qsort ((void *) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
745 /* This function is used to get the relocs for a particular section.
746 It is called via bfd_map_over_sections. */
749 get_relocs (bfd
*abfd
, asection
*sec
, void *dataarg
)
751 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
755 if ((sec
->flags
& SEC_RELOC
) == 0)
757 *data
->relocs
= NULL
;
764 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
766 bfd_fatal (bfd_get_filename (abfd
));
768 *data
->relocs
= xmalloc (relsize
);
769 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
771 if (*data
->relcount
< 0)
772 bfd_fatal (bfd_get_filename (abfd
));
780 /* Print a single symbol. */
783 print_symbol (bfd
*abfd
, asymbol
*sym
, bfd_vma ssize
, bfd
*archive_bfd
)
786 struct extended_symbol_info info
;
790 format
->print_symbol_filename (archive_bfd
, abfd
);
792 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
793 info
.sinfo
= &syminfo
;
795 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
796 info
.elfinfo
= (elf_symbol_type
*) sym
;
799 format
->print_symbol_info (&info
, abfd
);
803 static asymbol
**syms
;
804 static long symcount
;
805 const char *filename
, *functionname
;
808 /* We need to get the canonical symbols in order to call
809 bfd_find_nearest_line. This is inefficient, but, then, you
810 don't have to use --line-numbers. */
811 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
820 symsize
= bfd_get_symtab_upper_bound (abfd
);
822 bfd_fatal (bfd_get_filename (abfd
));
823 syms
= xmalloc (symsize
);
824 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
826 bfd_fatal (bfd_get_filename (abfd
));
827 lineno_cache_bfd
= abfd
;
830 if (bfd_is_und_section (bfd_get_section (sym
)))
832 static asection
**secs
;
833 static arelent
***relocs
;
834 static long *relcount
;
835 static unsigned int seccount
;
839 /* For an undefined symbol, we try to find a reloc for the
840 symbol, and print the line number of the reloc. */
841 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
843 for (i
= 0; i
< seccount
; i
++)
844 if (relocs
[i
] != NULL
)
856 struct get_relocs_info info
;
858 seccount
= bfd_count_sections (abfd
);
860 secs
= xmalloc (seccount
* sizeof *secs
);
861 relocs
= xmalloc (seccount
* sizeof *relocs
);
862 relcount
= xmalloc (seccount
* sizeof *relcount
);
865 info
.relocs
= relocs
;
866 info
.relcount
= relcount
;
868 bfd_map_over_sections (abfd
, get_relocs
, (void *) &info
);
869 lineno_cache_rel_bfd
= abfd
;
872 symname
= bfd_asymbol_name (sym
);
873 for (i
= 0; i
< seccount
; i
++)
877 for (j
= 0; j
< relcount
[i
]; j
++)
882 if (r
->sym_ptr_ptr
!= NULL
883 && (*r
->sym_ptr_ptr
)->section
== sym
->section
884 && (*r
->sym_ptr_ptr
)->value
== sym
->value
886 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
887 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
888 r
->address
, &filename
,
889 &functionname
, &lineno
)
892 /* We only print the first one we find. */
893 printf ("\t%s:%u", filename
, lineno
);
900 else if (bfd_get_section (sym
)->owner
== abfd
)
902 if ((bfd_find_line (abfd
, syms
, sym
, &filename
, &lineno
)
903 || bfd_find_nearest_line (abfd
, bfd_get_section (sym
),
904 syms
, sym
->value
, &filename
,
905 &functionname
, &lineno
))
908 printf ("\t%s:%u", filename
, lineno
);
915 /* Print the symbols when sorting by size. */
918 print_size_symbols (bfd
*abfd
, bfd_boolean dynamic
,
919 struct size_sym
*symsizes
, long symcount
,
923 struct size_sym
*from
, *fromend
;
925 store
= bfd_make_empty_symbol (abfd
);
927 bfd_fatal (bfd_get_filename (abfd
));
930 fromend
= from
+ symcount
;
931 for (; from
< fromend
; from
++)
936 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
938 bfd_fatal (bfd_get_filename (abfd
));
940 /* For elf we have already computed the correct symbol size. */
941 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
944 ssize
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
946 print_symbol (abfd
, sym
, ssize
, archive_bfd
);
951 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
955 print_symbols (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
, long symcount
,
956 unsigned int size
, bfd
*archive_bfd
)
959 bfd_byte
*from
, *fromend
;
961 store
= bfd_make_empty_symbol (abfd
);
963 bfd_fatal (bfd_get_filename (abfd
));
965 from
= (bfd_byte
*) minisyms
;
966 fromend
= from
+ symcount
* size
;
967 for (; from
< fromend
; from
+= size
)
971 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
973 bfd_fatal (bfd_get_filename (abfd
));
975 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
979 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
982 display_rel_file (bfd
*abfd
, bfd
*archive_bfd
)
987 struct size_sym
*symsizes
;
991 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
993 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
998 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
1000 bfd_fatal (bfd_get_filename (abfd
));
1004 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1008 if (show_synthetic
&& size
== sizeof (asymbol
*))
1012 asymbol
**static_syms
= NULL
;
1013 asymbol
**dyn_syms
= NULL
;
1014 long static_count
= 0;
1019 dyn_count
= symcount
;
1020 dyn_syms
= minisyms
;
1024 long storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
1026 static_count
= symcount
;
1027 static_syms
= minisyms
;
1031 dyn_syms
= xmalloc (storage
);
1032 dyn_count
= bfd_canonicalize_dynamic_symtab (abfd
, dyn_syms
);
1034 bfd_fatal (bfd_get_filename (abfd
));
1037 synth_count
= bfd_get_synthetic_symtab (abfd
, static_count
, static_syms
,
1038 dyn_count
, dyn_syms
, &synthsyms
);
1039 if (synth_count
> 0)
1045 new_mini
= xmalloc ((symcount
+ synth_count
+ 1) * sizeof (*symp
));
1047 memcpy (symp
, minisyms
, symcount
* sizeof (*symp
));
1049 for (i
= 0; i
< synth_count
; i
++)
1050 *symp
++ = synthsyms
+ i
;
1052 minisyms
= new_mini
;
1053 symcount
+= synth_count
;
1057 /* Discard the symbols we don't want to print.
1058 It's OK to do this in place; we'll free the storage anyway
1059 (after printing). */
1061 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1067 sort_dynamic
= dynamic
;
1068 sort_x
= bfd_make_empty_symbol (abfd
);
1069 sort_y
= bfd_make_empty_symbol (abfd
);
1070 if (sort_x
== NULL
|| sort_y
== NULL
)
1071 bfd_fatal (bfd_get_filename (abfd
));
1074 qsort (minisyms
, symcount
, size
,
1075 sorters
[sort_numerically
][reverse_sort
]);
1077 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1082 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1084 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1090 set_print_width (bfd
*file
)
1092 print_width
= bfd_get_arch_size (file
);
1094 if (print_width
== -1)
1097 Guess the target's bitsize based on its name.
1098 We assume here than any 64-bit format will include
1099 "64" somewhere in its name. The only known exception
1100 is the MMO object file format. */
1101 if (strstr (bfd_get_target (file
), "64") != NULL
1102 || strcmp (bfd_get_target (file
), "mmo") == 0)
1110 display_archive (bfd
*file
)
1113 bfd
*last_arfile
= NULL
;
1116 format
->print_archive_filename (bfd_get_filename (file
));
1119 print_symdef_entry (file
);
1125 arfile
= bfd_openr_next_archived_file (file
, arfile
);
1129 if (bfd_get_error () != bfd_error_no_more_archived_files
)
1130 bfd_fatal (bfd_get_filename (file
));
1134 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
1136 set_print_width (arfile
);
1137 format
->print_archive_member (bfd_get_filename (file
),
1138 bfd_get_filename (arfile
));
1139 display_rel_file (arfile
, file
);
1143 bfd_nonfatal (bfd_get_filename (arfile
));
1144 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1146 list_matching_formats (matching
);
1151 if (last_arfile
!= NULL
)
1153 bfd_close (last_arfile
);
1154 lineno_cache_bfd
= NULL
;
1155 lineno_cache_rel_bfd
= NULL
;
1157 last_arfile
= arfile
;
1160 if (last_arfile
!= NULL
)
1162 bfd_close (last_arfile
);
1163 lineno_cache_bfd
= NULL
;
1164 lineno_cache_rel_bfd
= NULL
;
1169 display_file (char *filename
)
1171 bfd_boolean retval
= TRUE
;
1175 if (get_file_size (filename
) < 1)
1178 file
= bfd_openr (filename
, target
);
1181 bfd_nonfatal (filename
);
1185 if (bfd_check_format (file
, bfd_archive
))
1187 display_archive (file
);
1189 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
1191 set_print_width (file
);
1192 format
->print_object_filename (filename
);
1193 display_rel_file (file
, NULL
);
1197 bfd_nonfatal (filename
);
1198 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1200 list_matching_formats (matching
);
1206 if (!bfd_close (file
))
1207 bfd_fatal (filename
);
1209 lineno_cache_bfd
= NULL
;
1210 lineno_cache_rel_bfd
= NULL
;
1215 /* The following 3 groups of functions are called unconditionally,
1216 once at the start of processing each file of the appropriate type.
1217 They should check `filename_per_file' and `filename_per_symbol',
1218 as appropriate for their output format, to determine whether to
1221 /* Print the name of an object file given on the command line. */
1224 print_object_filename_bsd (char *filename
)
1226 if (filename_per_file
&& !filename_per_symbol
)
1227 printf ("\n%s:\n", filename
);
1231 print_object_filename_sysv (char *filename
)
1234 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1236 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1237 if (print_width
== 32)
1239 Name Value Class Type Size Line Section\n\n"));
1242 Name Value Class Type Size Line Section\n\n"));
1246 print_object_filename_posix (char *filename
)
1248 if (filename_per_file
&& !filename_per_symbol
)
1249 printf ("%s:\n", filename
);
1252 /* Print the name of an archive file given on the command line. */
1255 print_archive_filename_bsd (char *filename
)
1257 if (filename_per_file
)
1258 printf ("\n%s:\n", filename
);
1262 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED
)
1267 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED
)
1271 /* Print the name of an archive member file. */
1274 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED
,
1275 const char *filename
)
1277 if (!filename_per_symbol
)
1278 printf ("\n%s:\n", filename
);
1282 print_archive_member_sysv (char *archive
, const char *filename
)
1285 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1287 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1288 if (print_width
== 32)
1290 Name Value Class Type Size Line Section\n\n"));
1293 Name Value Class Type Size Line Section\n\n"));
1297 print_archive_member_posix (char *archive
, const char *filename
)
1299 if (!filename_per_symbol
)
1300 printf ("%s[%s]:\n", archive
, filename
);
1303 /* Print the name of the file (and archive, if there is one)
1304 containing a symbol. */
1307 print_symbol_filename_bsd (bfd
*archive_bfd
, bfd
*abfd
)
1309 if (filename_per_symbol
)
1312 printf ("%s:", bfd_get_filename (archive_bfd
));
1313 printf ("%s:", bfd_get_filename (abfd
));
1318 print_symbol_filename_sysv (bfd
*archive_bfd
, bfd
*abfd
)
1320 if (filename_per_symbol
)
1323 printf ("%s:", bfd_get_filename (archive_bfd
));
1324 printf ("%s:", bfd_get_filename (abfd
));
1329 print_symbol_filename_posix (bfd
*archive_bfd
, bfd
*abfd
)
1331 if (filename_per_symbol
)
1334 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1335 bfd_get_filename (abfd
));
1337 printf ("%s: ", bfd_get_filename (abfd
));
1341 /* Print a symbol value. */
1344 print_value (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_vma val
)
1346 switch (print_width
)
1349 printf (value_format_32bit
, (unsigned long) val
);
1353 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1354 printf (value_format_64bit
, val
);
1356 /* We have a 64 bit value to print, but the host is only 32 bit. */
1357 if (print_radix
== 16)
1358 bfd_fprintf_vma (abfd
, stdout
, val
);
1364 s
= buf
+ sizeof buf
;
1368 *--s
= (val
% print_radix
) + '0';
1371 while ((buf
+ sizeof buf
- 1) - s
< 16)
1379 fatal (_("Print width has not been initialized (%d)"), print_width
);
1384 /* Print a line of information about a symbol. */
1387 print_symbol_info_bsd (struct extended_symbol_info
*info
, bfd
*abfd
)
1389 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1391 if (print_width
== 64)
1397 /* Normally we print the value of the symbol. If we are printing the
1398 size or sorting by size then we print its size, except for the
1399 (weird) special case where both flags are defined, in which case we
1400 print both values. This conforms to documented behaviour. */
1401 if (sort_by_size
&& !print_size
)
1402 print_value (abfd
, SYM_SIZE (info
));
1404 print_value (abfd
, SYM_VALUE (info
));
1406 if (print_size
&& SYM_SIZE (info
))
1409 print_value (abfd
, SYM_SIZE (info
));
1413 printf (" %c", SYM_TYPE (info
));
1415 if (SYM_TYPE (info
) == '-')
1419 printf (other_format
, SYM_STAB_OTHER (info
));
1421 printf (desc_format
, SYM_STAB_DESC (info
));
1422 printf (" %5s", SYM_STAB_NAME (info
));
1424 print_symname (" %s", SYM_NAME (info
), abfd
);
1428 print_symbol_info_sysv (struct extended_symbol_info
*info
, bfd
*abfd
)
1430 print_symname ("%-20s|", SYM_NAME (info
), abfd
);
1432 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1434 if (print_width
== 32)
1440 print_value (abfd
, SYM_VALUE (info
));
1442 printf ("| %c |", SYM_TYPE (info
));
1444 if (SYM_TYPE (info
) == '-')
1447 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type. */
1448 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size. */
1449 printf ("| |"); /* Line, Section. */
1453 /* Type, Size, Line, Section */
1456 get_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1460 if (SYM_SIZE (info
))
1461 print_value (abfd
, SYM_SIZE (info
));
1464 if (print_width
== 32)
1471 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1478 print_symbol_info_posix (struct extended_symbol_info
*info
, bfd
*abfd
)
1480 print_symname ("%s ", SYM_NAME (info
), abfd
);
1481 printf ("%c ", SYM_TYPE (info
));
1483 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1487 print_value (abfd
, SYM_VALUE (info
));
1489 if (SYM_SIZE (info
))
1490 print_value (abfd
, SYM_SIZE (info
));
1495 main (int argc
, char **argv
)
1500 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1501 setlocale (LC_MESSAGES
, "");
1503 #if defined (HAVE_SETLOCALE)
1504 setlocale (LC_CTYPE
, "");
1505 setlocale (LC_COLLATE
, "");
1507 bindtextdomain (PACKAGE
, LOCALEDIR
);
1508 textdomain (PACKAGE
);
1510 program_name
= *argv
;
1511 xmalloc_set_program_name (program_name
);
1513 START_PROGRESS (program_name
, 0);
1515 expandargv (&argc
, &argv
);
1518 set_default_bfd_target ();
1520 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhlnopPrSst:uvVvX:",
1521 long_options
, (int *) 0)) != EOF
)
1526 print_debug_syms
= 1;
1530 filename_per_symbol
= 1;
1532 case 'B': /* For MIPS compatibility. */
1533 set_output_format ("bsd");
1539 enum demangling_styles style
;
1541 style
= cplus_demangle_name_to_style (optarg
);
1542 if (style
== unknown_demangling
)
1543 fatal (_("unknown demangling style `%s'"),
1546 cplus_demangle_set_style (style
);
1553 /* Ignored for HP/UX compatibility. */
1556 set_output_format (optarg
);
1569 sort_numerically
= 1;
1575 set_output_format ("posix");
1587 set_print_radix (optarg
);
1596 /* Ignored for (partial) AIX compatibility. On AIX, the
1597 argument has values 32, 64, or 32_64, and specifies that
1598 only 32-bit, only 64-bit, or both kinds of objects should
1599 be examined. The default is 32. So plain AIX nm on a
1600 library archive with both kinds of objects will ignore
1601 the 64-bit ones. For GNU nm, the default is and always
1602 has been -X 32_64, and other options are not supported. */
1603 if (strcmp (optarg
, "32_64") != 0)
1604 fatal (_("Only -X 32_64 is supported"));
1607 case OPTION_TARGET
: /* --target */
1611 case 0: /* A long option that just sets a flag. */
1620 print_version ("nm");
1622 if (sort_by_size
&& undefined_only
)
1624 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1625 non_fatal (_("will produce no output, since undefined symbols have no size."));
1629 /* OK, all options now parsed. If no filename specified, do a.out. */
1631 return !display_file ("a.out");
1635 if (argc
- optind
> 1)
1636 filename_per_file
= 1;
1638 /* We were given several filenames to do. */
1639 while (optind
< argc
)
1642 if (!display_file (argv
[optind
++]))
1646 END_PROGRESS (program_name
);
1651 char *lim
= (char *) sbrk (0);
1653 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));