动态加载静态库?

时间:2010-09-02 10:08:29

标签: c++ linux shared-libraries

Linux中的静态库*.a可以在运行时动态加载吗? 我已经阅读了here

  

...静态库和共享库都可以用作动态加载的库。

如何动态加载静态库?

3 个答案:

答案 0 :(得分:8)

静态库或多或少只是对象文件的集合。如果要在程序中使用静态库,则必须将可执行文件与其链接。然后,可执行文件将包含静态库(或您使用的部分)。

如果要使用dlopen在运行时加载静态库,则必须先创建包含它的动态库libfoo.so

答案 1 :(得分:4)

使用.a打开dlopen文件工作(在Ubuntu 10.04上测试)。使用以下示例程序:

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

int main()
{
  void *lib_handle = dlopen("/usr/lib/libz.a",RTLD_LAZY);
  printf("dlopen error=%s\n",dlerror());

  printf("lib_handle=%p\n",lib_handle);
}

我明白了:

dlopen error=/usr/lib/libz.a: invalid ELF header
lib_handle=(nil)

而当使用/usr/lib/libz.so时,我得到:

dlopen error=(null)
lib_handle=0x19d6030

所以相同的代码适用于共享对象。

答案 2 :(得分:2)

A .a是包含一个或多个.o elf对象的档案。 Readelf和objdump不会解析它们。您必须使用ar从存档中提取.o文件。重要的是要意识到,如果您愿意花时间编写和调试可将一个或多个静态库包装在HAL中的load_elf()的变体,则可以动态地加载它们并为客户端提供一种自省其调用项的方法点。这是非标准的,我已经可以感觉到像《行尸走肉》一样的文人抽搐了。但是,ELF包含足够的信息,可以将库放入运行时环境,并为经过正确编码的客户端函数提供一种方法,以发现与所提供函数的接口并对其进行调用。这不是火箭科学。这简直是​​乏味的。这里的一个重要概念是,提供.a归档文件和include套件以限制您使用这些库的想法的开发人员只会令人讨厌。使用该库或发现其工作方式并不是一个严重的障碍。