zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: dynamic loading on AIX
@ 1998-05-06  6:46 Zoltan Hidvegi
  1998-05-06  8:55 ` Andrew Main
  1998-05-08 12:59 ` PATCH: more " pws
  0 siblings, 2 replies; 5+ messages in thread
From: Zoltan Hidvegi @ 1998-05-06  6:46 UTC (permalink / raw)
  To: Zsh hacking and development

The patch below implements dynamic loading on AIX.  AIX 4.1 and older
versions do not support the dlopen/dlsym interface.  Instead each object
has an export and an import list.  The export list contains the list of
symbols which is provided by the object for use by subsequently loaded
dynamic modules.

AIX 4.2 has dlopen/dlsym, the patch below adds wupport for that too,
however it may still be desirable and more efficient to use the old
dynamic loading even on 4.2, since looking at the manual the 4.2 dlopen
support looks like a hack on the top of the 4.1 mechanism.  You can
achieve that by exporting ac_cv_lib_dl_dlopen=no before running
configure.

Remenber that due to a bug in 3.1.3, you must run configure with
ARGV0=sh zsh configure

The setterm, refresh and cs external symbols had a conflict with the AIX
C library or with the curses library so they were renamed to zsetterm,
zrefresh and zshcs respectively.  `cs' was not changes in the source
files, instead cs is #defined to zshcs in system.h.  It also #defined ll
just for consistency, since cs and ll are usually used together.  I chose
the #define solution since cs is used too many places.

Each module which is listed as a dependency for an other module must have
an export file called modulename.export in the same directory where the
.mdd file is.  Such modules must set hasexport on the .mdd file.  The
export file is not generated automatically.  It is possible to
autogenerate export files from the .pro files, and I do have a script
which does that, but that creates an export file with 636 symbols for zsh
and 282 symbols for zle, which the current modules use only 233 symbols
from zsh.export and 8 symbols from zle.export.  Making the export list
smaller speeds up loading, reduces memory usage and reduces the risk or
name collisions.

An other way to automatically create export files is to parse the linker
output.  The linker lists the undefined symbols, which then can be added
to the appropriate export list.  This whould only create the minimally
needed export list, but this is much harder to automate.  I got the
provided export files by manually editing the linker output of undefined
symbols.

The zsh.export file contains tgoto anf tputs, which are coming from
curses.  These are the only curses functions used by zle, and this way it
is not necessary to link zle.so with -lcurses

There is a new little C file in the Src directory called modentry.c which
is used to create modentry..o which is then linked to every dynamic zsh
module created on AIX.  modentry..o contains the entry point for the
module modentry(int, Module).  Since we do not have dlsym, modentry is
used to call the boot_/cleanup_ function.  The first argument is nonzero
for boot and zero for cleanup.  Each module is linked with -emodentry.
When the module loads, the load subroutine returns a function pointer to
modentry.  modentry is not exported by any module so there is no name
collision.

Zoli

*** Config/defs.mk.orig	Sat May  2 03:45:36 1998
--- Config/defs.mk	Sun May  3 19:22:45 1998
***************
*** 60,65 ****
--- 60,67 ----
  LIBS            = @LIBS@
  DL_EXT          = @DL_EXT@
  DLLD            = @DLLD@
+ EXPOPT          = @EXPOPT@
+ IMPOPT          = @IMPOPT@
  
  # utilities
  AWK             = @AWK@
*** Src/Makefile.in.orig	Sat May  2 03:45:37 1998
--- Src/Makefile.in	Tue May  5 01:40:43 1998
***************
*** 54,65 ****
  LIBZSH = libzsh-$(VERSION).so
  NIBZSH =
  
  LDRUNPATH = LD_RUN_PATH=$(libdir)/zsh
  NDRUNPATH =
  
  zsh: $(@L@IBZSH) $(@L@STMP) $(MAIN_OBJS)
  	rm -f $@
! 	$(@L@DRUNPATH) $(LINK) $(MAIN_OBJS) $(@L@LIST) $(@L@IBZSH) $(LIBS)
  
  $(LIBZSH): $(LIBOBJS) $(NSTMP)
  	rm -f $@
--- 54,70 ----
  LIBZSH = libzsh-$(VERSION).so
  NIBZSH =
  
+ ZSH_EXPORT = $(EXPOPT)$(sdir)/zsh.export
+ ZSH_NXPORT =
+ ENTRYOBJ   = modentry..o
+ NNTRYOBJ   =
+ 
  LDRUNPATH = LD_RUN_PATH=$(libdir)/zsh
  NDRUNPATH =
  
  zsh: $(@L@IBZSH) $(@L@STMP) $(MAIN_OBJS)
  	rm -f $@
! 	$(@L@DRUNPATH) $(LINK) $(MAIN_OBJS) $(@L@LIST) $(ZSH_@E@XPORT) $(@L@IBZSH) $(LIBS)
  
  $(LIBZSH): $(LIBOBJS) $(NSTMP)
  	rm -f $@
***************
*** 112,117 ****
--- 117,127 ----
  	else \
  	    echo > $@; \
  	fi
+ 
+ modules: $(@E@NTRYOBJ)
+ 
+ $(ENTRYOBJ): FORCE
+ 	@$(MAKE) -f Makemod $(MAKEDEFS) $@
  
  # ========== ANSI TO K&R CONVERSION ==========
  
*** Src/Zle/comp1.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/comp1.c	Sun May  3 03:53:02 1998
***************
*** 167,173 ****
  }
  
  /**/
! int
  compctlread(char *name, char **args, char *ops, char *reply)
  {
      char *buf, *bptr;
--- 167,173 ----
  }
  
  /**/
! static int
  compctlread(char *name, char **args, char *ops, char *reply)
  {
      char *buf, *bptr;
*** Src/Zle/comp1.export.orig	Sun May  3 20:09:42 1998
--- Src/Zle/comp1.export	Tue May  5 01:40:43 1998
***************
*** 0 ****
--- 1,13 ----
+ #!
+ cc_compos
+ cc_default
+ cc_dummy
+ cc_first
+ clwnum
+ clwords
+ clwpos
+ clwsize
+ compctltab
+ freecompcond
+ freecompctl
+ incompctlfunc
*** Src/Zle/comp1.mdd.orig	Sat May  2 03:40:55 1998
--- Src/Zle/comp1.mdd	Sun May  3 20:02:57 1998
***************
*** 1,3 ****
--- 1,5 ----
+ hasexport=1
+ 
  objects="comp1.o"
  
  headers="comp.h"
*** Src/Zle/zle.export.orig	Sun May  3 20:10:03 1998
--- Src/Zle/zle.export	Tue May  5 01:40:43 1998
***************
*** 0 ****
--- 1,8 ----
+ #!
+ addzlefunction
+ backdel
+ deletezlefunction
+ feep
+ foredel
+ getkey
+ zmod
*** Src/Zle/zle.h.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle.h	Sat May  2 03:47:05 1998
***************
*** 31,37 ****
  #undef zleread
  #undef spaceinline
  #undef gotword
! #undef refresh
  
  typedef struct widget *Widget;
  typedef struct thingy *Thingy;
--- 31,37 ----
  #undef zleread
  #undef spaceinline
  #undef gotword
! #undef zrefresh
  
  typedef struct widget *Widget;
  typedef struct thingy *Thingy;
*** Src/Zle/zle.mdd.orig	Sat May  2 03:40:55 1998
--- Src/Zle/zle.mdd	Sun May  3 20:02:35 1998
***************
*** 1,3 ****
--- 1,5 ----
+ hasexport=1
+ 
  moddeps="comp1"
  
  autobins="bindkey vared zle"
*** Src/Zle/zle_hist.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_hist.c	Sat May  2 03:47:05 1998
***************
*** 781,787 ****
  	sbuf[sbptr] = '_';
  	statusll = sbuf - statusline + sbptr + 1;
      ref:
! 	refresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    int i;
  	    get_isrch_spot(0, &hl, &pos, &i, &sbptr, &dir, &nomatch);
--- 781,787 ----
  	sbuf[sbptr] = '_';
  	statusll = sbuf - statusline + sbptr + 1;
      ref:
! 	zrefresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    int i;
  	    get_isrch_spot(0, &hl, &pos, &i, &sbptr, &dir, &nomatch);
***************
*** 869,875 ****
  	    	cmd == Th(z_quotedinsert)) {
  	    if(cmd == Th(z_viquotedinsert)) {
  		sbuf[sbptr] = '^';
! 		refresh();
  	    }
  	    if ((c = getkey(0)) == EOF)
  		feep();
--- 869,875 ----
  	    	cmd == Th(z_quotedinsert)) {
  	    if(cmd == Th(z_viquotedinsert)) {
  		sbuf[sbptr] = '^';
! 		zrefresh();
  	    }
  	    if ((c = getkey(0)) == EOF)
  		feep();
***************
*** 996,1002 ****
      while (sptr) {
  	sbuf[sptr] = '_';
  	statusll = sptr + 1;
! 	refresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    ret = 0;
  	    break;
--- 996,1002 ----
      while (sptr) {
  	sbuf[sptr] = '_';
  	statusll = sptr + 1;
! 	zrefresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    ret = 0;
  	    break;
***************
*** 1031,1037 ****
  	} else if(cmd == Th(z_viquotedinsert) || cmd == Th(z_quotedinsert)) {
  	    if(cmd == Th(z_viquotedinsert)) {
  		sbuf[sptr] = '^';
! 		refresh();
  	    }
  	    if ((c = getkey(0)) == EOF)
  		feep();
--- 1031,1037 ----
  	} else if(cmd == Th(z_viquotedinsert) || cmd == Th(z_quotedinsert)) {
  	    if(cmd == Th(z_viquotedinsert)) {
  		sbuf[sptr] = '^';
! 		zrefresh();
  	    }
  	    if ((c = getkey(0)) == EOF)
  		feep();
*** Src/Zle/zle_main.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_main.c	Sat May  2 03:47:05 1998
***************
*** 112,118 ****
  
  /**/
  void
! setterm(void)
  {
      struct ttyinfo ti;
  
--- 112,118 ----
  
  /**/
  void
! zsetterm(void)
  {
      struct ttyinfo ti;
  
***************
*** 363,369 ****
  		ret = opts[MONITOR];
  		opts[MONITOR] = 1;
  		attachtty(mypgrp);
! 		refresh();	/* kludge! */
  		opts[MONITOR] = ret;
  		die = 1;
  	    } else if (errno != 0) {
--- 363,369 ----
  		ret = opts[MONITOR];
  		opts[MONITOR] = 1;
  		attachtty(mypgrp);
! 		zrefresh();	/* kludge! */
  		opts[MONITOR] = ret;
  		die = 1;
  	    } else if (errno != 0) {
***************
*** 373,379 ****
  	    }
  	}
  	if (cc == '\r')		/* undo the exchange of \n and \r determined by */
! 	    cc = '\n';		/* setterm() */
  	else if (cc == '\n')
  	    cc = '\r';
  
--- 373,379 ----
  	    }
  	}
  	if (cc == '\r')		/* undo the exchange of \n and \r determined by */
! 	    cc = '\n';		/* zsetterm() */
  	else if (cc == '\n')
  	    cc = '\r';
  
***************
*** 486,492 ****
  	initmodifier(&zmod);
  	prefixflag = 0;
  	feepflag = 0;
! 	refresh();
  	while (!done && !errflag) {
  
  	    statusline = NULL;
--- 486,492 ----
  	initmodifier(&zmod);
  	prefixflag = 0;
  	feepflag = 0;
! 	zrefresh();
  	while (!done && !errflag) {
  
  	    statusline = NULL;
***************
*** 517,527 ****
  		    tv.tv_usec = 500000;
  		if (!kungetct && select(SHTTY+1, (SELECT_ARG_2_T) & foofd,
  					NULL, NULL, &tv) <= 0)
! 		    refresh();
  	    } else
  #endif
  		if (!kungetct)
! 		    refresh();
  	    handlefeep();
  	}
  	statusline = NULL;
--- 517,527 ----
  		    tv.tv_usec = 500000;
  		if (!kungetct && select(SHTTY+1, (SELECT_ARG_2_T) & foofd,
  					NULL, NULL, &tv) <= 0)
! 		    zrefresh();
  	    } else
  #endif
  		if (!kungetct)
! 		    zrefresh();
  	    handlefeep();
  	}
  	statusline = NULL;
***************
*** 744,750 ****
  	return;
      statusline = "Describe key briefly: _";
      statusll = strlen(statusline);
!     refresh();
      seq = getkeymapcmd(curkeymap, &func, &str);
      statusline = NULL;
      if(!*seq)
--- 744,750 ----
  	return;
      statusline = "Describe key briefly: _";
      statusll = strlen(statusline);
!     zrefresh();
      seq = getkeymapcmd(curkeymap, &func, &str);
      statusline = NULL;
      if(!*seq)
***************
*** 812,825 ****
  trashzle(void)
  {
      if (zleactive) {
! 	/* This refresh() is just to get the main editor display right and *
! 	 * get the cursor in the right place.  For that reason, we disable *
! 	 * list display (which would otherwise result in infinite          *
! 	 * recursion [at least, it would if refresh() didn't have its      *
! 	 * extra `inlist' check]).                                         */
  	int sl = showinglist;
  	showinglist = 0;
