Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从加载了dlopen的共享库中引用全局符号_C_Shared Libraries_Dlopen_Dlsym - Fatal编程技术网

C 从加载了dlopen的共享库中引用全局符号

C 从加载了dlopen的共享库中引用全局符号,c,shared-libraries,dlopen,dlsym,C,Shared Libraries,Dlopen,Dlsym,我有一个共享库,我想从主程序访问符号。例如: main.c #include <stdio.h> void bar(void) { puts("bar"); } extern void foo(void); int main(void) { foo(); return 0; } #include <stdio.h> #include <dlfcn.h> void bar(void) { puts("bar"); } int main

我有一个共享库,我想从主程序访问符号。例如:

main.c

#include <stdio.h>

void bar(void) { puts("bar"); }

extern void foo(void);

int main(void) {
    foo();
    return 0;
}
#include <stdio.h>
#include <dlfcn.h>

void bar(void) { puts("bar"); }

int main(void) {
    void *handle = dlopen("./libfoo.so", RTLD_LAZY);
    void (*foo)(void) = (void(*)(void))dlsym(handle,"foo");
    foo();
    return 0;
}
我编译和运行如下:

gcc -c -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -L$(pwd) -o test main.c -lfoo
./test
我得到了我期望的结果:

foo
bar
但是,我必须使用
dlopen()
dlsym()
,因为我想控制加载库的时间。更改的文件包括:

main.c

#include <stdio.h>

void bar(void) { puts("bar"); }

extern void foo(void);

int main(void) {
    foo();
    return 0;
}
#include <stdio.h>
#include <dlfcn.h>

void bar(void) { puts("bar"); }

int main(void) {
    void *handle = dlopen("./libfoo.so", RTLD_LAZY);
    void (*foo)(void) = (void(*)(void))dlsym(handle,"foo");
    foo();
    return 0;
}
我改为编译并运行:

gcc -c -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -o test main.c -ldl
./test
然而,这次我得到了输出

foo
./test: symbol lookup error: ./libfoo.so: undefined symbol: bar

如何从libfoo引用主程序中的符号?

链接
测试时,必须添加
-rdynamic
选项:

gcc -o test main.c -ldl -rdynamic
发件人:

-动力学 将flag-export-dynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(而不仅仅是已使用的符号)添加到动态符号表中。此选项对于dlopen的某些使用或允许从程序中获取回溯是必需的