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

📄 1019.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 3 页
字号:
                  <TABLE cellSpacing=0 cellPadding=0 width="100%" 
                  background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
                    <TBODY>
                    <TR>
                        <TD vAlign=top width="80%"> 
                          <DIV align=center>
                        <FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
                            </FORM>
                        <TABLE cellSpacing=0 cellPadding=0 width="95%" 
                          border=0><TBODY>
                          <TR>
                            <TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif" 
                          height=30></TD></TR></TBODY></TABLE>
                        <TABLE cellSpacing=0 cellPadding=3 width="95%" 
                        align=center border=0>
                          <TBODY>
                          <TR>
                            <TD>
                              <TABLE cellSpacing=0 cellPadding=3 width="100%" 
                              border=0>
                                <TBODY>
                                <TR>
                                      <TD vAlign=top> 
<p><FONT class=normalfont><B><font color=blue>为Linux应用程序编写DLL</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:Allen Wilson(wilsona@us.ibm.com)<br>来自:Linux知识宝库<br>联系方式:无名<br><br>Linux 动态链接 <br>
Linux dll 函数 <br>
dll 示例:小的 C 程序和 dlTest <br>
构建 dlTest <br>
结束语 <br>
清单(应用程序和 dll) <br>
参考资料 <br>
关于作者 <br>
评论本文 <br>
 <br>
 <br>
相关内容: <br>
 <br>
Shared objects for the object disoriented! <br>
 <br>
 <br>
Linux 服务区中还有: <br>
 <br>
教程 <br>
工具与产品 <br>
代码和组件 <br>
文章 <br>
 <br>
 <br>
 <br>
 <br>
在仅仅只会编写插件的时候为什么要编写整个应用程序? <br>
<br>
电子商务设计师,IBM<br>
2001 年 10 月<br>
<br>
插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法。在 Linux 中,插件和 DLL 以动态库形式实现。电子商务顾问兼设计师 Allen Wilson 介绍了动态库并且向您演示了如何在某个应用程序正在运行之后使用动态库来改变该应用程序。<br>
Internet 浏览器用户非常熟悉插件的概念。从 Web 上下载插件,通常这些插件为浏览器的音频、视频以及特殊效果提供增强支持。一般来讲,在不更改原有应用程序的情况下,插件为现有应用程序提供新功能。<br>
<br>
DLL 是程序函数,它们在设计和构建应用程序时为该程序所知。设计应用程序的主程序时使用程序框架或底板,这些程序框架或底板在运行时选择性地装入所需的 dll,这些 dll 位于磁盘上同主程序分离的一些文件中。这一打包和动态装入提供了灵活的升级、维护、以及许可策略。<br>
<br>
随 Linux 一起交付的还有几千条命令和应用程序,它们至少都需要 libc 库函数。如果 libc 函数与每一个应用程序都打包在一起,那么磁盘上将会出现几千个相同函数的副本。Linux 构建这些应用程序,以使用通常所需的系统库的单个系统级副本,而不浪费磁盘空间。Linux 甚至做得更好,每个需要公共系统库函数的进程使用单个的系统级内的副本,一次性将该副本装入到内存并为各进程所共享。<br>
<br>
在 Linux 中,插件和 dll 以动态库形式实现。本文的余下部分是在应用程序运行之后使用动态库更改该应用程序的示例。<br>
<br>
Linux 动态链接<br>
Linux 中的应用程序以以下两种方式之一链接到外部函数:要么在构建时与静态库( lib*.a)静态地链接,并且将库代码包含在该应用程序的可执行文件里;要么在运行时与共享库( lib*.so)动态地链接。通过动态链接装入器,将动态库映射进应用程序的可执行内存中。在启动应用程序之前,动态链接装入器将所需的共享目标库映射到应用程序的内存,或者使用系统共享的目标并为应用程序解析所需的外部引用。现在应用程序就可以运行了。<br>
<br>
作为示例,下面有一个演示 Linux 中对动态链接库的缺省使用的小程序:<br>
<br>
main()<br>
{<br>
   printf("Hello world<br>
");<br>
}<br>
<br>
 <br>
<br>
当使用 gcc 编译 hello.c 时,就创建了一个名为 a.out 的可执行文件。通过使用 Linux 命令 ldd a.out(该命令打印出共享库的相互依赖性),可以看出所需的共享库是:<br>
<br>
        libc.so.6 =&gt; /lib/libc.so.6 (0x4001d000)<br>
         /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)<br>
<br>
<br>
 <br>
