【问题标题】:Where is the standard C library on Mac OS X?Mac OS X 上的标准 C 库在哪里?
【发布时间】:2011-06-05 02:23:02
【问题描述】:

我正在尝试在 Mac OS X 上查找标准 C 库。我尝试过以下路径: "/usr/lib/libc.a" 或 "/usr/lib/libm.a" ,但没有系统上的此类文件。你能告诉我在哪里可以找到它吗?

然后我在 Linux 机器上使用终端并运行这样的命令:

ar t /usr/lib/libc.a

它返回一个 .o 文件列表,这些 .o 文件如下所示:

svc.o
xdr.o
...

这些文件的含义是什么?在哪里可以找到它们?

【问题讨论】:

    标签: c macos


    【解决方案1】:

    标准库是 OS X 上 libSystem.dylib 的一部分。

    【讨论】:

    • 从 10.12 开始,/usr/lib/libSystem.dylib 似乎只是 /usr/lib/libSystem.B.dylib 的符号链接。
    • @GDP2:是的,.B 是当前版本;链接脚本应该通常链接到libSystem.dylib (-lSystem),但是。
    • 是的,这可能有助于向后兼容等。
    • 在 mac os 10.13 中是否还存在 libSystem.dylib?只能找到一系列libSystem_XXX.dylib文件。
    • @QED:libsystem_xxx.dylib 文件位于 /usr/lib/system/ 中。 libSystem.B.dylib 本身位于 /usr/lib/ 中。旧的 libSystem.dylib 符号链接的角色现在由 SDK 中的 libSystem.tbd 代替。
    【解决方案2】:

    看起来是这样的:

    /usr/lib/libSystem.B.dylib
    

    在我的机器上 (MacOS X 10.6.7)。


    您可以使用otool 找到答案——这是在运行 macOS 10.14.2 Mojave 的 Mac 上,并且(非常简单的)程序是使用 XCode 中的 Clang 构建的:

    $ otool -L al
    al:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    $ clang --version
    Apple LLVM version 10.0.0 (clang-1000.11.45.5)
    Target: x86_64-apple-darwin18.2.0
    Thread model: posix
    InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
    $
    

    其他程序有更多的库。例如,这个 Hanoi Tower 程序是使用自制的 GCC 8.2.0 和 ncurses 库构建的:

    $ otool -L hanoi
    hanoi:
        /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
        /opt/gcc/v8.2.0/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    $
    

    另一个程序使用更多:

    $ otool -L $(which sqlcmd)
    /Users/jonathanleffler/bin/sqlcmd:
        /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
        /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
        isqls09b.dylib (compatibility version 0.0.0, current version 0.0.0)
        iasfs09b.dylib (compatibility version 0.0.0, current version 0.0.0)
        igens09a.dylib (compatibility version 0.0.0, current version 0.0.0)
        iosls09a.dylib (compatibility version 0.0.0, current version 0.0.0)
        sobj4/igl4a304.dylib (compatibility version 0.0.0, current version 0.0.0)
        sobj4/iglxa304.dylib (compatibility version 0.0.0, current version 0.0.0)
        /System/Library/Frameworks/DirectoryService.framework/Versions/A/DirectoryService (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
        /opt/gcc/v8.2.0/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    $
    

    并且系统程序可能会使用其他库和框架:

    $ otool -L $(which passwd)
    /usr/bin/passwd:
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1561.0.0)
        /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libpam.2.dylib (compatibility version 3.0.0, current version 3.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    $ otool -L /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome 
    /Applications/Google Chrome.app/Contents/MacOS/Google Chrome:
        /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
        /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1349.63.0)
        /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
        /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 57740.51.2)
        /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 888.51.1)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
    $
    

    otool 可以完成许多其他工作——查看手册页。

    【讨论】:

      【解决方案3】:

      回答你的第二个问题:静态库保存在存档文件中,因此.a。因此,它们只是一堆文件的容器,就像 ZIP、TAR、RAR 等减去任何压缩。 ar(代表archive)实用程序列出的那些文件是打包到存档中的原始文件。您可以将其解压缩并获取原始文件。

      静态库与动态库形成鲜明对比。静态库的内容由链接器提取并在链接时包含到您的程序中,就好像它们只是程序构建过程的其他编译阶段的结果一样。

      动态库 OTOH 不仅仅是目标文件的存档,它们本身是链接的可执行文件,动态链接器将它们映射到链接进程地址空间并调整符号表以匹配映射的地址。

      【讨论】:

        【解决方案4】:

        实际上它确实存在于/usr/lib/system/libsystem_c.dylib

        您可以通过以下方式验证:$ nm -gU /usr/lib/system/libsystem_c.dylib

        更新:该文件自 MacOS Big Sur 以来已被移动/删除。

        【讨论】:

          【解决方案5】:

          要回答您问题的另一半,OS X 通常不使用静态库 (.a)。因此,OS X 上没有libc.a(或libSystem.a)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-31
            • 2016-11-26
            • 2013-03-27
            相关资源
            最近更新 更多