The Linux GCC HOWTO中译版V0.1 : 动态载入(Dynamic Loading)
Previous: 连结(Linking)
Next: 与发展人士联络

7. 动态载入(Dynamic Loading)

这一章节目前是简短了一点;当我掠尽ELF HOWTO时,就是这部份再度扩展的时候了.

7.1. 基本概念

Linux有共享程式库,如果之前你已坐著读完上一章节,想必现在一听到像这样的说词,便会立刻感到头昏.有一些照惯例而言是在连结时期便该完成的工作(matching-names-to-places),必须延迟到载入时期(load-time)才能完成.

7.2. 错误讯息(Error messages)

把你连结的错误寄给我!我不会做任何的事,不过我可以把它们写起来**

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的套件上找到)上有广泛的含盖(cover).这里有个不错的简单□例:以-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");
  }

}


The Linux GCC HOWTO中译版V0.1 : 动态载入(Dynamic Loading)
Previous: 连结(Linking)
Next: 与发展人士联络