zsh-workers
 help / color / mirror / code / Atom feed
* termcap moodule problem on Cygwin
@ 2001-01-29 14:55 Andrej Borsenkow
  2001-01-29 15:10 ` Peter Stephenson
  2001-01-29 16:48 ` Zefram
  0 siblings, 2 replies; 12+ messages in thread
From: Andrej Borsenkow @ 2001-01-29 14:55 UTC (permalink / raw)
  To: ZSH workers mailing list

Cygwin has only static libtermcap. It gets linked twice - into main zsh
(libzsh to be sure) where term is (re-)initalized and into termcap.dll where
bin_echotc is defined. Only first one calls tgetent() so every call to `echotc
cap' crashes somewhere in termcap.

Calling tgetent in bin_echotc is not an option because it won't catch changed
TERM. It means that code to deal with terminal should exist exactly once - in
main zsh or in module. I vote for moving it into zle (after all, it is the
only module that should care for TERM) together with bin_echotc. In any case,
it makes idea of echotc in seperate module very questionable.

Note, that Cygwin is not the only system with static termcap/terminfo.

-andrej

Have a nice DOS!
B >>


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: termcap moodule problem on Cygwin
  2001-01-29 14:55 termcap moodule problem on Cygwin Andrej Borsenkow
@ 2001-01-29 15:10 ` Peter Stephenson
  2001-01-30  8:25   ` Andrej Borsenkow
  2001-01-29 16:48 ` Zefram
  1 sibling, 1 reply; 12+ messages in thread
From: Peter Stephenson @ 2001-01-29 15:10 UTC (permalink / raw)
  To: Zsh hackers list

> Cygwin has only static libtermcap. It gets linked twice - into main zsh
> (libzsh to be sure) where term is (re-)initalized and into termcap.dll where
> bin_echotc is defined. Only first one calls tgetent() so every call to `echot
> c
> cap' crashes somewhere in termcap.

It must surely be possible to make sure it is linked in once only, which
would be the right thing to do.  If the worst comes to the worst, get
configure to detect a static termcap and only link it into the main module.

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: termcap moodule problem on Cygwin
  2001-01-29 14:55 termcap moodule problem on Cygwin Andrej Borsenkow
  2001-01-29 15:10 ` Peter Stephenson
@ 2001-01-29 16:48 ` Zefram
  1 sibling, 0 replies; 12+ messages in thread
From: Zefram @ 2001-01-29 16:48 UTC (permalink / raw)
  To: Andrej Borsenkow; +Cc: ZSH workers mailing list

Andrej Borsenkow wrote:
>Cygwin has only static libtermcap. It gets linked twice - into main zsh
>(libzsh to be sure) where term is (re-)initalized and into termcap.dll where
>bin_echotc is defined. Only first one calls tgetent() so every call to `echotc
>cap' crashes somewhere in termcap.

We've had this problem before, with a static `environ' symbol.  There's an
autoconf test for it in aczsh.m4.  Is there an appropriate symbol here
that we can use to test for a static termcap, to extend the test?

