libctf: fix ELF-in-BFD checks in the presence of ASAN

The address sanitizer contains a redirector that captures dlopen calls,
so checks for dlopen with AC_SEARCH_LIBS will always conclude that
dlopen is present when the sanitizer is on.  This means it won't add
-ldl to LIBS even if needed, and the immediately-following attempt to
actually link with -lbfd will fail because libbfd also needs dlsym,
which ASAN does *not* contain a redirector for.

If we check for dlsym instead of dlopen, the check works whether ASAN is
on or off.  (bfd uses both in close proximity: if it needs one, it will
always need the other.)

libctf/ChangeLog
2021-03-25  Nick Alcock  <nick.alcock@oracle.com>

	* configure.ac: Check for dlsym, not dlopen.
	* configure: Regenerate.
This commit is contained in:
Nick Alcock 2021-03-25 16:32:46 +00:00
parent 15131809c2
commit 8f7b22ea2a
3 changed files with 18 additions and 13 deletions

View File

@ -1,3 +1,8 @@
2021-03-25 Nick Alcock <nick.alcock@oracle.com>
* configure.ac: Check for dlsym, not dlopen.
* configure: Regenerate.
2021-03-25 Nick Alcock <nick.alcock@oracle.com> 2021-03-25 Nick Alcock <nick.alcock@oracle.com>
* testsuite/libctf-writable/symtypetab-nonlinker-writeout.c: Don't * testsuite/libctf-writable/symtypetab-nonlinker-writeout.c: Don't

24
libctf/configure vendored
View File

@ -12798,9 +12798,9 @@ fi
rm -f conftest.mmap conftest.txt rm -f conftest.mmap conftest.txt
# Needed for BFD capability checks. # Needed for BFD capability checks.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5
$as_echo_n "checking for library containing dlopen... " >&6; } $as_echo_n "checking for library containing dlsym... " >&6; }
if ${ac_cv_search_dlopen+:} false; then : if ${ac_cv_search_dlsym+:} false; then :
$as_echo_n "(cached) " >&6 $as_echo_n "(cached) " >&6
else else
ac_func_search_save_LIBS=$LIBS ac_func_search_save_LIBS=$LIBS
@ -12813,11 +12813,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
char dlopen (); char dlsym ();
int int
main () main ()
{ {
return dlopen (); return dlsym ();
; ;
return 0; return 0;
} }
@ -12830,25 +12830,25 @@ for ac_lib in '' dl; do
LIBS="-l$ac_lib $ac_func_search_save_LIBS" LIBS="-l$ac_lib $ac_func_search_save_LIBS"
fi fi
if ac_fn_c_try_link "$LINENO"; then : if ac_fn_c_try_link "$LINENO"; then :
ac_cv_search_dlopen=$ac_res ac_cv_search_dlsym=$ac_res
fi fi
rm -f core conftest.err conftest.$ac_objext \ rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest$ac_exeext
if ${ac_cv_search_dlopen+:} false; then : if ${ac_cv_search_dlsym+:} false; then :
break break
fi fi
done done
if ${ac_cv_search_dlopen+:} false; then : if ${ac_cv_search_dlsym+:} false; then :
else else
ac_cv_search_dlopen=no ac_cv_search_dlsym=no
fi fi
rm conftest.$ac_ext rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS LIBS=$ac_func_search_save_LIBS
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5
$as_echo "$ac_cv_search_dlopen" >&6; } $as_echo "$ac_cv_search_dlsym" >&6; }
ac_res=$ac_cv_search_dlopen ac_res=$ac_cv_search_dlsym
if test "$ac_res" != no; then : if test "$ac_res" != no; then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

View File

@ -68,7 +68,7 @@ ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_libctf_warn_cflags])
AC_FUNC_MMAP AC_FUNC_MMAP
# Needed for BFD capability checks. # Needed for BFD capability checks.
AC_SEARCH_LIBS(dlopen, dl) AC_SEARCH_LIBS(dlsym, dl)
AM_ZLIB AM_ZLIB
GCC_ENABLE([libctf-hash-debugging], [no], [], [Enable expensive debugging of CTF deduplication type hashing]) GCC_ENABLE([libctf-hash-debugging], [no], [], [Enable expensive debugging of CTF deduplication type hashing])