?? 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 + -