-zefram


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: termcap moodule problem on Cygwin
  2001-01-29 15:10 ` Peter Stephenson
@ 2001-01-30  8:25   ` Andrej Borsenkow
  2001-01-30 10:34     ` Peter Stephenson
  0 siblings, 1 reply; 12+ messages in thread
From: Andrej Borsenkow @ 2001-01-30  8:25 UTC (permalink / raw)
  To: Zsh hackers list

Answering both Peter and Zefram:

- it is not possible to simply link termcap into libzsh and then link termcap
module against libzsh (if that is what Peter means). AFAIK it may be
impossible on Win32 (it is not Cygwin limitation)

- in any case, it needs completely different configuration system to find out
exact set of libraries for every module. I am not even sure if any general
solution is possible. I have to look what libtool can do.

- even if it is possible to check for static vs. shared libtermcap (like
currently with environ) it will disable  modules (note, that on Cygwin environ
check is explicitly disabled as it is misleading there). What is worse modules
will be disabled on all systems that have static termcap/curses, and that are
possibly many SVR4-derivates, mine including :-) Having termcap/terminfo as
separate modules hardly justifies this.

- the problem is not limited to Cygwin (obviously). Depending of used terminal
library program may crash, echotc may not track terminal changes or everything
may be O.K. You cannot tell in advance, sigh.

- finally, having the whole terminal related code in main zsh and moving just
a single builtin in seperate module looks funny.

what we can do know is

- add wrappers for tgetent & Co. and add note to zsh-development-guide that
people should not use original functions.

- move termcap (and terminfo) back into main zsh.

Somehow I'm inclined to the latter.

cheers

-andrej


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: termcap moodule problem on Cygwin
  2001-01-30  8:25   ` Andrej Borsenkow
@ 2001-01-30 10:34     ` Peter Stephenson
  2001-01-31  8:50       ` Somebody with gcc knowledge here? (Was: termcap moodule problem on Cygwin ) Andrej Borsenkow
  2001-01-31 10:37       ` PATCH: RE: termcap moodule problem on Cygwin Andrej Borsenkow
  0 siblings, 2 replies; 12+ messages in thread
From: Peter Stephenson @ 2001-01-30 10:34 UTC (permalink / raw)
  To: Zsh hackers list

> - move termcap (and terminfo) back into main zsh.

You could force it to be statically linked by changing the `link' line to
test for cygwin in termcap.mdd.  See existing `link=' in terminfo.mdd for
how this works.  You can make this depend on a configure test for whether
termcap is static.

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Somebody with gcc knowledge here? (Was:  termcap moodule problem on Cygwin )
  2001-01-30 10:34     ` Peter Stephenson
@ 2001-01-31  8:50       ` Andrej Borsenkow
  2001-01-31 10:37       ` PATCH: RE: termcap moodule problem on Cygwin Andrej Borsenkow
  1 sibling, 0 replies; 12+ messages in thread
From: Andrej Borsenkow @ 2001-01-31  8:50 UTC (permalink / raw)
  To: Zsh hackers list


> > - move termcap (and terminfo) back into main zsh.
>
> You could force it to be statically linked by changing the `link' line to
> test for cygwin in termcap.mdd.  See existing `link=' in terminfo.mdd for
> how this works.  You can make this depend on a configure test for whether
> termcap is static.
>

Of course, I am idiot. Even more so as I cannot build zsh with static termcap:

dllwrap -g  --export-all-symbols -o libzsh-3.1.9-dev-8.dll  `cat
stamp-modobjs`
-ltermcap -lm -lc
dllwrap: no export definition file provided
dllwrap: creating one, but that may not be what you want
Modules/termcap.o(.text+0x318): multiple definition of `setup_zshQstermcap'
Modules/termcap.o(.text+0x318): first defined here
Modules/termcap.o(.text+0x324): multiple definition of `boot_zshQstermcap'
Modules/termcap.o(.text+0x324): first defined here
Modules/termcap.o(.text+0x354): multiple definition of `cleanup_zshQstermcap'
Modules/termcap.o(.text+0x354): first defined here
Modules/termcap.o(.text+0x37c): multiple definition of `finish_zshQstermcap'
Modules/termcap.o(.text+0x37c): first defined here
collect2: ld returned 1 exit status

This happens with both dllwrap and gcc; I do not understand the error message
at all.

It does not happen when building static zsh.

Anybody have some insight on what these errors mean?

-andrej


^ permalink raw reply	[flat|nested] 12+ messages in thread

* PATCH: RE: termcap moodule problem on Cygwin
  2001-01-30 10:34     ` Peter Stephenson
  2001-01-31  8:50       ` Somebody with gcc knowledge here? (Was: termcap moodule problem on Cygwin ) Andrej Borsenkow
