Funktioniert meine Linux-Binärdatei auf allen Distributionen?


24

Ich habe eine gute Ersatz-IDE für Delphi namens Lazarus gefunden. Aber ich habe keine Frage an Programmierer.

Funktioniert die statisch verknüpfte Linux-Binärdatei auf allen Linux-Distributionen? Dh es ist egal auf welcher Linux Distribution ich es gebaut habe und es wird auf Debian / ArchLinux / Ubuntu / OpenSUSE / ... was auch immer funktionieren?

Kommt es nach meinen Erkenntnissen wirklich nur auf 32-Bit vs. 64-Bit an? Ich möchte sicher sein, bevor ich veröffentliche.



Können Sie genauer beschreiben, mit welchen Bibliotheken Sie Ihr Programm verknüpfen möchten? Einige Bibliotheken haben versteckte Abhängigkeiten (Datendateien, dynamische Subsysteme) oder andere implizite Annahmen über das System, auf dem sie ausgeführt werden.
Thomas Erker

Antworten:


29

Diese Antwort wurde zuerst für die allgemeinere Frage "Läuft meine Binärdatei auf allen Distributionen?" Geschrieben, befasst sich jedoch mit statisch verknüpften Binärdateien in der zweiten Hälfte.


Für alles, was komplexer ist als eine statisch verknüpfte Hallo-Welt, lautet die Antwort wahrscheinlich nein .
Ohne vorher zu testen auf Verteilung X nehmen die Antwort ist nicht für X.

Wenn Sie Ihre Software in binärer Form versenden möchten, beschränken Sie sich auf

  • Einige beliebte Distributionen für den Einsatzbereich Ihrer Software (Desktop, Server, Embedded, ...)

  • die neuesten ein oder zwei Versionen von jedem

Andernfalls erhalten Sie Hunderte von Distributionen aller Größen, Versionen und Altersgruppen (zehn Jahre alte Distributionen werden immer noch verwendet und unterstützt).

Testen Sie für diese. Nur ein paar Hinweise, was sonst schief gehen kann (und wird):

  • Das Paket eines Tools / einer Bibliothek, das / die Sie benötigen, ist in allen Distributionen und sogar Versionen derselben Distribution unterschiedlich benannt

  • Die benötigten Bibliotheken sind zu neu oder zu alt (falsche Version). Nehmen Sie nicht einfach an, dass Ihr Programm eine Verknüpfung mit der richtigen Bibliothek herstellen kann.

  • Dieselbe Bibliothek (Datei auf der Festplatte) wird auf verschiedenen Distributionen unterschiedlich benannt, wodurch eine Verknüpfung unmöglich wird

  • 32-Bit auf 64-Bit: Die 32-Bit-Umgebung ist möglicherweise nicht installiert, oder eine nicht unbedingt erforderliche 32-Bit-Bibliothek wird in ein zusätzliches Paket verschoben, das von der 32-On-64-Umgebung getrennt ist. In diesem Fall besteht eine zusätzliche Abhängigkeit.

  • Shell: Nehmen Sie nicht Ihre Version von Bash an. Nehmen Sie nicht einmal Bash an.

  • Tools: Gehen Sie nicht davon aus, dass irgendwo ein Nicht-POSIX-Befehlszeilentool vorhanden ist.

  • Tools: Nehmen Sie nicht an, dass das Tool eine Option erkennt, nur weil die GNU-Version Ihrer Distribution dies tut.

  • Kernel-Schnittstellen: Gehen Sie nicht davon aus, dass Dateien vorhanden oder strukturiert sind, /procnur weil sie auf Ihrem Computer vorhanden sind bzw. diese Struktur aufweisen

  • Java: Sind Sie wirklich sicher, dass Ihr Programm auf IBMs JRE im Lieferumfang von SLES ausgeführt wird, ohne es zu testen?

Bonus:

  • Befehlssätze: Die auf Ihrem Computer kompilierte Binärdatei kann nicht auf älterer Hardware ausgeführt werden.

