Ich habe eine ausführbare Datei, die nur von libc abhängt. Die Ausgabe von ldd ist:
%Vor% Ich habe dies auf und alten CentOS 6. kompiliert% /lib64/libc.so.6
sagt:
Wie sicher ist es, diese ausführbare Datei auf einer anderen Version von Linux auszuführen? Insbesondere ist es sicher, auf Ubuntu- und Debian-Computern zu laufen, die eglibc
haben? Die ausführbare Datei, die ich kompiliert habe, scheint auf 12.04 LTS gut zu laufen, aber kann ich darauf vertrauen, dass sie keine subtilen Fehler hat und auch auf anderen Versionen dieser Distributionen läuft?
@javidcf ist insofern korrekt, als eglibc und glibc ABI-kompatibel sind, weil Sie kein Problem haben sollten, etwas auszuführen, das mit glibc auf eglibc im allgemeinen Sinn kompiliert wird.
Allerdings können Probleme auftreten, die nicht mit glibc vs. eglibc, sondern mit glibc version skew zusammenhängen. Bestimmte Glibc-Funktionen werden mit einer Version am Ende von ihnen markiert (z. B. 'printf @@ GLIBC_2.2.5', wenn sie in nm angezeigt werden, oder indem Sie Strings für die Binärdatei und grepping für GLIBC ausführen). Ich glaube, dass diese eine Art Mindestanforderung an glibc-Version darstellen, um die resultierende Binärdatei auszuführen. Einfache Programme können nur wenige (oder keine) dieser Typfunktionen haben. Komplexe Programme können mehrere Anforderungen haben. Hier ist das Ergebnis der Ausführung von Strings in meiner Firefox-Binärdatei unter Ubuntu 14.04:
%Vor%Dies bedeutet, dass ich mindestens Version 2.17 der glibc-Bibliothek benötigen würde, um die Symbole zu finden, die benötigt werden, um dieses Programm auszuführen.
Das Ergebnis ist, dass eine Binärdatei, die auf älteren Distributionen kompiliert wurde, gute Chancen hat, an einer neueren zu arbeiten. aber ein auf einer neueren Distribution kompilierter Binärcode gegen einen neueren glibc, der neuere Versionen von Funktionen verwenden kann, die mit höheren Mindestanforderungen versehen werden, wird auf älteren Systemen wahrscheinlich nicht funktionieren. Zum Beispiel könnte Ihre CentOS 6-Binärdatei nicht auf CentOS 5 oder Ubuntu 10.04 laufen; aber könnte auf CentOS 7 und Ubuntu 12.04 / 14.04 gut laufen.
Statisches Verknüpfen ist eine bessere Option, wenn Sie eine (wahrscheinlich wahrscheinlicher) wirklich tragbare Binärdatei möchten.
EGLIBC wurde als API- und ABI-kompatibel mit GLIB entwickelt, wie Sie vielleicht auf der Seite mit den Funktionen nachgelesen haben kein Problem, solange Sie die Standardkonfiguration verwenden (wie die Debian-Version) - dh Sie verwenden keine eingeschränkte Version mit weniger Funktionen als GLIBC.
Sie können insbesondere die Ankündigung der Umstellung von Debian auf EGLIBC lesen. Denken Sie daran, dass es von Debian zu EGLIBC nicht sinnvoll gewesen wäre, wenn es nicht vollständig ABI-kompatibel mit GLIBC wäre, da es Legacy-Binärdateien oder nur Software, die nicht aus den Debian-Repositories stammt, hätte brechen können.
Wenn Sie eine eingeschränkte Version von EGLIBC verwenden, sollten Sie keine Probleme haben, es sei denn, Sie verwenden einige der Funktionen, die aus der Bibliothek entfernt wurden. Zum Beispiel sollte eine mit GLIBC kompilierte Binärdatei mit einer EGLIBC-Version ohne Sockets funktionieren, solange sie diese nicht verwendet.