@ 2001-01-31 10:37       ` Andrej Borsenkow
  2001-01-31 11:30         ` Peter Stephenson
  1 sibling, 1 reply; 12+ messages in thread
From: Andrej Borsenkow @ 2001-01-31 10:37 UTC (permalink / raw)
  To: Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 731 bytes --]

>
> You could force it to be statically linked by changing the `link' line to
> test for cygwin in termcap.mdd.  See existing `link=' in terminfo.mdd for
> how this works.  You can make this depend on a configure test for whether
> termcap is static.
>

This implements the latter. On two systems with static termcap/terminfo both
are now compiled into main executable.

I do not have any system with shared term library. I could try using ncurses
on Cygwin, but zsh unconditionally includes termcap.h and it is incompatible
with ncurses. Please, check with shared termcap if both modules are still
built as shared :)

I am fairly sure that check in current form does not work correctly on Cygwin
(due to stab libraries).

-andrej

[-- Attachment #2: zsh.termcap.diff --]
[-- Type: application/octet-stream, Size: 7711 bytes --]

Index: aczsh.m4
===================================================================
RCS file: /cvsroot/zsh/zsh/aczsh.m4,v
retrieving revision 1.6
diff -u -r1.6 aczsh.m4
--- aczsh.m4	2000/10/11 12:26:13	1.6
+++ aczsh.m4	2001/01/31 10:32:38
@@ -111,28 +111,30 @@
 
 
 dnl
-dnl zsh_SYS_DYNAMIC_BROKEN
-dnl   Check whether static/shared library linking is broken.
+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(ident,type)
+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;
+	extern $2 **$1;
 	void *symlist1[[]] = {
-		(void *)&environ,
+		(void *)&$1,
 		(void *)0
 	};
 ' > conftest1.c
@@ -185,12 +187,12 @@
 	    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
 ])
 ])
Index: configure.in
===================================================================
RCS file: /cvsroot/zsh/zsh/configure.in,v
retrieving revision 1.39
diff -u -r1.39 configure.in
--- configure.in	2001/01/19 14:47:44	1.39
+++ configure.in	2001/01/31 10:32:39
@@ -557,37 +557,6 @@
   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 +814,40 @@
 	       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 +1471,10 @@
   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 +1619,15 @@
 fi
 
 if test "x$dynamic" = xyes; then
