首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从POSIX共享库导出符号并使用dlopen,dlsym加载

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

Stack Overflow用户
提问于 2017-06-08 21:07:14
回答 1查看 707关注 0票数 0

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

首先是编译。关于cygwin:

代码语言:javascript
复制
extern "C" void foo() { }


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

不显示公共符号。这似乎就是问题所在。如果我能公开他们,nm -D应该显示他们。

使用:

代码语言:javascript
复制
nm libfoo.so | grep foo

000000x0xx0x00x0x0  T _foo

你可以看到符号在那里。在Linux中,这似乎是可行的:

代码语言:javascript
复制
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中,我们似乎也无法连接到库。以下是源代码:

包括

包括

使用命名空间std;

代码语言:javascript
复制
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上,-D显示库中的符号,但是加载符号的代码不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-27 05:40:39

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

这本身就解释了为什么不能加载符号,但我也发现我需要执行dlopen("./foo.so", RTLD_NOW);,因为否则dlopen会搜索库路径,而不是当前目录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44445582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档