Theoretische Frage zu binärer Kompatibilität von Libs



  • Ich habe erstmal eine theoretische Verständnisfrage. Ich bin kein Linux-User und erst Recht kein Linux-Entwickler. Trotzdem will ich es wissen. 😃

    Durch meine Linux-Kurzreisen kenne ich es so, das meistens die Libs und Programme auf dem Zielsystem (also meine lokale Linux-Distri) kompiliert werden. Hat das eine besondere Bewandnis? Ich frage mich das, weil es ja mehrere Linux-Distris und von diesen verschiedene Versionsnummern gibt. Ist es aus technischen Gründen nötig, das immer alles speziell für/auf dem Zielsystem kompiliert werden muß? Weil evtl. eine Binärkompatibilität nicht vorhanden ist?

    Da ich es nicht weiß und es nur der _Eindruck_ ist, frage ich.

    Das ganze hat natürlich auch einen Grund der mich pers. betrifft. Ich programmiere gerade in C++ eine Bibliothek unter Windows. Diese Bibliothek ist aber von der Schnittstelle her platformunabhängig. Zum größten Teil ist es ein Adapter/Wrapper auf eine native platformabhängige API. Nun will ich später auch mal das ganze für Linux und BSD implementieren. Z.B. anstatt Win32-Commoncontrols würde ich GTK+ benutzen. Die Frage die mir sich stellt, ist ob ich dann ein fertiges Binary (*.a-Datei) plus Header bereitstellen kann, für alle C++ Linuxer? Oder wird pro Linux-Distri eine extra binäre Lib benötigt? Mir ist klar, das auf dem Linuxsystem mind. GTK+ drauf sein muß. Aber muß der Linuxer der meine C++ Libs nutzen will, für seine Distri meine Lib neu kompilieren? Oder kann er einfach die .a-Lib plus Header nehmen.

    Unter Windows kann ich z.B. durch eine mit MSVC erstellte Lib, alle MSVC-User bedienen. D.h. es muß nicht für WinXP oder Win2000 extra kompiliert werden. Sind die Bedingungen unter Linux und BSD die gleichen?

    Würde mich über etwas Aufklärung freuen. Oder ein guter Online-Artikel?
    Danke!

    Artchi

    PS: Achja, das die g++-Version evtl. mind. stimmen muß, ist mir wiederrum bewusst. Da hat sich das ABI glaub ich zwischenzeitlich geändert.



  • Artchi schrieb:

    Unter Windows kann ich z.B. durch eine mit MSVC erstellte Lib, alle MSVC-User bedienen. D.h. es muß nicht für WinXP oder Win2000 extra kompiliert werden. Sind die Bedingungen unter Linux und BSD die gleichen?

    <ot> aber für mein win98 doch 🤡 </ot>



  • 1. Zunächst ist es besser eine .so Datei auszuliefern oder sogar beides. (.so und .a). Mehr zu .so in
    http://people.redhat.com/drepper/dsohowto.pdf

    2. Man kann immer die benötigten libs mitliefern, so dass diese verwendet werden und nicht die auf dem Sytem installierten.

    3. Es gibt die Linux Standard Base. Wenn man sein Programm oder seine Bibliothek dagegen baut, funktionieren sie auf allen konformen Distributionen. Inzwischen sind alle großen Distributionen konform.

    Ansonsten hängt es stark von den Umständen ab, vor allem auf welchen Bibliotheken das eigene Binärmodul basiert. Werden nur das Betriebssystem und langbekannte GLIBC Funktionen verwendet, kann man sicher sein, dass es überall läuft. Benutzt man Bibliotheken die sich um Binärkompatibilität kümmern, muss nur sicher gestellt sein, dass die richtige Version installiert ist, was nicht selbstverständlich ist. Wenn zum Beispiel alles auf Qt4 basiert, kann man nicht mehr annehmen, dass noch Qt3 vorhanden ist.

    Die meisten Projekte machen aber Fehler in ihrer Binärkompatibilität oder kümmern sich gar nicht drum. Dann hängt es vom Projekt ab.



  • elise schrieb:

    Artchi schrieb:

    Unter Windows kann ich z.B. durch eine mit MSVC erstellte Lib, alle MSVC-User bedienen. D.h. es muß nicht für WinXP oder Win2000 extra kompiliert werden. Sind die Bedingungen unter Linux und BSD die gleichen?

    <ot> aber für mein win98 doch 🤡 </ot>

    Hihi, wahrscheinlich weil es kein NT ist? 😉 Aber meine Lib läuft per Design sowieso erst ab Win2000Pro und neuer. :p



  • Ponto schrieb:

    1. Zunächst ist es besser eine .so Datei auszuliefern oder sogar beides. (.so und .a). Mehr zu .so in
    http://people.redhat.com/drepper/dsohowto.pdf

    Danke! Habe mal die erste Seite gelesen, werde zu hause mal genauer reinschauen. Von dynamischen Libs habe ich jedoch keine Ahnung, habe mich auch unter Windows noch nie an DLLs gewagt. Wird langsam, Zeit...

    Ponto schrieb:

    2. Man kann immer die benötigten libs mitliefern, so dass diese verwendet werden und nicht die auf dem Sytem installierten.

    Was ist wiederrum mit den benötigten Libs? Haben die nicht auch das Problem der Inkompatibilität? Wäre das nicht ein Teufelskreis? Oder meinst du eher die Versionsnummer einer Lib? Weil das ist mir wiederrum klar, das z.B. zwischen GTK+ 1.0 und 2.0 eine Kompatibilität nicht garantiert ist.

    Hem, ok. Aber ich glaube meine Frage ist nicht ganz beantwortet bzw. sie ist bei dir falsch angekommen. Habe meine Frage anscheinend nicht präzise genug formuliert.

    Aber mir geht es eher um folgendes (nur hypothetisch):

    1. Ubuntu mit GTK+ 2.1
    2. Suse mit GTK+ 2.1
    3. RedhatLinux mit GTK+ 2.1

    So, ich selber programmiere jetzt eine Lib (oder auch Programm), welches GTK+ 2.1 vorraussetzt bzw. benutzt.

    Ist jetzt mein binäres Kompilat (Library oder ausführbare Programmdatei), welches ich unter Suse erstellt habe, auf jedem dieser anderen drei Distris ohne weiteres lauffähig? 😕 ⚠

    Wenn dem so ist, dann ist doch alles in Butter! 🙂 Und meine Wahrnehmung wurde getäuscht. Dann kann man natürlich notfalls auch einfach die nötigen Libs mitliefern.

    Ponto schrieb:

    3. Es gibt die Linux Standard Base. Wenn man sein Programm oder seine Bibliothek dagegen baut, funktionieren sie auf allen konformen Distributionen. Inzwischen sind alle großen Distributionen konform.

    OK, das hört sich schon mal gut an. Kommt glaub ich meiner Frage auch schon näher.

    Ponto schrieb:

    Ansonsten hängt es stark von den Umständen ab, vor allem auf welchen Bibliotheken das eigene Binärmodul basiert. Werden nur das Betriebssystem und langbekannte GLIBC Funktionen verwendet, kann man sicher sein, dass es überall läuft. Benutzt man Bibliotheken die sich um Binärkompatibilität kümmern, muss nur sicher gestellt sein, dass die richtige Version installiert ist, was nicht selbstverständlich ist. Wenn zum Beispiel alles auf Qt4 basiert, kann man nicht mehr annehmen, dass noch Qt3 vorhanden ist.

    Gut, also interpretiere ich mal deine Antworten so, das es hauptsächlich Binärinkompatibilitäten zwischen Library-Versionen geben kann, aber nicht zwischen Kompilaten an sich selbst?

    Also solange Qt4 auf einem Linux-System drauf ist, braucht man sich meistens keine Sorgen machen?

    Mir geht es auch nicht unbedingt um exotische Linux-Varianten. Wenn sich z.B. die Mainstream-Distries binär kompatibel sind, ist das ja schon mal gut.



  • [quote="Artchi"]

    Ponto schrieb:

    Ponto schrieb:

    2. Man kann immer die benötigten libs mitliefern, so dass diese verwendet werden und nicht die auf dem Sytem installierten.

    Was ist wiederrum mit den benötigten Libs? Haben die nicht auch das Problem der Inkompatibilität? Wäre das nicht ein Teufelskreis? Oder meinst du eher die Versionsnummer einer Lib? Weil das ist mir wiederrum klar, das z.B. zwischen GTK+ 1.0 und 2.0 eine Kompatibilität nicht garantiert ist.

    Hem, ok. Aber ich glaube meine Frage ist nicht ganz beantwortet bzw. sie ist bei dir falsch angekommen. Habe meine Frage anscheinend nicht präzise genug formuliert.

    Aber mir geht es eher um folgendes (nur hypothetisch):

    1. Ubuntu mit GTK+ 2.1
    2. Suse mit GTK+ 2.1
    3. RedhatLinux mit GTK+ 2.1

    So, ich selber programmiere jetzt eine Lib (oder auch Programm), welches GTK+ 2.1 vorraussetzt bzw. benutzt.

    Ist jetzt mein binäres Kompilat (Library oder ausführbare Programmdatei), welches ich unter Suse erstellt habe, auf jedem dieser anderen drei Distris ohne weiteres lauffähig? 😕 ⚠

    Wenn dem so ist, dann ist doch alles in Butter! 🙂 Und meine Wahrnehmung wurde getäuscht. Dann kann man natürlich notfalls auch einfach die nötigen Libs mitliefern.

    Ich meine, dass du direkten und indirekten Abhängigkeiten mitlieferst, so dass deine Software nur auf der GLIBC und dem Betriebssystem basiert.
    Das kann man gut bei fertigen Programmen machen. Bei Bibliotheken ist das nicht so angebracht, da man den Benutzer zwingt deine mitgelieferten Bibliotheken zu nehmen.

    Artchi schrieb:

    Ponto schrieb:

    3. Es gibt die Linux Standard Base. Wenn man sein Programm oder seine Bibliothek dagegen baut, funktionieren sie auf allen konformen Distributionen. Inzwischen sind alle großen Distributionen konform.

    OK, das hört sich schon mal gut an. Kommt glaub ich meiner Frage auch schon näher.

    Ponto schrieb:

    Ansonsten hängt es stark von den Umständen ab, vor allem auf welchen Bibliotheken das eigene Binärmodul basiert. Werden nur das Betriebssystem und langbekannte GLIBC Funktionen verwendet, kann man sicher sein, dass es überall läuft. Benutzt man Bibliotheken die sich um Binärkompatibilität kümmern, muss nur sicher gestellt sein, dass die richtige Version installiert ist, was nicht selbstverständlich ist. Wenn zum Beispiel alles auf Qt4 basiert, kann man nicht mehr annehmen, dass noch Qt3 vorhanden ist.

    Gut, also interpretiere ich mal deine Antworten so, das es hauptsächlich Binärinkompatibilitäten zwischen Library-Versionen geben kann, aber nicht zwischen Kompilaten an sich selbst?

    Also solange Qt4 auf einem Linux-System drauf ist, braucht man sich meistens keine Sorgen machen?

    Mir geht es auch nicht unbedingt um exotische Linux-Varianten. Wenn sich z.B. die Mainstream-Distries binär kompatibel sind, ist das ja schon mal gut.

    Es kann Inkompatiblilitäten zwischen Library-Versionen geben, wenn die Bibliotheken mit exotischen Kompileroptionen übersetzt werden, oder wenn die Bibliotheken nicht die benötigte gleiche Funktionalität bieten. Das ist aber selten der Fall.

    Da fast alle Linuxsoftware vom GCC erzeugt wird und man fast überall dieselbe ABI hat, ist die Wahrscheinlichkeit groß, dass es klappt. Am wahrscheinlichsten ist eine Kompatibilität mit der LSB.

    Grundsätzlich gilt. Wenn meine Software von der Bibliothek libbla.so.5.3.2 abhängt, dann klappt es mit allen Versionen libbla.so.5.x.y die höher sind als 5.3.2 aber nicht mit libbla.so.4.x.y oder libbla.so.6.x.y. Es stellt kein Problem dar, eine libbla.so.5.x.y, eine libbla.so.4.x.y und eine libbla.so.6.x.y installiert zu haben. Distributionen installieren verschiedene Versionen solange parallel, wie Software existiert, welche die alten Versionen benötigt.

    Ich behaupte mal, dass ein Programm, dass von verschiedenen Bibliotheken abhängt, auf allen Linuxsystemen funktionieren wird, auf denen die Bibliotheken in den Versionen installiert sind, wie sie oben erlaubt werden.

    Zum Beispiel gibt es zur Zeit nur eine Flashplayer-9-Bibliothek von Adobe. Die funktioniert auf fast allen aktuellen Systemen. Hier sind die Abhängigkeiten und deren Auflösung auf meinem System:

    linux-gate.so.1 =>  (0xffffe000)
    libdl.so.2 => /lib/libdl.so.2 (0xb77b9000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb77a5000)
    libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb76ae000)
    libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0xb76a0000)
    libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0xb764f000)
    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb75e2000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb75a9000)
    libgtk-x11-2.0.so.0 => /opt/gnome/lib/libgtk-x11-2.0.so.0 (0xb72b5000)
    libgobject-2.0.so.0 => /opt/gnome/lib/libgobject-2.0.so.0 (0xb727c000)
    libglib-2.0.so.0 => /opt/gnome/lib/libglib-2.0.so.0 (0xb71f6000)
    libm.so.6 => /lib/libm.so.6 (0xb71d0000)
    libc.so.6 => /lib/libc.so.6 (0xb70b0000)
    /lib/ld-linux.so.2 (0x80000000)
    libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0xb70a7000)
    libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0xb708f000)
    libz.so.1 => /lib/libz.so.1 (0xb707d000)
    libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb705e000)
    libgdk_pixbuf-2.0.so.0 => /opt/gnome/lib/libgdk_pixbuf-2.0.so.0 (0xb7047000)
    libgdk-x11-2.0.so.0 => /opt/gnome/lib/libgdk-x11-2.0.so.0 (0xb6fc5000)
    libpangocairo-1.0.so.0 => /opt/gnome/lib/libpangocairo-1.0.so.0 (0xb6fbe000)
    libpango-1.0.so.0 => /opt/gnome/lib/libpango-1.0.so.0 (0xb6f87000)
    libatk-1.0.so.0 => /opt/gnome/lib/libatk-1.0.so.0 (0xb6f6e000)
    libgmodule-2.0.so.0 => /opt/gnome/lib/libgmodule-2.0.so.0 (0xb6f6a000)
    libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb6f18000)
    libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0xb6f10000)
    libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb6ed1000)
    libglitz.so.1 => /usr/lib/libglitz.so.1 (0xb6eaf000)
    libXrandr.so.2 => /usr/X11R6/lib/libXrandr.so.2 (0xb6eab000)
    libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0xb6ea3000)
    libXinerama.so.1 => /usr/X11R6/lib/libXinerama.so.1 (0xb6ea0000)
    libXcursor.so.1 => /usr/X11R6/lib/libXcursor.so.1 (0xb6e97000)
    libXfixes.so.3 => /usr/X11R6/lib/libXfixes.so.3 (0xb6e92000)
    libpangoft2-1.0.so.0 => /opt/gnome/lib/libpangoft2-1.0.so.0 (0xb6e6c000)
    


  • Ponto! Danke erstmal für die ausführliche Erklärung. Fazit für mich lautet, das meine Befürchtungen möglich sind, aber in der Praxis die Situation besser aussieht. Das mit dem Flashplayer ist ein gutes Beispiel.


Anmelden zum Antworten