From 2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 18 May 2022 13:15:22 +0100 Subject: Add a --no-weak option to nm. PR 29135 * nm.c (non_weak): New variable. (filter_symbols): When non-weak is true, ignore weak symbols. (long_options): Add --no-weak. (usage): Mention --no-weak. (main): Handle -W/--no-weak. * doc/binutils.texi: Document new feature. * NEWS: Mention the new feature. * testsuite/binutils-all/nm.exp: Add test of new feature. * testsuite/binutils-all/no-weak.s: New test source file. --- binutils/ChangeLog | 13 +++++++++++++ binutils/NEWS | 2 ++ binutils/doc/binutils.texi | 5 +++++ binutils/nm.c | 11 ++++++++++- binutils/testsuite/binutils-all/nm.exp | 32 ++++++++++++++++++++++++++++++- binutils/testsuite/binutils-all/no-weak.s | 13 +++++++++++++ 6 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 binutils/testsuite/binutils-all/no-weak.s diff --git a/binutils/ChangeLog b/binutils/ChangeLog index ab65d20..6697697 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,16 @@ +2022-05-18 Nick Clifton + + PR 29135 + * nm.c (non_weak): New variable. + (filter_symbols): When non-weak is true, ignore weak symbols. + (long_options): Add --no-weak. + (usage): Mention --no-weak. + (main): Handle -W/--no-weak. + * doc/binutils.texi: Document new feature. + * NEWS: Mention the new feature. + * testsuite/binutils-all/nm.exp: Add test of new feature. + * testsuite/binutils-all/no-weak.s: New test source file. + 2022-04-25 Nick Clifton PR 29072 diff --git a/binutils/NEWS b/binutils/NEWS index c266bb9..3043a7a 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,7 +1,9 @@ -*- text -*- +* Add --no-weak/-W option to nm to make it ignore weak symbols. * Add an option to objdump and readelf to prevent attempts to access debuginfod servers when following links. + * objcopy --weaken, --weaken-symbol, and --weaken-symbols now make ELF STB_GNU_UNIQUE symbols weak. diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 292588c..81be746 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -819,6 +819,7 @@ nm [@option{-A}|@option{-o}|@option{--print-file-name}] [@option{-u}|@option{--undefined-only}] [@option{-U}|@option{--defined-only}] [@option{-V}|@option{--version}] + [@option{-W}|@option{--no-weak}] [@option{-X 32_64}] [@option{--no-demangle}] [@option{--no-recurse-limit}|@option{--recurse-limit}]] @@ -1213,6 +1214,10 @@ them as escape sequences highlighted in red (if supported by the output device). The colouring is intended to draw attention to the presence of unicode sequences where they might not be expected. +@item -W +@itemx --no-weak +Do not display weak symbols. + @item --with-symbol-versions @item --without-symbol-versions Enables or disables the display of symbol version information. The diff --git a/binutils/nm.c b/binutils/nm.c index 9edaa8d..60e4d85 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -176,6 +176,7 @@ static const char *print_format_string = NULL; static int do_demangle = 0; /* Pretty print C++ symbol names. */ static int external_only = 0; /* Print external symbols only. */ static int defined_only = 0; /* Print defined symbols only. */ +static int non_weak = 0; /* Ignore weak symbols. */ static int no_sort = 0; /* Don't sort; print syms in order found. */ static int print_debug_syms = 0;/* Print debugger-only symbols too. */ static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */ @@ -281,6 +282,7 @@ static struct option long_options[] = {"undefined-only", no_argument, 0, 'u'}, {"unicode", required_argument, NULL, OPTION_UNICODE}, {"version", no_argument, &show_version, 1}, + {"no-weak", no_argument, 0, 'W'}, {"with-symbol-versions", no_argument, &with_symbol_versions, 1}, {"without-symbol-versions", no_argument, &with_symbol_versions, 0}, {0, no_argument, 0, 0} @@ -365,6 +367,8 @@ usage (FILE *stream, int status) --unicode={default|show|invalid|hex|escape|highlight}\n\ Specify how to treat UTF-8 encoded unicode characters\n")); fprintf (stream, _("\ + -W, --no-weak Ignore weak symbols\n")); + fprintf (stream, _("\ --with-symbol-versions Display version strings after symbol names\n")); fprintf (stream, _("\ -X 32_64 (ignored)\n")); @@ -808,6 +812,8 @@ filter_symbols (bfd *abfd, bool is_dynamic, void *minisyms, | BSF_GNU_UNIQUE)) != 0 || bfd_is_und_section (sym->section) || bfd_is_com_section (sym->section)); + else if (non_weak) + keep = ((sym->flags & BSF_WEAK) == 0); else keep = 1; @@ -2052,7 +2058,7 @@ main (int argc, char **argv) fatal (_("fatal error: libbfd ABI mismatch")); set_default_bfd_target (); - while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uU:vVvX:", + while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uU:vVvWX:", long_options, (int *) 0)) != EOF) { switch (c) @@ -2171,6 +2177,9 @@ main (int argc, char **argv) case 'V': show_version = 1; break; + case 'W': + non_weak = 1; + break; case 'X': /* Ignored for (partial) AIX compatibility. On AIX, the argument has values 32, 64, or 32_64, and specifies that diff --git a/binutils/testsuite/binutils-all/nm.exp b/binutils/testsuite/binutils-all/nm.exp index 4560df1..1c419df 100644 --- a/binutils/testsuite/binutils-all/nm.exp +++ b/binutils/testsuite/binutils-all/nm.exp @@ -340,7 +340,37 @@ if [is_elf_format] { } } - + set testname "nm --no-weak" + if {![binutils_assemble $srcdir/$subdir/no-weak.s tmpdir/no-weak.o]} then { + fail "$testname (assembly)" + } else { + if [is_remote host] { + set tmpfile [remote_download host tmpdir/no-weak.o] + } else { + set tmpfile tmpdir/no-weak.o + } + + set got [binutils_run $NM "$NMFLAGS --no-weak $tmpfile"] + + if [regexp "weak_with_default_value" $got] then { + fail "$testname (weak symbol with default value)" + } else { + pass "$testname (weak symbol with default value)" + } + + if [regexp "weak_without_default_value" $got] then { + fail "$testname (weak symbol without default value)" + } else { + pass "$testname (weak symbol without default value)" + } + + # FIXME: We should re run this test without the --no-weak option + # and verify that the expected symbol names *are* shown... + + if { $verbose < 1 } { + remote_file host delete "tmpdir/no0weak.o" + } + } } # There are certainly other tests that could be run. diff --git a/binutils/testsuite/binutils-all/no-weak.s b/binutils/testsuite/binutils-all/no-weak.s new file mode 100644 index 0000000..a25454d --- /dev/null +++ b/binutils/testsuite/binutils-all/no-weak.s @@ -0,0 +1,13 @@ + .file "no-weak.c" + .text + + .globl weak_with_default_value + .weak weak_with_default_value +weak_with_default_value: + .nop + + .data + .weak weak_without_default_value + .dc.a weak_without_default_value + + -- cgit v1.1