【问题标题】:Referencing global symbols from shared library loaded with dlopen从使用 dlopen 加载的共享库中引用全局符号
【发布时间】:2015-09-20 10:25:35
【问题描述】:

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

main.c

#include <stdio.h>

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

extern void foo(void);

int main(void) {
    foo();
    return 0;
}

foo.c

#include <stdio.h>

extern void bar(void);

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

我编译和运行如下:

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>
#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;
}

foo.c

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

extern void bar(void);

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

我改为编译和运行:

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 引用主程序中的符号?

【问题讨论】:

    标签: c shared-libraries dlopen dlsym


    【解决方案1】:

    链接test时必须添加-rdynamic选项:

    gcc -o test main.c -ldl -rdynamic
    

    来自here

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

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2015-03-02
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多