! 	refresh();
  	showinglist = sl;
  	moveto(nlnct, 0);
  	if (clearflag && tccan(TCCLEAREOD)) {
--- 812,825 ----
  trashzle(void)
  {
      if (zleactive) {
! 	/* This zrefresh() is just to get the main editor display right and *
! 	 * get the cursor in the right place.  For that reason, we disable  *
! 	 * list display (which would otherwise result in infinite           *
! 	 * recursion [at least, it would if zrefresh() didn't have its      *
! 	 * extra `inlist' check]).                                          */
  	int sl = showinglist;
  	showinglist = 0;
! 	zrefresh();
  	showinglist = sl;
  	moveto(nlnct, 0);
  	if (clearflag && tccan(TCCLEAREOD)) {
***************
*** 849,855 ****
      /* Set up editor entry points */
      trashzleptr = trashzle;
      gotwordptr = gotword;
!     refreshptr = refresh;
      spaceinlineptr = spaceinline;
      zlereadptr = zleread;
  
--- 849,855 ----
      /* Set up editor entry points */
      trashzleptr = trashzle;
      gotwordptr = gotword;
!     refreshptr = zrefresh;
      spaceinlineptr = spaceinline;
      zlereadptr = zleread;
  
*** Src/Zle/zle_misc.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_misc.c	Sat May  2 03:47:05 1998
***************
*** 426,432 ****
  #endif
      c = getkey(0);
  #ifndef HAS_TIO
!     setterm();
  #endif
      if (c < 0)
  	feep();
--- 426,432 ----
  #endif
      c = getkey(0);
  #ifndef HAS_TIO
!     zsetterm();
  #endif
      if (c < 0)
  	feep();
***************
*** 599,605 ****
      for (;;) {
  	*ptr = '_';
  	statusll = l + len + 1;
! 	refresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    statusline = NULL;
  	    selectkeymap(okeymap, 1);
--- 599,605 ----
      for (;;) {
  	*ptr = '_';
  	statusll = l + len + 1;
! 	zrefresh();
  	if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) {
  	    statusline = NULL;
  	    selectkeymap(okeymap, 1);
***************
*** 611,617 ****
  	    redisplay();
  	} else if(cmd == Th(z_viquotedinsert)) {
  	    *ptr = '^';
! 	    refresh();
  	    c = getkey(0);
  	    if(c == EOF || !c || len == NAMLEN)
  		feep();
--- 611,617 ----
  	    redisplay();
  	} else if(cmd == Th(z_viquotedinsert)) {
  	    *ptr = '^';
! 	    zrefresh();
  	    c = getkey(0);
  	    if(c == EOF || !c || len == NAMLEN)
  		feep();
*** Src/Zle/zle_refresh.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_refresh.c	Sat May  2 03:47:05 1998
***************
*** 47,53 ****
  
  /* Most lines of the buffer we've shown at once with the current list *
   * showing.  == 0 if there is no list.  == -1 if a new list has just  *
!  * been put on the screen.  == -2 if refresh() needs to put up a new  *
   * list.                                                              */
  
  /**/
--- 47,53 ----
  
  /* Most lines of the buffer we've shown at once with the current list *
   * showing.  == 0 if there is no list.  == -1 if a new list has just  *
!  * been put on the screen.  == -2 if zrefresh() needs to put up a new *
   * list.                                                              */
  
  /**/
***************
*** 55,61 ****
  
  /* Non-zero if ALWAYS_LAST_PROMPT has been used, meaning that the *
   * screen below the buffer display should not be cleared by       *
!  * refresh(), but should be by trashzle().                        */
  
  /**/
  int clearflag;
--- 55,61 ----
  
  /* Non-zero if ALWAYS_LAST_PROMPT has been used, meaning that the *
   * screen below the buffer display should not be cleared by       *
!  * zrefresh(), but should be by trashzle().                       */
  
  /**/
  int clearflag;
***************
*** 75,81 ****
  #endif
  
  /* Oct/Nov 94: <mason> some code savagely redesigned to fix several bugs -
!    refreshline() & tc_rightcurs() majorly rewritten; refresh() fixed -
     I've put my fingers into just about every routine in here -
     any queries about updates to mason@werple.net.au */
  
--- 75,81 ----
  #endif
  
  /* Oct/Nov 94: <mason> some code savagely redesigned to fix several bugs -
!    refreshline() & tc_rightcurs() majorly rewritten; zrefresh() fixed -
     I've put my fingers into just about every routine in here -
     any queries about updates to mason@werple.net.au */
  
***************
*** 224,230 ****
  
  /**/
  void
! refresh(void)
  {
      static int inlist;		/* avoiding recursion                        */
      int canscroll = 0,		/* number of lines we are allowed to scroll  */
--- 224,230 ----
  
  /**/
  void
! zrefresh(void)
  {
      static int inlist;		/* avoiding recursion                        */
      int canscroll = 0,		/* number of lines we are allowed to scroll  */
***************
*** 240,246 ****
      char **qbuf;		/* tmp					     */
  
      /* If this is called from listmatches() (indirectly via trashzle()), and *
!      * that was called from the end of refresh(), then we don't need to do   *
       * anything.  All this `inlist' code is actually unnecessary, but it     *
       * improves speed a little in a common case.                             */
      if (inlist)
--- 240,246 ----
      char **qbuf;		/* tmp					     */
  
      /* If this is called from listmatches() (indirectly via trashzle()), and *
!      * that was called from the end of zrefresh(), then we don't need to do  *
       * anything.  All this `inlist' code is actually unnecessary, but it     *
       * improves speed a little in a common case.                             */
      if (inlist)
***************
*** 263,269 ****
  	termflags &= ~TERM_SHORT;
      if (resetneeded) {
  	onumscrolls = 0;
! 	setterm();
  #ifdef TIOCGWINSZ
  	if (winchanged) {
  	    moveto(0, 0);
--- 263,269 ----
  	termflags &= ~TERM_SHORT;
      if (resetneeded) {
  	onumscrolls = 0;
! 	zsetterm();
  #ifdef TIOCGWINSZ
  	if (winchanged) {
  	    moveto(0, 0);
***************
*** 547,553 ****
  	inlist = 1;
  	listmatches();
  	inlist = 0;
! 	refresh();
      }
      if (showinglist == -1)
  	showinglist = nlnct;
--- 547,553 ----
  	inlist = 1;
  	listmatches();
  	inlist = 0;
! 	zrefresh();
      }
      if (showinglist == -1)
  	showinglist = nlnct;
*** Src/Zle/zle_tricky.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_tricky.c	Sat May  2 03:47:05 1998
***************
*** 3676,3682 ****
      /* Maybe we have to ask if the user wants to see the list. */
      if ((listmax && ct > listmax) || (!listmax && up >= lines)) {
  	int qup;
! 	setterm();
  	qup = printfmt("zsh: do you wish to see all %n possibilities? ", ct, 1);
  	fflush(shout);
  	if (getzlequery() != 'y') {
--- 3676,3682 ----
      /* Maybe we have to ask if the user wants to see the list. */
      if ((listmax && ct > listmax) || (!listmax && up >= lines)) {
  	int qup;
! 	zsetterm();
  	qup = printfmt("zsh: do you wish to see all %n possibilities? ", ct, 1);
  	fflush(shout);
  	if (getzlequery() != 'y') {
*** Src/Zle/zle_vi.c.orig	Sat May  2 03:45:37 1998
--- Src/Zle/zle_vi.c	Sat May  2 03:47:05 1998
***************
*** 126,132 ****
  	char sav = line[cs];
  
  	line[cs] = '^';
! 	refresh();
  	c = getkey(0);
  	line[cs] = sav;
  	if(c == EOF) {
--- 126,132 ----
  	char sav = line[cs];
  
  	line[cs] = '^';
! 	zrefresh();
  	c = getkey(0);
  	line[cs] = sav;
  	if(c == EOF) {
***************
*** 817,823 ****
      beep();
      statusline = "press a lowercase key to continue";
      statusll = strlen(statusline);
!     refresh();
      while (!islower(getkey(0)));
      statusline = NULL;
  }
--- 817,823 ----
      beep();
      statusline = "press a lowercase key to continue";
      statusll = strlen(statusline);
!     zrefresh();
      while (!islower(getkey(0)));
      statusline = NULL;
  }
***************
*** 891,897 ****
  
      spaceinline(1);
      line[cs] = '^';
!     refresh();
  #ifndef HAS_TIO
      sob = shttyinfo.sgttyb;
      sob.sg_flags = (sob.sg_flags | RAW) & ~ECHO;
--- 891,897 ----
  
      spaceinline(1);
      line[cs] = '^';
!     zrefresh();
  #ifndef HAS_TIO
      sob = shttyinfo.sgttyb;
      sob.sg_flags = (sob.sg_flags | RAW) & ~ECHO;
***************
*** 899,905 ****
  #endif
      c = getkey(0);
  #ifndef HAS_TIO
!     setterm();
  #endif
      foredel(1);
      if(c < 0)
--- 899,905 ----
  #endif
      c = getkey(0);
  #ifndef HAS_TIO
!     zsetterm();
  #endif
      foredel(1);
      if(c < 0)
*** Src/jobs.c.orig	Sat May  2 03:45:37 1998
--- Src/jobs.c	Sat May  2 03:47:05 1998
***************
*** 214,220 ****
      if ((isset(NOTIFY) || job == thisjob) && (jn->stat & STAT_LOCKED)) {
  	printjob(jn, !!isset(LONGLISTJOBS), 0);
  	if (zleactive)
! 	    refresh();
      }
      if (sigtrapped[SIGCHLD] && job != thisjob)
  	dotrap(SIGCHLD);
--- 214,220 ----
      if ((isset(NOTIFY) || job == thisjob) && (jn->stat & STAT_LOCKED)) {
  	printjob(jn, !!isset(LONGLISTJOBS), 0);
  	if (zleactive)
! 	    zrefresh();
      }
      if (sigtrapped[SIGCHLD] && job != thisjob)
  	dotrap(SIGCHLD);
*** Src/mkmakemod.sh.orig	Sun May  3 19:12:57 1998
--- Src/mkmakemod.sh	Sun May  3 23:17:17 1998
***************
*** 145,150 ****
--- 145,155 ----
      echo "PROTOS  =$all_proto"
      echo "SUBDIRS =$all_subdirs"
      echo
+     echo "ENTRYOBJ = \$(dir_src)/modentry..o"
+     echo "NNTRYOBJ ="
+     echo "ENTRYOPT = -emodentry"
+     echo "NNTRYOPT ="
+     echo
  
      echo "##### ===== INCLUDING Makemod.in.in ===== #####"
      echo
***************
*** 161,167 ****
      remote_mdhs=
      for module in $here_modules; do
  
! 	unset moddeps nozshdep alwayslink
  	unset autobins
  	unset objects proto headers hdrdeps otherincs
  	. $top_srcdir/$the_subdir/${module}.mdd
--- 166,172 ----
      remote_mdhs=
      for module in $here_modules; do
  
! 	unset moddeps nozshdep alwayslink hasexport
  	unset autobins
  	unset objects proto headers hdrdeps otherincs
  	. $top_srcdir/$the_subdir/${module}.mdd
***************
*** 172,179 ****
--- 177,186 ----
  
  	dobjects=`echo $objects '' | sed 's,\.o ,..o ,g'`
  	modhdeps=
+ 	imports=
  	for dep in $moddeps; do
  	    eval "loc=\$loc_$dep"
+ 	    imports="$imports \$(IMPOPT)\$(sdir_top)/$loc/$dep.export"
  	    case $the_subdir in
  		$loc)
  		    mdh="${dep}.mdh"
***************
*** 199,207 ****
  	echo "##### ===== DEPENDENCIES GENERATED FROM ${module}.mdd ===== #####"
  	echo
  	echo "MODOBJS_${module} = $objects"
! 	echo "MODDOBJS_${module} = $dobjects"
  	echo "PROTO_${module} = $proto"
  	echo "INCS_${module} = \$(PROTO_${module}) $otherincs"
  	echo
  	echo "proto.${module}: \$(PROTO_${module})"
  	echo "\$(PROTO_${module}): \$(PROTODEPS)"
--- 206,216 ----
  	echo "##### ===== DEPENDENCIES GENERATED FROM ${module}.mdd ===== #####"
  	echo
  	echo "MODOBJS_${module} = $objects"
! 	echo "MODDOBJS_${module} = $dobjects \$(@E@NTRYOBJ)"
  	echo "PROTO_${module} = $proto"
  	echo "INCS_${module} = \$(PROTO_${module}) $otherincs"
+ 	echo "EXPIMP_${module} = $imports ${hasexport+\$(EXPOPT)\$(sdir)/$module.export}"
+ 	echo "NXPIMP_${module} ="
  	echo
  	echo "proto.${module}: \$(PROTO_${module})"
  	echo "\$(PROTO_${module}): \$(PROTODEPS)"
***************
*** 212,218 ****
  	if test -z "$alwayslink"; then
  	    echo "${module}.\$(DL_EXT): \$(MODDOBJS_${module})"
  	    echo '	rm -f $@'
! 	    echo "	\$(DLLINK) \$(MODDOBJS_${module})"
  	    echo
  	fi
  	echo "${module}.mdhi: ${module}.mdhs \$(INCS_${module})"
--- 221,227 ----
  	if test -z "$alwayslink"; then
  	    echo "${module}.\$(DL_EXT): \$(MODDOBJS_${module})"
  	    echo '	rm -f $@'
! 	    echo "	\$(DLLINK) \$(@E@XPIMP_$module) \$(@E@NTRYOPT) \$(MODDOBJS_${module})"
  	    echo
  	fi
  	echo "${module}.mdhi: ${module}.mdhs \$(INCS_${module})"
*** Src/modentry.c.orig	Mon May  4 01:34:39 1998
--- Src/modentry.c	Sun May  3 22:58:53 1998
***************
*** 0 ****
--- 1,15 ----
+ #include "zsh.mdh"
+ 
+ int boot_ _((Module));
+ int cleanup_ _((Module));
+ int modentry _((int boot, Module m));
+ 
+ /**/
+ int
+ modentry(int boot, Module m)
+ {
+     if (boot)
+ 	return boot_(m);
+     else
+ 	return cleanup_(m);
+ }
*** Src/module.c.orig	Sat May  2 03:45:37 1998
--- Src/module.c	Wed May  6 01:40:26 1998
***************
*** 161,166 ****
--- 161,204 ----
      return hadf ? hads : 1;
  }
  
+ #ifdef AIXDYNAMIC
+ 
+ #include <sys/ldr.h>
+ 
+ static char *dlerrstr[256];
+ 
+ /**/
+ static void *
+ load_and_bind(const char *fn)
+ {
+     void *ret = (void *) load((char *) fn, L_NOAUTODEFER, NULL);
+ 
+     if (ret) {
+ 	LinkNode node;
+ 	int err = loadbind(0, (void *) addbuiltin, ret);
+ 	for (node = firstnode(modules); !err && node; incnode(node)) {
+ 	    Module m = (Module) getdata(node);
+ 	    if (m->handle)
+ 		err |= loadbind(0, m->handle, ret);
+ 	}
+ 
+ 	if (err) {
+ 	    loadquery(L_GETMESSAGES, dlerrstr, sizeof(dlerrstr));
+ 	    unload(ret);
+ 	    ret = NULL;
+ 	}
+     } else
+ 	loadquery(L_GETMESSAGES, dlerrstr, sizeof(dlerrstr));
+ 
+     return ret;
+ }
+ 
+ #define dlopen(X,Y) load_and_bind(X)
+ #define dlclose(X)  unload(X)
+ #define dlerror()   (dlerrstr[0])
+ 
+ #else
+ 
  #ifdef HAVE_DLFCN_H
  # include <dlfcn.h>
  #else
***************
*** 168,179 ****
  # include <nlist.h>
  # include <link.h>
  #endif
- #ifndef RTLD_LAZY
- # define RTLD_LAZY 1
- #endif
- #ifndef RTLD_GLOBAL
- # define RTLD_GLOBAL 0
- #endif
  #ifndef HAVE_DLCLOSE
  # define dlclose(X) ((X), 0)
  #endif
--- 206,211 ----
***************
*** 189,194 ****
--- 221,236 ----
  # define STR_CLEANUP   "cleanup_"
  # define STR_CLEANUP_S "cleanup_%s"
  #endif /* !DLSYM_NEEDS_UNDERSCORE */
+ 
+ #endif /* !AIXDYNAMIC */
+ 
+ #ifndef RTLD_LAZY
+ # define RTLD_LAZY 1
+ #endif
+ #ifndef RTLD_GLOBAL
+ # define RTLD_GLOBAL 0
+ #endif
+ 
  typedef int (*Module_func) _((Module));
  
  /**/
***************
*** 257,262 ****
--- 299,322 ----
      return NULL;
  }
  
+ #ifdef AIXDYNAMIC
+ 
+ /**/
+ static int
+ init_module(Module m)
+ {
+     return ((int (*)_((int,Module))) m->handle)(1, m);
+ }
+ 
+ /**/
+ static int
+ cleanup_module(Module m)
+ {
+     return ((int (*)_((int,Module))) m->handle)(0, m);
+ }
+ 
+ #else
+ 
  /**/
  static int
  init_module(Module m)
***************
*** 289,294 ****
--- 349,387 ----
  }
  
  /**/
+ static int
+ cleanup_module(Module m)
+ {
+     char *s, *t;
+ #ifndef DYNAMIC_NAME_CLASH_OK
+     char buf[PATH_MAX + 1];
+ #endif
+     Module_func fn;
+ 
+     s = strrchr(m->nam, '/');
+     if (s)
+ 	s = dupstring(++s);
+     else
+ 	s = m->nam;
+     if ((t = strrchr(s, '.')))
+ 	*t = '\0';
+ #ifdef DYNAMIC_NAME_CLASH_OK
+     fn = (Module_func) dlsym(m->handle, STR_CLEANUP);
+ #else /* !DYNAMIC_NAME_CLASH_OK */
+     if (strlen(s) + 9 > PATH_MAX)
+ 	return 1;
+     sprintf(buf, STR_CLEANUP_S, s);
+     fn = (Module_func) dlsym(m->handle, buf);
+ #endif /* !DYNAMIC_NAME_CLASH_OK */
+     if(fn)
+ 	return fn(m);
+     zwarnnam(m->nam, "no cleanup function", NULL, 0);
+     return 1;
+ }
+ 
+ #endif /* !AIXDYNAMIC */
+ 
+ /**/
  Module
  load_module(char const *name)
  {
***************
*** 335,371 ****
  	return NULL;
      }
      return m;
- }
- 
- /**/
- static int
- cleanup_module(Module m)
- {
-     char *s, *t;
- #ifndef DYNAMIC_NAME_CLASH_OK
-     char buf[PATH_MAX + 1];
- #endif
-     Module_func fn;
- 
-     s = strrchr(m->nam, '/');
-     if (s)
- 	s = dupstring(++s);
-     else
- 	s = m->nam;
-     if ((t = strrchr(s, '.')))
- 	*t = '\0';
- #ifdef DYNAMIC_NAME_CLASH_OK
-     fn = (Module_func) dlsym(m->handle, STR_CLEANUP);
- #else /* !DYNAMIC_NAME_CLASH_OK */
-     if (strlen(s) + 9 > PATH_MAX)
- 	return 1;
-     sprintf(buf, STR_CLEANUP_S, s);
-     fn = (Module_func) dlsym(m->handle, buf);
- #endif /* !DYNAMIC_NAME_CLASH_OK */
-     if(fn)
- 	return fn(m);
-     zwarnnam(m->nam, "no cleanup function", NULL, 0);
-     return 1;
  }
  
  /**/
--- 428,433 ----
*** Src/system.h.orig	Sat May  2 03:45:37 1998
--- Src/system.h	Sat May  2 03:47:05 1998
***************
*** 609,611 ****
--- 609,617 ----
  extern char PC, *BC, *UP;
  extern short ospeed;
  #endif
+ 
+ /* Rename some global zsh variables to avoid *
+  * possible name clashes with libc           */
+ 
+ #define cs zshcs
+ #define ll zshll
*** Src/utils.c.orig	Sat May  2 03:45:37 1998
--- Src/utils.c	Sat May  2 03:47:05 1998
***************
*** 846,852 ****
      setiparam("LINES", shttyinfo.winsize.ws_row);
      if (zleactive && (oldcols != columns || oldrows != lines)) {
  	resetneeded = winchanged = 1;
! 	refresh();
      }
  #endif   /* TIOCGWINSZ */
  }
--- 846,852 ----
      setiparam("LINES", shttyinfo.winsize.ws_row);
      if (zleactive && (oldcols != columns || oldrows != lines)) {
  	resetneeded = winchanged = 1;
! 	zrefresh();
      }
  #endif   /* TIOCGWINSZ */
  }
*** Src/zsh.export.orig	Tue May  5 00:48:56 1998
--- Src/zsh.export	Tue May  5 01:40:43 1998
***************
*** 0 ****
--- 1,234 ----
+ #!
+ SHTTY
+ addbuiltins
+ addedx
+ addhashnode
+ aliastab
+ alloc_stackp
+ appstr
+ arrdup
+ arrlen
+ attachtty
+ bangchar
+ beep
+ bin_notavail
+ breaks
+ bufstack
+ builtintab
+ chline
+ chuck
+ clearjobtab
+ closem
+ cmdnamtab
+ columns
+ compctlreadptr
+ coprocin
+ coprocout
+ countlinknodes
+ countprompt
+ createparam
+ ctxtlex
+ curhist
+ current_limits
+ deletebuiltins
+ deletehashtable
+ domatch
+ doshfunc
+ dputs
+ dquotedztrdup
+ dummy_list
+ dupstring
+ dupstrpfx
+ dyncat
+ emptyhashtable
+ endparamscope
+ errflag
+ excs
+ execstring
+ exlast
+ expanding
+ fallback_compctlread
+ fallback_zleread
+ fignore
+ file_type
+ filesub
+ filesubstr
+ findcmd
+ firsthist
+ freearray
+ freeheap
+ getaparam
+ gethashnode
+ gethashnode2
+ getiparam
+ getkeystring
+ getlinknode
+ getshfunc
+ getsparam
+ glob_pre
+ glob_suf
+ global_heapalloc
+ global_permalloc
+ globlist
+ gotwordptr
+ halloc
+ hasam
+ hashcmd
+ hasher
+ hasspecial
+ hcalloc
+ hgetc
+ hgetline
+ histentarr
+ histentct
+ hptr
+ hrealloc
+ inbufct
+ incmdpos
+ incond
+ init_io
+ init_shout
+ init_term
+ inpop
+ inpush
+ inredir
+ insertlinknode
+ intr
+ inwhat
+ isfirstln
+ jobtab
+ lastpid
+ lastval
+ lchdir
+ lexrestore
+ lexsave
+ lexstop
+ limits
+ line
+ lines
+ locallevel
+ metadiffer
+ metafy
+ metalen
+ mode_to_octal
+ mypgrp
+ mypid
+ nameddirtab
+ ncalloc
+ newhashtable
+ newlinklist
+ nicechar
+ nicezputs
+ niceztrdup
+ niceztrlen
+ noaliases
+ noerrs
+ noop_function
+ noop_function_int
+ optiontab
+ opts
+ paramtab
+ parbegin
+ parend
+ parsereg
+ parsestr
+ path
+ pathchecked
+ popheap
+ postedit
+ ppid
+ prefork
+ prepromptfns
+ printif
+ printqt
+ promptexpand
+ pushheap
+ putshout
+ pwd
+ quietgetevent
+ quietgethist
+ quotedzputs
+ refreshptr
+ remlpaths
+ remnulargs
+ removehashnode
+ resetneeded
+ restoredir
+ reswdtab
+ retflag
+ scanhashtable
+ setaparam
+ setlimits
+ setsparam
+ settyinfo
+ shfunctab
+ shingetline
+ shout
+ shttyinfo
+ singsub
+ skipparens
+ spaceinlineptr
+ spacesplit
+ spckword
+ startparamscope
+ stdunsetfn
+ stophist
+ stopmsg
+ strinbeg
+ strinend
+ strpfx
+ strsfx
+ strucpy
+ struncpy
+ tclen
+ tcstr
+ termflags
+ tgoto
+ tok
+ tokenize
+ tokstr
+ tputs
+ trashzleptr
+ tricat
+ tsetcap
+ ttystrname
+ tulower
+ tuupper
+ txtchange
+ typtab
+ ugetnode
+ uinsertlinknode
+ unmeta
+ unmetafy
+ untokenize
+ uremnode
+ useheap
+ winchanged
+ wordbeg
+ zalloc
+ zcalloc
+ zchdir
+ zerr
+ zerrnam
+ zexit
+ zfree
+ zgetdir
+ zgetenv
+ zjoin
+ zleactive
+ zleparse
+ zlereadptr
+ zputs
+ zreaddir
+ zsetlimit
+ zsfree
+ zshcs
+ zshll
+ zstrtol
+ ztokens
+ ztrdup
+ ztrduppfx
+ ztrftime
+ ztrlen
+ ztrsub
+ zwarnnam
*** Src/zsh.h.orig	Sat May  2 03:45:37 1998
--- Src/zsh.h	Sat May  2 03:47:05 1998
***************
*** 31,37 ****
  #define zleread(X,Y,H)  zlereadptr(X,Y,H)
  #define spaceinline(X)  spaceinlineptr(X)
  #define gotword()       gotwordptr()
! #define refresh()       refreshptr()
  
  #define compctlread(N,A,O,R) compctlreadptr(N,A,O,R)
  
--- 31,37 ----
  #define zleread(X,Y,H)  zlereadptr(X,Y,H)
  #define spaceinline(X)  spaceinlineptr(X)
  #define gotword()       gotwordptr()
! #define zrefresh()      refreshptr()
  
  #define compctlread(N,A,O,R) compctlreadptr(N,A,O,R)
  
*** acconfig.h.orig	Wed Apr 30 01:11:45 1997
--- acconfig.h	Sun May  3 20:12:34 1998
***************
*** 191,193 ****
--- 191,196 ----
  
  /* Define to 1 if you want to use dynamically loaded modules */
  #undef DYNAMIC
+ 
+ /* Define to 1 if you want to use dynamically loaded modules on AIX */
+ #undef AIXDYNAMIC
*** aczsh.m4.orig	Sat May  2 03:45:37 1998
--- aczsh.m4	Sat May  2 03:47:05 1998
***************
*** 93,98 ****
--- 93,100 ----
  $DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o 1>&5 2>&5 &&
  $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
  $DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o 1>&5 2>&5; then
+     save_ldflags=$LDFLAGS
+     LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
      AC_TRY_RUN([
  #ifdef HAVE_DLFCN_H
  #include <dlfcn.h>
***************
*** 124,129 ****
--- 126,132 ----
  [zsh_cv_sys_dynamic_rtld_global=no],
  [zsh_cv_sys_dynamic_rtld_global=no]
  )
+     LDFLAGS=$save_ldflags
  else
      zsh_cv_sys_dynamic_rtld_global=no
  fi
*** configure.in.orig	Sat May  2 03:45:37 1998
--- configure.in	Tue May  5 01:40:43 1998
***************
*** 211,221 ****
    fi
  fi
  if test -n "$auto_ldflags"; then
!   if test "${enable_zsh_debug}" = yes; then
!     LDFLAGS=-g
!   else
!     LDFLAGS=-s
!   fi
  fi
  
  dnl ----------
--- 211,221 ----
    fi
  fi
  if test -n "$auto_ldflags"; then
!   case "${enable_zsh_debug}$host_os" in
!     yesaix*) ;;  # AIX ld does not accept -g
!     yes*)    LDFLAGS=-g ;;
!     *)       LDFLAGS=-s ;;
!   esac
  fi
  
  dnl ----------
***************
*** 416,427 ****
  dnl -------------------
  dnl Prefer BSD termcap library to SysV curses library, except on certain
  dnl versions of AIX and HP-UX.
! if test `echo $host_os | sed 's/^.*\(aix\)[[1-9]]\.[[0-9]].*$/\1/'` = aix ||
!     test `echo $host_os | sed 's/^.*\(hpux\)10\..*$/\1/'` = hpux; then
!   termcap_curses_order="curses ncurses termcap"
! else
!   termcap_curses_order="termcap curses ncurses"
! fi
  
  for lib in $termcap_curses_order; do
    AC_CHECK_LIB(${lib}, tgetent, [LIBS="$LIBS -l$lib"; break])
--- 416,425 ----
  dnl -------------------
  dnl Prefer BSD termcap library to SysV curses library, except on certain
  dnl versions of AIX and HP-UX.
! case "$host_os" in
!   aix*|hpux10.*) termcap_curses_order="curses ncurses termcap" ;;
!   *)             termcap_curses_order="termcap curses ncurses" ;;
! esac
  
  for lib in $termcap_curses_order; do
    AC_CHECK_LIB(${lib}, tgetent, [LIBS="$LIBS -l$lib"; break])
***************
*** 534,541 ****
                sigblock sigsetmask sigrelse sighold killpg sigaction getrlimit \
                sigprocmask setuid seteuid setreuid setresuid setsid strerror \
                nis_list initgroups fchdir cap_init readlink)
  if test $dynamic = yes; then
!   AC_CHECK_FUNCS(dlopen dlerror dlsym dlclose)
  fi
  
  
--- 532,540 ----
                sigblock sigsetmask sigrelse sighold killpg sigaction getrlimit \
                sigprocmask setuid seteuid setreuid setresuid setsid strerror \
                nis_list initgroups fchdir cap_init readlink)
+ 
  if test $dynamic = yes; then
!   AC_CHECK_FUNCS(dlopen dlerror dlsym dlclose load loadquery loadbind unload)
  fi
  
  
***************
*** 843,856 ****
  dnl dynamic loading
  dnl ---------------
  L=N
! if test "$ac_cv_func_dlopen" != yes; then
!   dynamic=no
! elif test "$ac_cv_func_dlsym" != yes; then
!   dynamic=no
! elif test "$ac_cv_func_dlerror" != yes; then
!   dynamic=no
  fi
! if test "x$dynamic" = xyes; then
    AC_CACHE_CHECK(if your system use ELF binaries,
     zsh_cv_sys_elf,
     [AC_TRY_RUN([/* Test for whether ELF binaries are produced */
--- 842,877 ----
  dnl dynamic loading
  dnl ---------------
  L=N
! aixdynamic=no
! if test "$ac_cv_func_dlopen"  != yes ||
!    test "$ac_cv_func_dlsym"   != yes ||
!    test "$ac_cv_func_dlerror" != yes; then
!   if test "$ac_cv_func_load"      != yes ||
!      test "$ac_cv_func_unload"    != yes ||
!      test "$ac_cv_func_loadbind"  != yes ||
!      test "$ac_cv_func_loadquery" != yes; then
!     dynamic=no
!   elif test "x$dynamic" = xyes; then
!     aixdynamic=yes
!   fi
  fi
! 
! test -n "$GCC" && LDARG=-Wl,
! 
! if test "x$aixdynamic" = xyes; then
!   DL_EXT="${DL_EXT=so}"
!   DLLD="${DLLD=$CC}"
!   zsh_cv_func_dlsym_needs_underscore=no
!   DLLDFLAGS=${DLLDFLAGS=}
!   EXTRA_LDFLAGS=${EXTRA_LDFLAGS=}
!   EXPOPT=${LDARG}-bE:
!   IMPOPT=${LDARG}-bI:
!   zsh_cv_sys_dynamic_clash_ok="${zsh_cv_sys_dynamic_clash_ok=yes}"
!   zsh_cv_sys_dynamic_rtld_global="${zsh_cv_sys_dynamic_rtld_global=yes}"
!   zsh_cv_sys_dynamic_execsyms="${zsh_cv_sys_dynamic_execsyms=yes}"
!   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}"
! elif test "x$dynamic" = xyes; then
    AC_CACHE_CHECK(if your system use ELF binaries,
     zsh_cv_sys_elf,
     [AC_TRY_RUN([/* Test for whether ELF binaries are produced */
***************
*** 890,899 ****
    case "$host_os" in
      hpux*)        DLLDFLAGS="${DLLDFLAGS=-b}" ;;
      linux*|irix*) DLLDFLAGS="${DLLDFLAGS=-shared}" ;;
-     solaris*)     DLLDFLAGS="${DLLDFLAGS=-G}" ;;
      sunos*)       DLLDFLAGS="${DLLDFLAGS=-assert nodefinitions}" ;;
-     sysv4*|esix*) DLLDFLAGS="${DLLDFLAGS=-G $ldflags}" ;;
      netbsd*)      DLLDFLAGS="${DLLDFLAGS=-x -shared --whole-archive}" ;;
    esac
    case "$host_os" in
      hpux*)  EXTRA_LDFLAGS="${EXTRA_LDFLAGS=-Wl,-E}" ;;
--- 911,920 ----
    case "$host_os" in
      hpux*)        DLLDFLAGS="${DLLDFLAGS=-b}" ;;
      linux*|irix*) DLLDFLAGS="${DLLDFLAGS=-shared}" ;;
      sunos*)       DLLDFLAGS="${DLLDFLAGS=-assert nodefinitions}" ;;
      netbsd*)      DLLDFLAGS="${DLLDFLAGS=-x -shared --whole-archive}" ;;
