From: Nick Clifton Date: Wed, 18 May 2022 12:15:22 +0000 (+0100) Subject: Add a --no-weak option to nm. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55;p=binutils-gdb.git 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. --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index ab65d20aca1..6697697b9d0 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 c266bb9c3de..3043a7a7f3c 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 292588c241d..81be746a17b 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 9edaa8d26b0..60e4d850885 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} @@ -364,6 +366,8 @@ usage (FILE *stream, int status) fprintf (stream, _("\ --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, _("\ @@ -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 4560df16099..1c419df4d9a 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 00000000000..a25454dd985 --- /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 + +