-  zsh_SYS_DYNAMIC_BROKEN
-  test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
+  zsh_SHARED_SYMBOL([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_SYMBOL([tgetent], [(void (*)())])
+  fi
+  if test "$ac_cv_func_tigetstr" = yes; then
+    zsh_SHARED_SYMBOL([tigetstr], [(void (*)())])
+  fi
 fi
 
 if test "x$dynamic" = xyes; then
Index: Src/Modules/termcap.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/termcap.c,v
retrieving revision 1.1
diff -u -r1.1 termcap.c
--- Src/Modules/termcap.c	2000/12/03 20:53:25	1.1
+++ Src/Modules/termcap.c	2001/01/31 10:32:40
@@ -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;
Index: Src/Modules/termcap.mdd
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/termcap.mdd,v
retrieving revision 1.1
diff -u -r1.1 termcap.mdd
--- Src/Modules/termcap.mdd	2000/12/03 20:53:25	1.1
+++ Src/Modules/termcap.mdd	2001/01/31 10:32:40
@@ -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"
Index: Src/Modules/terminfo.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/terminfo.c,v
retrieving revision 1.4
diff -u -r1.4 terminfo.c
--- Src/Modules/terminfo.c	2000/12/06 01:16:15	1.4
+++ Src/Modules/terminfo.c	2001/01/31 10:32:40
@@ -36,7 +36,7 @@
 /* echoti: output a terminfo capability */
 
 /**/
-int
+static int
 bin_echoti(char *name, char **argv, char *ops, int func)
 {
     char *s, *t;
Index: Src/Modules/terminfo.mdd
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/terminfo.mdd,v
retrieving revision 1.3
diff -u -r1.3 terminfo.mdd
--- Src/Modules/terminfo.mdd	2000/12/05 11:00:09	1.3
+++ Src/Modules/terminfo.mdd	2001/01/31 10:32:40
@@ -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"

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: PATCH: RE: termcap moodule problem on Cygwin
  2001-01-31 10:37       ` PATCH: RE: termcap moodule problem on Cygwin Andrej Borsenkow
@ 2001-01-31 11:30         ` Peter Stephenson
  2001-01-31 12:42           ` Andrej Borsenkow
  0 siblings, 1 reply; 12+ messages in thread
From: Peter Stephenson @ 2001-01-31 11:30 UTC (permalink / raw)
  To: Zsh hackers list

> This implements the latter. On two systems with static termcap/terminfo both
> are now compiled into main executable.

This turns the linking on SunOS 5.6 from dynamic to static for the two
modules.  It was working OK before with dynamic.  However, the curses
library which is linked in does appear to be static.  On the other hand,
our new server with SunOS 5.8 appears to have a dynamic curses library, but
the test still fails, although:
  % nm /lib/libcurses.so | grep tgetent
  [1176]  |     95876|      52|FUNC |GLOB |0    |9      |tgetent
The libraries used are `-lsocket -ldl -lnsl -lcurses -lm -lc'.

Does anyone have any evidence of termcap still being linked in dynamically
with the patch in place?  I can't promise I'll get a chance to look at
what's happening immediately.

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: PATCH: RE: termcap moodule problem on Cygwin
  2001-01-31 11:30         ` Peter Stephenson
@ 2001-01-31 12:42           ` Andrej Borsenkow
  2001-01-31 13:49             ` Peter Stephenson
  0 siblings, 1 reply; 12+ messages in thread
From: Andrej Borsenkow @ 2001-01-31 12:42 UTC (permalink / raw)
  To: Zsh hackers list

>
> This turns the linking on SunOS 5.6 from dynamic to static for the two
> modules.  It was working OK before with dynamic.  However, the curses
> library which is linked in does appear to be static.  On the other hand,
> our new server with SunOS 5.8 appears to have a dynamic curses library, but
> the test still fails, although:
>   % nm /lib/libcurses.so | grep tgetent
>   [1176]  |     95876|      52|FUNC |GLOB |0    |9      |tgetent
> The libraries used are `-lsocket -ldl -lnsl -lcurses -lm -lc'.
>

Yes, test was broken, sorry. Try this patch (on top of previous).

The situation looks a bit more complicated. On my system name resolution in
shared modules happens at runtime (unless you override it) so all modules pick
up just one copy of curses library linked into main executable. Cool.

-andrej

--- aczsh.m4.old        Wed Jan 31 13:31:38 2001
+++ aczsh.m4    Wed Jan 31 15:31:46 2001
@@ -111,6 +111,38 @@


 dnl
+dnl zsh_SHARED_FUNCTION
+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
+dnl Usage: zsh_SHARED_FUNCTION(name)
+dnl Sets zsh_cv_shared_$1 cache variable to yes/no
+dnl
+
+AC_DEFUN(zsh_SHARED_FUNCTION,
+[zsh_SHARED_SYMBOL($1, [char *$1()], [$1])])
+
+dnl
+dnl zsh_SHARED_VARIABLE
+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
+dnl Usage: zsh_SHARED_VARIABLE(name,type)
+dnl Sets zsh_cv_shared_$1 cache variable to yes/no
+dnl
+
+AC_DEFUN(zsh_SHARED_VARIABLE,
+[zsh_SHARED_SYMBOL($1, [ $2 $1], [&$1])])
+
+dnl
 dnl zsh_SHARED_SYMBOL
 dnl   Check whether symbol is available in static or shared library
 dnl
@@ -119,7 +151,7 @@
 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
-dnl Usage: zsh_SHARED_SYMBOL(ident,type)
+dnl Usage: zsh_SHARED_SYMBOL(name,declaration)
 dnl Sets zsh_cv_shared_$1 cache variable to yes/no
 dnl

@@ -132,9 +164,12 @@
     us=
 fi
 echo '
-       extern $2 **$1;
-       void *symlist1[[]] = {
-               (void *)&$1,
+#ifdef __CYGWIN__
+       __attribute__((__dllimport__))
+#endif
+       extern $2;
+       void *symlist[[]] = {
+               (void *)$3,
                (void *)0
        };
 ' > conftest1.c
@@ -179,8 +214,8 @@
     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");
+    symlist1 = (void **) dlsym(handle1, "${us}symlist");
+    symlist2 = (void **) dlsym(handle2, "${us}symlist");
     if(!symlist1 || !symlist2) exit(1);
     for(; *symlist1; symlist1++, symlist2++)
        if(*symlist1 != *symlist2)
bor@itsrm2% gdiff -u configure.in.old configure.in
--- configure.in.old    Wed Jan 31 14:45:05 2001
+++ configure.in        Wed Jan 31 15:32:05 2001
@@ -1619,17 +1619,16 @@
 fi

 if test "x$dynamic" = xyes; then
-  zsh_SHARED_SYMBOL([environ], [char **])
+  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_SYMBOL([tgetent], [(void (*)())])
+    zsh_SHARED_FUNCTION([tgetent])
   fi
   if test "$ac_cv_func_tigetstr" = yes; then
-    zsh_SHARED_SYMBOL([tigetstr], [(void (*)())])
+    zsh_SHARED_FUNCTION([tigetstr])
   fi
 fi
-    zsh_SHARED_SYMBOL([socket], [(void (*)())])

 if test "x$dynamic" = xyes; then
   zsh_SYS_DYNAMIC_CLASH


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: PATCH: RE: termcap moodule problem on Cygwin
  2001-01-31 12:42           ` Andrej Borsenkow
@ 2001-01-31 13:49             ` Peter Stephenson
  2001-02-05 15:31               ` Andrej Borsenkow
  0 siblings, 1 reply; 12+ messages in thread
From: Peter Stephenson @ 2001-01-31 13:49 UTC (permalink / raw)
  To: Zsh hackers list

> Yes, test was broken, sorry. Try this patch (on top of previous).

That's fine, both libraries are now dynamically linked on both versions of
Solaris, which is what was happening before the patch.

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: PATCH: RE: termcap moodule problem on Cygwin
  2001-01-31 13:49             ` Peter Stephenson
@ 2001-02-05 15:31               ` Andrej Borsenkow
  2001-02-13 14:36                 ` Andrej Borsenkow
  0 siblings, 1 reply; 12+ messages in thread
From: Andrej Borsenkow @ 2001-02-05 15:31 UTC (permalink / raw)
  To: Peter Stephenson, Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 1062 bytes --]

>
>
> > Yes, test was broken, sorry. Try this patch (on top of previous).
>
> That's fine, both libraries are now dynamically linked on both versions of
> Solaris, which is what was happening before the patch.
>

O.K., hopefully the last version. Now it really works for Cygwin, both shared
and static libs. I tested it with:

- Unix, pseudo-shared (see below) static curses
- Cygwin, static termcap
- Cygwin, shared ncurses

So, remaining case is Unix with real shared library and possibly Unix with
bad-behaving static library.

Solaris 2.6 and my system both provide pseudo-shared implementation - static
symbols are linked into every shared object, but references to them are
resolved at runtime and point to the single copy of static symbol. It has one
possible drawback - if shared object that owns this static symbol is unloaded,
references are no more valid. So far, my system seems to correctly keep
reference count. It depends on coimpiler options (I can force local binding).
So I added test for this case as well - dunno if it really helps.

-andrej

[-- Attachment #2: zsh.termcap.diff --]
[-- Type: application/octet-stream, Size: 10217 bytes --]

Index: aczsh.m4
===================================================================
RCS file: /cvsroot/zsh/zsh/aczsh.m4,v
retrieving revision 1.6
diff -u -r1.6 aczsh.m4
--- aczsh.m4	2000/10/11 12:26:13	1.6
+++ aczsh.m4	2001/02/05 15:24:13
@@ -111,32 +111,59 @@
 
 
 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 @@
 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
 ])
 ])
