Was ist ein Shim?

Ein Shim ist eine kleine Bibliothek, die Aufrufe an eine andere Bibliothek abfängt und verändert, hauptsächlich um die Kompatibilität zu unterstützen.

Die Pflege mehrerer Versionen einer Bibliothek ist notwendig, um Ihre Kunden zu unterstützen. Shim-Bibliotheken übersetzen alte in neue Bibliotheksaufrufe, bevor sie an die neue Bibliothek weitergeleitet werden.

Beispiel 1:

Linux-Installationen kommen normalerweise mit einer einzigen Ruby-Version. Ruby-Entwickler müssen verschiedene Ruby-Versionen für ihre vielen aktiven Projekte haben. Rbenv verwendet Shims, um dieses Problem zu lösen.

Die Ausführung eines Ruby-Befehls in Linux bedeutet, dass nach der ausführbaren Datei im Pfad gesucht wird – und zwar von links nach rechts. So bedeutet das Ausführen des Ruby-Befehls rails server, dass Linux Rails, eine ausführbare Ruby-Datei, im ersten Verzeichnis findet und ausführt.

Rails App normal ausführen

Rbenv fügt ein shims Verzeichnis hinzu und lädt es mit Shim-Skripten, bevor es den Pfad voranstellt. Für jede Ruby-Anwendung gibt es ein Shim-Skript, und das Ausführen einer Ruby-Anwendung bedeutet nun das Ausführen des passenden Shim-Skripts. Die Ausführung von Rails bedeutet also die Ausführung des Rails-Skripts im Verzeichnis shims und nicht die Ausführung der Rails-Anwendung in usr/local/bin. Das Skript ermittelt die erforderliche Ruby-Version und führt dann die passende Anwendung, in diesem Fall Rails, unter der erwarteten Ruby-Version aus.

Beispiel 2:

Microsoft verwendet Shims, um die Windows-Aufrufe einer Anwendung vorzutäuschen. Wenn eine Anwendung einen Systemaufruf tätigt, durchläuft sie die ‚Import Address Table‘.

Eine Anwendung, die Windows von der IAT aus aufruft

Sie können die Tabelle ändern und den Windows-Aufruf durch einen Aufruf an ein Shim ersetzen. Das Shim im Beispiel ist ein ‚version-lie‘ Shim. Die Anwendung denkt, dass sie sich auf einem Windows 7-Rechner befindet.

Ein Anwendungsaufruf, der von IAT zu einem Shim umgeleitet wird

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.