ein Plugin statisch linken

  • Hi,


    ich habe folgendes Problem:
    Einige Librarys des em84xx-Plugin benötigen zwangsweise eine bestimmte Version der libc. Um nun nicht mein komplettes System auf diese leicht eingestaubte Version der libc umzustellen, möchte ich gerne das Plugin an diese ältere Version der libc binden (wohl am ehsten statisch).
    Mein Frage bezieht sich auf die Diskusion in diesem Thrad


    Nur sind meine c++ Kentnisse zu eingerostet als das ich wüsste wie das Makefile anzupassen ist um dies zu bewerkstelligen. Ich würde mich also freuen ,wenn mir jemand der sich mit sowas auskennt, nen paar tipps geben könnte.


    Mir ist klaar, dass dieses Vorhaben nicht unbedinkt erfolgsversprechend sein muss (vorallem weil es sich um die libc handelt), aber nen Versuch wehre es allemale wert. Wenn jemand nen Grund weiß, warum das überhaupt nicht funktionieren kann, darf er den natürlich auch gerne äussern :)


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • Ich bin mir nichtmal sicher ob es gängig ist die libc überhaupt als statische Version mitzuliefern. Ich habe bei meinen Systemen jedenfalls keine gefunden. Wenn es eine gibt, ist der Bindeaufruf eigentlich recht einfach:


    g++ -nodefaultlibs [restliche parameter] /lib/libc.a

  • Hi LordJaxom,


    unter SuSE gibt's eine /usr/lib/libc.a Das sollte doch die richtige sein, oder? Die libc liegt unter /lib/libc.so.6 Ich denke mal das die aber zusammen gehören.
    Die /usr/lib/libc.so ist lediglich ne Textdatei, in der steht, das nicht alle Funktionen in der Dynamischen libc enthalten sind, und dass man die statische verwenden soll, wenn es harkt...


    Unabhängig davon ob statisch geht, gibt's ne Möglichkeit beim dynamischen Linken eine bestimmte Version mit anzugeben, also das laden der gewünschten zu erzwingen, oder kann dynamisch immer nur eine Version verwendet werden (ffmpeg 4.8/4.9 Problematik)?


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • Hi,


    hat noch jemand von euch nen RedHat 6.2 installiert, und mag mir mal die libc-2.1.3.a zuschicken. vermutlich ist die unter /usr/lib zu finden. Ne alte SuSE 6.4 würde es auch tuen.


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • So, nun hab ich mir halt nen SuSE 6.4 installiert und mir von dort die libc.a geholt.
    Nur leider bekomme ich die nicht in das Plugin hinein :(
    Kompelieren tue ich das em84xx Plugin mit:

    Code
    g++ -nodefaultlibs -g -Wall -Woverloaded-virtual -shared em84xx.o device.o osd.o player.o thread.o common.o skin.o skinclassic4col.o skinclassic8col.o -o libvdr-em84xx.so -lEM84xx -losd libc.a


    aber 'ldd libvdr-em84xx.so' spukt anschließend weiterhin dies aus:

    Code
    /lib/libNoVersion.so.1 (0x40036000)
    linux-gate.so.1 =>  (0xffffe000)
    libEM84xx.so => /usr/lib/libEM84xx.so (0x40052000)
    libosd.so => /usr/lib/libosd.so (0x4017a000)
    libc.so.6 => /lib/tls/libc.so.6 (0x40181000)
    libpthread.so.0 => /lib/tls/libpthread.so.0 (0x402a0000)
    libm.so.6 => /lib/tls/libm.so.6 (0x402b2000)
    /lib/ld-linux.so.2 (0x80000000)

    Hat jemand nen Vorschlag?


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

    Einmal editiert, zuletzt von clausmuus ()

  • Ich denke das Problem ist dass die anderen shared libraries widerum libc.so benötigen und Du so das Problem nicht losbekommst :( Dazu kommt, dass Du selbst nur eine shared library linkst, die von VDR geladen wird, welches seinerseits die libc.so linkt...


    Ich denke der letzte Versuch wäre das dvbdevice von VDR direkt durch das em-device zu ersetzen (also Patch statt Plugin), und dann den ganzen Brei statisch zu linken (am besten auch noch mit statischen sigma-libs)


  • Du kannst mit den Umgebungsvariablen LD_PRELOAD und LD_PRELAOD_PATH Libaries in der Suchreihenfolge nach vorne bringen, z.B. im runvdr script.
    Kann natürlich zu Problemen mit anderen Abhängigkeiten führen.

  • OK, so kommen wir also nicht weiter :(


    wie sieht es denn mit nem dissassemblieren der libEM84xx.so und anschliessenden erneuten Linken an die alte libc aus? Hat damit jemand erfahrung, oder wie schätzt Ihr die chanksen ein?


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!