代码之家  ›  专栏  ›  技术社区  ›  Lucas Meijer

OSX中定义的xxx$unix2003函数在哪里?

  •  0
  • Lucas Meijer  · 技术社区  · 15 年前

    我有一个可以成功运行的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 回复  |  直到 15 年前
        1
  •  4
  •   Yuji    15 年前

    见本苹果文件中的明确讨论, 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 变体。我想您的链接问题是由您的库的支持的体系结构引起的。