【发布时间】:2010-09-02 10:08:29
【问题描述】:
【问题讨论】:
标签: c++ linux shared-libraries
【问题讨论】:
标签: c++ linux shared-libraries
静态库或多或少只是目标文件的集合。如果要在程序中使用静态库,则必须将可执行文件与其链接。然后可执行文件将包含静态库(或您使用的部分)。
如果您想在运行时使用dlopen 加载静态库,您必须首先创建一个包含它的动态库libfoo.so。
【讨论】:
使用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
所以相同的代码适用于共享对象。
【讨论】:
.a 是包含一个或多个 .o elf 对象的存档。 Readelf 和 objdump 不会解析它们。您必须使用 ar 从存档中提取 .o 文件。重要的是要意识到,如果您愿意花时间编写和调试可以将一个或多个静态库包装在 HAL 中的 load_elf() 变体,您可以动态加载它们并为客户端提供一种内省其调用条目的方法点。这是不标准的,我已经可以感觉到像The Walking Jed那样的文人抽搐。但是,ELF 包含足够的信息,可以将库放入运行时环境,并为正确编码的客户端函数提供一种方法来发现所提供函数的接口并调用它们。这不是火箭科学。这简直太乏味了。这里的一个重要概念是,提供 .a 存档和包含套件的开发人员认为它们会限制您对库的使用,这只是令人讨厌。这不是使用图书馆的严重障碍,或者发现它是如何工作的。
【讨论】: