c - 如果 dlopen() 失败,dlerror() 如何返回 NULL?

标签 c linux ubuntu shared-libraries

我正在开发通过调用脚本自动加载所有 *.so 模块库的系统。

我试图更新其中一个模块以支持 XML-RPC。我在 Ubuntu 10.10 上使用了库 ibxmlrpc-c3-devdlopen()在我修改后失败,dlerror()返回NULL的问题。编译不会返回任何错误。

我该如何调试和解决这个问题?下面是代码:

#include "stdlib.h"
#include "stdio.h"
#ifndef WIN32
#include "unistd.h"
#endif

#include "xmlrpc-c/base.h"
#include "xmlrpc-c/server.h"
#include "xmlrpc-c/server_abyss.h"

#include "config.h"  /* information about this build environment */

而且,我添加了这个函数,大部分行都被注释掉了,即使 dlopen() 失败了:

int RPC_Server(int           const port) {

   // xmlrpc_server_abyss_parms serverparm;
    //xmlrpc_registry * registryP;
    xmlrpc_env env;



    xmlrpc_env_init(&env);

    //registryP = xmlrpc_registry_new(&env);

   // xmlrpc_registry_add_method(
    //    &env, registryP, NULL, "sample.add", &sample_add, NULL);

    /* In the modern form of the Abyss API, we supply parameters in memory
       like a normal API.  We select the modern form by setting
       config_file_name to NULL:
    */
  //  serverparm.config_file_name = NULint
    RPC_Server(int           const port) {

       // xmlrpc_server_abyss_parms serverparm;
        //xmlrpc_registry * registryP;
        xmlrpc_env env;



        xmlrpc_env_init(&env);

        //registryP = xmlrpc_registry_new(&env);

       // xmlrpc_registry_add_method(
        //    &env, registryP, NULL, "sample.add", &sample_add, NULL);

        /* In the modern form of the Abyss API, we supply parameters in memory
           like a normal API.  We select the modern form by setting
           config_file_name to NULL:
        */
      //  serverparm.config_file_name = NULL;
       // serverparm.registryP        = registryP;
       // serverparm.port_number      = port;
       // serverparm.log_file_name    = "/tmp/xmlrpc_log";

       // printf("Running XML-RPC server...\n");

       // xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));

        /* xmlrpc_server_abyss() never returns */

        return 0;
    }L;
   // serverparm.registryP        = registryP;
   // serverparm.port_number      = port;
   // serverparm.log_file_name    = "/tmp/xmlrpc_log";

   // printf("Running XML-RPC server...\n");

   // xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(log_file_name));

    /* xmlrpc_server_abyss() never returns */

    return 0;
}

这是用于加载模块的代码

#ifndef RTLD_NOW

#define RTLD_NOW DL_LAZY
#endif   
void* handle;
char* error;


handle=dlopen(mod->binary_file, RTLD_NOW); 

if (!handle){
LOG( " could not open file [%s]: %s\n",
    mod_cfg->binary_file, dlerror() );
return 0;
}

最佳答案

在这段代码中:

handle=dlopen(mod->binary_file, RTLD_NOW); 

if (!handle) {
    LOG( " could not open file [%s]: %s\n",
         mod_cfg->binary_file, dlerror() );

我能想到的让 dlerror() 返回 NULL 的最可能方法是 LOG 本身调用 之一code>dl* 例程(这将清除 dlerror 返回的错误状态)。

所以,

  • 向我们展示 LOG 宏(如果它确实是 宏)扩展到什么,以及
  • 在GDB下运行程序,在dlopendlmopendlsymdlvsym上设置断点,观察其中一个在你调用 dlopen 之前和调用 dlerror 之前之后被调用。

关于c - 如果 dlopen() 失败,dlerror() 如何返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547372/

相关文章:

c - 如何从十六进制转储中提取字节?

c - c中特定嵌套循环的时间复杂度

linux - 运行 ./configure for vlc 时找不到 libavcodec

linux - 当两个文件都由 RANDOM 特殊变量命名时如何不覆盖现有文件

linux - Sudo 使错误 : make:*** [prepare-compiler-check] Error 1

ubuntu - Ubuntu 12.10 上 uWSGI 上的 Flask - 版本不匹配?

ubuntu - 汇编 : Trying to compare two integers - I'm getting the WRONG answer

c - 用户在 C 中输入 int 文件得到 'Access violation'

c - 我的 C 程序中函数返回局部变量错误的地址

linux - 将 bash 脚本限制为其所有者