osx中定义的xxx $ UNIX2003函数在哪里?

时间:2010-07-12 19:30:36

标签: macos unix

我有一个成功运行的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。

1 个答案:

答案 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变种。我猜您的链接问题是由于您的库支持的体系结构。