gpt4 book ai didi

c - 使用 ld 实用程序与 dlfcn API 动态链接的优势?

转载 作者:太空狗 更新时间:2023-10-29 12:06:50 25 4
gpt4 key购买 nike

我正在对平台独立代码进行一些研究,发现提到了 dlfcn API。这是我第一次提到它并对其进行了进一步的研究。现在希望我缺乏平台独立代码以及编译/链接的经验/理解不会在这篇文章中显示出来,但对我来说 dlfcn API 只是让我们以编程方式进行与 ld 实用程序相同的动态链接。如果我有误解,请纠正我,因为我想知道。关于我认为我对 ld 实用程序和 dlfcn API 的了解,我有一些问题。

使用 ld 实用程序与 dlfcn API 进行动态链接有哪些优势?

我的第一个想法是,dlfcn API 似乎是在浪费我的时间,因为我需要请求指向函数的指针,而不是让 ld 检查符号表中的 undefined symbol ,然后链接它们。同样,ld 为我做所有事情,而我必须使用 dlfcn API 手动做所有事情(即打开/加载库、获取函数指针、关闭库等)。但仔细一看,我认为可能有一些优势。一个是我们可以在使用完库后将其从内存中加载出来。

如果我们知道我们不需要一直使用库,那么通过这种方式可以节省内存。我不确定是否有任何由 ld 动态链接的库的“内存/库”管理?同样,我不确定在哪些场景/环境下我们会对使用 dlfcn API 来保存所述内存感兴趣,因为这在现代系统中似乎不是问题。我认为一个是在资源非常非常有限的系统(可能是某些嵌入式系统?)上使用库。

还有哪些优点或缺点?

关于动态链接,平台独立代码使用什么“编码模式”?

如果我正在编写依赖于系统调用的平台独立代码,我可以看到自己通过以三种风格之一编码来实现平台独立代码:

  1. 通过宏直接在我的库代码中进行逻辑分支。像这样的东西:
  2. void myAwesomeFunction()
    {
    ...
    #if defined(_MSC_VER)
    // Call some Windows system call
    #elif defined(__GNUC__)
    // Call some Unix system call
    ...
    }
  3. 创建通用系统调用函数并在我的库代码中使用它们。像这样的东西:
  4. OS_Calls.h

    void OS_openFile(string myFile)
    {
    ...
    #if defined(_MSC_VER)
    // Call Windows system call to open file
    #elif defined(__GNUC__)
    // Call Unix system call to open file
    ...
    }

    MyAwesomeFunctions.cpp

    #include "OS_Calls.h"

    void myAwesomeFunction()
    {
    ...
    OS_openFile("my awesome file");
    ...
    }
  5. 与一个类似,但使用 dlfcn API 添加了一个抽象层
  6. MyLibraryLoader.h

    void* GetLibraryFunction(void* lib, char* funcName)
    {
    ...
    return dlsym(lib, funcName);
    }

    MyAwesomeFunctions.cpp

    #include "MyLibraryLoader.h"

    void myAwesomeFunction()
    {
    Result result = GetLibraryFunction(someLib, someFunc)(arguments...);
    }

通常使用哪些?为什么?如果还有任何其他未列出但比我更喜欢的,请告诉我。

感谢阅读这篇文章。我会保持更新,以便它可以作为 future 的信息引用。

最佳答案

dlfcn 和 ld 没有解决同一个问题:实际上您可以在您的项目中使用两者

dlfcn API 旨在支持插件架构,您可以在其中定义模块应实现的接口(interface)。然后,出于各种原因(可扩展性、定制等),应用程序可以加载该接口(interface)的不同实现。

ld,嗯,链接您的应用程序请求的库,但在编译 时执行,而不是在运行时执行。它不以任何方式支持插件架构,因为 ld 链接在命令行中指定的对象。

当然你只能使用 dlfcn API,但它不应该以这种方式使用,当然,以这种方式使用它会给你的直肠带来巨大的痛苦。

对于你的第二个问题,我认为最好的模式是第二个。“直接在代码中”分支可能会造成混淆,因为这两个分支完成的事情并不是很明显,如果您定义适当的抽象并为每个支持的体系结构使用多个分支来实现它,那么这是明确定义的。使用 dlfcn API 毫无意义,因为您没有统一的调用接口(interface)(这正是支持第二种模式的参数),所以它只会在您的代码中增加膨胀。

HTH

关于c - 使用 ld 实用程序与 dlfcn API 动态链接的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8732383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com