Ist die statische Verknüpfung (oder die Bündelung aller benötigten Bibliotheken mit Ihrer Software) eine Lösung? Auch wenn es technisch funktioniert, können die damit verbundenen Kosten zu hoch sein. Also leider ist die Antwort wahrscheinlich auch nicht.

  • Sicherheit: Sie übertragen die Verantwortung für die Aktualisierung der Bibliotheken vom Benutzer Ihrer Software auf sich selbst.

  • Größe und Komplexität: Versuchen Sie aus Spaß, ein statisch verknüpftes GUI-Programm zu erstellen.

  • Interoperabilität: Wenn es sich bei Ihrer Software um ein "Plugin" handelt, sind Sie auf die Software angewiesen, die Sie aufruft.

  • Bibliotheksdesign: Wenn Sie Ihr Programm statisch mit GNU libc getpwnam()verknüpfen und Namensdienste ( usw.) verwenden, werden Sie dynamisch mit dem NSS (Name Service Switch) von libc verknüpft.

  • Bibliotheksdesign: Die Bibliothek, mit der Sie Ihr Programm statisch verknüpfen, verwendet Datendateien oder andere Ressourcen (wie Zeitzonen oder Gebietsschemas).


Aus allen oben genannten Gründen ist das Testen unerlässlich.

  • Machen Sie sich mit KVM oder anderen Virtualisierungstechniken vertraut und verfügen Sie über eine VM für jede Distribution, die Sie unterstützen möchten. Testen Sie Ihre Software auf jeder VM.

  • Verwenden Sie minimale Installationen dieser Distributionen.

  • Erstellen Sie eine VM mit einem eingeschränkten Befehlssatz (z. B. keine SSE 4).

  • Nur statisch verknüpft oder gebündelt: Überprüfen Sie Ihre Binärdateien mit ldd, um festzustellen, ob sie wirklich statisch verknüpft sind, und verwenden Sie nur Ihre gebündelten Bibliotheken.

  • Nur statisch verknüpft oder gebündelt: Erstellen Sie ein leeres Verzeichnis und kopieren Sie Ihre Software in dieses Verzeichnis. chrootin dieses Verzeichnis und starten Sie Ihre Software.


Das ist eine ziemlich umfassende Antwort +1
Sirlark

2
Shell: Insbesondere verwendet Debian kein Bash , und da dies die Shellshock-Verwundbarkeit auf Debian-Systemen stark gemindert hat, kann ich mir nicht vorstellen, dass sich dies in naher Zukunft ändern wird.
Kevin

1
Wenn Sie Binärdateien versenden möchten, verknüpfen Sie sie auch statisch .
user253751

Warum wird "Befehlssatz" als "Bonus" bezeichnet? Wenn Sie in binärer Form verteilen, müssen Sie wirklich überlegen, für welche ISAs Sie kompilieren möchten. Möglicherweise interessieren Sie sich nicht für m68k-Benutzer, aber es ist schwierig, ARM, IA32 und X86_64 mindestens zu ignorieren.
Toby Speight

@TobySpeight Denk an SSE4 und so. Könnte Sie nur beißen, wenn Sie Assembler verwenden.
Thomas Erker

9

Die Antwort ist, es kommt darauf an. Aber in den meisten Fällen ja, solange die erforderlichen Bibliotheken auf dem Betriebssystem installiert sind.

Im Allgemeinen verfügen die meisten großen Distributionen wie die von Ihnen erwähnten über Paketverwaltungstools, mit denen die von der Community gepflegte Version der Anwendung installiert wird. Dies kümmert sich um alle erforderlichen Pakete, die die Anwendung benötigt. Wenn Sie es ohne Paketmanager installieren, müssen Sie sicherstellen, dass alle erforderlichen Pakete und Bibliotheken auf dem Betriebssystem installiert sind. Es ist eine gute Idee, eine Liste dieser vorausgesetzten Anwendungen in die Dokumentation aufzunehmen.


2

Beschissene Antwort zuerst: Es kommt darauf an

Wenn Sie Binärdateien veröffentlichen, übernehmen die Antwort auf sein „Nein“ , es sei denn Sie verteilen alle die Libs , dass es jemals mit ihm geht (von Grund auf, was ärgerlich ist , wenn Sie ein wirklich riesiges System bieten , das auf eigenen ohnehin steht ) oder verknüpfen statisch das Äquivalent.

... aber Zauberer und Geld, und Geld Zauberer ...

