【发布时间】:2011-12-17 19:31:59
【问题描述】:
我正在开发通过调用脚本自动加载所有 *.so 模块库的系统。
我尝试更新其中一个模块以支持 XML-RPC。我在 Ubuntu 10.10 上使用了库 ibxmlrpc-c3-dev。 dlopen() 在我的更改后失败并且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;
}
【问题讨论】:
-
使用DLL不会导致编译错误;它们是动态链接库。
-
确实,更多细节可能会有所帮助。一般来说,我建议使用
gdb进行调试并使用vim进行修复。 -
我只添加了inludes语句和一个函数,我注释掉了大部分测试行,但dlopen仍然失败
-
你能粘贴调用
dlopen和dlerror的代码吗? -
dlopen的参数是什么? (路径是绝对路径吗,见realpath函数)?
标签: c linux ubuntu shared-libraries