【问题标题】:How to check shared library is loaded successfully or not loaded using dlopen?如何使用 dlopen 检查共享库是否加载成功或未加载?
【发布时间】:2013-02-05 12:02:03
【问题描述】:

我在 C++ 程序中使用 dlopen() 函数加载共享库。

那么如何判断是否加载成功呢? 或者我们可以使用该库中存在的任何函数的重命名来检查库的加载吗?

【问题讨论】:

  • dlopen 函数出错时返回 NULL,这是您要找的吗?有关更详细的说明,请参见 dlopen 的手册页。

标签: c++ linux shared-libraries


【解决方案1】:

来自manual page

如果 dlopen() 因任何原因失败,则返回 NULL。


dlsym 函数无法处理 C++ 标识符,除非它们已被声明为 extern "C",或者您使用了损坏的名称。

【讨论】:

    【解决方案2】:

    如果没有成功加载,dlopen() 返回 NULL。

    dlopen() 的手册页说:

    返回值

    如果文件找不到,无法打开读取,不是合适的对象 dlopen() 处理的格式,或者如果在加载过程中发生错误 文件或重新定位其符号引用,dlopen() 应返回 NULL。 更详细的诊断信息应通过 dlerror() 获得。

    【讨论】:

      【解决方案3】:

      根据文档 (http://linux.die.net/man/3/dlopen),dlopen 在任何失败时都返回 NULL。所以你可以检查一下并完成。但是如果由于某种原因您不相信该库是一个“好”的库,您可以为您的系统定义自己的约定。例如,您可以要求系统可加载的任何库都定义一个具有特定名称的符号,该符号具有某些特定属性,直到并包括诸如“API 密钥”之类的东西,您可以将其分配给想要编写兼容库的用户。

      【讨论】:

        【解决方案4】:

        如果dlopen遇到错误,则返回NULL,dlerror会返回相应的错误信息。

        【讨论】:

          【解决方案5】:

          正如每个人提到的,如果 dlopen() 失败,你会得到一个空值,但是如果你试图解决为什么即使你指定的路径上存在库,你也会得到神秘的空值,可以确保所有库都存在于系统上该“特定库”依赖,否则调用将失败并返回 NULL ;)

          在你的 .cpp 文件中使用 extern "C" 作为函数,这样编译器就不会破坏它,并且你可以在库加载后调用它。

          【讨论】:

            【解决方案6】:

            您还可以在共享库的其中一个文件中添加静态块。当它加载成功时,它会打印一条消息。示例:

            struct LoadMessage {
                    init(void){
                    std::cout << "I am loaded\n";
                    }
            };
            
            LoadMessage message;
            

            【讨论】:

              猜你喜欢
              • 2015-03-02
              • 2016-10-09
              • 1970-01-01
              • 2012-09-27
              • 1970-01-01
              • 1970-01-01
              • 2018-03-23
              • 1970-01-01
              • 2017-02-26
              相关资源
              最近更新 更多