2010-07-12 52 views
0

我有一個成功運行的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 

由於應用程序成功地運行,顯然OS能夠在加載應用程序成功地解決這些符號。我想弄清楚哪個系統庫定義了這些符號。

一個可能的嫌疑人是/usr/lib/libSystem.B.dylib,但是,運行

nm /usr/lib/libSystem.B.dylib | grep UNIX 

有變成是在那裏沒有符號與$ UNIX2003後綴時。

我想弄清楚這些符號是在哪裏定義的,涉及到一個單獨的程序的構建問題,這個問題沒有成功運行,但在運行時失敗,因爲它找不到_opendir $ UNIX2003。

回答

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變種。我想你的鏈接問題是由於你的庫支持的體系結構。

+0

很好的答案,謝謝!徹底解決了我一直在努力的問題。 – 2010-07-13 09:01:03

相關問題