Mac OS X上的标准C库在哪里?

时间:2011-06-05 02:23:03

标签: c macos

我试图在Mac OS X上找到标准的C库。我尝试过像“/usr/lib/libc.a”或“/usr/lib/libm.a”这样的路径,但是没有系统上的此类文件。你能告诉我在哪里找到它吗?

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

ar t /usr/lib/libc.a

它返回一个.o文件列表,那些.o文件是这样的:

svc.o
xdr.o
...

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

5 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:10)

看起来像是:

/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
$

其他程序有更多库。例如,这个河内塔计划是使用自制的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完成许多其他工作 - 请查看手册页。

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

您可以使用:$ nm -gU /usr/lib/system/libsystem_c.dylib

进行验证