Где находится стандартная библиотека C в Mac OS X? - PullRequest
17 голосов
/ 05 июня 2011

Я пытаюсь найти стандартную библиотеку C в Mac OS X. Я пробовал пути, например: "/usr/lib/libc.a" или "/usr/lib/libm.a", но нет такие файлы в системе. Не могли бы вы сказать мне, где его найти?

Затем я использовал Terminal на машине с Linux и запустил такую ​​команду:

ar t /usr/lib/libc.a

Возвращает список файлов .o, и эти файлы .o выглядят так:

svc.o
xdr.o
...

Что означают эти файлы? где их найти?

Ответы [ 5 ]

20 голосов
/ 05 июня 2011

Стандартная библиотека является частью libSystem.dylib на OS X.

10 голосов
/ 05 июня 2011

Похоже, что это:

/usr/lib/libSystem.B.dylib

на моем компьютере (MacOS X 10.6.7).


Вы можете узнать, используя otool - это на Mac с MacOS 10.14.2 Mojave, и (очень простая) программа была построена с использованием Clang из XCode:

$ 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 - посмотрите справочную страницу.

6 голосов
/ 05 июня 2011

Чтобы ответить на ваш второй вопрос: статические библиотеки хранятся в архивных файлах, следовательно, .a.Как таковые, они являются просто контейнерами для множества файлов, таких как ZIP, TAR, RAR и т. Д., За исключением любого сжатия.Файлы, перечисленные утилитой ar (расшифровывается как archive ), являются оригинальными файлами, упакованными в архив.Вы можете распаковать его и получить исходные файлы.

Статические библиотеки резко контрастируют с динамическими библиотеками.Содержимое статической библиотеки извлекается компоновщиком и включается в вашу программу при компоновке, как если бы они были просто результатами других этапов компиляции процесса сборки вашей программы.

Динамические библиотеки OTOH - это не просто архивы объектных файлов,но они сами являются связанными исполняемыми файлами, и динамический компоновщик отображает их в адресное пространство процессов компоновки и корректирует таблицы символов в соответствии с сопоставленным адресом.

4 голосов
/ 02 мая 2017

На самом деле он существует в /usr/lib/system/libsystem_c.dylib.

. Вы можете проверить это с помощью: $ nm -gU /usr/lib/system/libsystem_c.dylib

4 голосов
/ 05 июня 2011

Чтобы ответить на другую половину вашего вопроса, OS X обычно не использует статические библиотеки (.a). Таким образом, в OS X нет libc.a (или libSystem.a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...