Statisch Linken

  • Hallo,


    bin gerade dabei auf meiner DM7000 einen CVS-Server aufzusetzen ohne dabei mein 1.8er Image zu überschreiben.
    Das CVS Kommando habe ich mit dem CDK übersetzen können. Wenn ich das Binary auf der Box starte bekomme ich
    ein GLIBC relocation error. Wenn ich die lib.6.so vom CDK auf der Dreamplatte kopiere und in den Pfad einbinde läuft es ohne Probleme.
    Da ich die Bibliothek nicht auf der Platte haben will und diese rund 80MB gross ist, wollte ich statisch linken.
    Kann mir jemand einen Tipp geben wie ich die Bibliothek statisch Linken kann? Die CVS Sourcen arbeiten mit configure scripten,
    aber da steig ich nicht so durch...


    Danke

  • Gründe für das fehlerhafte Ausführen deines Binarys auf der Dream sind die gestrippten libs in dem Image. Bei maken der Images werden alle Tools des Image auf verlinkte Bibliotheken, besser gesagt Funktionen überprüft. Für den Platzbedarf sorgt das phänomenale mklibs.py Script dafür, daß alle Funktionen der Bibliothken, die nicht von den Tools zur Laufzeit benötigt werden entfernt werden. Das bringt etwas Platz, hat aber den Nachteil, dass späterere, dem Image zugefügte Tools nicht mehr funktionieren, da ebend besagte Funktionen aus den libs gestrippt wurden.


    Übrigens kannst du notfalls auch deine libc.so.6 auf die Dream schieben. Dann sollten die größte Probs der gelinkten Tools behoben sein. Ich bin zwar kein Fan von Bibliotheken-Versions-Mischmasch, aber in dem Fall sollte das machbar sein.


    Die libc.so.6 ist übrigens keineswegs zwangsläufig 80 MB groß. Da sind nur mordsmäßig viele Debuginfos drin. Dafür sorgt unter anderem das FLAG "-ggdb3". Die Debugs kannst du aber entfernen. Adde den Pfad deines Crosscompiler zu der PATH Variable. Kopiere die libc.so.6 aus deiner Crossumgebung wohin du willst und strippe sie mit dem Befehl:

    Code
    powerpc-tuxbox-linux-gnu-strip --remove-section=.comment --remove-section=.note --strip-unneeded libc.so.6


    Deine libc.so.6 sollte dann so in etwa 1,2 - 1,3 MB groß sein und damit in das Image der Dream integrierbar sein.


    Das ist ürbigens schon in etwa das Maximum, wie man dynamische Bibliotheken strippen kann. Versuche keine weiteren Hardcore Stripversuche, wie etwa die Option "-s". Das macht die libs unbrauchbar und damit auch dein komplettes Image.


    Denke aber daran eine Kopie deiner libc zu machen. Andernfalls gehts beim nächsten Imagebauen schief!!! mklibs.py macht dann nämlich Probleme mit extrem gestripten libs.


    Alternativ:


    Das statische Linken funktioniert unter anderem mit dem Linkerflag "-static".
    Kann also quasi zu dem CFLAG und CXXFLAG in den Makefiles gefügt werden.
    So in der Art CFLAGS="-mcpu=405 -msoft-float -mmultiple -mstring -meabi -pipe -Os -static".


    Ist bei kleinen Tools sicher machbar, aber bei größeren Anwendung leidet die Performance.


    cheers :winking_face:

    Make your dreams true with xdevels.

    2 Mal editiert, zuletzt von krallekit ()

  • Hallo krallekit,


    vielen Dank für die ausführliche Antwort. Das die Bibliothik von mklibs.py gestrippt wird hatte ich hier in Forum schon gelesen und den Fehler prinzipell verstanden. Allerdings ist meine "selbstgebaute" lib halt zu gross um sie benutzen zu können.
    Das ich diese jedoch selbst auf eine akzebtable grösse strippen kann ist mir neu.


    So die lib liess sich nun durch den klasse Tipp auf 1.1MB reduzieren und ist immer noch funktionsfähig! Habe sie momentan unter /var/lib gespeichert und ein

    Code
    export LD_LIBRARY_PATH=/var/lib:$LD_LIBRARY_PATH

    gemacht.
    Evtl ist es auch möglich die lib der Box zu ersetzen, aber da will ich erst wissen ob sie Fehlerfrei läuft..


    Danke
    Uenz

    Einmal editiert, zuletzt von Uenz ()