我有一个成功运行的osx可执行文件。我跑的时候
nm mono | grep UNIX
就此,我得到了这些结果:
U _accept$UNIX2003
U _bind$UNIX2003
U _closedir$UNIX2003
U _connect$UNIX2003
U _fwrite$UNIX2003
U _getpeername$UNIX2003
U _getsockname$UNIX2003
U _listen$UNIX2003
U _mmap$UNIX2003
U _mprotect$UNIX2003
U _munmap$UNIX2003
U _nanosleep$UNIX2003
U _opendir$UNIX2003
U _pthread_cond_timedwait$UNIX2003
U _pthread_cond_wait$UNIX2003
U _pthread_join$UNIX2003
U _recv$UNIX2003
U _recvfrom$UNIX2003
U _recvmsg$UNIX2003
U _semctl$UNIX2003
U _send$UNIX2003
U _sendmsg$UNIX2003
U _sendto$UNIX2003
U _setenv$UNIX2003
U _strftime$UNIX2003
U _unsetenv$UNIX2003
由于应用程序成功运行,显然操作系统在加载应用程序时能够成功解析这些符号。我试图弄清楚哪个系统库定义了这些符号。
可能怀疑是/usr/lib/libSystem.B.dylib,但是,在运行时
nm /usr/lib/libSystem.B.dylib | grep UNIX
那里的$ UNIX2003后缀没有符号。
我想弄清楚这些符号的定义位置,与单独运行的程序上的构建问题无关,但在运行时失败,因为找不到_opendir $ UNIX2003。
答案 0 :(得分:4)
参见本苹果文件Symbol Variants Release Notes中的明确讨论。
所有这些都在/usr/lib/libSystem.B.dylib
中定义。请注意,它是通用dylib
,即包含32位和64位版本。在你的盒子上,你会看到像
/usr/lib$ nm -arch i386 libSystem.dylib | grep fputs
000c22c0 T _fputs
000328bc T _fputs$UNIX2003
/usr/lib$ nm -arch x86_64 libSystem.dylib | grep fputs
00000000000551cf T _fputs
关键是,64位变体中没有这些函数的非SUS兼容版本。所以没有$UNIX2003
变种。我猜您的链接问题是由于您的库支持的体系结构。