[PATCH] [gdb/build] Check if libsource-highlight is usable

Tom de Vries tdevries@suse.de
Sat Nov 20 12:22:31 GMT 2021


On 11/20/21 11:57 AM, Andrew Burgess wrote:
> * Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> [2021-11-19 21:56:41 +0100]:
> 
>> On 11/19/21 4:56 PM, Andrew Burgess wrote:
>>> * Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> [2021-11-19 13:34:23 +0100]:
>>>
>>>> When building gdb with g++ 4.8.5, I ran into:
>>>> ...
>>>> ld: source-cache.o: in function `source_cache::ensure(symtab*)':
>>>> source-cache.c:207: undefined reference to \
>>>>   srchilite::SourceHighlight::SourceHighlight(std::string const&)
>>>> ...
>>>>
>>>> [ I configured gdb without explicit settings related to source-highlight, so
>>>> we're excercising the enable_source_highlight=auto scenario. ]
>>>>
>>>> The problem is that:
>>>> - the source-highlight library is build with system compiler
>>>>   g++ 7.5.0 which uses the new libstdc++ library abi (see
>>>>   https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html )
>>>> - gdb is build using g++ 4.8.5 which uses the old abi.
>>>>
>>>> [ There's a compatibility macro _GLIBCXX_USE_CXX11_ABI, but that doesn't work
>>>> for this case.  Instead, it enables the opposite case where the
>>>> source-highlight library is build with g++ 4.8.5 and gdb is build with
>>>> g++ 7.5.0. ]
>>>>
>>>> Fix this by checking whether the source-highlight library is usable during
>>>> configuration.
>>>>
>>>> In the enable_source_highlight=auto scenario, this allows the build to skip
>>>> the unusable library and finish successfully.
>>>>
>>>> In the enable_source_highlight=yes scenario, this allows the build to error
>>>> out earlier.
>>>
>>> I make no claims of being an autoconf expert, but this all looks
>>> reasonable to me.  I had just one tiny nit..
>>>
>>>>
>>>> Tested on x86_64-linux.
>>>> ---
>>>>  gdb/configure    | 158 ++++++++++++++++++++++++++++++++---------------
>>>>  gdb/configure.ac |  47 ++++++++++++--
>>>>  2 files changed, 151 insertions(+), 54 deletions(-)
>>>>
>>>> diff --git a/gdb/configure b/gdb/configure
>>>> index 6e2dfb766c8..aaa622d9fcc 100755
>>>> --- a/gdb/configure
>>>> +++ b/gdb/configure
>>>> @@ -2367,6 +2367,52 @@ $as_echo "$ac_res" >&6; }
>>>>  
>>>>  } # ac_fn_c_check_func
>>>>  
>>>> +# ac_fn_cxx_try_link LINENO
>>>> +# -------------------------
>>>> +# Try to link conftest.$ac_ext, and return whether this succeeded.
>>>> +ac_fn_cxx_try_link ()
>>>> +{
>>>> +  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
>>>> +  rm -f conftest.$ac_objext conftest$ac_exeext
>>>> +  if { { ac_try="$ac_link"
>>>> +case "(($ac_try" in
>>>> +  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>>>> +  *) ac_try_echo=$ac_try;;
>>>> +esac
>>>> +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
>>>> +$as_echo "$ac_try_echo"; } >&5
>>>> +  (eval "$ac_link") 2>conftest.err
>>>> +  ac_status=$?
>>>> +  if test -s conftest.err; then
>>>> +    grep -v '^ *+' conftest.err >conftest.er1
>>>> +    cat conftest.er1 >&5
>>>> +    mv -f conftest.er1 conftest.err
>>>> +  fi
>>>> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>>>> +  test $ac_status = 0; } && {
>>>> +	 test -z "$ac_cxx_werror_flag" ||
>>>> +	 test ! -s conftest.err
>>>> +       } && test -s conftest$ac_exeext && {
>>>> +	 test "$cross_compiling" = yes ||
>>>> +	 test -x conftest$ac_exeext
>>>> +       }; then :
>>>> +  ac_retval=0
>>>> +else
>>>> +  $as_echo "$as_me: failed program was:" >&5
>>>> +sed 's/^/| /' conftest.$ac_ext >&5
>>>> +
>>>> +	ac_retval=1
>>>> +fi
>>>> +  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
>>>> +  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
>>>> +  # interfere with the next link command; also delete a directory that is
>>>> +  # left behind by Apple's compiler.  We do this before executing the actions.
>>>> +  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
>>>> +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>>>> +  as_fn_set_status $ac_retval
>>>> +
>>>> +} # ac_fn_cxx_try_link
>>>> +
>>>>  # ac_fn_c_check_type LINENO TYPE VAR INCLUDES
>>>>  # -------------------------------------------
>>>>  # Tests whether TYPE exists after having included INCLUDES, setting cache
>>>> @@ -2524,52 +2570,6 @@ $as_echo "$ac_res" >&6; }
>>>>  
>>>>  } # ac_fn_c_check_member
>>>>  
>>>> -# ac_fn_cxx_try_link LINENO
>>>> -# -------------------------
>>>> -# Try to link conftest.$ac_ext, and return whether this succeeded.
>>>> -ac_fn_cxx_try_link ()
>>>> -{
>>>> -  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
>>>> -  rm -f conftest.$ac_objext conftest$ac_exeext
>>>> -  if { { ac_try="$ac_link"
>>>> -case "(($ac_try" in
>>>> -  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
>>>> -  *) ac_try_echo=$ac_try;;
>>>> -esac
>>>> -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
>>>> -$as_echo "$ac_try_echo"; } >&5
>>>> -  (eval "$ac_link") 2>conftest.err
>>>> -  ac_status=$?
>>>> -  if test -s conftest.err; then
>>>> -    grep -v '^ *+' conftest.err >conftest.er1
>>>> -    cat conftest.er1 >&5
>>>> -    mv -f conftest.er1 conftest.err
>>>> -  fi
>>>> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>>>> -  test $ac_status = 0; } && {
>>>> -	 test -z "$ac_cxx_werror_flag" ||
>>>> -	 test ! -s conftest.err
>>>> -       } && test -s conftest$ac_exeext && {
>>>> -	 test "$cross_compiling" = yes ||
>>>> -	 test -x conftest$ac_exeext
>>>> -       }; then :
>>>> -  ac_retval=0
>>>> -else
>>>> -  $as_echo "$as_me: failed program was:" >&5
>>>> -sed 's/^/| /' conftest.$ac_ext >&5
>>>> -
>>>> -	ac_retval=1
>>>> -fi
>>>> -  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
>>>> -  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
>>>> -  # interfere with the next link command; also delete a directory that is
>>>> -  # left behind by Apple's compiler.  We do this before executing the actions.
>>>> -  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
>>>> -  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
>>>> -  as_fn_set_status $ac_retval
>>>> -
>>>> -} # ac_fn_cxx_try_link
>>>> -
>>>>  # ac_fn_cxx_check_func LINENO FUNC VAR
>>>>  # ------------------------------------
>>>>  # Tests whether FUNC exists, setting the cache variable VAR accordingly
>>>> @@ -12103,13 +12103,73 @@ $as_echo "no - pkg-config not found" >&6; }
>>>>            ;;
>>>>        esac
>>>>  
>>>> -      SRCHIGH_CFLAGS=`${pkg_config_prog_path} --cflags source-highlight`
>>>> -      SRCHIGH_LIBS=`${pkg_config_prog_path} --libs source-highlight`
>>>> +      srchigh_pkg_cflags=`${pkg_config_prog_path} --cflags source-highlight`
>>>> +      srchigh_pkg_libs=`${pkg_config_prog_path} --libs source-highlight`
>>>> +
>>>> +      # Now that we have found a source-highlight library, check if we can use
>>>> +      # it.  In particular, we're trying to detect the situation that the
>>>> +      # library is using the new libstdc++ library abi ( see
>>>> +      # https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html )
>>>> +      # while the compiler being used to compile gdb is using the old abi.
>>>> +      # Such a situation will result in an undefined reference to
>>>> +      # srchilite::SourceHighlight::SourceHighlight(std::string const&).
>>>> +      # This situation can occur when f.i. using a source highlight library
>>>
>>> what's "f.i." ? 
>>
>> For instance.
> 
> OK, that makes sense.
> 
>>
>>> did you mean "e.g." ?
>>
>> Well, I meant for instance.  That is, I know "e.g.", but I find it hard
>> to use because it doesn't directly map to an english language
>> expression, like "f.i.".  So I'd prefer to continue to use this, unless
>> it's hard to understand for people in general.  I'm
>> not-a-native-speaker, so feedback on that is welcome :)
> 
> I've never seen "for instance" abbreviated to "f.i." before, so, I'd
> just suggest saying "for instance".
> 

Updated patch accordingly, and committed.

> Or don't change it at all if you don't want to :)  I was still able to
> understand what you were saying, so it's not really important.
> 

Ack, that's good to know.

I've grepped a bit in the log messages and sources, and it seems to be
just me using this abbreviation.  I'll try to refrain from using this in
the future.

Thanks for the review.

- Tom


More information about the Gdb-patches mailing list