Wo ist die Standard-C-Bibliothek unter Mac OS X?

Lesezeit: 4 Minuten

Benutzer-Avatar
Oliver

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 aus wie /usr/lib/libSystem.dylib ist nur ein symbolischer Link zu /usr/lib/libSystem.B.dylibab 10.12.

    – BIP2

    12. September 2017 um 5:03 Uhr

  • @GDP2: Ja, .B ist die aktuelle Version; Link-Skripte sollten normalerweise Link dagegen libSystem.dylib (-lSystem), jedoch.

    – Stefan Kanon

    13. September 2017 um 20:42 Uhr


  • Ja, das hilft wahrscheinlich bei der Abwärtskompatibilität und so.

    – BIP2

    13. September 2017 um 20:57 Uhr

  • existiert libSystem.dylib noch in mac os 10.13? Ich kann nur eine Reihe von libSystem_XXX.dylib-Dateien finden.

    – QED

    12. Dezember 2018 um 19:11 Uhr

  • @QED: Die libsystem_xxx.dylib-Dateien befinden sich in /usr/lib/system/. libSystem.B.dylib selbst befindet sich in /usr/lib/. Die Rolle des alten libSystem.dylib-Symlinks wird jetzt von libSystem.tbd ausgefüllt, das sich im SDK befindet.

    – Stefan Kanon

    12. Dezember 2018 um 21:13 Uhr


Benutzer-Avatar
Jonathan Leffler

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.

Benutzer-Avatar
Datenwolf

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.

Benutzer-Avatar
Limettenrot

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.

1371890cookie-checkWo ist die Standard-C-Bibliothek unter Mac OS X?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy