dylib中缺少符号

Missing symbols from a dylib

本文关键字:符号 dylib      更新时间:2023-10-16

我正在尝试围绕c++库制作C api,以便稍后可以将其封装在Golang中。我首先简单地生成一个带有一个函数的dylib,这样我就有了参考资料。然后,我对我想要使用的实际库做了一个包装。当我从简单的dylib生成所有的符号时,我得到了这个:

MacbookMainframe:c hydroflame$ nm -a clib/libxyz.dylib 
0000000000000f90 T _Hello
                 U dyld_stub_binder

,我只声明了一个名为Hello的函数,到目前为止一切顺利

当我做了我认为对实际库等价的事情时,go包装器不会编译,并且在

处生成的符号
MacbookMainframe:c hydroflame$ nm -a ../luxengine.net/steamc/libsteam.dylib 
                 U _SteamAPI_Init
0000000000000f60 T __Z14SteamCAPI_Initv
                 U dyld_stub_binder

我期待的符号是_SteamCAPI_Init(下划线,因为显然Hello生成_Hello,但我得到了一些奇怪的东西。

是我的编译错误,还是应该生成正常的符号?

源文件可在这里获得(只有大约30行重要行):
https://github.com/luxengine/steam
https://github.com/luxengine/steamc

编辑(供将来的读者使用):

我在写的时候的问题是,我的头文件声明有extern "C" {,但我的源文件没有,所以gcc会把名字弄乱,而cgo找不到它。

MacbookMainframe:steamc hydroflame$ nm -a libsteam.dylib 
                 U _SteamAPI_Init
0000000000000f60 T _SteamCAPI_Init
                 U dyld_stub_binder

首先,dyld_stub_binder是编译c++时默认生成的符号。你不需要关心它。

其次,__Z14SteamCAPI_Initv实际上是正确的符号。由于c++支持重载,c++函数是用混乱的符号名编译的,这样函数名就不会相互冲突。例如,您有两个函数void do_something(int a)void do_something(int a, int b),如果函数名没有混淆,链接器将如何解析符号名?

关于c++名称混淆的信息可以在这里找到