📄 039.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->Linux HowTo 中译版-->The Linux GCC HOWTO中译版V0.1: 动态载入(Dynamic Loading)</TITLE>
<META NAME="keywords" CONTENT=" Linux HowTo 中译版 The Linux GCC HOWTO中译版V0.1: 动态载入(Dynamic Loading)">
<META NAME="description" CONTENT=" - Linux HowTo 中译版 - The Linux GCC HOWTO中译版V0.1: 动态载入(Dynamic Loading)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" bgcolor="#e0e0e0"><strong><A HREF="040.htm">后一页</A><BR>
<A HREF="038.htm">前一页</A><BR>
<A HREF="index.html">回目录</A><BR>
<A HREF="../../../../index.htm">回首页</A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">The Linux GCC HOWTO中译版V0.1: 动态载入(Dynamic Loading)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
姓名:Daniel Barlow<br>
Email:dan@detached.demon.co.uk<br>
地址 :<br>
转摘 :http://member.netease.com/</p>
<BR>
<BR>
<hr SIZE="0">
<BR>
<p><br>
<br>
7. 动态载入(Dynamic Loading) <br>
这一章节目前是简短了一点;当我掠尽ELF HOWTO时,就是这部份再度扩展的时候了.
<br>
<br>
7.1. 基本概念 <br>
Linux有共享程式库,如果之前你已坐著读完上一章节,想必现在一听到像这样的说词,便会立刻感到头昏.有一些照惯例而言是在连结时期便该完成的工作(matching-names-to-places),必须延迟到载入时期(load-time)才能完成.
<br>
<br>
7.2. 错误讯息(Error messages) <br>
把你连结的错误寄给我!我不会做任何的事,不过我可以把它们写起来**
<br>
<br>
<br>
can't load library: /lib/libxxx.so, Incompatible version <br>
(a. out only) 这是指你没有xxx程式库的正确的主要版本.可别以为随随便便弄个连结到你目前拥有的版本就可以了,如果幸运的话,
就只会造成你的程式分页错误而已.去抓新的版本.ELF类似的情况会造成像下面这样的讯息:
<br>
<br>
<br>
ftp: can't load library 'libreadline.so.2' <br>
<br>
<br>
warning using incompatible library version xxx <br>
(a. out only)你的程式库的次要版本比起这支程式用来编译的还要旧.程式依然可以执行.只是可能啦!我想,升个级应该没什麽伤害吧!
<br>
<br>
<br>
7.3. 控制动态载入器的运作 <br>
有一组环境变数会让动态载入器有所反应.大部份的环境变数对ldd的用途要比起对一般users的还要来得更多.而且可以很方便的设定成由ldd配合各种参数来执行.这些变数包括
<br>
<br>
<br>
LD_BIND_NOW --- 正常来讲,函数在呼叫之前是不会让程式寻找(looked up)的.设定这个旗号会使得程式库一载入,所有的寻找(lookups)便会发生,同时也造成起始的时间(startup
time)较慢.当你想测试程式,确定所有的连结都没有问题时,这项旗号就变得很有用.
<br>
LD_PRELOAD 可以设定一个档案,使其具有*覆盖*(overriding)函数定义的能力.例如,如果你要测试记忆体分配的方略(strategies),而且还想置换*malloc*,那麽你可以写好准备替换的副程式(routine),并把它编译成mallolc.,然後:
<br>
$ LD_PRELOAD=malloc.o; export LD_PRELOAD <br>
$ some_test_program <br>
<br>
LD_ELF_PRELOAD 与 LD_AOUT_PRELOAD 很类似,但是仅适用於正确的二进位型态.如果设定了
LD_something_PRELOAD 与 LD_PRELOAD ,比较明确的那一个会被用到. <br>
LD_LIBRARY_PATH 是一连串以分号隔离的目录名称,用来搜寻共享程式库.对ld而言,并没有任何的影响;这项只有在执行期间才有影响.另外,对执行setuid与setgid的程式而言,这一项是无效的.而LD_ELF_LIBRARY_PATH与LD_AOUT_LIBRARY_PATH这两种旗号可根据各别的二进位型式分别导向不同的搜寻路径.一般正常的运作下,不应该会用到LD_LIBRARY_PATH;把需要搜寻的目录加到/etc/ld.so.conf/里;然後重新执行ldconfig.
<br>
LD_NOWARN 仅适用於a.out.一旦设定了这一项(LD_NOWARN=true; export LD_NOWARN),它会告诉载入器必须处理fatal-warnings(像是次要版本不相容等)的警告讯息.
<br>
LD_WARN 仅适用於ELF.设定这一项时,它会将通常是致命讯息的"Can*t
find library"转换成警告讯息.对正常的操作而言,这并没有多大的用处,可是对ldd就很重要了.
<br>
LD_TRACE_LOADED_OBJECTS 仅适用於ELF.而且会使得程式以为它们是由ldd所执行的:
<br>
$ LD_TRACE_LOADED_OBJECTS=true /usr/bin/lynx <br>
libncurses.so.1 => /usr/lib/libncurses.so.1.9.6 <br>
libc.so.5 => /lib/libc.so.5.2.18 <br>
<br>
<br>
7.4. 以动态载入撰写程式 <br>
如果你很熟悉Solaris 2.x所支援的动态载入的工作的话,你会发现Linux在这点上与其非常的相近.这一部份在H.J.Lu的ELF程式设计文件内与dlopen(3)的manual
page(可以在ld.so的套件上找到)上有广泛的含盖(cover).这里有个不错的简单□例:以-ldl连结.
<br>
<br>
<br>
#include <dlfcn.h> <br>
#include <stdio.h> <br>
<br>
main() <br>
{ <br>
void *libc; <br>
void (*printf_call)(); <br>
<br>
if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY)) <br>
{ <br>
printf_call=dlsym(libc,"printf"); <br>
(*printf_call)("hello, world\n"); <br>
} <br>
<br>
} <br>
</p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="040.htm">后一页</A><BR>
<A HREF="038.htm">前一页</A><BR>
<A HREF="index.html">回目录</A><BR>
<A HREF="../../../../index.htm">回首页</A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -