Wie führe ich x86_64-Programme ohne Arch auf Apple Silicon aus?

Hintergrund

Nachdem ich ein M1 MacBook Air bekommen hatte, wollte ich einige Befehlszeilenpakete installieren. Nach diesem Blogbeitrag habe ich Terminal.app dupliziert und so eingestellt, dass es mit Rosetta ausgeführt wird. htopMit diesem x86_64-Terminal habe ich Nix installiert und damit , , usw. installiert. nnnDiese laufen im x86_64-Terminal einwandfrei.

Sie funktionieren jedoch auch im nativen Terminal ohne arch. Das macht mich verwirrt, weil ich beim Lesen dieses Beitrags dachte, ich müsste arch -x86_64vor dem Befehl hinzufügen, um ihn mit Rosetta auszuführen.

Screenshot der Befehlsausgabe

Der fileBefehl sagt mir, dass die Binärdatei keine Version für Apple Silicon hat.

Frage

Wie htoperfolgreich gelaufen?

Antworten (2)

  • Wenn Rosetta installiert ist, führt das System automatisch x64-Binärdateien aus, die Sie nicht benötigenarch
  • archist nur erforderlich, wenn Sie die Verwendung einer bestimmten Version in einer universellen Binärdatei (die sowohl x64- als auch Arm-Code enthält) erzwingen möchten, z. B. um die x64-Version einer Binärdatei auszuführen, wenn sie auf Plugins angewiesen ist, die nur in x64 verfügbar sind.
Wann sollte ich im Allgemeinen die Verwendung der x64-Version in einer universellen Binärdatei erzwingen?
@uselessledteyelid ZB wenn die Binärdatei Plugins benötigt, die nur für x64 kompiliert sind.
Nitpick: Möglicherweise benötigen Sie auch arch, wenn Sie x64 bereits über Rosetta ausführen und eine weitere Binärdatei im ARM-Modus von innen starten möchten: stackoverflow.com/questions/66705777/…

TL;DR: Die Binärdatei selbst bettet Informationen darüber ein, um welche Architektur es sich handelt, und das Betriebssystem sieht sich diese an, um zu entscheiden, wie es ausgeführt werden soll. archist nur erforderlich, um die Verwendung einer bestimmten Architekturvariante einer universellen Binärdatei zu erzwingen.


Alle modernen ausführbaren Dateiformate, einschließlich des von macOS verwendeten Mach-O-Formats, des von den meisten anderen UNIX-ähnlichen Systemen verwendeten ELF-Formats und des von Windows und UEFI verwendeten PE-Formats, betten Informationen über die CPU-Architektur des Codes in den Dateiheader ein in der Datei ist und in welcher Umgebung (oder Betriebssystem) sie ausgeführt werden soll.

Wenn Sie eine ausführbare Datei aufrufen, passiert als Erstes, dass ein Teil des Betriebssystems, der normalerweise als „Ladeprogramm für ausführbare Dateien“ bekannt ist, sich die Datei ansieht und entscheidet, wie sie in den Speicher geladen und tatsächlich ausgeführt wird. Der ausführbare Lader ist im Allgemeinen ziemlich intelligent und kann normalerweise feststellen, dass er einen Interpreter oder eine Übersetzungsschicht verwenden muss, bevor er den Code überhaupt in den Speicher lädt. Ein triviales Beispiel dafür ist die Behandlung von Skripten, die mit einem beginnen #!. Der ausführbare Ladeprogramm im Betriebssystem sieht diese #!Zeile und weiß, dass es bedeutet, den Befehl danach auszuführen und den Pfad zum Skript als Positionsargument zu übergeben.

Die gleiche Logik gilt für diese Informationen darüber, für welche CPU-Architektur die ausführbare Datei bestimmt ist. In macOS für Apple-Silizium gibt es einen Sonderfall im ausführbaren Ladeprogrammcode, der versucht, Binärdateien für x86_64-CPUs mit Rosetta 2 auszuführen, wenn es installiert ist. Wenn Rosetta 2 nicht installiert ist, erhalten Sie nur eine Fehlermeldung, dass die ausführbare Datei nicht ausgeführt werden konnte, aber wenn dies der Fall ist, wird die ausführbare Datei einfach nahtlos ausgeführt, ohne Sie zu stören.

Der archBefehl existiert hauptsächlich für den Spezialfall des Ausführens von universellen Binärdateien. Mit dem Mach-O-Format und dem Standard-Loader-Code in macOS führt das Betriebssystem die erste gültige Version eines Programms in einer universellen Binärdatei aus, die der Host-CPU entspricht. Indem Sie jedoch verwenden arch, können Sie das System explizit zwingen, die x86_64-Version auf einem System auszuführen, auf dem Rosetta 2 installiert ist. Dasselbe konnte in der Vergangenheit getan werden, um die 32-Bit-Version einer Binärdatei explizit auf einem 64-Bit-System auszuführen. Das klingt irgendwie sinnlos, aber es ist nützlich für Entwickler zu überprüfen, ob ihre universellen Binärdateien korrekt funktionieren, wenn sie nur Zugriff auf einen Hardwaretyp haben.


Nebenbei bemerkt, diese Art der Laufzeitflexibilität kann auf einigen Plattformen noch weiter ausgebaut werden. Linux hat beispielsweise eine Funktion namens, binfmt_miscmit der Sie beliebige Interpreter mit beliebigen Dateitypen verknüpfen können. Historisch entstand dies, um Dinge wie die Behandlung von JAR-Dateien als normale ausführbare Dateien zu unterstützen, aber es wird heute aktiv zusammen mit der QEMU-Userspace-Emulation verwendet, um die gleichen Dinge zu tun, die macOS mit Rosetta 2 für noch mehr CPU-Architekturen tut.