我遇到了一些segfault,这些segfault似乎可以在linux平台上通过ELF动态库中的符号版本控制来解决。但我仍然在macOS上遇到segfault。Mach-O共享库中是否有类似的功能?如果是,我如何在文件中查看版本信息?
例如,我知道在linux上我可以执行readelf -s libsomething.so
,它会输出版本信息和符号。但是readelf
阻塞了.dylib
文件。
不是真的,但你可以自己滚动。
举个例子,苹果实际上已经对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
已经有了新版本。(
但是,如果您只是一个库的用户,那么除非您使用不匹配的结构和函数定义破坏了标头,否则这不会解决segfault问题。