我试图允许共享库从正在加载的进程中调用一个函数.该库是用C语言编写的,C语言是C++中的"内核".
kernel.cpp:
#include#include typedef void(*func_t)(); extern "C" { void test(); } int main() { char *error; void *handle = dlopen("./library.so", RTLD_LAZY); if((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return 1; } func_t init = (func_t)dlsym(handle, "init"); if((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return 1; } init(); return 0; } void test() { fprintf(stderr, "test() called.\n"); }
LIBRARY.C:
#includevoid test(); void init() { fprintf(stderr, "init() called.\n"); test(); }
生成文件:
all: g++ -ldl kernel.cpp -o kernel gcc -fpic -shared library.c -o library.so ./kernel
objdump -x内核
SYMBOL TABLE: ... 000000000040088b g F .text 0000000000000024 test
运行程序,我得到以下输出:
init() called. ./kernel: symbol lookup error: ./library.so: undefined symbol: test
如果我将dlopen更改为使用RTLD_NOW,我会得到:
./library.so: undefined symbol: test
为什么图书馆很难找到那个符号,当它明显没有被破坏,坐在那里?