我試圖使這個OSX代碼(golfed爲便於討論)在Ubuntu Linux上工作。兄弟之間的.so文件中的符號的可見性
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!
但是,我不能讓needer
到即使整個「鏈」編譯爲-rdynamic
:
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
0見
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
的答案也是朝正確方向邁出的一步。
謝謝! :D(我已編輯您的評論以包含剪切和粘貼的代碼。) – Quuxplusone