gpt4 book ai didi

linux - dlopening 一个有依赖关系的库

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:44 31 4
gpt4 key购买 nike

我有一个程序调用 dlopen(使用 RTLD_NOW)来动态加载一个库,该库的完整路径在运行时指定,但程序首次执行时不知道。指定的库动态链接到另一个 .so 文件,该文件的位置直到程序启动后才知道,但在调用 dlopen 之前是已知的。关于如何使这种情况起作用的任何想法?谢谢!

最佳答案

将它传递给第一个动态加载库中的方法

三.c:

#include <stdio.h>

void
doit()
{
printf("Success\n");
}

二.c:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

void go(const char* location)
{
void *handle;
void (*doit)(void);
char *error;

handle = dlopen(location, RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}

dlerror();

*(void **) (&doit) = dlsym(handle, "doit");

if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}

(*doit)();
dlclose(handle);
}

主.c:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int
main(int argc, char **argv)
{
void *handle;
void (*go)(const char*);
char *error;

handle = dlopen("/tmp/two.so", RTLD_NOW);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return EXIT_FAILURE;
}

dlerror();

const char* location = "/tmp/three.so";
*(void **) (&go) = dlsym(handle, "go");

if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
return EXIT_FAILURE;
}

(*go)(location);
dlclose(handle);

return EXIT_SUCCESS;
}

结果:

svengali ~ % gcc -o /tmp/two.so two.c -shared -rdynamic -fpic
svengali ~ % gcc -o /tmp/three.so three.c -shared -rdynamic -fpic
svengali ~ % gcc -rdynamic -o go main.c -ldl
svengali ~ % go
Success
svengali ~ %

关于linux - dlopening 一个有依赖关系的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766067/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com