【问题标题】:How to export symbols from POSIX shared library and load using dlopen, dlsym如何从 POSIX 共享库中导出符号并使用 dlopen、dlsym 加载
【发布时间】:2017-06-08 21:07:14
【问题描述】:

我们正在使用 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 中,我们似乎也无法连接到库。以下是源代码:

包括

包括

使用命名空间标准;

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,上面的代码会打印“Symbol not found” 但它在 dlclose 上崩溃了。

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

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

【问题讨论】:

  • 在 cygwin 中用 .so 尝试了同样的事情,同样的问题。试图获得一个存在的符号不会返回任何结果。
  • 可能需要明确导出,例如extern "C" __attribute__ ((visibility ("default"))) char *getX (void) { return x; }
  • 试过了,没区别。名字很可疑,如果是默认的,为什么要设置呢?
  • 它在 unix 中工作......当你使用 Windows/MacOS 时,你可以试试这个 pragma:__declspec(dllexport)
  • 你也可以在编译中添加-fPIC -DPIC

标签: linux macos shared-libraries dylib dlsym


【解决方案1】:

在您的示例中,您编写了if (so = nullptr) {,它将nullptr 分配给so,并且条件始终为假。 -Wall 是调试时的好主意!

仅此一项就解释了为什么您无法加载符号,但我还发现我需要执行dlopen("./foo.so", RTLD_NOW);,因为dlopen 否则会搜索库路径,而不是当前目录。

【讨论】:

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