+     aix*)         DLLDFLAGS="${DLLDFLAGS=-G -bexpall -lc}" ;;
+     solaris*|sysv4*|esix*) DLLDFLAGS="${DLLDFLAGS=-G}" ;;
    esac
    case "$host_os" in
      hpux*)  EXTRA_LDFLAGS="${EXTRA_LDFLAGS=-Wl,-E}" ;;
***************
*** 901,907 ****
    esac
    AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
     zsh_cv_func_dlsym_needs_underscore,
!    [cat >conftest.c <<EOM
  fred () { }
  EOM
      $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&5 2>&5 &&
--- 922,928 ----
    esac
    AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
     zsh_cv_func_dlsym_needs_underscore,
!    [echo failed >conftestval && cat >conftest.c <<EOM
  fred () { }
  EOM
      $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&5 2>&5 &&
***************
*** 949,956 ****
      zsh_cv_func_dlsym_needs_underscore=failed
      dynamic=no,
      zsh_cv_func_dlsym_needs_underscore=no)])
!   if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
      AC_DEFINE(DLSYM_NEEDS_UNDERSCORE)
    fi
  fi
  
--- 970,981 ----
      zsh_cv_func_dlsym_needs_underscore=failed
      dynamic=no,
      zsh_cv_func_dlsym_needs_underscore=no)])
