首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libdl API调用打开共享库的区别

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

Stack Overflow用户
提问于 2014-06-19 15:42:41
回答 1查看 695关注 0票数 0

请说明调用这两种方法的不同之处,并建议我哪种方法在性能和效率方面更好。

代码语言:javascript
复制
handle = dlopen("libxx.so", RTLD_GLOBAL| RTLD_NOW);
dlsym(handle, "func"); 

代码语言:javascript
复制
const char* dlfunc = dlsym(RTLD_DEFAULT, "func");

此程序适用于我,并给出一个有效的指针地址:

代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

发布于 2014-06-19 16:01:34

你的两个示例代码都没有多少用处,你的问题也无法得到回答,也不是“更好”,因为你的两个代码片段做了不同的事情,例如你的第一个代码片段加载了一个额外的共享库,而第二个代码片段没有。

dlopen()允许您加载共享库。

dlsym()允许您获取指向共享库或当前加载的代码(当前可执行文件+当前任何共享库)中的符号的指针。符号可以是例如函数或变量。

下面是一个加载共享库并调用共享库中具有原型void func(void)函数的示例

代码语言:javascript
复制
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获取指向当前加载的可执行文件(或共享库中当前链接的任何文件)中函数的指针的示例。

代码语言:javascript
复制
void (*func_ptr)(void)  = dlsym(RTLD_DEFAULT, "func");  //get a pointer to the "func" symbol
func_ptr(); //call the function through our function pointer

后一段代码可以通过直接调用该函数来完成:

代码语言:javascript
复制
  func();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24301281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档