Next Previous Contents

7. 動態載入

這一章節目前是簡短了一點;當我掠盡ELF HOWTO時,就是這部份再度擴展的時候了。

7.1 基本概念

Linux有共享程式庫,如果之前你已坐著讀完上一章節,想必現在一聽到像這樣的說詞,便會立刻感到頭昏。有一些照慣例而言是在連結時期便該完成的工作,必須延遲到載入時期才能完成。

7.2 錯誤訊息

把你連結的錯誤寄給我!我不會做任何的事,不過我可以把它們寫起來**

can't load library: /lib/libxxx.so, Incompatible version

(a. out only) 這是指你沒有xxx程式庫的正確的主要版本。可別以為隨隨 便便弄個連結到你目前擁有的版本就可以了,如果幸運的話,就只會造成你的程式分頁錯誤而已。去抓新的版本.ELF類似的情況會造成像下面這樣的訊息:

ftp: can't load library 'libreadline.so.2'

warning using incompatible library version xxx

(a. out only)你的程式庫的次要版本比起這支程式用來編譯的還要舊。程式依然可以執行。只是可能啦!我想,昇個級應該沒什麼傷害吧!

7.3 控制動態載入器的運作

有一組環境變數會讓動態載入器有所反應。大部份的環境變數對ldd的用途要比起對一般users的還要來得更多。而且可以很方便的設定成由ldd配合各種參數來執行。這些變數包括,

7.4 以動態載入撰寫程式

如果你很熟悉Solaris 2.x所支援的動態載入的工作的話,你會發現Linux在這點上與其非常的相近。這一部份在H.J.Lu的ELF程式設計文件內與dlopen(3)的manual page(可以在ld.so的套件上找到)上有廣泛的討論。這裡有個不錯的簡單範例:以-ldl連結。

#include <dlfcn.h>
#include <stdio.h>

main()
{
  void *libc;
  void (*printf_call)();

  if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
  {
    printf_call=dlsym(libc,"printf");
    (*printf_call)("hello, world\n");
  }

}


Next Previous Contents