⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autobook_187.html

📁 Autoconf使用手册
💻 HTML
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12  2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)            Karl Berry  <karl@freefriends.org>            Olaf Bachmann <obachman@mathematik.uni-kl.de>            and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Unloading a Module</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Unloading a Module"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Unloading a Module"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!--    // Check the browser version.    function checkVersion() {      if (navigator.appVersion.charAt(0)>=3) return true;      if (navigator.appVersion.charAt(0)>=4) return true;      else return false;    }      if (checkVersion()) {             homeon = new Image();             homeon.src = "homeon.png";             homeoff = new Image();             homeoff.src = "home.png";             tocon = new Image();             tocon.src = "tocon.png";             tocoff = new Image();             tocoff.src = "toc.png";             indexon = new Image();             indexon.src = "indexon.png";             indexoff = new Image();             indexoff.src = "index.png";             helpon = new Image();             helpon.src = "helpon.png";             helpoff = new Image();             helpoff.src = "help.png";             backon = new Image();             backon.src = "backon.png";             backoff = new Image();             backoff.src = "back.png";             forwardon = new Image();             forwardon.src = "forwardon.png";             forwardoff = new Image();             forwardoff.src = "forward.png";             prevon = new Image();             prevon.src = "prevon.png";             prevoff = new Image();             prevoff.src = "prev.png";             nexton = new Image();             nexton.src = "nexton.png";             nextoff = new Image();             nextoff.src = "next.png";             upon = new Image();             upon.src = "upon.png";             upoff = new Image();             upoff.src = "up.png";         }     function img_act(imgName) {             if (checkVersion()) {             imgOn = eval(imgName + "on.src");             document [imgName].src = imgOn;             }     }     function img_inact(imgName) {             if (checkVersion()) {             imgOff = eval(imgName + "off.src");             document [imgName].src = imgOff;             }     }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC187"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_186.html#SEC186" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Loading a Module" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_188.html#SEC188" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: A Loadable Module" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_182.html#SEC182" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: A Complex GNU Autotools Project" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_183.html#SEC183" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: A Module Loading Subsystem" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_188.html#SEC188" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: A Loadable Module" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 20.1.4 Unloading a Module </H3><!--docid::SEC187::--><P>When unloading a module, several things must be done:</P><P><UL><LI>Any built-in commands implemented by this module must be unregistered sothat Sic doesn't try to call them after the implementation has beenremoved.<P><LI>Any syntax extensions implemented by this module must be similarlyunregistered, including <CODE>syntax_init</CODE> and <CODE>syntax_finish</CODE>functions.<P><LI>If there is a finalisation entry point in the module,<SAMP>`module_finish'</SAMP> (see section <A HREF="autobook_186.html#SEC186">20.1.3 Loading a Module</A>), it must be called.</UL><P>My first cut implementation of a module subsystem kept a list of theentry points associated with each module so that they could be looked upand removed when the module was subsequently unloaded.  It also kepttrack of multiply loaded modules so that a module wasn't unloadedprematurely.  libltdl already does all of this though, and it iswasteful to duplicate all of that work.  This system uses<CODE>lt_dlforeach</CODE> and <CODE>lt_dlgetinfo</CODE> to access libltdls recordsof loaded modules, and save on duplication.  These two functions aredescribed fully insection `Libltdl interface' in <CITE>The Libtool Manual</CITE>. </P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>This function asks libltdl to call the function<CODE>unload_ltmodule</CODE> for each of the modules it has loaded, along withsome details of the module it wants to unload.  The tricky part of thecallback function below is recalculating the entry point addresses forthe module to be unloaded and then removing all matching addresses fromthe appropriate internal structures.  Otherwise, the balance of thiscallback is involved in informing the calling <CODE>lt_dlforeach</CODE> loopof whether a matching module has been found and handled:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>The <CODE>userdata_address_compare</CODE> helper function at the end is usedto compare the address of recalculated entry points against the alreadyregistered functions and handlers to find which items need to beunregistered.</P><P>There is also a matching header file to export the module interface, sothat the code for loadable modules can make use of it:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>This header also includes some of the other Sic headers, so that in mostcases, the source code for a module need only <SAMP>`#include&#60;sic/module.h&#62;'</SAMP>.</P><P>To make the module loading interface useful, I have added built-ins for<SAMP>`load'</SAMP> and <SAMP>`unload'</SAMP>.  Naturally, these must be compiled intothe bare <CODE>sic</CODE> executable, so that it is able to load additionalmodules:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>These new built-in commands are simply wrappers around the module loadingcode in <TT>`module.c'</TT>.</P><P>As with <SAMP>`dlopen'</SAMP>, you can  use libltdl to <SAMP>`lt_dlopen'</SAMP> themain executable, and then lookup <EM>its</EM> symbols.  I have simplifiedthe initialisation of Sic by replacing the <CODE>sic_init</CODE> function in<TT>`src/sic.c'</TT> by `loading' the executable itself as a module.  Thisworks because I was careful to use the same format in<TT>`sic_builtin.c'</TT> and <TT>`sic_syntax.c'</TT> as would be required for a genuine loadable module, like so:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P><A NAME="A Loadable Module"></A></TR></TABLE><BR>  <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12  2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -