Führen Sie Rosetta 2 manuell auf x86-Binärdateien aus

Ich habe ein sehr einfaches C-Programm geschrieben und mein Ziel ist es, eine reine x86-Binärdatei zu erstellen und diese Binärdatei dann auf einem Apple Silicon Mac auszuführen und sie von Rosetta 2 in eine Universal 2-Binärdatei übersetzen zu lassen. Ich möchte mir speziell die Rosetta 2-übersetzte Binärdatei ansehen; Ich möchte selbst keine Universal 2-App erstellen (das wäre trivial).

Ich habe versucht, das Programm über Terminal ( ) auszuführen $ ./helloworldund es sogar in eine zu stecken .app, es in den Anwendungsordner zu legen und darauf zu doppelklicken. In beiden Fällen läuft das Programm korrekt, aber laut $ file helloworldist die Binärdatei immer noch nur x86 (Rosetta 2 hat keine ausführbare arm64-Datei hinzugefügt).

Irgendeine Idee, wie man Rosetta 2 zwingen kann, eine Binärdatei zu übersetzen?

Suchen Sie nach Rosetta, um eine ausführbare arm64-Datei aus der x86-Binärdatei zu erstellen? Warum bauen Sie die App nicht einfach als arm64?
@ErniePC12 Ja. Ich möchte die übersetzte arm64-Binärdatei zerlegen und mit einer nativ erstellten Binärdatei vergleichen.
Um das Öffnen der App unter Rosetta zu erzwingen, aktivieren Sie das Kontrollkästchen im Fenster „Informationen abrufen“. Aber ich bin mir nicht sicher, ob es die App mit der übersetzten Binärdatei ändern würde. Es würde diese übersetzte Binärdatei wahrscheinlich irgendwo in einer Sandbox platzieren. Überprüfen Sie vielleicht /Library/Application Support/?
Rosetta funktioniert nicht so – es ist ein Emulator , der Anweisungen zur Laufzeit übersetzt. Während einige Anweisungen vor der ersten Ausführung übersetzt werden, kann und tut Rosetta dies nicht für die gesamte ausführbare Datei. (Nun, vielleicht könnte es theoretisch für ein sehr einfaches Programm funktionieren , aber es ist nicht dafür ausgelegt, so zu funktionieren, weil es im allgemeinen Fall nicht möglich ist.)
Wowfunhappy: völlig falsch. Rosetta2 ist Übersetzerin.
Nun, vielleicht hätte ich klarer sagen sollen, dass es ein Hybrid ist – es übersetzt einige Abschnitte, emuliert aber andere. Sie können eine Binärdatei nicht vollständig im Voraus übersetzen, da die Binärdatei ihren eigenen Code umschreiben kann. Rosettas "Übersetzung" ist nicht so autark, wie es sich das OP vorstellt.
@Wowfunhappy Mir ist bewusst, dass einige Binärdateien nicht vollständig im Voraus übersetzt werden können (z. B. JIT-Code), aber Rosetta 2 führt während der Installation einige Übersetzungen durch. Im Falle meines Hello-World-Programms sollte es alles übersetzen können, aber selbst wenn nicht, muss es etwas übersetzen . Mein Ziel ist es herauszufinden, wie diese Übersetzung ausgelöst wird und wo die übersetzte Binärdatei landet.

Antworten (2)

Dies ist ein bisschen spät, aber Sie können direkt oahd-helperzwei Dateideskriptoren ausführen und übergeben (die x86-Binärdatei, die als erster übersetzt werden soll, und eine Datei, in die der übersetzte Bin als zweiter ausgegeben wird). Der Speicherort von oahd-helpervariiert (auf Big Sur ist es in /Library/Apple/usr/libexec/oah, auf Monterey ist es /usr/libexec/rosetta). Ich habe eine Zusammenfassung erstellt, die den Vorgang vereinfacht. Sie finden sie hier: https://gist.github.com/sunflsks/00fe7c740f3b1d9668f55dff80707d03

Danke schön! Ihr Bash-Skript hat bei mir funktioniert.
Ist dies in der Lage, an einzelnen Objektdateien oder nur an vollständigen Binärdateien zu arbeiten? Gibt es irgendetwas, das dies auf Objektdateiebene tun kann?
@MalcolmMacLeod hast du jemals herausgefunden, ob dies Objekte konvertieren könnte?
@David Leider nein, habe die Aufgabe, die ich mir dafür vorgestellt hatte, vorübergehend für wichtigere Dinge auf Eis gelegt ... Immer noch etwas, das ich mir in naher Zukunft ansehen muss, also sehr an der Antwort interessiert. Wird hier aktualisieren, wenn/falls ich es versuche, wenn niemand zuerst dort ankommt.
Wie kann ich dies für nicht ausführbare Binärdateien wie Bundles, Plug-ins oder Bibliotheken tun?

Wenn Sie ein Programm in C geschrieben haben, kompilieren Sie das Programm einfach zweimal mit der Mac-Version von gccund verwenden Sie dann lipo, um sie zu einem Programm zu kombinieren.

Siehe https://developer.apple.com/documentation/xcode/building_a_universal_macos_binary für Apples Erläuterung des Prozesses zum Erstellen einer universellen Binärdatei (enthält sowohl x86_64 als auch ARM64)

Danke für die Antwort. Mein Ziel ist es, die von Rosetta 2 übersetzte Binärdatei zu zerlegen und mit einer nativ kompilierten Binärdatei zu vergleichen (um eine Vorstellung davon zu bekommen, wie Rosetta 2 funktioniert). Ich habe meine Frage aktualisiert, um dies klarzustellen. Um Ihre Antwort zu ergänzen: Wenn das Ziel darin besteht, eine Universal 2-Binärdatei zu erstellen (was in meinem Fall nicht der Fall ist), können Sie einfach Xcode verwenden und das Build-Gerät auf „Any Mac (Apple Silicon, Intel)“ setzen. ".