From 1996d0f12cd57391e01e0eebe32e44510e6ec17d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 15 Mar 2021 10:55:49 +0000 Subject: [PATCH] Add a symbols-only mode to nm. PR 27487 * nm.c (FORMAT_JUST_SYMBOLS): Define. (struct optput_fns): Add entry for FORMAT_JUST_SYMBOLS. (long_options): Add just-symbols. (set_output_format): Add support for just-symbols. (get_print_format): Likewise. (do_not_print_object_filename): New function. (do_not_print_archive_filename): New function. (do_not_print_archive_member): New function. (do_not_print_symbol_filename): New function. (just_print_symbol_name): New function. (main): Handle --just-symbols. * NEWS: Mention the new feature. * doc/binutils.texi: Document the new feature. --- binutils/ChangeLog | 17 ++++++ binutils/NEWS | 4 ++ binutils/doc/binutils.texi | 45 ++++++++++----- binutils/nm.c | 109 +++++++++++++++++++++++++++++-------- 4 files changed, 137 insertions(+), 38 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 37460e7bcde..62f98b4cda0 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,20 @@ +2021-03-15 Nick Clifton + + PR 27487 + * nm.c (FORMAT_JUST_SYMBOLS): Define. + (struct optput_fns): Add entry for FORMAT_JUST_SYMBOLS. + (long_options): Add just-symbols. + (set_output_format): Add support for just-symbols. + (get_print_format): Likewise. + (do_not_print_object_filename): New function. + (do_not_print_archive_filename): New function. + (do_not_print_archive_member): New function. + (do_not_print_symbol_filename): New function. + (just_print_symbol_name): New function. + (main): Handle --just-symbols. + * NEWS: Mention the new feature. + * doc/binutils.texi: Document the new feature. + 2021-03-12 Clément Chigot * od-xcoff.c: Replace RTB by TRL entry. diff --git a/binutils/NEWS b/binutils/NEWS index a4d7a61ef2d..c035f522e3f 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,5 +1,9 @@ -*- text -*- +* A new format has been added to the nm program. Specifying + --format=just-symbols (or just using -j) will tell the program to only + display symbol names and nothing else. + * A new command line --keep-section-symbols has been added to objcopy and strip. This stops the removal of unused section symbols when the file is copied. Removing these symbols saves space, but sometimes they are needed by diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index a9d1dd3e73b..292f71110c9 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -793,23 +793,37 @@ The @sc{gnu} linker @command{ld} is now described in a separate manual. @smallexample @c man begin SYNOPSIS nm -nm [@option{-A}|@option{-o}|@option{--print-file-name}] [@option{-a}|@option{--debug-syms}] - [@option{-B}|@option{--format=bsd}] [@option{-C}|@option{--demangle}[=@var{style}]] - [@option{-D}|@option{--dynamic}] [@option{-f}@var{format}|@option{--format=}@var{format}] - [@option{-g}|@option{--extern-only}] [@option{-h}|@option{--help}] +nm [@option{-A}|@option{-o}|@option{--print-file-name}] + [@option{-a}|@option{--debug-syms}] + [@option{-B}|@option{--format=bsd}] + [@option{-C}|@option{--demangle}[=@var{style}]] + [@option{-D}|@option{--dynamic}] + [@option{-f}@var{format}|@option{--format=}@var{format}] + [@option{-g}|@option{--extern-only}] + [@option{-h}|@option{--help}] [@option{--ifunc-chars=@var{CHARS}}] + [@option{-j}|@option{--format=just-symbols}] [@option{-l}|@option{--line-numbers}] [@option{--inlines}] [@option{-n}|@option{-v}|@option{--numeric-sort}] - [@option{-P}|@option{--portability}] [@option{-p}|@option{--no-sort}] - [@option{-r}|@option{--reverse-sort}] [@option{-S}|@option{--print-size}] - [@option{-s}|@option{--print-armap}] [@option{-t} @var{radix}|@option{--radix=}@var{radix}] - [@option{-u}|@option{--undefined-only}] [@option{-V}|@option{--version}] - [@option{-X 32_64}] [@option{--defined-only}] [@option{--no-demangle}] - [@option{--plugin} @var{name}] + [@option{-P}|@option{--portability}] + [@option{-p}|@option{--no-sort}] + [@option{-r}|@option{--reverse-sort}] + [@option{-S}|@option{--print-size}] + [@option{-s}|@option{--print-armap}] + [@option{-t} @var{radix}|@option{--radix=}@var{radix}] + [@option{-u}|@option{--undefined-only}] + [@option{-V}|@option{--version}] + [@option{-X 32_64}] + [@option{--defined-only}] + [@option{--no-demangle}] [@option{--no-recurse-limit}|@option{--recurse-limit}]] - [@option{--size-sort}] [@option{--special-syms}] - [@option{--synthetic}] [@option{--with-symbol-versions}] - [@option{--without-symbol-versions}] [@option{--target=}@var{bfdname}] + [@option{--plugin} @var{name}] + [@option{--size-sort}] + [@option{--special-syms}] + [@option{--synthetic}] + [@option{--target=}@var{bfdname}] + [@option{--with-symbol-versions}] + [@option{--without-symbol-versions}] [@var{objfile}@dots{}] @c man end @end smallexample @@ -1027,7 +1041,7 @@ libraries. @cindex @command{nm} format @cindex @command{nm} compatibility Use the output format @var{format}, which can be @code{bsd}, -@code{sysv}, or @code{posix}. The default is @code{bsd}. +@code{sysv}, @code{posix} or @code{just-symbols}. The default is @code{bsd}. Only the first character of @var{format} is significant; it can be either upper or lower case. @@ -1049,6 +1063,9 @@ first character will be used for global indirect function symbols and the second character, if present, will be used for local indirect function symbols. +@item j +The same as @option{--format=just-symbols}. + @item -l @itemx --line-numbers @cindex symbol line numbers diff --git a/binutils/nm.c b/binutils/nm.c index 2637756c647..119c486af62 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -79,41 +79,63 @@ struct extended_symbol_info static void print_object_filename_bsd (const char *); static void print_object_filename_sysv (const char *); static void print_object_filename_posix (const char *); +static void do_not_print_object_filename (const char *); + static void print_archive_filename_bsd (const char *); static void print_archive_filename_sysv (const char *); static void print_archive_filename_posix (const char *); +static void do_not_print_archive_filename (const char *); + static void print_archive_member_bsd (const char *, const char *); static void print_archive_member_sysv (const char *, const char *); static void print_archive_member_posix (const char *, const char *); +static void do_not_print_archive_member (const char *, const char *); + static void print_symbol_filename_bsd (bfd *, bfd *); static void print_symbol_filename_sysv (bfd *, bfd *); static void print_symbol_filename_posix (bfd *, bfd *); -static void print_value (bfd *, bfd_vma); +static void do_not_print_symbol_filename (bfd *, bfd *); + static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *); static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *); static void print_symbol_info_posix (struct extended_symbol_info *, bfd *); +static void just_print_symbol_name (struct extended_symbol_info *, bfd *); + +static void print_value (bfd *, bfd_vma); /* Support for different output formats. */ struct output_fns - { - /* Print the name of an object file given on the command line. */ - void (*print_object_filename) (const char *); +{ + /* Print the name of an object file given on the command line. */ + void (*print_object_filename) (const char *); - /* Print the name of an archive file given on the command line. */ - void (*print_archive_filename) (const char *); + /* Print the name of an archive file given on the command line. */ + void (*print_archive_filename) (const char *); - /* Print the name of an archive member file. */ - void (*print_archive_member) (const char *, const char *); + /* Print the name of an archive member file. */ + void (*print_archive_member) (const char *, const char *); - /* Print the name of the file (and archive, if there is one) - containing a symbol. */ - void (*print_symbol_filename) (bfd *, bfd *); + /* Print the name of the file (and archive, if there is one) + containing a symbol. */ + void (*print_symbol_filename) (bfd *, bfd *); - /* Print a line of information about a symbol. */ - void (*print_symbol_info) (struct extended_symbol_info *, bfd *); - }; + /* Print a line of information about a symbol. */ + void (*print_symbol_info) (struct extended_symbol_info *, bfd *); +}; -static struct output_fns formats[] = +/* Indices in `formats'. */ +enum formats +{ + FORMAT_BSD = 0, + FORMAT_SYSV, + FORMAT_POSIX, + FORMAT_JUST_SYMBOLS, + FORMAT_MAX +}; + +#define FORMAT_DEFAULT FORMAT_BSD + +static struct output_fns formats[FORMAT_MAX] = { {print_object_filename_bsd, print_archive_filename_bsd, @@ -129,14 +151,14 @@ static struct output_fns formats[] = print_archive_filename_posix, print_archive_member_posix, print_symbol_filename_posix, - print_symbol_info_posix} + print_symbol_info_posix}, + {do_not_print_object_filename, + do_not_print_archive_filename, + do_not_print_archive_member, + do_not_print_symbol_filename, + just_print_symbol_name} }; -/* Indices in `formats'. */ -#define FORMAT_BSD 0 -#define FORMAT_SYSV 1 -#define FORMAT_POSIX 2 -#define FORMAT_DEFAULT FORMAT_BSD /* The output format to use. */ static struct output_fns *format = &formats[FORMAT_DEFAULT]; @@ -214,6 +236,7 @@ static struct option long_options[] = {"format", required_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"ifunc-chars", required_argument, 0, OPTION_IFUNC_CHARS}, + {"just-symbols", no_argument, 0, 'j'}, {"line-numbers", no_argument, 0, 'l'}, {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */ {"no-demangle", no_argument, &do_demangle, 0}, @@ -265,9 +288,10 @@ usage (FILE *stream, int status) --defined-only Display only defined symbols\n\ -e (ignored)\n\ -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\ - `sysv' or `posix'. The default is `bsd'\n\ + `sysv', `posix' or 'just-symbols'. The default is `bsd'\n\ -g, --extern-only Display only external symbols\n\ --ifunc-chars=CHARS Characters to use when displaying ifunc symbols\n\ + -j, --just-symbols Same as --format=just-symbols\n\ -l, --line-numbers Use debugging information to find a filename and\n\ line number for each symbol\n\ -n, --numeric-sort Sort symbols numerically by address\n\ @@ -338,6 +362,10 @@ set_output_format (char *f) case 'S': i = FORMAT_SYSV; break; + case 'j': + case 'J': + i = FORMAT_JUST_SYMBOLS; + break; default: fatal (_("%s: invalid output format"), f); } @@ -1268,7 +1296,7 @@ static const char * get_print_format (void) { const char * padding; - if (print_format == FORMAT_POSIX) + if (print_format == FORMAT_POSIX || print_format == FORMAT_JUST_SYMBOLS) { /* POSIX compatible output does not have any padding. */ padding = ""; @@ -1477,6 +1505,11 @@ print_object_filename_posix (const char *filename) if (filename_per_file && !filename_per_symbol) printf ("%s:\n", filename); } + +static void +do_not_print_object_filename (const char *filename ATTRIBUTE_UNUSED) +{ +} /* Print the name of an archive file given on the command line. */ @@ -1496,6 +1529,11 @@ static void print_archive_filename_posix (const char *filename ATTRIBUTE_UNUSED) { } + +static void +do_not_print_archive_filename (const char *filename ATTRIBUTE_UNUSED) +{ +} /* Print the name of an archive member file. */ @@ -1528,6 +1566,13 @@ print_archive_member_posix (const char *archive, const char *filename) if (!filename_per_symbol) printf ("%s[%s]:\n", archive, filename); } + +static void +do_not_print_archive_member (const char *archive ATTRIBUTE_UNUSED, + const char *filename ATTRIBUTE_UNUSED) +{ +} + /* Print the name of the file (and archive, if there is one) containing a symbol. */ @@ -1566,6 +1611,13 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd) printf ("%s: ", bfd_get_filename (abfd)); } } + +static void +do_not_print_symbol_filename (bfd *archive_bfd ATTRIBUTE_UNUSED, + bfd *abfd ATTRIBUTE_UNUSED) +{ +} + /* Print a symbol value. */ @@ -1723,6 +1775,12 @@ print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd) print_value (abfd, SYM_SIZE (info)); } } + +static void +just_print_symbol_name (struct extended_symbol_info *info, bfd *abfd) +{ + print_symname ("%s", info, NULL, abfd); +} int main (int argc, char **argv) @@ -1755,7 +1813,7 @@ main (int argc, char **argv) fatal (_("fatal error: libbfd ABI mismatch")); set_default_bfd_target (); - while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:", + while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uvVvX:", long_options, (int *) 0)) != EOF) { switch (c) @@ -1830,6 +1888,9 @@ main (int argc, char **argv) case 'P': set_output_format ("posix"); break; + case 'j': + set_output_format ("just-symbols"); + break; case 'r': reverse_sort = 1; break; -- 2.30.2