使用libdl API调用打开共享库的区别

时间:2014-06-19 07:42:41

标签: c linker shared-libraries loader

请详细说明调用这两者的不同之处,并建议我在性能和效率方面做得更好。

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 file.c

1 个答案:

答案 0 :(得分:0)

你的示例代码都不是很有用,你的问题也无法回答,而且#34;更好&#34;因为你的2个代码片段做了不同的事情,例如您的第一个代码片段会加载一个额外的共享库,而您的第二个代码片段则不会。

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();