我尝试使用动态链接,但无法获得有效的示例。我的库代码是:
dyn_shl.c:
#include <stdio.h>
#include <dyn_shl.h>
void hello (void)
{
puts("Hello, Im a loaded shared library");
}
头文件(dyn_shl.h)
extern void hello(void);
我编译它们:
gcc -fPIC -g -c source/dyn_shl.c -o objects/dyn_shl.o -Iincludes/ -DDEBUG -Wall
gcc -shared -W1,-soname,libhello.so -o objects/libhello.so objects/dyn_shl.o
现在 nm -D objects/libhello.so 显示:
0000000000201030 B __bss_start
w __cxa_finalize
0000000000201030 D _edata
0000000000201040 B _end
0000000000000648 T _fini
w __gmon_start__
00000000000005f4 T hello
00000000000004d8 T _init
w _Jv_RegisterClasses
U puts
我的 hello 符号位于 00000000000005f4。
我的主要来源在 dyn_ratd.c:
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>
int main (void)
{
void* lib;
void (*print_my)(void);
char *error;
lib = dlopen("/root/dev/src/wm_rat/objects/libhello.so",RTLD_NOW);
if(lib = NULL) {
return printf("ERROR: Cannot load library");
}
print_my = dlsym(lib, "hello");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
}
我用它构建
gcc -rdynamic -o bin/dyn_ratd source/dyn_ratd.c -ldl
当我运行 bin/dyn_ratd 时,我得到 undefined symbol :你好
我不明白我错在哪里。有人知道我缺少什么吗?
最佳答案
这是你的问题:
if(lib = NULL) {
您不是将比较 lib
与 NULL,而是为其分配 NULL。这就是 dlsym
调用失败的原因。
将分配更改为比较:
if(lib == NULL) {
如果您使用 -Wall
编译主要源代码,它会警告您这一点。
关于C dlsym undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35896521/