!   if test "x$zsh_cv_func_dlsym_needs_underscore" = xyes; then
      AC_DEFINE(DLSYM_NEEDS_UNDERSCORE)
+   elif test "x$zsh_cv_func_dlsym_needs_underscore" != xno; then
+     dnl Do not cache failed value
+     unset zsh_cv_func_dlsym_needs_underscore
+     dynamic=no
    fi
  fi
  
***************
*** 983,995 ****
--- 1008,1030 ----
    D=N
  fi
  
+ if test "x$aixdynamic" = xyes; then
+   E=E
+   AC_DEFINE(AIXDYNAMIC)dnl
+ else
+   E=N
+ fi
+ 
  AC_DEFINE_UNQUOTED(DL_EXT, "$DL_EXT")dnl
  AC_SUBST(D)dnl
  AC_SUBST(DL_EXT)dnl
  AC_SUBST(DLLD)dnl
  AC_SUBST(DLCFLAGS)dnl
  AC_SUBST(DLLDFLAGS)dnl
+ AC_SUBST(E)dnl
  AC_SUBST(EXTRA_LDFLAGS)dnl
+ AC_SUBST(EXPOPT)dnl
+ AC_SUBST(IMPOPT)dnl
  AC_SUBST(L)dnl
  AC_SUBST(RTLD_GLOBAL_OK)dnl
  


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

