Shared Library & Cross Compilation



  • Hallo zusammen,

    ich stehe grad vor folgendem Problem:
    Ich möchte auf meinem PC (i686) eine Anwendung für meine FritzBox (auf welcher ja auch "ein Linux läuft", mipsel) kompilieren. Als Toolchain verwende ich einen gcc mit uclibc, wie er von Freetz zur Verfügung gestellt wird.

    Das Kompilieren und Linken funktioniert ohne Probleme. Nur wird auch gegen einige Shared Libraries gelinkt. Wenn ich die entstandene Binary* auf die Box hochlade und ldd ausführe, sieht das Ergebnis so aus:

    $ ldd bti
            libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x2aabe000)
    #NOT found
            libcurl.so.4 => not found
            libpthread.so.0 => /lib/libpthread.so.0 (0x2abae000)
            libz.so.1 => /lib/libz.so.1 (0x2abd2000)
            libm.so.0 => /lib/libm.so.0 (0x2abf7000)
            libxml2.so.2 => not found
            libpcre.so.1 => not found
            libdl.so.0 => /lib/libdl.so.0 (0x2ac1c000)
            libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ac2f000)
            libc.so.0 => /lib/libc.so.0 (0x2ac4d000)
            ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)
    

    Wie man sieht wurde die libcurl.so.4 nicht gefunden.
    Schaue ich mir jedoch ldd für eine andere Binary auf der Fritzbox an, sagt diese:

    $ ldd /usr/bin/transmission-daemon
            librt.so.0 => /lib/librt.so.0 (0x2aabe000)
            libevent-2.0.so.5 => /usr/lib/freetz/libevent-2.0.so.5 (0x2aacf000)
    #found
            libcurl.so.4 => /usr/lib/freetz/libcurl.so.4 (0x2ab1c000)
            libssl.so.0.9.8 => /usr/lib/freetz/libssl.so.0.9.8 (0x2ab75000)
            libcrypto.so.0.9.8 => /usr/lib/freetz/libcrypto.so.0.9.8 (0x2abc0000)
            libdl.so.0 => /lib/libdl.so.0 (0x2acce000)
            libz.so.1 => /usr/lib/freetz/libz.so.1 (0x2ace1000)
            libm.so.0 => /lib/libm.so.0 (0x2ad03000)
            libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ad28000)
            libpthread.so.0 => /lib/libpthread.so.0 (0x2ad46000)
            libc.so.0 => /lib/libc.so.0 (0x2ad6a000)
            ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)
    

    libcurl.so.4 wurde gefunden. Scheinbar ist die Shared Library für diese Binary im Suchpfad. Zwischenzeitlich wurde keine Umgebungsvariable gesetzt.

    Auf der Fritzbox selbst gibt es kein ldconfig. Meine Überlegung ist also, dass der Suchpfad für die dynamischen Bibliotheken in die Binaries "fest einkompiliert/gelinkt" ist?
    Ist das korrekt? Oder liegt der Fehler woanders?

    Das Setzen von LD_LIBRARY_PATH bringt es übrigens auch nicht:

    $ LD_LIBRARY_PATH="/usr/lib/freetz" ldd bti                          
    	libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x2aabe000)
    	libcurl.so.4 => not found
    	libpthread.so.0 => /lib/libpthread.so.0 (0x2abae000)
    	libz.so.1 => /lib/libz.so.1 (0x2abd2000)
    	libm.so.0 => /lib/libm.so.0 (0x2abf7000)
    	libxml2.so.2 => not found
    	libpcre.so.1 => not found
    	libdl.so.0 => /lib/libdl.so.0 (0x2ac1c000)
    	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ac2f000)
    	libc.so.0 => /lib/libc.so.0 (0x2ac4d000)
    	ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)
    

    * (export PKG_CONFIG_LIBDIR=.../toolchain/target/lib/pkgconfig/, damit nicht die .pc-Dateien vom Buildsystem genommen werden, ./configure --host=mipsel-linux --target=mipsel-linux, make)



  • Kann auch schon wieder zu. Setzen von CFLAGS und LDFLAGS hat das Problem gelöst.

    cflags:                 -Wl,--rpath=/usr/lib/freetz/
    	ldflags:                -Wl,--rpath=/usr/lib/freetz/
    

Anmelden zum Antworten