如何从POSIX共享库导出符号并使用dlopen,dlsym加载

时间:2017-06-08 21:07:15

标签: linux macos shared-libraries dylib dlsym

我们正在使用dlopen读取Mac OS X上的动态库。更新: 这是一个posix问题,同样的事情在cygwin下失败了。

首先编译。关于cygwin:

extern "C" void foo() { }


g++ -shared foo.c -o libfoo.so
nm -D libfoo.so

不显示公共符号。这似乎是个问题。如果我可以公开它们,nm -D应该显示它们。

使用:

nm libfoo.so | grep foo

000000x0xx0x00x0x0  T _foo

你可以看到符号在那里。在Linux中,这似乎有效:

nm -D foo.so
0000000000201020 B __bss_start
                 w __cxa_finalize
0000000000201020 D _edata
0000000000201028 B _end
0000000000000608 T _fini
0000000000000600 T foo
                 w __gmon_start__
00000000000004c0 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses

然而,即使在Linux中,我们也似乎无法连接到库。这是源代码:

包括

包括

使用namespace std;

int main() {
    void* so = dlopen("foo.so", RTLD_NOW);
    if (so = nullptr) {
        cerr << "Can't open shared library\n";
        exit(-1);
    }
    #if 0
    const void* sym = dlsym(so, "foo");
    if (sym == nullptr) {
        cout << "Symbol not found\n";
    }
    #endif
    dlclose(so);
}

如果删除#ifdef,上面的代码会打印“找不到符号” 但它在dlclose上崩溃了。

我们尝试导出LD_LIBRARY_PATH =。只是为了看看是否无法访问图书馆。并且dlopen调用似乎在任何情况下都有效,返回不是nullptr。

总而言之,该库似乎不适用于Mac和Cygwin。在Linux上,nm -D显示库中的符号,但加载符号的代码不起作用。

0 个答案:

没有答案