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

qc6wkl3g  于 2023-01-25  发布在  Mac
关注(0)|答案(5)|浏览(252)

我正在尝试查找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
...

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

b4lqfgs4

b4lqfgs41#

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

rqenqsqc

rqenqsqc2#

看起来是的

/usr/lib/libSystem.B.dylib

在我的机器上(Mac OS X v10.6.7(Snow Leopard))。
你可以使用otool来找到答案--这是在一台运行macOS v10.14.2(莫哈韦)的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

其他程序有更多的库,例如,这个Tower of Hanoi程序是用一个自制的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完成-请查看手册页。

stszievb

stszievb3#

回答你的第二个问题:静态库保存在归档文件中,因此.a。因此它们只是一堆文件的容器,就像ZIPTARRAR等,没有任何压缩。ar(代表 archive)实用程序列出的那些文件是打包到归档文件中的原始文件。您可以解包并获得原始文件。
静态库与动态库形成了鲜明的对比。静态库的内容由链接器提取,并在链接时包含到程序中,就好像它们只是程序构建过程中其他编译阶段的结果一样。
另一方面,动态库不仅仅是目标文件的存档,它们本身也是链接的可执行文件,动态链接器将它们Map到链接进程的地址空间,并调整符号表以匹配Map的地址。

gg0vcinb

gg0vcinb4#

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

h79rfbju

h79rfbju5#

实际上,它确实存在于/usr/lib/system/libsystem_c.dylib
您可以通过以下方式进行验证:nm -gU /usr/lib/system/libsystem_c.dylib
该文件自macOS v11(Big Sur)以来已移动/删除。

相关问题