<br>
使用相同的动态链接装入器在应用程序运行之后将 dll 映射进应用程序的内存。通过使用 Linux 动态装入器例程,应用程序控制装入哪一个动态库以及调用库中的哪一个函数,以执行装入和链接以及返回所需入口点的地址。<br>
<br>
Linux dll 函数<br>
Linux 提供 4 个库函数(dlopen, dlerror, dlsym 和 dlclose),一个 include 文件(dlfcn.h)以及两个共享库(静态库 libdl.a 和动态库 libdl.so),以支持动态链接装入器。这些库函数是:<br>
<br>
dlopen 将共享目标文件打开并且映射到内存中,并且返回句柄 <br>
dlsym 返回一个指向被请求入口点的指针 <br>
dlerror 返回 NULL 或者一个指向描述最近错误的 ASCII 字符串的指针 <br>
dlclose 关闭句柄并且取消共享目标文件的映射 <br>
<br>
<br>
<br>
动态链接装入器例程 dlopen 需要在文件系统中查找共享目标文件以打开文件并创建句柄。有 4 种方式用以指定文件的位置:<br>
<br>
dlopen call 中的绝对文件路径 <br>
在 LD_LIBRARY_PATH 环境变量中指定的目录中 <br>
在 /etc/ld.so.cache 中指定的库列表之中 <br>
先在 /usr/lib 之中,然后在 /lib 之中 <br>
<br>
<br>
<br>
dll 示例:小的 C 程序和 dlTest<br>
动态链接装入器示例程序是一个小的 C 程序,该程序被设计用来练习 dl 例程。该程序基于每个人都编写过的一个 C 程序,它将“Hello World”打印到控制台上。最初打印的消息是“HeLlO WoRlD”。该测试程序链接到再次打印该消息的两个函数上:第一次都用大写字符,第二次都用小写字符。<br>
<br>
以下是该程序的概要:<br>
<br>
定义 dll include 文件 dlfcn.h 和所需的变量。至少需要这些变量: <br>
到共享库文件的句柄 <br>
指向被映射函数入口点的指针 <br>
指向错误字符串的指针 <br>
<br>
<br>
打印初始消息,“HeLlO WoRlD”。<br>
<br>
<br>
使用绝对路径“/home/dlTest/UPPERCASE.so”和选项 RTLD_LAZY,dlopen 打开 UPPERCASE dll 的共享目标文件并返回句柄。 <br>
选项 RTLD_LAZY 推迟解析 dll 的外部引用,直到 dll 被执行。 <br>
选项 RTLD_NOW 在 dlopen 返回之前解析所有的外部引用。 <br>
<br>
<br>
dlsym 返回入口点 printUPPERCASE 的地址。<br>
<br>
<br>
调用 printUPPERCASE 并且打印修改过的消息“HELLO WORLD”。<br>
<br>
<br>
dlclose 关闭到 UPPERCASE.so 的句柄,并且从内存中取消 dll 映射。<br>
<br>
<br>
dlopen 使用基于环境变量 LD_LIBRARY_PATH 的相对路径查找共享目标路径,来打开 lowercase dll 的共享目标文件 lowercase.so,并且返回句柄。<br>
<br>
<br>
dlsym 返回入口点 printLowercase 的地址。<br>
<br>
<br>
调用 printLowercase 并且打印修改过的信息“hello world”。<br>
<br>
<br>
dlclose 关闭到 lowercase.so 的句柄,并且从内存中取消 dll 映射。 <br>
注意,每次调用 dlopen、dlsym 或 dlclose 之后,调用 dlerror 以获取最后的错误信息,并且打印该错误信息字符串。以下是 dlTest 的测试运行:<br>
<br>
   dlTest  2-Original message <br>
HeLlO WoRlD<br>
    dlTest  3-Open Library with absolute path return-(null)- <br>
    dlTest  4-Find symbol printUPPERCASE return-(null)- <br>
HELLO WORLD<br>
    dlTest  5-printUPPERCASE return-(null)- <br>
    dlTest  6-Close handle return-(null)-<br>
    dlTest  7-Open Library with relative path return-(null)- <br>
    dlTest  8-Find symbol printLowercase return-(null)- <br>
hello world<br>
    dlTest  9-printLowercase return-(null)- <br>
    dlTest 10-Close handle return-(null)-<br>
<br>
<br>
 <br>
<br>
完整的 dlTest.c、UPPERCASE.c 和 lowercase.c 源代码清单在本文后面的清单里。<br>
<br>
构建 dlTest<br>
启用运行时动态链接需要三步:<br>
<br>
将 dll 编译为位置无关代码 <br>
创建 dll 共享目标文件 <br>
编译主程序并同 dl 库相链接 <br>
编译 UPPERCASE.c 和 lowercase.c 的 gcc 命令包含 -fpic 选项。选项 -fpic 和 -fPIC 导致生成的代码是位置无关的,重建共享目标库需要位置无关。-fPIC 选项产生位置无关的代码,这类代码支持大偏移。用于 UPPERCASE.o 和 lowercase.o 的第二个 gcc 命令,带有 -shared 选项,该选项产生适合于动态链接的共享目标文件 a*.so。<br>
<br>
用于编译和执行 dltest 的 ksh 脚本如下:<br>
<br>
#!/bin/ksh<br>
#  Build shared library<br>
#<br>
#set -x<br>
clear<br>
<br>
#<br>
#  Shared library for dlopen absolute path test<br>
#<br>
if [ -f UPPERCASE.o ]; then rm UPPERCASE.o<br>
fi<br>
gcc  -c -fpic UPPERCASE.c<br>
if [ -f UPPERCASE.so ]; then rm UPPERCASE.so<br>
fi<br>
gcc -shared -lc  -o UPPERCASE.so  UPPERCASE.o <br>
<br>
#<br>
#  Shared library for dlopen relative path test<br>
#<br>
export LD_LIBRARY_PATH=`pwd`<br>
if [ -f lowercase.o ]; then rm lowercase.o<br>
fi<br>
gcc  -c -fpic lowercase.c<br>
if [ -f lowercase.so ]; then rm lowercase.so<br>
fi<br>
gcc -shared -lc  -o lowercase.so  lowercase.o<br>
<br>
#<br>
#  Rebuild test program<br>
#<br>
if [ -f dlTest ]; then rm dlTest<br>

⌨️ 快捷键说明

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