So führen Sie Software aus, die nicht über Paketmanager angeboten wird und ia32-libs erfordert

So führen Sie Software aus, die nicht über Paketmanager angeboten wird und ia32-libs erfordert

Ich versuche, den dedizierten Arma 2 OA-Server auf einer Virtualbox-VM zu installieren, damit ich meine eigenen Missionen in einer Sandbox-Umgebung testen und sie auf einen anderen Computer in meinem Netzwerk auslagern kann. (Auf dem anderen Computer läuft die VM, aber es ist eine Windows-Maschine, und ich wollte mich nicht mit der Installation herumschlagen.) Es werden mindestens 2, vorzugsweise 4 GB RAM benötigt, also dachte ich, ich würde die AMD64-Version von Ubuntu 13.10 installieren, um das zum Laufen zu bringen.

'Wie führt man ein 32-Bit-Programm auf einer 64-Bit-Version von Ubuntu aus?' hat bereits erklärt, wie 32-Bit-Software über apt-get und/oder dpkg installiert wird, aber das trifft in diesem Fall nicht zu.

Der Server wird als komprimierter Download auf der Site von BI Studio angeboten, dem Entwickler der Arma-Spiele. Die Installationsanweisungen sind offensichtlich nicht mehr auf dem neuesten Stand der Technik. (Wahrscheinlich, weil der Stand der Technik erst vor kurzem aktualisiert wurde :) ) Dort steht, dass ich ia32-libs installieren muss, was mittlerweile anscheinend veraltet ist. Jetzt muss ich herausfinden, wie ich die richtigen Pakete installiere, damit es funktioniert.

Mein Erfahrungsniveau in diesen Fragen ist eher Anfänger-Mittelstufe. Ich habe viele Pakete über apt-get installiert; ich habe in der Vergangenheit Abhängigkeitsprobleme gelöst; ich habe nicht viel Software ohne Paketmanager installiert. Ich komme mit grundlegenden Verwaltungsaufgaben wie dem Bearbeiten von Conf-Dateien und dergleichen gut zurecht.

