configure: check for dlsym instead of dlopen.

When building with sanitizers the sanitizer library provides dlopen, but not
dlsym(), making configure think that -ldl isn't needed. Just checking for
dlsym() ought to suffice, hard to see dlsym() being provided without dlopen()
also being provided.

Backpatch to all branches, for the same reasons as 46ab07ffda.

Reviewed-By: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/20220323173537.ll7klrglnp4gn2um@alap3.anarazel.de
Backpatch: 10-
This commit is contained in:
Andres Freund 2022-03-23 12:43:14 -07:00
parent efe44fb2f6
commit a77dddb42e
2 changed files with 19 additions and 13 deletions

27
configure vendored
View File

@ -10925,9 +10925,12 @@ if test "$ac_res" != no; then :
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 # gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
$as_echo_n "checking for library containing dlopen... " >&6; } # when enabling asan the dlopen check doesn't notice that -ldl is actually
if ${ac_cv_search_dlopen+:} false; then : # required. Just checking for dlsym() ought to suffice.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5
$as_echo_n "checking for library containing dlsym... " >&6; }
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
@ -10940,11 +10943,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;
} }
@ -10957,25 +10960,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

@ -1184,7 +1184,10 @@ AC_SUBST(PTHREAD_LIBS)
AC_CHECK_LIB(m, main) AC_CHECK_LIB(m, main)
AC_SEARCH_LIBS(setproctitle, util) AC_SEARCH_LIBS(setproctitle, util)
AC_SEARCH_LIBS(dlopen, dl) # gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
# when enabling asan the dlopen check doesn't notice that -ldl is actually
# required. Just checking for dlsym() ought to suffice.
AC_SEARCH_LIBS(dlsym, dl)
AC_SEARCH_LIBS(socket, [socket ws2_32]) AC_SEARCH_LIBS(socket, [socket ws2_32])
AC_SEARCH_LIBS(shl_load, dld) AC_SEARCH_LIBS(shl_load, dld)
# We only use libld in port/dynloader/aix.c # We only use libld in port/dynloader/aix.c