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

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

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

如何动态加载静态库?

【问题讨论】:

    标签: c++ linux shared-libraries


    【解决方案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 存档和包含套件的开发人员认为它们会限制您对库的使用,这只是令人讨厌。这不是使用图书馆的严重障碍,或者发现它是如何工作的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        相关资源
        最近更新 更多