Ich versuche, die Standard-C-Bibliothek unter Mac OS X zu finden. Ich habe Pfade wie versucht: “/usr/lib/libc.a” oder “/usr/lib/libm.a” , aber es gibt keine solchen Dateien das System. Können Sie mir sagen, wo ich es finden kann?
Dann habe ich Terminal auf einem Linux-Rechner verwendet und diesen Befehl ausgeführt:
ar t /usr/lib/libc.a
Es gibt eine Liste von .o-Dateien zurück und diese .o-Dateien sehen folgendermaßen aus:
svc.o
xdr.o
...
Welche Bedeutung haben diese Dateien? wo sind sie zu finden?
Die Standardbibliothek ist unter OS X Teil von libSystem.dylib.
Es sieht so aus:
/usr/lib/libSystem.B.dylib
auf meinem Rechner (MacOS X 10.6.7).
Das kannst du mit herausfinden otool
– dies ist auf einem Mac mit macOS 10.14.2 Mojave, und das (sehr einfache) Programm wurde mit Clang von XCode erstellt:
$ 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
$
Andere Programme haben mehr Bibliotheken. Dieses Tower of Hanoi-Programm wurde beispielsweise mit einem selbstgebauten GCC 8.2.0 und dem erstellt ncurses
Bibliothek:
$ 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)
$
Und ein anderes Programm verwendet noch mehr:
$ 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)
$
Und Systemprogramme können andere Bibliotheken und Frameworks verwenden:
$ 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)
$
Es gibt viele andere Jobs, die damit erledigt werden können otool
— Schauen Sie sich die Manpage an.
Um Ihre zweite Frage zu beantworten: Statische Bibliotheken werden in Archivdateien aufbewahrt, daher die .a
. Als solche sind sie nur Container für eine Reihe von Dateien, genau wie ZIP, TAR, RAR usw., abzüglich jeglicher Komprimierung. Diese Dateien, die von der ar
(steht für Archiv) Utility sind die Originaldateien, die in das Archiv gepackt wurden. Sie könnten es entpacken und die Originaldateien erhalten.
Statische Bibliotheken stehen im krassen Gegensatz zu dynamischen Bibliotheken. Der Inhalt einer statischen Bibliothek wird vom Linker extrahiert und beim Linken in Ihr Programm eingefügt, als wären sie nur Ergebnisse anderer Kompilierungsphasen des Erstellungsprozesses Ihres Programms.
Dynamische Bibliotheken OTOH sind nicht nur Archive von Objektdateien, sondern selbst verknüpfte ausführbare Dateien, und der dynamische Linker ordnet sie dem Adressraum des Verknüpfungsprozesses zu und passt die Symboltabellen an die zugeordnete Adresse an.
Tatsächlich existiert es bei /usr/lib/system/libsystem_c.dylib
.
Sie können das überprüfen mit: $ nm -gU /usr/lib/system/libsystem_c.dylib
Aktualisieren: Die Datei wurde seit MacOS Big Sur verschoben/entfernt.
Um die andere Hälfte Ihrer Frage zu beantworten, verwendet OS X im Allgemeinen keine statischen Bibliotheken (.a
). Insofern gibt es keine libc.a
(oder libSystem.a
) unter OS X.