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/