请说明调用这两种方法的不同之处,并建议我哪种方法在性能和效率方面更好。
handle = dlopen("libxx.so", RTLD_GLOBAL| RTLD_NOW);
dlsym(handle, "func"); 或
const char* dlfunc = dlsym(RTLD_DEFAULT, "func");此程序适用于我,并给出一个有效的指针地址:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
int main() {
/* void* handle = dlopen("libXt.so", RTLD_GLOBAL| RTLD_NOW);
dlsym(handle, "XtStrings"); */
const char* dlfunc = dlsym(RTLD_DEFAULT, "XtStrings");
if(!dlfunc) {
fprintf(stderr, "--- %s\n", dlerror());
} else {
printf("DEFAULT: %p\n", dlfunc);
return;
}
dlfunc = dlsym(RTLD_NEXT, "XtStrings");
if(!dlfunc) fprintf(stderr, "--- %s\n", dlerror());
printf("NEXT: %p\n", dlfunc);
}编译使用: gcc -ldl -L/usr/lib/x86_64-linux-gnu -lXt文件c
发布于 2014-06-19 16:01:34
你的两个示例代码都没有多少用处,你的问题也无法得到回答,也不是“更好”,因为你的两个代码片段做了不同的事情,例如你的第一个代码片段加载了一个额外的共享库,而第二个代码片段没有。
dlopen()允许您加载共享库。
dlsym()允许您获取指向共享库或当前加载的代码(当前可执行文件+当前任何共享库)中的符号的指针。符号可以是例如函数或变量。
下面是一个加载共享库并调用共享库中具有原型void func(void)函数的示例
void *handle = dlopen("libxx.so", RTLD_GLOBAL| RTLD_NOW); //load the shared library
void (*func_ptr)(void) = dlsym(handle, "func"); //get a pointer to the "func" symbol
func_ptr(); //call the function through our function pointer下面是使用dlsym获取指向当前加载的可执行文件(或共享库中当前链接的任何文件)中函数的指针的示例。
void (*func_ptr)(void) = dlsym(RTLD_DEFAULT, "func"); //get a pointer to the "func" symbol
func_ptr(); //call the function through our function pointer后一段代码可以通过直接调用该函数来完成:
func();https://stackoverflow.com/questions/24301281
复制相似问题