Index: configure.in
===================================================================
RCS file: /cvsroot/zsh/zsh/configure.in,v
retrieving revision 1.39
diff -u -r1.39 configure.in
--- configure.in	2001/01/19 14:47:44	1.39
+++ configure.in	2001/02/05 15:24:14
@@ -493,7 +493,9 @@
 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 @@
   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 @@
 	       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 @@
   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 @@
 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
Index: Src/Modules/termcap.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/termcap.c,v
retrieving revision 1.1
diff -u -r1.1 termcap.c
--- Src/Modules/termcap.c	2000/12/03 20:53:25	1.1
+++ Src/Modules/termcap.c	2001/02/05 15:24:16
@@ -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;
Index: Src/Modules/termcap.mdd
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/termcap.mdd,v
retrieving revision 1.1
diff -u -r1.1 termcap.mdd
--- Src/Modules/termcap.mdd	2000/12/03 20:53:25	1.1
+++ Src/Modules/termcap.mdd	2001/02/05 15:24:16
@@ -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"
Index: Src/Modules/terminfo.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/terminfo.c,v
retrieving revision 1.4
diff -u -r1.4 terminfo.c
--- Src/Modules/terminfo.c	2000/12/06 01:16:15	1.4
+++ Src/Modules/terminfo.c	2001/02/05 15:24:16
@@ -36,7 +36,7 @@
 /* echoti: output a terminfo capability */
 
 /**/
