gpt4 book ai didi

c - 同级 .so 文件中符号的可见性

转载 作者:行者123 更新时间:2023-11-30 17:49:12 26 4
gpt4 key购买 nike

我正在尝试使此 OSX 代码(golfed 以便于讨论)在 Ubuntu Linux 上运行。

cat >main.c <<EOF
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void provided_by_main() { puts("Hello main!"); }
int main() {
void *provider_so, *needer_so;
(provider_so = dlopen("provider.so", RTLD_NOW)) || printf("Fail %s\n", dlerror()) && (exit(0),0);
(needer_so = dlopen("needer.so", RTLD_NOW)) || printf("Fail %s\n", dlerror()) && (exit(0),0);
void (*needer)() = dlsym(needer_so, "needer");
needer();
}
EOF

cat >needer.c <<EOF
extern void provider();
void needer() { provider(); }
EOF

cat >provider.c <<EOF
#include <stdio.h>
void provider() { puts("Hello provider!"); }
EOF

gcc -shared -o provider.so provider.c
gcc -shared -o needer.so needer.c -dynamic -undefined dynamic_lookup
gcc -o main main.c -ldl
./main
Hello provider!

在 Linux 上,通过反复试验和 StackOverflow,我确定 needer 无法引用 main 中定义的任何内容,除非 main 已链接与-rdynamic:

gcc -shared -fpic -o provider.so provider.c
gcc -shared -fpic -o needer.so needer.c -Dprovider=provided_by_main
gcc -o main main.c -ldl -rdynamic
./main
Hello main!

但是,即使整个“链”是用 -rdynamic 编译的,我也无法让 needer 查看 provider 提供的任何内容:

gcc -shared -fpic -o provider.so provider.c -rdynamic
gcc -shared -fpic -o needer.so needer.c
gcc -o main main.c -ldl -rdynamic
./main
Fail needer.so: undefined symbol: provider

那么,我该如何完成这项工作呢?

或者,如果在 Linux 上这在设计上是不可能的,那么为什么它被设计成不可能的?

(OSX 等效项: Accessing main program global variables from a dlopen()ed dynamic library in C on OS X )

现实世界的额外复杂性:在我的实际程序中,provider.so 是在运行时生成的代码,并且 provider 的名称> 符号只有在 main 链接后​​才能确定。然而,即使涉及修改 main.c 的答案也将是朝着正确方向迈出的一步。

最佳答案

这在 OS X 上有效而在 Linux 上失败的原因是 RTLD_GLOBAL 是 dlopen 在前者上的默认符号可见性,而后者默认为 RTLD_LOCAL。使用(小心):

dlopen("provider.so", RTLD_NOW | RTLD_GLOBAL);

-rdynamic 另一方面仅适用于在可执行文件中定义的缺失库符号,但不适用于其他任何地方。

<小时/>
sed -i 's/RTLD_NOW/RTLD_NOW|RTLD_GLOBAL/' main.c
gcc -shared -fpic -o provider.so provider.c
gcc -shared -fpic -o needer.so needer.c
gcc -o main main.c -ldl
./main
Hello provider!

关于c - 同级 .so 文件中符号的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027721/

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