Program auf eine andere Linux System ausführen.

Auf Fedora kompiliert, auf Debian laufen lassen!

Warum

  • Ein Web-Konferenz system wirow wurde unter Fedora 35 kompiliert.
  • Testen sollte auf ein VPS mit Debian erfolgen
    Es geht nicht ohne weiteres!

Wirow

  • Wirow ist ein interessante Webkonfrenz system mit einfache Installation
  • Alles, bis auf sehr wenige *.so Bibliotheken sind im Program enthalten.
    libc.so.6
    libgcc_s.so.1
    libm.so.6
    libstdc++.so.6
  • Zur Laufzeit müssen weitere Bibliothekfunktionen eingebunden werden.
  • Die Ausführbare Datei ist nicht kompatible mit /lib64/ld-linux-x86-64.so.2
    Eine Referenz ist nicht definiert, damit endet die Ausführung sofort.

Was sagt uns ldd

$ ldd wirow
    linux-vdso.so.1 (0x00007ffd40571000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f8678aa2000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f86789c6000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f86789ab000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f86787a2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8678cef000)
$ ldd /lib64/libc.so.6
    /lib64/ld-linux-x86-64.so.2 (0x00007f9519cae000)
    linux-vdso.so.1 (0x00007ffcd39c3000)

Hier ist erschtlich, dass der Interpreter sowohl von wirow wie von libc.so.6 refernziert wird.

/lib64/ld-linux-x86-64.so.2

  • /lib64/ld-linux-x86-64.so.2 ist sowohl eine dymamiche Bibliothek (interpreter) wie ein ausführbare Programm.
  • Als Bibliothek sorgt es für das Laden weitere dynamische Bibliotheken.

Es gilt der Debian Interpreter /lib64/ld-linux-x86-64.so.2 durch den Interpreter der Linux Distribution zu ersetzen, ohne negative Rückwirkung auf das Original Debian System zu erhalten.

patchelf

  • Patchelf kann die Bibliotheken und ausführbare Programme verändern.
    Ein neuen Interpreter kan angegeben werden.
    Referenzierte Bibiotheken können verändert werden.

Aus den patchelf Manual

...
--set-interpreter INTERPRETER
...
--replace-needed LIB_ORIG LIB_NEW

Was ist zu tun?

  • Ordner Anlegen, beispielsweise /opt/lib-wirow
  • Eingebundene Bibliotheken im Ordner kopieren
  • Interpreter /lib64/ld-linux-x86-64.so.2 ebenfalls im Ordner kopieren
  • mit patchelf die notwendige Einträge (Ausführbaren und ld-linux-x86-64.so.2

Patch Beispiel

patchelf --replace-needed libc.so.6 /opt/lib-wirow/libc.so.6 wirow
patchelf --replace-needed libm.so.6 /opt/lib-wirow/libc.so.6 wirow
patchelf --replace-needed libgcc_s.so.1 /opt/lib-wirow/libgcc_s.so.1 wirow
patchelf --replace-needed libstdc++.so.6 /opt/lib-wirow/libstdc++.so.6 wirow
patchelf --set-interpreter /opt/lib-wirow/ld-linux-x86-64.so.2 wirow

Die einbezogene Biliotheken beinhalten auch Verweise auf Bibliotheken. “Patchen” der Bibliotheken ist auch notwendig

Biblothek patchen

patchelf --print-interpreter \<Datei>

Gibt an ob ein interpreter eingesetzt wird

patchelf --print-needed \<Datei>

gibt eine Liste der einbezogene Biliotheken

ldd  \<Datei>

zeigt auch den Pfad der einbezogene Datei an.

Von Fedora zu Debian

  • Dein inhalt von /opt/lib-wirow sowie das ausführbare Program (wirow) auf das Debian System bringen
  • Ausführbare Program normal ausführen

Bein Aufruf vom Program, wird nach der Interpreter geschaut, er wird vom Verpzeichnis /opt/lib-wirow/ geladen Danach werden die Bibliotheken aus dem Ordner /opt/lib-wirow/, sie sind mit ein absoluten Pfad versehen.

Die bibliotheken können auch relativ zum Aufrufverzeichnis des Programs angegeben werden. In dem Fall muss mindestens ein “/” in der Referenz vorhanden sein, z.B. “./lib-wirow”.

Wenn das Ausführbare Program aus der Verzeichnis /var/lib/wirow aufgerufen wird und lie Bibliotheken sich im Verzeichnis /var/lib/wirow/lib-wirow, sollte es funktionnieren.