The Struggle Within

Компилирах ядро 2.6.15 и вкъщи. Четейки Changelog-a явно съм бързал и не съм внимавал, понеже с някои от промените се сблъсках челно веднага след reboot-a.
По принцип първата ми работа след инсталация на ново ядро е да си инсталирам драйвер за видео-картата (Nvidia GeForce 6600), и веднага след това да компилирам модул за поддръжка на дистанционното на TV tunner-a.

Точно с второто имах проблеми… Историята започна с грешка при компилиране на lirc-0.7.2:

...
../lirc_gpio.c:98: error: `BTTV_PXELVWPLTVPAK' undeclared here \\
(not in a function)
../lirc_gpio.c:98: error: initializer element is not constant
../lirc_gpio.c:98: error: (near initialization for \\
`rcv_infos[1].bttv_id')
...

Преравям кода и виждам, че няма дефинирана константа BTTV_PXELVWPLTVPAK никъде из LIRC. Един бърз

grep -R BTTV_PXELVWPLTVPAK *

ме убеждава да прегледам #include директивите, които ме водят към сорса на ядрото, където BTTV_PXELVWPLTVPAK вече е BTTV_BOARD_PXELVWPLTVPAK и въобще BTTV_* вече е BTTV_BOARD_*.
Няма проблем, викам си – Find and Replace и си свиркай… Да, ама не.

make минава без оплаквания, инсталирам модулите и при modprobe lirc_gpio получавам здрав Segmentation fault със съобщение от ядрото за Unhadled NULL pointer exception в модула…

Проверявам в mailing list-a на LIRC за patch и виждам, че има snapshot на 0.8.0 който още е със статут на beta, a в CVS-a е добавен и patch за моя проблем (евала, много бърза реакция). Та дърпам аз lirc-0.8.0pre2, след което checkout-вам от CVS-a и целия lirc. Разпакетирам първо snapshot-a и пробвам компилация – тц! Хващам CVS сорса – той пък реве за една камара shell скриптове… Решавам да смеся двете и configure минава, обаче make реве, че libtool нямал опция –tag (явно моя libtool е остарял). Разцъквам из Makefile-овете и разкарвам проблемната опция, след което пак make – тоя път минава.
Инсталирам модула, modprobe минава без Segmentation fault, пускам демона и даже като root тествам тунера с irw – изплюва си кой клавиш натискам, всичко си му е ОК.

Ей, накрая, викам си, ще пусна съобщение в mailing list-a, че lirc_gpio модула работи, понеже разработчика пише, че нямал дистанционно с което да го тества… Преди това решавам да си пусна като нормален потребител и irexec и получавам:

irexec: error while loading shared libraries: liblirc_client.0: \\
cannot open shared object file: No such file or directory

Чудничко… преглеждам depenancies на shared библиотеките:

$ ldd `which irexec`
        linux-gate.so.1 =>  (0xffffe000)
        liblirc_client.0 => not found
        libc.so.6 => /lib/tls/libc.so.6 (0xb7e67000)
        /lib/ld-linux.so.2 (0xb7fb8000)

проблемната библиотека е liblirc_client.0, което е символна връзка към liblirc_client.0.1.0

$ mv liblirc_client.0.1.0 liblirc_client.so.0.1.0
$ ldconfig
 
$ ldd `which irexec`
        linux-gate.so.1 =>  (0xffffe000)
        liblirc_client.0 => \\
        /usr/local/lib/liblirc_client.0 (0xb7f47000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7e17000)
        /lib/ld-linux.so.2 (0xb7f6e000)

Сега вече всичко изглежда наред. Пускам irexec и натискам POWER на дистанционното:

$ irexec
Running tvtime 1.0.1.
Reading configuration from /etc/tvtime/tvtime.xml
Reading configuration from /home/stinger/.tvtime/tvtime.xml

Натискам пак POWER:

tvtime-command: Sending command QUIT.
Thank you for using tvtime.

В крайна сметка съм доволен, че работи, но не съм доволен от начина по който стигнах до работещото решение…


Маркери: , ,

За тази статия



Категории