我遇到了一个无法解决的问题。查看我到目前为止找到的所有内容。 我的问题是,我在我的程序中创建了一个dyn库,想要将它dlopen并从该lib中删除一个方法。
似乎dlopen有效,但是dlsym会给我错误“ undefined symbol:method ”
其中“方法”是我传递给dlsym的方法的名称。
以下是我创建库的方法:
execl("/usr/bin/gcc", "gcc", "-fPIC", "-Wall", "-g", "-c", "userinput.c", NULL);
和
execl("/usr/bin/gcc", "gcc", "-ggdb3", "-shared",
"-Wl,-soname,libuserinput.so.1", "-o", "libuserinput.so.1.0",
"userinput.o", "-lc", NULL);
这应该可以在运行我的代码后有一个库。
我像这样打开图书馆:
static void *my_load_dyn (const char *lib) {
static void *handle;
handle = dlopen ("./libuserinput.so.1.0", RTLD_NOW | RTLD_DEEPBIND);
if (handle == NULL) {
printf ("error at dlopen(): %s\n", dlerror ());
exit (EXIT_FAILURE);
}
return handle;
}
/* load func from dyn lib"*/
static void *my_load_func (void *handle, char *func) {
void *funcptr = dlsym (handle, func);
if (funcptr == NULL) {
printf ("error at dlsym(): %s\n", dlerror ());
exit (EXIT_FAILURE);
}
return funcptr;
}
并调用这样的函数:
void *libhandle;
void (*userMethod) (unsigned char *d);
libhandle = my_load_dyn(LIBUSERINPUT);
userMethod = my_load_func(libhandle, "testMethod");
(*userMethod)(d);
编辑: 这是userinput.c的代码:
#include <stdio.h>
#include <unistd.h>
void testMethod(unsigned char *d)
{
d[0] = 'Z';
}
它在我的程序中生成,也在正在运行的程序中编译和链接
答案 0 :(得分:0)
我可以看到两个可能的问题
代码中存在问题
您确定在method
中将userinput.c
声明为公共功能吗?
e.g。如果您的方法声明为static
,那么它将无法从“外部”访问。
还有其他方法可以将隐藏函数从库外看到,但是如果没有看到任何代码,就无法判断你是否遇到了这个问题。
您的库的编译/链接已损坏
e.g。你似乎是在一个头文件(userinput.h
)中链接到结果库?
我建议在问题解决之前使用正确的构建系统,然后切换到动态编译(例如使用make
)