首页 > 解决方案 > dlsym 找不到 nm 列出的符号

问题描述

我在使用以下简单示例程序时遇到问题,当我在基于 ubuntu:bionic 的 docker 容器中编译和运行程序时,在我的 mac 上运行(我不明白为什么这会相关,但我想强调我在我的 Mac 上本地运行这个程序没有问题)。

#include <dlfcn.h>
#include <iostream>

extern "C" void myFunc() { }

int main() {
    auto handle = dlopen(NULL, RTLD_LAZY|RTLD_GLOBAL );
    dlerror();
    std::cout << "symbol addr = " << dlsym(handle,"myFunc") << std::endl;
    if (auto e = dlerror(); e) std::cout << " error = " << e << std::endl;
    dlclose(handle);
    return 0;
}

输出是:

symbol addr = 0
 error = ./myExe: undefined symbol: myFunc

但如果我这样做了,nm ./myExe我会看到:0000000000000be0 T myFunc列为 day

为了比较,在mac(clang编译器)上编译和运行完全相同的东西我得到:

symbol addr = 0x10ccdc090

和 nm 列表:(0000000100001080 T _myFunc我注意到在 mac 上下划线前缀似乎是一个东西,但不影响 dlsym 找到符号)

说真的,我在这里错过了什么?谢谢!

标签: c++

解决方案


推荐阅读