Debian: Welche Anweisungen verwenden x86-64-Binärdateien?

7

Ich möchte wissen, ob Binärdateien spezielle Befehlssätze wie SSE 4.1 / 4.2, AVX, F16C verwenden (für diese kompiliert wurden) oder nicht. Wie kann ich herausfinden, ob eine Binärdatei in einem Paket bestimmte Befehlssätze verwendet?

Ich weiß, dass ich solche Anweisungen mithilfe von configureSchaltern aktivieren kann, wenn ich Pakete von Hand kompiliere, aber wenn ich vorkompilierte Pakete aus dem Debian-Repository verwende, muss es einen Standard geben.

Wahrscheinlich werden Binärdateien nicht mit zu spezifischen Befehlssätzen kompiliert, da sie auf keinem System verwendet werden können, oder sie werden je nach Binärdatei mit alternativen Unterroutinen kompiliert, die die Verarbeitung mit grundlegenden Anweisungen "emulieren", um CPUs zu unterstützen, denen solche Funktionen fehlen.

Ich weiß, dass ich in die rulesDatei eines Debian-Quellpakets schauen könnte, aber ich bin interessiert, ob es einen einfacheren Weg gibt, dies zu tun.

  • Sind die CPU-Anweisungen, die eine x86-64-Binärdatei verwendet, sehr begrenzt?
  • Dürfen Pakete ganz bestimmte Befehlssätze verwenden, können sie Fallbacks mit primitiveren Befehlen haben?
versuchen Sie es endlich
quelle

Antworten:

6

Um Ihre Frage allgemein zu beantworten, gibt /superuser/726395/how-to-check-if-a-binary-requires-sse4-or-avx-on-linux ein Skript an, das zerlegt werden kann binär (die Ausgabe von objdump) und versucht, den minimal erforderlichen Befehlssatz herauszufinden. Diese Technik ist notwendigerweise ungefähr, da eine gegebene Binärdatei abhängig vom verfügbaren Befehlssatz unterschiedliche Ausführungspfade haben kann und eine solche Binärdatei anscheinend den "besten" Befehlssatz erfordert, den sie unterstützt, obwohl sie tatsächlich ohne sie ausgeführt werden kann.

Insbesondere in Bezug auf Debian-Pakete muss alles, was für amd64(den 64-Bit-Befehlssatz "PC") gepackt ist, auf jeder AMD64- oder x86-64-kompatiblen CPU ausgeführt werden können. Dies bedeutet , dass der vollständige 64-Bit-Standardbefehlssatz verwendet werden kann, der SSE2 enthält. Andere Funktionen (einschließlich der von Ihnen aufgelisteten) können jedoch nur verwendet werden, wenn Fallbacks für CPUs bereitgestellt werden, die diese nicht unterstützen. Es gibt Ausnahmen, aber die Pakete sollten dies in der Paketbeschreibung angeben (siehe zum Beispiel rr).

Der Linux-Kernel selbst kann seine Funktionen an die der CPU anpassen, auf der er ausgeführt wird. Wenn es für x86-64 kompiliert ist, wird davon ausgegangen, dass es eine TSC, CMPXCHG64, CMOV verwenden kann (suchen Sie nach allem, was von X86_64diesem Link abhängt ). Es kann jedoch kompiliert werden, um zur Laufzeit zu prüfen, ob Funktionen wie AES-NI, AVX, AVX2 verfügbar sind, und diese insbesondere zur Beschleunigung von Kryptoberechnungen zu verwenden. Dies kann jedem Programm zugute kommen, das diese Funktionen verwendet (auf Kosten von Kontextwechseln in den Kernel).

In einigen Fällen kann der dynamische Linker auch dazu beitragen, je nach CPU Alternativen bereitzustellen: Auf diese Weise libc6-i686wird eine Reihe von Bibliotheken für die i386Architektur bereitgestellt , die automatisch anstelle der Bare-Bones-Entsprechungen auf CPUs verwendet werden, die mit dem i686Befehlssatz kompatibel sind (und CMOV unterstützen).

Stephen Kitt
quelle