Ich habe gerade versucht, es zu installieren, ohne ia32-libs über apt-get zu installieren, sondern gcc zu installieren, um die Bibliotheken doch zu bekommen. Meine Überlegung ist, dass gcc die Dateien für die Abwärtskompatibilität der Codierung einschließt und unter Linux alle Bibliotheken (soweit ich das beurteilen kann) auf Systemebene in installiert sind /libs. Bisher scheint es zu starten. (Ich kann mich über meinen Netzwerkbrowser im Spiel mit dem Spieleserver verbinden, es kommuniziert also.) Ich bin nicht sicher, ob beim Ausführen des Spieleserverprogramms eine Abhängigkeitsprüfung stattfindet, daher bleiben mir ein paar Fragen:

  • Erfasst 13.10 alle Aufrufe der ia32libs-Bibliotheken und übersetzt sie auf amd64 in den richtigen Code?
  • Wenn es läuft, bedeutet das, dass alle benötigten Bibliotheken korrekt geladen wurden, oder besteht die Möglichkeit, dass es später abstürzt, wenn doch eine benötigte Bibliothek fehlt?
  • Ist eine Problemumgehung wie die Installation von gcc erforderlich? (zusammen mit den i386-Bibliotheken)
  • Wie finde ich heraus, welche Bibliotheken ich zum Ausführen dieser Software benötige? (oder jeder anderen 32-Bit-Software, die nicht über einen Paketmanager angeboten wird)

  • Antwort1

    Es hängt hauptsächlich von der Software und ihrer Schreibweise ab. In solchen Fällen würde ich mich für die 32-Bit-Debian-Binärdatei (falls verfügbar) oder die kompilierte 32-Bit-Binärdatei entscheiden. Dies wurde bereits in meiner Antwort erklärt.Wie führt man ein 32-Bit-Programm auf einer 64-Bit-Version von Ubuntu aus?und demonstrierte sogar, dass eine 64-Bit-Version eines 32-Bit-Systems ausgeführt werden kann (was vor einigen Jahren noch unmöglich war).Tatsächlich ist es einfacher, 32-Bit-Anwendungen auf 64-Bit-Systemen auszuführen.

    Normalerweise werden Sie beim Ausführen der Binärdatei über fehlende Bibliotheken informiert, die Sie in den Repositorys nachschlagen können.

    Erfasst 13.10 alle Aufrufe der ia32libs-Bibliotheken und übersetzt sie auf amd64 in den richtigen Code?

    Nein. Das sollten Entwickler tun. Das System zeigt nur die Bibliotheken an, die den GNU Linker verwenden ld. Wenn die Software versucht, „hard-code“-Bibliotheken zu verwenden, muss man sie austricksen und auf die richtigen Bibliotheken verweisen. Moderne, gut geschriebene Software braucht das nicht.

    Wenn es läuft, bedeutet das, dass alle benötigten Bibliotheken korrekt geladen wurden, oder besteht die Gefahr, dass es später abstürzt, wenn doch eine benötigte Bibliothek fehlt?

    Wenn es läuft, ist alles perfekt. Allerdings werden Bibliotheken beim Start der ausführbaren Datei geladen, und ohne sie (d. h. einige von ihnen fehlen) wird es nicht gestartet, aber selbst wenn sie vorhanden sind, werden nicht alle Aufrufe beim Start ausgeführt, sodass möglicherweise ein bestimmter Aufruf einer bestimmten Funktion das Verhalten geändert hat und die Anwendung dies nicht unterstützt, was zu einem Absturz führt. Dies sind Sonderfälle, aber sie sind möglich. Sie werden also wahrscheinlich bemerken, wenn es Inkompatibilitäten mit neueren Bibliotheken gibt. Das ist jedoch ein ganz anderes Problem. Um das zu beheben, müssen Sie sich entweder an die neuen Bibliotheken anpassen oder die bereits installierten herunterstufen.

    Ist ein Workaround wie beispielsweise die Installation von gcc notwendig?

    gccist ein Compiler. Sie müssen ihn nur installieren, wenn Sie Code mit C oder C++ kompilieren. In anderen Fällen ist möglicherweise ein Workaround erforderlich, aber ich habe noch keine „Binärdatei“ (bereits kompilierte ausführbare Datei) gesehen, die den gccCompiler zum Ausführen benötigt.

    Wie finde ich heraus, welche Bibliotheken ich zum Ausführen dieser Software benötige? (oder jeder anderen 32-Bit-Software, die nicht über einen Paketmanager angeboten wird)

    Ist zwar etwas brachial, aber wenn in der Anleitung nicht genau steht, welche Bibliotheken du brauchst, dann nutze doch den ld-linux.so --listBefehl. Beispiel:

    $ /lib64/ld-linux-x86-64.so.2 --list /bin/bash
        linux-vdso.so.1 =>  (0x00007fffd479f000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f0d39138000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0d38f34000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d38b6a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0d3937f000
    

    (die lddBinärdatei liefert die gleiche Ausgabe, danke an @ubfan)

    Wie Sie sehen, bashverwendet linux-vdso, libtinfo.so, libdl.so und libc.so. Wenn diese Bibliotheken korrekt sind, bashist man mit ihnen zufrieden. Dies ist fürdynamisch verknüpfte Binärdateien. Sie können stattdessen verwenden, --verifyum zu überprüfen, ob die Binärdatei wirklich dynamisch verknüpft ist.

    Dann nehmen Sie den Namen der Bibliotheken, sagen wirlibtinfo.so.5, die in den Paketen enthalten waren:

    File                                Packages
    /lib/i386-linux-gnu/libtinfo.so.5   libtinfo5 [not amd64]
    /lib/x86_64-linux-gnu/libtinfo.so.5 libtinfo5 [not i386]
    /lib32/libtinfo.so.5                lib32tinfo5 [not i386]
    /lib64/libtinfo.so.5                lib64tinfo5 [not amd64]
    /usr/lib/debug/libtinfo.so.5        libtinfo5-dbg
    /usr/libx32/libtinfo.so.5           libx32tinfo5
    

    Wir müssen also nur das richtige Paket für die Architektur der Binärdatei installieren (wenn es 32-Bit ist, fügen Sie :i386dem Namen des Pakets „64-Bit“ hinzu :amd64) und schon kann es losgehen.

    Es versteht sich von selbst, dass Ihre CPU 64-Bit-fähig sein muss, um 64-Bit-Binärdateien auf einer 32-Bit-Plattform ausführen zu können (die meisten Systeme ab 2008 sind das) und höchstwahrscheinlich einen installierten 64-Bit-Kernel erfordert.

    verwandte Informationen