public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
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

  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).