Ich möchte meinen DVB-S-Stick (Sundtek SkyTV Ultimate III (USB 2.0)) gerne mit TVHeadend auf einem ARM-OpenWRT-System betreiben. Dabei laufe ich leider auf folgendes Problem:
Der "normale" LD_PRELOAD-Mechanismus für die Einbindung von libmediaclient.so funktioniert nicht, weil die verwendete uClibc ohne Unterstützung für LD_PRELOAD übersetzt wurde. Weil ich ohnehin nur TVHeadend zusammen mit dem Stick verwenden will und TVHeadend sowieso selber übersetze, habe ich alternativ versucht, libmediaclient.so explizit in TVHeadend zu linken. Nach meinem Verständnis sollte das (korrekte Linkreihenfolge vorausgesetzt) eigentlich keinen Unterschied zu LD_PRELOAD machen, und ein Proof-of-Concept auf einem x86-System (Ubuntu 13.04 auf x86-64) funktioniert auch bestens.
Die (Cross-)Compilation für das ARM-System scheitert allerdings daran, daß das von libmediaclient.so verwendet Symbol "__poll" nicht definiert ist.
Details:
Hardware: Iomega ix2-200 (Kirkwood-SOC)
OpenWRT-Version: ATTITUDE ADJUSTMENT (Bleeding Edge, r31555)
uClibc-Version: 0.9.33.2
gcc: 4.6-linaro
Sundtek-Treiber: "openwrtarm4" aus sundtek_installer_130810.165534.sh
Ich habe mediaclient, mediasrv und libmediaclient.so von Hand unter den folgenden Pfaden installiert:
/lib/libmediaclient.so
/bin/mediaclient
/sbin/mediasrv
Der Treiber scheint grundsätzlich auch zu passen, zumindest mediasrv und mediaclient funktionieren soweit ich das beurteilen kann. Ausgabe von
mediaclient -e:
**** List of Media Hardware Devices ****
device 0: [Sundtek SkyTV Ultimate III (USB 2.0)] DVB-S/S2, REMOTE-CONTROL
[BUS]:
ID: 1-1.2.1.4
[SERIAL]:
ID: U130422145316
[DVB-S/S2]:
FRONTEND: /dev/dvb/adapter2/frontend0
DVR: /dev/dvb/adapter2/dvr0
DMX: /dev/dvb/adapter2/demux0
[REMOTECONTROL]:
INPUT0: /dev/mediainput0
Und last not least der relevante Befehl aus dem Crosscompile (Pfade und Liste der TVHeadend-Object-Files gekürzt):
arm-openwrt-linux-uclibcgnueabi-gcc \
-o $BUILD_DIR/build.linux/tvheadend \
$TVHEADEND_OBJECTS \
-Os -pipe -march=armv5te -mtune=xscale -fno-caller-saves -fhonour-copts \
-Wno-error=unused-but-set-variable -msoft-float \
-I$STAGING_DIR/usr/lib/libiconv-stub/include -I$STAGING_DIR/usr/lib/libintl-stub/include \
-I$STAGING_DIR/usr/include -I$STAGING_DIR/usr/include \
-Wall -Werror -Wwrite-strings -Wno-deprecated-declarations -Wmissing-prototypes \
-fms-extensions -g -funsigned-char -O2 -D_FILE_OFFSET_BITS=64 \
-I$BUILD_DIR/build.linux -I$BUILD_DIR/src -I$BUILD_DIR \
-L$STAGING_DIR/usr/lib -L$STAGING_DIR/lib \
-L$TOOLCHAIN_DIR/usr/lib -L$TOOLCHAIN_DIR/lib \
-L$STAGING_DIR/usr/lib/libiconv-stub/lib \
-L$STAGING_DIR/usr/lib/libintl-stub/lib \
-lmediaclient \
-L$STAGING_DIR/usr/lib -L$STAGING_DIR/lib \
-L$TOOLCHAIN_DIR/usr/lib -L$TOOLCHAIN_DIR/lib \
-L$STAGING_DIR/usr/lib/libiconv-stub/lib \
-L$STAGING_DIR/usr/lib/libintl-stub/lib \
-L$STAGING_DIR/usr/lib \
-lssl -lcrypto \
-L$STAGING_DIR/usr/lib \
-lz -lrt -ldl -lpthread -lm
Fehlermeldung:
$STAGING_DIR/lib/libmediaclient.so: undefined reference to `__poll'