Ответ 1
Стандартная библиотека является частью libSystem.dylib для OS X.
Я пытаюсь найти стандартную библиотеку 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
...
Каковы значения этих файлов? где их найти?
Стандартная библиотека является частью libSystem.dylib для OS X.
Похоже, что это:
/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
- посмотрите страницу руководства.
Чтобы ответить на ваш второй вопрос: статические библиотеки хранятся в архивных файлах, поэтому .a
. Таким образом, они просто контейнеры для кучи файлов, как ZIP, TAR, RAR и т.д. Минус любое сжатие. Эти файлы, перечисленные утилитой ar
(означает архив), являются исходными файлами, упакованными в архив. Вы можете распаковать его и получить исходные файлы.
Статические библиотеки резко контрастируют с динамическими библиотеками. Содержимое статической библиотеки извлекается компоновщиком и включается в вашу программу при связывании, как если бы это были просто результаты других этапов компиляции процесса сборки вашей программы.
Динамические библиотеки OTOH - это не только архивы объектных файлов, но и связанные с ними исполняемые файлы сами по себе, а динамический компоновщик сопоставляет их в адресное пространство процессов связывания и настраивает таблицы символов в соответствии с отображаемым адресом.
Чтобы ответить на другую половину вашего вопроса, OS X обычно не использует статические библиотеки (.a
). Таким образом, на OS X нет libc.a
(или libSystem.a
).
На самом деле он существует в /usr/lib/system/libsystem_c.dylib
.
Вы можете проверить, что с помощью: $ nm -gU /usr/lib/system/libsystem_c.dylib