动态加载静态库?

Posted

技术标签:

【中文标题】动态加载静态库?【英文标题】:dynamically loading static library? 【发布时间】:2010-09-02 10:08:29 【问题描述】:

Linux 中的静态库*.a 可以在运行时动态加载吗? 我读过here那个

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

如何

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

该解决方法意味着如果我想动态加载它,我必须从静态库创建一个共享库。这意味着动态加载静态库是不可能的,只有共享库可以用于动态加载?如果是这样,那么我从来源中陈述的报价是不正确的。 引用的文字不正确,或者我误解了它们的意思。【参考方案2】:

使用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);

我明白了:

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

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

dlopen error=(null)
lib_handle=0x19d6030

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

【讨论】:

【参考方案3】:

.a 是包含一个或多个 .o elf 对象的存档。 Readelf 和 objdump 不会解析它们。您必须使用 ar 从存档中提取 .o 文件。重要的是要意识到,如果您愿意花时间编写和调试可以将一个或多个静态库包装在 HAL 中的 load_elf() 变体,您可以动态加载它们并为客户端提供一种内省其调用条目的方法点。这是不标准的,我已经可以感觉到像The Walking Jed那样的文人抽搐。但是,ELF 包含足够的信息,可以将库放入运行时环境,并为正确编码的客户端函数提供一种方法来发现所提供函数的接口并调用它们。这不是火箭科学。这简直太乏味了。这里的一个重要概念是,提供 .a 存档和包含套件的开发人员认为它们会限制您对库的使用,这只是令人讨厌。这不是使用图书馆的严重障碍,或者发现它是如何工作的。

【讨论】:

以上是关于动态加载静态库?的主要内容,如果未能解决你的问题,请参考以下文章

请问,ld链接生成的时候,加载动态库/静态库顺序如何?

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

动态加载和静态加载

动态加载和静态加载

静态库 动态库 调用

linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库