* Re: PATCH: dynamic loading on AIX
  1998-05-06  6:46 PATCH: dynamic loading on AIX Zoltan Hidvegi
@ 1998-05-06  8:55 ` Andrew Main
  1998-05-08 12:59 ` PATCH: more " pws
  1 sibling, 0 replies; 5+ messages in thread
From: Andrew Main @ 1998-05-06  8:55 UTC (permalink / raw)
  To: Zoltan Hidvegi; +Cc: zsh-workers

Zoltan Hidvegi wrote:
>The patch below implements dynamic loading on AIX.  AIX 4.1 and older
>versions do not support the dlopen/dlsym interface.  Instead each object
>has an export and an import list.  The export list contains the list of
>symbols which is provided by the object for use by subsequently loaded
>dynamic modules.

This is interesting.  I've been planning for some time to do a manual
implementation of symbol tables, much like this, to allow dependent module
loading on systems such as SunOS, where symbols from one loaded module
are not available to other modules.  Presumably much of the export list
handling code can be shared between these two uses.

Probably we could also use the export list to reduce the size of
symbol tables on some systems where the symbols are handled completely
automatically.

>The setterm, refresh and cs external symbols had a conflict with the AIX
>C library or with the curses library so they were renamed to zsetterm,
>zrefresh and zshcs respectively.  `cs' was not changes in the source
>files, instead cs is #defined to zshcs in system.h.  It also #defined ll
>just for consistency, since cs and ll are usually used together.  I chose
>the #define solution since cs is used too many places.

I'd like to do a proper solution to this sort of problem.  I've been
thinking along the lines of automatically #defineing each symbol `foo'
to `name_of_module__foo', thus avoiding clashes with both the C library
and other modules.

>                                             It is possible to
>autogenerate export files from the .pro files, and I do have a script
>which does that, but that creates an export file with 636 symbols for zsh
>and 282 symbols for zle, which the current modules use only 233 symbols
>from zsh.export and 8 symbols from zle.export.  Making the export list
>smaller speeds up loading, reduces memory usage and reduces the risk or
>name collisions.

Perhaps it would be better to add a dummy keyword to the declarations,
to flag symbols for export from the module.

-zefram


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

* PATCH: more dynamic loading on AIX
  1998-05-06  6:46 PATCH: dynamic loading on AIX Zoltan Hidvegi
  1998-05-06  8:55 ` Andrew Main