IBM hat einige "allgemeine Unixish" -Installer, die mich schockiert haben, weil sie überall dort gearbeitet haben, wo ich sie ausprobiert habe: verschiedene Linuces aus verschiedenen Kernel-Generationen, OpenSolaris (oder wie es jetzt heißt), Solaris und BSD. Aber sie sind riesig. Und die Dinge, die sie zur Verfügung stellen, sind ebenso riesig. Auf diese Weise werden keine kleinen Rennwagenprogramme veröffentlicht, sondern nur die großen, unternehmerischen Dinge, die Sie von IBM erwarten würden.

Soweit es nur um Linux geht, aber in den meisten Linux-Ländern gut funktioniert, scheint dies in binärer Form möglich zu sein, wie die Vielzahl von Binärinstallationsprogrammen vom Typ "für Linux (allgemein)" zeigt, die Sie von einigen Anbietern erhalten. Auf diese Weise werden mehrere Chat-, Browser-, Spiel-, Meta-Installer usw. veröffentlicht, aber immer von großen Anbietern, die sich die Zeit nehmen können, um dies richtig zu machen. Es ist schon erstaunlich, dass sie "für Linux" sagen können und im Allgemeinen zuversichtlich sind, dass es funktionieren wird, aber dies scheint der Fall zu sein.

Aber...

Ich verteile meine Software als Quelle mit einem Build-Dienstprogramm. Ich mache das in C, Erlang, Python, Guile usw. Das gibt mir viel mehr Flexibilität, ob es läuft oder nicht, und es ist viel einfacher, ein Buildscript zu schreiben, das sicherstellt, dass die richtigen Dinge zum Zeitpunkt des Builds vorhanden sind, als in Stellen Sie sicher, dass zur Laufzeit alles vorhanden ist. Sobald dies vorhanden ist, ist es trivial, einen Auto-Updater für Ihr Programm zu schreiben, wenn Sie den Quellcode verteilen: Der Quellcode ist normalerweise viel kleiner als eine Binärdatei, die alle Abhängigkeiten und anderen Wahnsinnsfaktoren enthält. Mit dieser Methode hatte ich keine großen Probleme mit der zuverlässigen Bereitstellung unter Unices (und manchmal unter Windows, aber das ist ein bisschen mühsamer).

Genug Kinderspiel, bewaffne dich!

Wenn Sie es ernst meinen, wie srsly srs, sich nahtlos in die Linux-Welt einzufügen, verteilen Sie C-Quellen oder wenden sich an eine vollständig verwaltete Umgebung, um eine hackig schöne Sprache zu erhalten, die bereits vorgefertigt ist. Wenn Sie beispielsweise Python-Code schreiben, können Sie die Versionen überprüfen und wissen, mit welcher CPython-Version Sie arbeiten. In der Regel können Sie davon ausgehen, dass eine kompatible Version unter einem bestimmten Linux vorhanden ist (und dies ist viel einfacher zu überprüfen als eine breite Palette von C-Bibliotheken) / Versionen, die Sie möglicherweise verwenden). Erlang, Guile, Python, Perl, CL usw. sind alle sehr Einfache Ziele für diese Art der Bereitstellung, und viele von ihnen verfügen über ein zentrales Repository wie CPAN oder pip (oder was auch immer), in dem Benutzer einen Befehl ausführen können, um signierte Quellen selbst abzurufen, wenn sie dies wünschen, und wissen, dass die Dinge im Allgemeinen wie beabsichtigt funktionieren .

[Nachtrag: 1. Sogar Haskell kann dies generell über Cabal abwickeln - obwohl ich vorsichtig wäre, wenn ich das in einer Produktionsumgebung tun würde. 2. Mit Erlang gibt es völlig andere Bereitstellungsstrategien für Releases, die sicherstellen, dass Ihr Code eine vollständige Umgebung enthält. 3. Python geht mit virtuellen Umgebungen noch einen Schritt weiter. Nicht alle Laufzeiten helfen dir so viel.]

Das letzte bisschen über verwaltete Umgebungen unter Linux ist unglaublich . Und als Bonus können Sie viel allgemeinere Abhängigkeiten definieren, diese ohne zusätzlichen Aufwand automatisch auflösen lassen, kein Paket pro Distribution schreiben und sich nicht mehr darum kümmern, ob ein System 32 oder 64 ist bisschen (im Allgemeinen sowieso).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.