From: Nick Alcock <nick.alcock@oracle.com>
To: binutils@sourceware.org
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH 2/4 REVIEW] libtool.m4: fix nm BSD flag detection
Date: Tue, 06 Jul 2021 20:37:26 +0100 [thread overview]
Message-ID: <87fswrdyix.fsf@esperi.org.uk> (raw)
In-Reply-To: <20210625161335.4831-3-nick.alcock@oracle.com> (Nick Alcock via Binutils's message of "Fri, 25 Jun 2021 17:13:33 +0100")
Ping?
On 25 Jun 2021, Nick Alcock via Binutils said this:
> Libtool needs to get BSD-format (or MS-format) output out of the system
> nm, so that it can scan generated object files for symbol names for
> -export-symbols-regex support. Some nms need specific flags to turn on
> BSD-formatted output, so libtool checks for this in its AC_PATH_NM.
> Unfortunately the code to do this has a pair of interlocking flaws:
>
> - it runs the test by doing an nm of /dev/null. Some platforms
> reasonably refuse to do an nm on a device file, but before now this
> has only been worked around by assuming that the error message has a
> specific textual form emitted by Tru64 nm, and that getting this
> error means this is Tru64 nm and that nm -B would work to produce
> BSD-format output, even though the test never actually got anything
> but an error message out of nm -B. This is fixable by nm'ing *nm
> itself* (since we necessarily have a path to it).
>
> - the test is entirely skipped if NM is set in the environment, on the
> grounds that the user has overridden the test: but the user cannot
> reasonably be expected to know that libtool wants not only nm but
> also flags forcing BSD-format output. Worse yet, one such "user" is
> the top-level Cygnus configure script, which neither tests for
> nor specifies any BSD-format flags. So platforms needing BSD-format
> flags always fail to set them when run in a Cygnus tree, breaking
> -export-symbols-regex on such platforms. Libtool also needs to
> augment $LD on some platforms, but this is done unconditionally,
> augmenting whatever the user specified: the nm check should do the
> same.
>
> One wrinkle: if the user has overridden $NM, a path might have been
> provided: so we use the user-specified path if there was one, and
> otherwise do the path search as usual. (If the nm specified doesn't
> work, this might lead to a few extra pointless path searches -- but
> the test is going to fail anyway, so that's not a problem.)
>
> (Tested with NM unset, and set to nm, /usr/bin/nm, my-nm where my-nm is a
> symlink to /usr/bin/nm on the PATH, and /not-on-the-path/my-nm where
> *that* is a symlink to /usr/bin/nm.)
>
> Cc: gcc-patches@gcc.gnu.org
>
> ChangeLog
> 2021-06-22 Nick Alcock <nick.alcock@oracle.com>
>
> PR libctf/27482
> * libtool.m4 (LT_PATH_NM): Try BSDization flags with a user-provided
> NM, if there is one. Run nm on itself, not on /dev/null, to avoid
> errors from nms that refuse to work on non-regular files. Remove
> other workarounds for this problem. Strip out blank lines from the
> nm output.
> ---
> libtool.m4 | 88 ++++++++++++++++++++++++++++--------------------------
> 1 file changed, 45 insertions(+), 43 deletions(-)
>
> diff --git a/libtool.m4 b/libtool.m4
> index b0a56917497..29dce1f8239 100644
> --- a/libtool.m4
> +++ b/libtool.m4
> @@ -3200,53 +3200,55 @@ _LT_DECL([], [file_magic_cmd], [1],
>
> # LT_PATH_NM
> # ----------
> -# find the pathname to a BSD- or MS-compatible name lister
> +# find the pathname to a BSD- or MS-compatible name lister, and any flags
> +# needed to make it compatible
> AC_DEFUN([LT_PATH_NM],
> [AC_REQUIRE([AC_PROG_CC])dnl
> AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
> [if test -n "$NM"; then
> - # Let the user override the test.
> - lt_cv_path_NM="$NM"
> -else
> - lt_nm_to_check="${ac_tool_prefix}nm"
> - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
> - lt_nm_to_check="$lt_nm_to_check nm"
> - fi
> - for lt_tmp_nm in $lt_nm_to_check; do
> - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
> - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
> - IFS="$lt_save_ifs"
> - test -z "$ac_dir" && ac_dir=.
> - tmp_nm="$ac_dir/$lt_tmp_nm"
> - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
> - # Check to see if the nm accepts a BSD-compat flag.
> - # Adding the `sed 1q' prevents false positives on HP-UX, which says:
> - # nm: unknown option "B" ignored
> - # Tru64's nm complains that /dev/null is an invalid object file
> - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
> - */dev/null* | *'Invalid file or object type'*)
> - lt_cv_path_NM="$tmp_nm -B"
> - break
> - ;;
> - *)
> - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
> - */dev/null*)
> - lt_cv_path_NM="$tmp_nm -p"
> - break
> - ;;
> - *)
> - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
> - continue # so that we can try to find one that supports BSD flags
> - ;;
> - esac
> - ;;
> - esac
> - fi
> - done
> - IFS="$lt_save_ifs"
> - done
> - : ${lt_cv_path_NM=no}
> -fi])
> + # Let the user override the nm to test.
> + lt_nm_to_check="$NM"
> + else
> + lt_nm_to_check="${ac_tool_prefix}nm"
> + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
> + lt_nm_to_check="$lt_nm_to_check nm"
> + fi
> + fi
> + for lt_tmp_nm in $lt_nm_to_check; do
> + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
> + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
> + IFS="$lt_save_ifs"
> + test -z "$ac_dir" && ac_dir=.
> + case "$lt_tmp_nm" in
> + */*|*\\*) tmp_nm="$lt_tmp_nm";;
> + *) tmp_nm="$ac_dir/$lt_tmp_nm";;
> + esac
> + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
> + # Check to see if the nm accepts a BSD-compat flag.
> + # Adding the `sed 1q' prevents false positives on HP-UX, which says:
> + # nm: unknown option "B" ignored
> + case `"$tmp_nm" -B "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
> + *$tmp_nm*) lt_cv_path_NM="$tmp_nm -B"
> + break
> + ;;
> + *)
> + case `"$tmp_nm" -p "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
> + *$tmp_nm*)
> + lt_cv_path_NM="$tmp_nm -p"
> + break
> + ;;
> + *)
> + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
> + continue # so that we can try to find one that supports BSD flags
> + ;;
> + esac
> + ;;
> + esac
> + fi
> + done
> + IFS="$lt_save_ifs"
> + done
> + : ${lt_cv_path_NM=no}])
> if test "$lt_cv_path_NM" != "no"; then
> NM="$lt_cv_path_NM"
> else
next prev parent reply other threads:[~2021-07-06 19:37 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-25 16:13 [PATCH 0/4 REVIEW] libtool and libctf fixes for Solaris 11 Nick Alcock
2021-06-25 16:13 ` [PATCH 1/4] libtool.m4: augment symcode " Nick Alcock
2021-06-25 16:13 ` [PATCH 2/4 REVIEW] libtool.m4: fix nm BSD flag detection Nick Alcock
2021-07-06 19:37 ` Nick Alcock [this message]
2021-07-07 14:39 ` Nick Clifton
2021-07-07 19:03 ` Nick Alcock
2021-07-21 8:22 ` Alan Modra
2021-09-09 12:39 ` Nick Alcock
2021-06-25 16:13 ` [PATCH 3/4] libctf: try several possibilities for linker versioning flags Nick Alcock
2021-06-25 16:13 ` [PATCH 4/4] configure: regenerate in all projects that use libtool.m4 Nick Alcock
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fswrdyix.fsf@esperi.org.uk \
--to=nick.alcock@oracle.com \
--cc=binutils@sourceware.org \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).