-int
+static int
 bin_echoti(char *name, char **argv, char *ops, int func)
 {
     char *s, *t;
Index: Src/Modules/terminfo.mdd
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/terminfo.mdd,v
retrieving revision 1.3
diff -u -r1.3 terminfo.mdd
--- Src/Modules/terminfo.mdd	2000/12/05 11:00:09	1.3
+++ Src/Modules/terminfo.mdd	2001/02/05 15:24:16
@@ -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"

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: PATCH: RE: termcap moodule problem on Cygwin
  2001-02-05 15:31               ` Andrej Borsenkow
@ 2001-02-13 14:36                 ` Andrej Borsenkow
  0 siblings, 0 replies; 12+ messages in thread
From: Andrej Borsenkow @ 2001-02-13 14:36 UTC (permalink / raw)
  To: Zsh hackers list

> 
> O.K., hopefully the last version. 

Nobody answered and it works fine here so I've committed it (13431)

-andrej


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2001-02-13 14:36 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-01-29 14:55 termcap moodule problem on Cygwin Andrej Borsenkow
2001-01-29 15:10 ` Peter Stephenson
2001-01-30  8:25   ` Andrej Borsenkow
2001-01-30 10:34     ` Peter Stephenson
2001-01-31  8:50       ` Somebody with gcc knowledge here? (Was: termcap moodule problem on Cygwin ) Andrej Borsenkow
2001-01-31 10:37       ` PATCH: RE: termcap moodule problem on Cygwin Andrej Borsenkow
2001-01-31 11:30         ` Peter Stephenson
2001-01-31 12:42           ` Andrej Borsenkow
2001-01-31 13:49             ` Peter Stephenson
2001-02-05 15:31               ` Andrej Borsenkow
2001-02-13 14:36                 ` Andrej Borsenkow
2001-01-29 16:48 ` Zefram

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).