1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-10 01:26:17 +02:00

13431: better check for shared libraries.

This commit is contained in:
Andrey Borzenkov 2001-02-13 14:35:07 +00:00
parent 326d682510
commit fa6bab3083
7 changed files with 139 additions and 63 deletions

View File

@ -1,3 +1,12 @@
2001-02-02 Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
* 13431: aczsh.m4,configure.in,Src/Modules/termcap.c,
Src/Modules/termcap.mdd,Src/Modules/terminfo.c,
Src/Modules/terminfo.mdd,Src/mkmakemod.sh: hopefully better
check for shared libraries. Link in termcap/terminfo statically
if shared libtermcap/libcurses unavailable
2001-02-13 Sven Wischnowsky <wischnow@zsh.org>
* 13462: Src/Modules/zpty.c: try to make the -t option of zpty

View File

@ -33,7 +33,7 @@
/* echotc: output a termcap */
/**/
int
static int
bin_echotc(char *name, char **argv, char *ops, int func)
{
char *s, buf[2048], *t, *u;

View File

@ -1,5 +1,15 @@
name=zsh/termcap
link=either
link='if test "x$ac_cv_func_tgetent" = xyes; then
if test "x$zsh_cv_shared_tgetent" = xyes; then
echo either
else
echo static
fi
else
echo no;
fi
'
load=yes
autobins="echotc"

View File

@ -36,7 +36,7 @@ static Param terminfo_pm;
/* echoti: output a terminfo capability */
/**/
int
static int
bin_echoti(char *name, char **argv, char *ops, int func)
{
char *s, *t;

View File

@ -1,5 +1,15 @@
name=zsh/terminfo
link='if test "x$ac_cv_func_tigetstr" = xyes; then echo either; else echo no; fi'
link='if test "x$ac_cv_func_tigetstr" = xyes; then
if test "x$zsh_cv_shared_tigetstr" = xyes; then
echo either
else
echo static
fi
else
echo no;
fi
'
load=yes
autobins="echoti"

View File

@ -111,32 +111,59 @@ main()
dnl
dnl zsh_SYS_DYNAMIC_BROKEN
dnl Check whether static/shared library linking is broken.
dnl zsh_SHARED_FUNCTION
dnl
dnl This is just a frontend to zsh_SHARED_SYMBOL
dnl
dnl Usage: zsh_SHARED_FUNCTION(name[,rettype[,paramtype]])
dnl
AC_DEFUN(zsh_SHARED_FUNCTION,
[zsh_SHARED_SYMBOL($1, ifelse([$2], ,[int ],[$2]) $1 [(]ifelse([$3], ,[ ],[$3])[)], $1)])
dnl
dnl zsh_SHARED_VARIABLE
dnl
dnl This is just a frontend to zsh_SHARED_SYMBOL
dnl
dnl Usage: zsh_SHARED_VARIABLE(name[,type])
dnl
AC_DEFUN(zsh_SHARED_VARIABLE,
[zsh_SHARED_SYMBOL($1, ifelse([$2], ,[int ],[$2]) $1, [&$1])])
dnl
dnl zsh_SHARED_SYMBOL
dnl Check whether symbol is available in static or shared library
dnl
dnl On some systems, static modifiable library symbols (such as environ)
dnl may appear only in statically linked libraries. If this is the case,
dnl then two shared libraries that reference the same symbol, each linked
dnl with the static library, could be given distinct copies of the symbol.
dnl If this is the case then dynamic linking is FUBAR.
dnl
dnl Usage: zsh_SHARED_SYMBOL(name,declaration,address)
dnl Sets zsh_cv_shared_$1 cache variable to yes/no
dnl
AC_DEFUN(zsh_SYS_DYNAMIC_BROKEN,
[AC_CACHE_CHECK([if static/shared library linking is broken],
zsh_cv_sys_dynamic_broken,
AC_DEFUN(zsh_SHARED_SYMBOL,
[AC_CACHE_CHECK([if $1 is available in shared libraries],
zsh_cv_shared_$1,
[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
us=_
else
us=
fi
echo '
extern char **environ;
void *symlist1[[]] = {
(void *)&environ,
(void *)0
};
void *zsh_getaddr1()
{
#ifdef __CYGWIN__
__attribute__((__dllimport__))
#endif
extern $2;
return $3;
};
' > conftest1.c
sed 's/symlist1/symlist2/' < conftest1.c > conftest2.c
sed 's/zsh_getaddr1/zsh_getaddr2/' < conftest1.c > conftest2.c
if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5 &&
$CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
@ -172,25 +199,33 @@ char *zsh_gl_sym_addr ;
main()
{
void *handle1, *handle2;
void **symlist1, **symlist2;
void *(*zsh_getaddr1)(), *(*zsh_getaddr2)();
void *sym1, *sym2;
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
if(!handle1) exit(1);
handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
if(!handle2) exit(1);
symlist1 = (void **) dlsym(handle1, "${us}symlist1");
symlist2 = (void **) dlsym(handle2, "${us}symlist2");
if(!symlist1 || !symlist2) exit(1);
for(; *symlist1; symlist1++, symlist2++)
if(*symlist1 != *symlist2)
exit(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
zsh_getaddr2 = (void *(*)()) dlsym(handle2, "${us}zsh_getaddr2");
sym1 = zsh_getaddr1();
sym2 = zsh_getaddr2();
if(!sym1 || !sym2) exit(1);
if(sym1 != sym2) exit(1);
dlclose(handle1);
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
if(!handle1) exit(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
sym1 = zsh_getaddr1();
if(!sym1) exit(1);
if(sym1 != sym2) exit(1);
exit(0);
}
], [zsh_cv_sys_dynamic_broken=no],
[zsh_cv_sys_dynamic_broken=yes],
[zsh_cv_sys_dynamic_broken=yes]
], [zsh_cv_shared_$1=yes],
[zsh_cv_shared_$1=no],
[zsh_cv_shared_$1=no]
)
else
zsh_cv_sys_dynamic_broken=yes
zsh_cv_shared_$1=no
fi
])
])

View File

@ -493,7 +493,9 @@ dnl -------------------
dnl On some systems, modules need to be linked against libc explicitly,
dnl in case they require objects that exist only in the static version
dnl and might not be compiled into the zsh executable.
AC_CHECK_LIB(c, printf)
dnl On ReliantUNIX -lc better be the last library, else funny things
dnl may happen.
AC_CHECK_LIB(c, printf, [LIBS="$LIBS -lc"])
AC_CHECK_LIB(m, pow)
@ -557,37 +559,6 @@ elif test $zsh_cv_decl_ospeed_must_define = yes; then
AC_DEFINE(MUST_DEFINE_OSPEED)
fi
dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer)
dnl Some termcaps reportedly accept a zero buffer, but then dump core
dnl in tgetstr().
dnl Under Cygwin test program crashes but exit code is still 0. So,
dnl we test for a file that porgram should create
AC_CACHE_CHECK(if tgetent accepts NULL,
zsh_cv_func_tgetent_accepts_null,
[AC_TRY_RUN([
main()
{
int i = tgetent((char*)0,"vt100");
if (i > 0) {
char tbuf[1024], *u;
u = tbuf;
tgetstr("cl", &u);
creat("conftest.tgetent", 0640);
}
exit(!i || i == -1);
}
],
if test -f conftest.tgetent; then
zsh_cv_func_tgetent_accepts_null=yes
else
zsh_cv_func_tgetent_accepts_null=no
fi,
zsh_cv_func_tgetent_accepts_null=no,
zsh_cv_func_tgetent_accepts_null=no)])
if test $zsh_cv_func_tgetent_accepts_null = yes; then
AC_DEFINE(TGETENT_ACCEPTS_NULL)
fi
dnl --------------
dnl CHECK TYPEDEFS
dnl --------------
@ -845,9 +816,40 @@ AC_CHECK_FUNCS(strftime difftime gettimeofday \
putenv getenv \
brk sbrk \
pathconf sysconf \
tigetflag tigetnum tigetstr)
tgetent tigetflag tigetnum tigetstr)
AC_FUNC_STRCOLL
dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer)
dnl Some termcaps reportedly accept a zero buffer, but then dump core
dnl in tgetstr().
dnl Under Cygwin test program crashes but exit code is still 0. So,
dnl we test for a file that porgram should create
AC_CACHE_CHECK(if tgetent accepts NULL,
zsh_cv_func_tgetent_accepts_null,
[AC_TRY_RUN([
main()
{
int i = tgetent((char*)0,"vt100");
if (i > 0) {
char tbuf[1024], *u;
u = tbuf;
tgetstr("cl", &u);
creat("conftest.tgetent", 0640);
}
exit(!i || i == -1);
}
],
if test -f conftest.tgetent; then
zsh_cv_func_tgetent_accepts_null=yes
else
zsh_cv_func_tgetent_accepts_null=no
fi,
zsh_cv_func_tgetent_accepts_null=no,
zsh_cv_func_tgetent_accepts_null=no)])
if test $zsh_cv_func_tgetent_accepts_null = yes; then
AC_DEFINE(TGETENT_ACCEPTS_NULL)
fi
AC_FUNC_MMAP
if test x$ac_cv_func_mmap_fixed_mapped = xyes; then
AC_CHECK_FUNCS(munmap msync)
@ -1471,7 +1473,10 @@ elif test "x$ac_cv_cygwin" = xyes; then
zsh_cv_sys_dynamic_execsyms="${zsh_cv_sys_dynamic_execsyms=no}"
zsh_cv_sys_dynamic_strip_exe="${zsh_cv_sys_dynamic_strip_exe=yes}"
zsh_cv_sys_dynamic_strip_lib="${zsh_cv_sys_dynamic_strip_lib=yes}"
zsh_cv_sys_dynamic_broken="${zsh_cv_sys_dynamic_broken=no}"
#
# THAT SUCKS! and must be changed
#
zsh_cv_shared_environ="${zsh_cv_shared_environ=yes}"
LINKMODS=LINKMODS
MOD_EXPORT="__attribute__((__dllexport__))"
MOD_IMPORT_VARIABLE="__attribute__((__dllimport__))"
@ -1616,8 +1621,15 @@ main()
fi
if test "x$dynamic" = xyes; then
zsh_SYS_DYNAMIC_BROKEN
test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
zsh_SHARED_VARIABLE([environ], [char **])
test "$zsh_cv_shared_environ" = yes || dynamic=no
dnl test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
if test "$ac_cv_func_tgetent" = yes; then
zsh_SHARED_FUNCTION([tgetent])
fi
if test "$ac_cv_func_tigetstr" = yes; then
zsh_SHARED_FUNCTION([tigetstr])
fi
fi
if test "x$dynamic" = xyes; then