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.
This commit is contained in:
parent
8d624a9d80
commit
1996d0f12c
4 changed files with 137 additions and 38 deletions
|
@ -1,3 +1,20 @@
|
||||||
|
2021-03-15 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
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 <clement.chigot@atos.net>
|
2021-03-12 Clément Chigot <clement.chigot@atos.net>
|
||||||
|
|
||||||
* od-xcoff.c: Replace RTB by TRL entry.
|
* od-xcoff.c: Replace RTB by TRL entry.
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
-*- text -*-
|
-*- 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
|
* 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
|
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
|
copied. Removing these symbols saves space, but sometimes they are needed by
|
||||||
|
|
|
@ -793,23 +793,37 @@ The @sc{gnu} linker @command{ld} is now described in a separate manual.
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
@c man begin SYNOPSIS nm
|
@c man begin SYNOPSIS nm
|
||||||
nm [@option{-A}|@option{-o}|@option{--print-file-name}] [@option{-a}|@option{--debug-syms}]
|
nm [@option{-A}|@option{-o}|@option{--print-file-name}]
|
||||||
[@option{-B}|@option{--format=bsd}] [@option{-C}|@option{--demangle}[=@var{style}]]
|
[@option{-a}|@option{--debug-syms}]
|
||||||
[@option{-D}|@option{--dynamic}] [@option{-f}@var{format}|@option{--format=}@var{format}]
|
[@option{-B}|@option{--format=bsd}]
|
||||||
[@option{-g}|@option{--extern-only}] [@option{-h}|@option{--help}]
|
[@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{--ifunc-chars=@var{CHARS}}]
|
||||||
|
[@option{-j}|@option{--format=just-symbols}]
|
||||||
[@option{-l}|@option{--line-numbers}] [@option{--inlines}]
|
[@option{-l}|@option{--line-numbers}] [@option{--inlines}]
|
||||||
[@option{-n}|@option{-v}|@option{--numeric-sort}]
|
[@option{-n}|@option{-v}|@option{--numeric-sort}]
|
||||||
[@option{-P}|@option{--portability}] [@option{-p}|@option{--no-sort}]
|
[@option{-P}|@option{--portability}]
|
||||||
[@option{-r}|@option{--reverse-sort}] [@option{-S}|@option{--print-size}]
|
[@option{-p}|@option{--no-sort}]
|
||||||
[@option{-s}|@option{--print-armap}] [@option{-t} @var{radix}|@option{--radix=}@var{radix}]
|
[@option{-r}|@option{--reverse-sort}]
|
||||||
[@option{-u}|@option{--undefined-only}] [@option{-V}|@option{--version}]
|
[@option{-S}|@option{--print-size}]
|
||||||
[@option{-X 32_64}] [@option{--defined-only}] [@option{--no-demangle}]
|
[@option{-s}|@option{--print-armap}]
|
||||||
[@option{--plugin} @var{name}]
|
[@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{--no-recurse-limit}|@option{--recurse-limit}]]
|
||||||
[@option{--size-sort}] [@option{--special-syms}]
|
[@option{--plugin} @var{name}]
|
||||||
[@option{--synthetic}] [@option{--with-symbol-versions}]
|
[@option{--size-sort}]
|
||||||
[@option{--without-symbol-versions}] [@option{--target=}@var{bfdname}]
|
[@option{--special-syms}]
|
||||||
|
[@option{--synthetic}]
|
||||||
|
[@option{--target=}@var{bfdname}]
|
||||||
|
[@option{--with-symbol-versions}]
|
||||||
|
[@option{--without-symbol-versions}]
|
||||||
[@var{objfile}@dots{}]
|
[@var{objfile}@dots{}]
|
||||||
@c man end
|
@c man end
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
@ -1027,7 +1041,7 @@ libraries.
|
||||||
@cindex @command{nm} format
|
@cindex @command{nm} format
|
||||||
@cindex @command{nm} compatibility
|
@cindex @command{nm} compatibility
|
||||||
Use the output format @var{format}, which can be @code{bsd},
|
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
|
Only the first character of @var{format} is significant; it can be
|
||||||
either upper or lower case.
|
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
|
the second character, if present, will be used for local indirect
|
||||||
function symbols.
|
function symbols.
|
||||||
|
|
||||||
|
@item j
|
||||||
|
The same as @option{--format=just-symbols}.
|
||||||
|
|
||||||
@item -l
|
@item -l
|
||||||
@itemx --line-numbers
|
@itemx --line-numbers
|
||||||
@cindex symbol line numbers
|
@cindex symbol line numbers
|
||||||
|
|
109
binutils/nm.c
109
binutils/nm.c
|
@ -79,41 +79,63 @@ struct extended_symbol_info
|
||||||
static void print_object_filename_bsd (const char *);
|
static void print_object_filename_bsd (const char *);
|
||||||
static void print_object_filename_sysv (const char *);
|
static void print_object_filename_sysv (const char *);
|
||||||
static void print_object_filename_posix (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_bsd (const char *);
|
||||||
static void print_archive_filename_sysv (const char *);
|
static void print_archive_filename_sysv (const char *);
|
||||||
static void print_archive_filename_posix (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_bsd (const char *, const char *);
|
||||||
static void print_archive_member_sysv (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 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_bsd (bfd *, bfd *);
|
||||||
static void print_symbol_filename_sysv (bfd *, bfd *);
|
static void print_symbol_filename_sysv (bfd *, bfd *);
|
||||||
static void print_symbol_filename_posix (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_bsd (struct extended_symbol_info *, bfd *);
|
||||||
static void print_symbol_info_sysv (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 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. */
|
/* Support for different output formats. */
|
||||||
struct output_fns
|
struct output_fns
|
||||||
{
|
{
|
||||||
/* Print the name of an object file given on the command line. */
|
/* Print the name of an object file given on the command line. */
|
||||||
void (*print_object_filename) (const char *);
|
void (*print_object_filename) (const char *);
|
||||||
|
|
||||||
/* Print the name of an archive file given on the command line. */
|
/* Print the name of an archive file given on the command line. */
|
||||||
void (*print_archive_filename) (const char *);
|
void (*print_archive_filename) (const char *);
|
||||||
|
|
||||||
/* Print the name of an archive member file. */
|
/* Print the name of an archive member file. */
|
||||||
void (*print_archive_member) (const char *, const char *);
|
void (*print_archive_member) (const char *, const char *);
|
||||||
|
|
||||||
/* Print the name of the file (and archive, if there is one)
|
/* Print the name of the file (and archive, if there is one)
|
||||||
containing a symbol. */
|
containing a symbol. */
|
||||||
void (*print_symbol_filename) (bfd *, bfd *);
|
void (*print_symbol_filename) (bfd *, bfd *);
|
||||||
|
|
||||||
/* Print a line of information about a symbol. */
|
/* Print a line of information about a symbol. */
|
||||||
void (*print_symbol_info) (struct extended_symbol_info *, bfd *);
|
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_object_filename_bsd,
|
||||||
print_archive_filename_bsd,
|
print_archive_filename_bsd,
|
||||||
|
@ -129,14 +151,14 @@ static struct output_fns formats[] =
|
||||||
print_archive_filename_posix,
|
print_archive_filename_posix,
|
||||||
print_archive_member_posix,
|
print_archive_member_posix,
|
||||||
print_symbol_filename_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. */
|
/* The output format to use. */
|
||||||
static struct output_fns *format = &formats[FORMAT_DEFAULT];
|
static struct output_fns *format = &formats[FORMAT_DEFAULT];
|
||||||
|
@ -214,6 +236,7 @@ static struct option long_options[] =
|
||||||
{"format", required_argument, 0, 'f'},
|
{"format", required_argument, 0, 'f'},
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
{"ifunc-chars", required_argument, 0, OPTION_IFUNC_CHARS},
|
{"ifunc-chars", required_argument, 0, OPTION_IFUNC_CHARS},
|
||||||
|
{"just-symbols", no_argument, 0, 'j'},
|
||||||
{"line-numbers", no_argument, 0, 'l'},
|
{"line-numbers", no_argument, 0, 'l'},
|
||||||
{"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
|
{"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */
|
||||||
{"no-demangle", no_argument, &do_demangle, 0},
|
{"no-demangle", no_argument, &do_demangle, 0},
|
||||||
|
@ -265,9 +288,10 @@ usage (FILE *stream, int status)
|
||||||
--defined-only Display only defined symbols\n\
|
--defined-only Display only defined symbols\n\
|
||||||
-e (ignored)\n\
|
-e (ignored)\n\
|
||||||
-f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\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\
|
-g, --extern-only Display only external symbols\n\
|
||||||
--ifunc-chars=CHARS Characters to use when displaying ifunc 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\
|
-l, --line-numbers Use debugging information to find a filename and\n\
|
||||||
line number for each symbol\n\
|
line number for each symbol\n\
|
||||||
-n, --numeric-sort Sort symbols numerically by address\n\
|
-n, --numeric-sort Sort symbols numerically by address\n\
|
||||||
|
@ -338,6 +362,10 @@ set_output_format (char *f)
|
||||||
case 'S':
|
case 'S':
|
||||||
i = FORMAT_SYSV;
|
i = FORMAT_SYSV;
|
||||||
break;
|
break;
|
||||||
|
case 'j':
|
||||||
|
case 'J':
|
||||||
|
i = FORMAT_JUST_SYMBOLS;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fatal (_("%s: invalid output format"), f);
|
fatal (_("%s: invalid output format"), f);
|
||||||
}
|
}
|
||||||
|
@ -1268,7 +1296,7 @@ static const char *
|
||||||
get_print_format (void)
|
get_print_format (void)
|
||||||
{
|
{
|
||||||
const char * padding;
|
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. */
|
/* POSIX compatible output does not have any padding. */
|
||||||
padding = "";
|
padding = "";
|
||||||
|
@ -1477,6 +1505,11 @@ print_object_filename_posix (const char *filename)
|
||||||
if (filename_per_file && !filename_per_symbol)
|
if (filename_per_file && !filename_per_symbol)
|
||||||
printf ("%s:\n", filename);
|
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. */
|
/* 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)
|
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. */
|
/* 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)
|
if (!filename_per_symbol)
|
||||||
printf ("%s[%s]:\n", archive, filename);
|
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)
|
/* Print the name of the file (and archive, if there is one)
|
||||||
containing a symbol. */
|
containing a symbol. */
|
||||||
|
@ -1566,6 +1611,13 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
|
||||||
printf ("%s: ", bfd_get_filename (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. */
|
/* 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));
|
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
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
|
@ -1755,7 +1813,7 @@ main (int argc, char **argv)
|
||||||
fatal (_("fatal error: libbfd ABI mismatch"));
|
fatal (_("fatal error: libbfd ABI mismatch"));
|
||||||
set_default_bfd_target ();
|
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)
|
long_options, (int *) 0)) != EOF)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
|
@ -1830,6 +1888,9 @@ main (int argc, char **argv)
|
||||||
case 'P':
|
case 'P':
|
||||||
set_output_format ("posix");
|
set_output_format ("posix");
|
||||||
break;
|
break;
|
||||||
|
case 'j':
|
||||||
|
set_output_format ("just-symbols");
|
||||||
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
reverse_sort = 1;
|
reverse_sort = 1;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue