gpt4 book ai didi

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

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

我正在开发通过调用脚本自动加载所有 *.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/

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