动态加载静态库?

9
在Linux中,静态库*.a能否在运行时动态加载呢?根据这里所说,静态和共享库都可以被用作动态加载库。那么如何动态加载静态库呢?
3个回答

12

静态库基本上只是一组目标文件的集合。如果您想在程序中使用静态库,则必须将可执行文件与其链接起来。然后,可执行文件将包含静态库(或您使用的部分)。

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


这个解决方法意味着如果我想要动态加载它,我必须从静态库创建一个共享库。 这意味着不能动态地加载静态库,只能使用共享库进行动态加载? 如果是这样的话,那么我从源代码中引用的那句话就不正确。 - dragan.stepanovic
引用的文本是错误的,或者我误解了它们的意思。 - JesperE

3

使用dlopen打开.a文件无法正常工作(在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);
}

I get:

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

当我使用/usr/lib/libz.so时,会得到以下结果:
dlopen error=(null)
lib_handle=0x19d6030

因此,同样的代码可用于共享对象。


2
.a是一个包含一个或多个.o ELF对象的存档文件。Readelf和objdump无法解析它们,您必须使用ar命令从存档中提取.o文件。重要的是要认识到,如果您愿意花时间编写和调试load_elf()的变体,可以将一个或多个静态库包装在HAL中进行动态加载,并为客户端提供一种检查其调用入口点的方法。这是非标准的,我已经感觉到文人们像行走的杰德一样抽搐了。然而,ELF包含足够的信息将库放入运行时环境中,并为正确编码的客户端函数提供发现所提供的函数接口并调用它们的方法。这并不是什么高深的技术,只是有些繁琐。这里的一个重要概念是,提供.a存档文件和包含套件的开发人员是在限制您使用库的方式,这只是令人讨厌而已。这不是使用库或发现它如何工作的严重障碍。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接