自己编写的so,引用so里面的函数时通过objdump地址为什么是绝对地址而不是动态链接库进行动态解析的,怎么可以像printf一样使用动态链接库进行动态解析
时间: 2023-12-10 22:37:31 浏览: 191
当你编写的程序引用so里面的函数时,它会使用绝对地址来调用这些函数。这是因为在编译时,链接器将这些函数的地址写入了可执行文件中,而不是在运行时动态链接库进行动态解析。
如果你想像printf一样使用动态链接库进行动态解析,可以使用dlopen和dlsym函数。dlopen函数可以打开动态链接库,并返回一个句柄,然后通过dlsym函数根据函数名获取函数指针,最后通过函数指针调用函数。
以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *handle = dlopen("libtest.so", RTLD_LAZY);
if (!handle) {
printf("Failed to open library: %s\n", dlerror());
return 1;
}
typedef void (*hello_t)();
hello_t hello = (hello_t)dlsym(handle, "hello");
if (!hello) {
printf("Failed to get symbol: %s\n", dlerror());
return 1;
}
hello();
dlclose(handle);
return 0;
}
```
这个例子中,我们使用dlopen函数打开动态链接库,然后使用dlsym函数获取hello函数的指针,最后通过函数指针调用hello函数。注意,在使用dlsym函数获取函数指针时,需要指定函数类型。
阅读全文