@ 1998-05-08 12:59 ` pws
  1998-05-08 13:37   ` Peter Stephenson
  1998-05-08 15:10   ` hzoli
  1 sibling, 2 replies; 5+ messages in thread
From: pws @ 1998-05-08 12:59 UTC (permalink / raw)
  To: zsh-workers

hzoli@cs.elte.hu wrote:
> The patch below implements dynamic loading on AIX.

This is a good thing to have.  I tried it, and encountered the
following problems

1) module.c was trying to include <link.h>.  This doesn't exist here
under AIX 3.2, nor does it seem to be there on a 4.1 system at the
other end of Europe.  If it's sometimes necessary, it should probably
be tested for in configure.

2) AIXDYNAMIC was missing from config.h.in and so didn't appear in
config.h.  I am correct that config.h.in needs to be updated by hand,
not by autoconf?

3) I made comp1 and zle builtin, mainly as an act of cowardice after
my experience with IRIX, but even so loading compctl or deltochar
causes a core dump.  As far as I can see, it seems to be happening
when trying to call init_module(), which is special for the AIX
version.  Recompiling with compctl also builtin seems to work.
On the other hand, the remaining libraries (stat, file, ...) work fine
dynamically.  Any ideas?

Here's the simplest possible patch for the first two.

*** Src/module.c.aix	Fri May  8 11:53:19 1998
--- Src/module.c	Fri May  8 11:53:38 1998
***************
*** 204,210 ****
  #else
  # include <sys/types.h>
  # include <nlist.h>
- # include <link.h>
  #endif
  #ifndef HAVE_DLCLOSE
  # define dlclose(X) ((X), 0)
--- 204,209 ----
*** config.h.in.aix	Fri May  8 11:53:11 1998
--- config.h.in	Fri May  8 11:53:21 1998
***************
*** 256,261 ****
--- 256,264 ----
  /* Define to 1 if you want to use dynamically loaded modules */
  #undef DYNAMIC
  
+ /* Define to 1 if you want to use dynamically loaded modules on AIX */
+ #undef AIXDYNAMIC
+ 
  /* Define if you have the cap_init function.  */
  #undef HAVE_CAP_INIT
  
-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 50 844536
WWW:  http://www.ifh.de/~pws/
Gruppo Teorico, Dipartimento di Fisica
Piazza Torricelli 2, 56100 Pisa, Italy


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

* Re: PATCH: more dynamic loading on AIX
  1998-05-08 12:59 ` PATCH: more " pws
