Mach-O 共享库(`.dylib`s)是否支持符号版本控制?

Do Mach-O shared libraries (`.dylib`s) support symbol versioning?

我 运行 遇到了一些段错误,这些段错误似乎在 linux 平台上由 ELF 动态库中的 symbol versioning 解决了。但我在 macOS 上仍然遇到段错误。 Mach-O 共享库中是否有类似的功能?如果是这样,我怎样才能看到文件中的版本信息?

例如,我知道在 linux 上我可以做 readelf -s libsomething.so,它会输出版本信息和符号。但是 readelf.dylib 个文件上阻塞。

不是真的,但你可以自己动手。

举个例子,Apple 实际上已经对 stat() 函数族进行了某种符号版本控制。根据宏定义,stat 的声明将扩展为:

int stat(const char *, struct stat *) __asm("_stat");

或者这样:

int stat(const char *, struct stat *) __asm("_stat$INODE64");

这就是库导出的样子:

% nm -arch x86_64 /usr/lib//system/libsystem_kernel.dylib | fgrep ' _stat'
0000000000009650 T _stat
0000000000001fd8 T _stat$INODE64
0000000000001fd8 T _stat64
00000000000250dc T _statfs
0000000000002e4c T _statfs$INODE64
0000000000002e4c T _statfs64

(请注意,您 必须 在那里使用 x86_64 版本,因为 arm64 版本从一开始就没有旧的实现,因此 _stat 已经有新版本了。)

但是如果您只是一个库的用户,那么除非您用不匹配的结构和函数定义破坏了 headers,否则这不会解决您的段错误问题。