From 35a674bdbc294730429a1007c9e7ce01e65b49b5 Mon Sep 17 00:00:00 2001 From: WHR Date: Thu, 11 Jan 2018 00:41:57 +0800 Subject: [PATCH] configure: Solaris detection, ld 'soname' option auto detection; other Solaris related fixes --- Makefile | 3 ++- configure | 40 +++++++++++++++++++++++++++++++++++++--- src/core.c | 4 ++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 28169ab..fe5f8c6 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,7 @@ INC = PIC = -fPIC AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib +SOCKET_LIBS = LDSO_SUFFIX = so LD_SET_SONAME = -Wl,-soname= @@ -82,7 +83,7 @@ src/version.o: src/version.h $(LDSO_PATHNAME): $(LOBJS) $(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) $(USER_LDFLAGS) \ - -shared -o $@ $(LOBJS) + -shared -o $@ $(LOBJS) $(SOCKET_LIBS) $(ALL_TOOLS): $(OBJS) $(CC) src/main.o src/common.o $(USER_LDFLAGS) -o $(PXCHAINS) diff --git a/configure b/configure index f09d69f..b1eec43 100755 --- a/configure +++ b/configure @@ -46,6 +46,19 @@ check_compile_run() { return $res } +check_link_silent() { + printf "$2" > "$tmpc" + $CC $OUR_CPPFLAGS $CPPFLAGS $1 $CFLAGS "$tmpc" -o /dev/null >/dev/null 2>&1 +} + +check_link() { + printf "checking %s ... " "$1" + local res=0 + check_link_silent "$2" "$3" || res=1 + test x$res = x0 && printf "yes\n" || printf "no\n" + return $res +} + usage() { echo "supported arguments" echo "--prefix=/path default: $prefix" @@ -130,7 +143,10 @@ mac_64=false ismac64() { $mac_64 } - +solaris_detected=false +issolaris() { + $solaris_detected +} check_define __APPLE__ && { mac_detected=true @@ -144,6 +160,7 @@ check_compile_run 'whether OpenBSDs fclose() (illegally) calls close()' \ '#include \n#include\nint close(int x){exit(0);}int main(){fclose(stdin);return 1;}' && \ OUR_CPPFLAGS="$OUR_CPPFLAGS -DBROKEN_FCLOSE" } +check_define __sun && check_define __SVR4 && solaris_detected=true echo "CC=$CC">config.mak [ -z "$CPPFLAGS" ] || echo "CPPFLAGS=$CPPFLAGS">>config.mak @@ -157,9 +174,24 @@ echo includedir=$includedir>>config.mak echo sysconfdir=$sysconfdir>>config.mak [ "$ignore_cve" = "no" ] && echo "CPPFLAGS+= -DSUPER_SECURE">>config.mak [ -z "$OUR_CPPFLAGS" ] || echo "CPPFLAGS+= $OUR_CPPFLAGS" >>config.mak + +check_link "whether we can use -Wl,--no-as-needed" "-Wl,--no-as-needed" \ +"int main() { return 0; }" || echo NO_AS_NEEDED= >> config.mak + +LD_SONAME_FLAG= +printf "checking what's the option to use in linker to set library name ... " +for o in --soname -h -soname -install_name; do + check_link_silent "-shared -Wl,$o,libconftest.so" "void test_func(int a) {}" && LD_SONAME_FLAG=$o && break +done +if [ -z "$LD_SONAME_FLAG" ]; then + printf '\ncannot find an option to set library name\n' + exit 1 +fi +echo "$LD_SONAME_FLAG" +echo "LD_SET_SONAME = -Wl,$LD_SONAME_FLAG," >> config.mak + make_cmd=make if ismac ; then - echo NO_AS_NEEDED=>>config.mak echo LDSO_SUFFIX=dylib>>config.mak echo MAC_CFLAGS+=-DIS_MAC=1>>config.mak if ismac64 && [ "$fat_binary" = 1 ] ; then @@ -167,11 +199,13 @@ if ismac ; then echo MAC_CFLAGS+=-arch i386 -arch x86_64>>config.mak echo LDFLAGS+=-arch i386 -arch x86_64>>config.mak fi - echo LD_SET_SONAME=-Wl,-install_name,>>config.mak elif isbsd ; then echo LIBDL=>>config.mak echo "CFLAGS+=-DIS_BSD">>config.mak make_cmd=gmake +elif issolaris; then + echo "CFLAGS+=-DIS_SOLARIS -D__EXTENSIONS__" >> config.mak + echo "SOCKET_LIBS=-lsocket -lnsl" >> config.mak fi echo "Done, now run $make_cmd && $make_cmd install" diff --git a/src/core.c b/src/core.c index 57c1128..ed3a6bd 100644 --- a/src/core.c +++ b/src/core.c @@ -787,8 +787,8 @@ void proxy_freeaddrinfo(struct addrinfo *res) { free(res); } -#if defined(IS_MAC) || defined(IS_OPENBSD) -#ifdef IS_OPENBSD /* OpenBSD has its own incompatible getservbyname_r */ +#if defined(IS_MAC) || defined(IS_OPENBSD) || defined(IS_SOLARIS) +#if defined(IS_OPENBSD) || defined(IS_SOLARIS) /* OpenBSD and Solaris has its own incompatible getservbyname_r */ #define getservbyname_r mygetservbyname_r #endif /* getservbyname on mac is using thread local storage, so we dont need mutex