@ 1998-05-08 13:37   ` Peter Stephenson
  1998-05-08 15:10   ` hzoli
  1 sibling, 0 replies; 5+ messages in thread
From: Peter Stephenson @ 1998-05-08 13:37 UTC (permalink / raw)
  To: Zsh hackers list

pws@ibmth.df.unipi.it wrote:
> 3) I made comp1 and zle builtin, mainly as an act of cowardice after
> my experience with IRIX, but even so loading compctl or deltochar
> causes a core dump.

`Even so' seems to be an exaggeration.  I've recompiled with
everything including comp1 and zle as loadable modules and everything
is fine.  There must be something confusing it into thinking that zle
should be a separately loaded library even though it isn't, so that
calls into zle don't work.

-- 
Peter Stephenson <pws@ifh.de>       Tel: +39 50 844536
WWW:  http://www.ifh.de/~pws/
Gruppo Teorico, Dipartimento di Fisica
Piazza Torricelli 2, 56100 Pisa, Italy


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

* Re: PATCH: more dynamic loading on AIX
  1998-05-08 12:59 ` PATCH: more " pws
  1998-05-08 13:37   ` Peter Stephenson
@ 1998-05-08 15:10   ` hzoli
  1 sibling, 0 replies; 5+ messages in thread
From: hzoli @ 1998-05-08 15:10 UTC (permalink / raw)
  To: pws; +Cc: zsh-workers

pws@ibmth.df.unipi.it wrote:
> 1) module.c was trying to include <link.h>.  This doesn't exist here
> under AIX 3.2, nor does it seem to be there on a 4.1 system at the
> other end of Europe.  If it's sometimes necessary, it should probably
> be tested for in configure.

That link.h include was in the else branch of #ifdef AIXDYNAMIC, so it
seems that something was wrong in your build process.

> 2) AIXDYNAMIC was missing from config.h.in and so didn't appear in
> config.h.  I am correct that config.h.in needs to be updated by hand,
> not by autoconf?

You should run autoheader.  I did try this on a very ancient AIX 3.2
box (configure says AIX 3.2 not even 3.2.5, that 3.2 is full of bugs
and broken things).  It did work.  All of your problems should go away
if you run autoheader and rerun configure and make.

Zoli


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

end of thread, other threads:[~1998-05-08 15:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-05-06  6:46 PATCH: dynamic loading on AIX Zoltan Hidvegi
1998-05-06  8:55 ` Andrew Main
1998-05-08 12:59 ` PATCH: more " pws
1998-05-08 13:37   ` Peter Stephenson
1998-05-08 15:10   ` hzoli

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).