PDA

Bekijk de volledige versie : Кросс-компиляция rTorrent



al37919
24-12-2007, 16:23
Откомпилировал svn версию rtorrent с поддержкой dht
Вроде куда-то соединяется:

(16:12:59) DHT statistics: 39042 queries in, 2296 queries out, 1138 replies received, 4212981 bytes read, 8472606 bytes sent, 162 known nodes in 22 buckets, 1
359 peers (highest: 24) tracked in 956 torrents.
Однако как это работает мне в общем и целом непонятно (а главное непонятно как должно :) ).

Чтобы включить поддержку dht нужно внести изменения в конфигурационный файл согласно: http://libtorrent.rakshasa.no/wiki/RTorrentUsingDHT а также открыть соответствующий порт в iptables.
2153
2154

gekk
26-12-2007, 19:35
Я в linux плохо разбираюсь, так что извиняте :)
Попробовал установить




ipkg install rtorrent_0.7.9+r1020-1_mipsel.ipk
Upgrading rtorrent on /opt/ from 0.7.9-2 to 0.7.9+r1020-1...
package rtorrent suggests installing dtach
Configuring bzip2
update-alternatives: Error: not linking //opt/bin/bzip2 to /opt/bin/bzip2-bzip2 since //opt/bin/bzip2 exists and is not a link
postinst script returned status 1
ERROR: bzip2.postinst returned 1
Configuring e2fsprogs
update-alternatives: Error: not linking //opt/bin/chattr to /opt/bin/e2fsprogs-chattr since //opt/bin/chattr exists and is not a link
update-alternatives: Error: not linking //opt/bin/lsattr to /opt/bin/e2fsprogs-lsattr since //opt/bin/lsattr exists and is not a link
update-alternatives: Error: not linking //opt/sbin/fsck to /opt/sbin/e2fsprogs-fsck since //opt/sbin/fsck exists and is not a link
postinst script returned status 1
ERROR: e2fsprogs.postinst returned 1
Configuring e2fsprogs
update-alternatives: Error: not linking //opt/bin/chattr to /opt/bin/e2fsprogs-chattr since //opt/bin/chattr exists and is not a link
update-alternatives: Error: not linking //opt/bin/lsattr to /opt/bin/e2fsprogs-lsattr since //opt/bin/lsattr exists and is not a link
update-alternatives: Error: not linking //opt/sbin/fsck to /opt/sbin/e2fsprogs-fsck since //opt/sbin/fsck exists and is not a link
postinst script returned status 1
ERROR: e2fsprogs.postinst returned 1
Configuring less
update-alternatives: Error: not linking //opt/bin/less to /opt/bin/less-less since //opt/bin/less exists and is not a link
postinst script returned status 1
ERROR: less.postinst returned 1
Configuring less
update-alternatives: Error: not linking //opt/bin/less to /opt/bin/less-less since //opt/bin/less exists and is not a link
postinst script returned status 1
ERROR: less.postinst returned 1
Configuring ncurses
update-alternatives: Error: not linking //opt/bin/clear to /opt/bin/ncurses-clear since //opt/bin/clear exists and is not a link
postinst script returned status 1
ERROR: ncurses.postinst returned 1
Configuring rtorrent
Successfully terminated.



что-то не так делаю ?

al37919
26-12-2007, 21:59
подозреваю, что если бы это был ipkg с родного репозитария, то эти файлы установились бы автоматом. А так есть 2 варианта:
1)
ipkg install rtorrent
(эта комбинация должна установить все необходимые сторонние пакеты)
ipkg remove rtorrent
ipkg remove libtorrent
после этого уже устаналивать данные файлы
2)
ставить все запрашиваемое вручную:
ipkg install bzip2
ipkg install e2fsprogs
ipkg install less
ipkg install ncurses
и что там еще понадобится, далее опять таки устанавливать непосредственно эти файлы

gostest
12-08-2008, 22:18
Кто-нибудь с тех пор решил проблему?

Выполняю

cd ~
svn co http://svn.nslu2-linux.org/svnroot/optware/trunk optware
cd optware
make oleg-target
cd oleg
make directories ipkg-utils
make rtorrent
Перед make rtorrent сконфигурировал, чтобы версия бралась 0.9.28 а не daily.
Все равно 404-ую ошибку выдает.

Novik
12-08-2008, 22:51
Все равно 404-ую ошибку выдает.
Данная проблема решается. Однако, возникают другие.
Тут изложено - http://wl500g.info/showthread.php?p=98999#post98999

gostest
12-08-2008, 23:17
Данная проблема решается. Однако, возникают другие.
Тут изложено - http://wl500g.info/showthread.php?p=98999#post98999

Ну да :( Собственно, я положил необходимый файл в ~/optware/oleg/toolchain/buildroot/dl и данная проблема исчезла, но дальнейшая судьба аналогична автору указанного поста. Буду думать. Спасибо.

gostest
13-08-2008, 00:07
Хм... Не уверен, что это лучшее решение проблемы, но может кто-то, у кого это работает, выложит архив со своим ~/optware/oleg/toolchain/buildroot каталогом? Подозреваю, что можно без toolchain_build_mipsel внутри.

Novik
13-08-2008, 09:50
Хм... Не уверен, что это лучшее решение проблемы, но может кто-то, у кого это работает, выложит архив со своим ~/optware/oleg/toolchain/buildroot каталогом?
Посмотрю, что можно сделать. Раньше выходных не обещаю.

Novik
16-08-2008, 10:47
Тут лежит - http://vif2ne.ru/nvk/stuff/novik/rtorrent/optware.tar.gz [5M]
Вроде, положил все что нужно. Но, понятно, не проверял. У меня лежало в корне.
1) Не забудьте про установку OPTWARE_TARGET, всякие make directories и т.п.
2) Тянуться будут старые версии пакетов. Например, для rtorrent - 0.8.1 вместо 0.8.2. Наверное, это можно как-то решить путем утягивания определенных скриптов с svn, но я побоялся экспериментировать, и просто подменял пакеты непосредственно в /optware/downloads на новые. Т.е. утянуть руками rtorrent-0.8.2, распаковать то, что оно скачало (rtorrent-0.8.1), закинуть туда новые файлы, снова запаковать со старым именем, положить в /optware/downloads.

gostest
16-08-2008, 11:42
Тут лежит - http://vif2ne.ru/nvk/stuff/novik/rtorrent/optware.tar.gz [5M]
Вроде, положил все что нужно. Но, понятно, не проверял. У меня лежало в корне.
1) Не забудьте про установку OPTWARE_TARGET, всякие make directories и т.п.
2) Тянуться будут старые версии пакетов. Например, для rtorrent - 0.8.1 вместо 0.8.2. Наверное, это можно как-то решить путем утягивания определенных скриптов с svn, но я побоялся экспериментировать, и просто подменял пакеты непосредственно в /optware/downloads на новые. Т.е. утянуть руками rtorrent-0.8.2, распаковать то, что оно скачало (rtorrent-0.8.1), закинуть туда новые файлы, снова запаковать со старым именем, положить в /optware/downloads.
Спасибо большое!!! Сегодня постараюсь проверить!

Novik
20-08-2008, 09:48
Спасибо большое!!! Сегодня постараюсь проверить!
И как, получилось?

gostest
30-08-2008, 13:20
И как, получилось?
Привет, сорри что тако долго не писал - не доходили руки поставить :(( Сегодня поставил - та же проблема :( Впрочем, сейчас необходимость в кросскомпиляции отпала - решил задачу другими методами.
Спасибо большое за помощь!

border
26-03-2009, 12:39
Точнее, компилируется, но не запускается.

Я скачал optware, сделал всё по инструкции, сделал make rtorrent. Всё скомпилировалось.

Запускаю на роутере (скопировав туда и либторрент) - ничего не пишет, top показывает что этот процесс занимает процессор но 90%. Сделал strip из тулчейна - тот же эффект.

border
26-03-2009, 12:41
В то же время, если я подменяю libtorrent на собранный мною, то старый rtorrent (не тот, что я компилял, а из пакетов) работает. Скомпилированная мною простая программа на c++ (cout<<"hello, world") -работает. Скомпилял программу, использующая ncurses (nhn) - тоже работает.
То есть, закорюка где-то в компиляции самого рторрента.

jan_h
26-03-2009, 12:51
Может начнете отсюда: Еще раз про rTorrent и web-морду к нему (http://wl500g.info/showthread.php?t=14256) Установка rTorrent "на пальцах" (http://wl500g.info/showthread.php?t=16485), а эту тему удалите?:rolleyes:

border
26-03-2009, 22:50
Может начнете отсюда: Еще раз про rTorrent и web-морду к нему (http://wl500g.info/showthread.php?t=14256) Установка rTorrent "на пальцах" (http://wl500g.info/showthread.php?t=16485), а эту тему удалите?:rolleyes:

:) проблемы с установкой у меня нету. мне надо код rtorrent'а поковырять, чтобы он лучше работал на наших девайсах.

Novik
27-03-2009, 09:07
ipkg upgrade libcurl

border
27-03-2009, 14:51
ipkg upgrade libcurl
делал, не помогло.

border
27-03-2009, 14:56
ipkg upgrade libcurl

Кстати, а каким тулчейном правильно компилять? Я использую тот, что из slug2, platform=oleg. Есть ещё платформа wl500g, для которой нужен тулчейн от асуса. Какой из них использовать правильнее?

Novik
27-03-2009, 15:47
Я компилирую этим - http://www.nslu2-linux.org/wiki/Optware/AddAPackageToOptware
Именно rtorrent. Все замечательно работает.

border
27-03-2009, 21:32
Я компилирую этим - http://www.nslu2-linux.org/wiki/Optware/AddAPackageToOptware
Именно rtorrent. Все замечательно работает.

эхх, а у меня фиг работает.
ладно, я уже начал ковырять (yo)dctcs для ctorrent. хотя rtorrent лучше:)

al37919
27-03-2009, 21:44
на всякий случай еще раз --- правильный таргет --- optware / oleg

intruders
24-09-2009, 15:44
Народ, помогите кто-нибудь - нужен человек, умеющий собирать из исходников программы под наши роутеры. Хотел собрать rtorrent с поддержкой ipfilter, да что-то не получается кросс-компилировать :(

Под debian x86 успешно собирал rtorrent 0.8.5 + xmlrpc + ipfilter-patch из исходников вот так:
mkdir rtorrent-ipfilter-patch
cd rtorrent-ipfilter-patch

svn co svn://rakshasa.no/libtorrent/trunk/libtorrent
svn co svn://rakshasa.no/libtorrent/trunk/rtorrent
svn co http://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/advanced xmlrpc-c

cd xmlrpc-c
./configure
make
make install

cd ../libtorrent
./autogen.sh
./configure
make
make install

cd ../rtorrent
wget http://libtorrent.rakshasa.no/raw-attachment/ticket/239/ip_filter_0.8.4_no_boost.diff.gz
gzip -d ip_filter_0.8.4_no_boost.diff.gz
patch -p0 -i ip_filter_0.8.4_no_boost.diff
./autogen.sh
./configure --with-xmlrpc-c
make
make install

Гуру, не проходите мимо - помогите :) Я уверен, многим это будет полезно.

intruders
18-10-2009, 22:29
В общем, получилось собрать rtorrent с патчем ipfilter - проблема была в том, что пытался собрать на системе, где версия rpcxml была свежая (1.19.х). Поставил debian с нуля в virtualbox - всё собралось с пол-пинка :)

Формат ipfilter-файла должен быть таким:

<description>:<IP from>-<IP to>

т.е. примерно так:

comment:0.0.0.0-x.x.x.x
...
comment:y.y.y.y-255.255.255.255

Загружать либо руками, нажав ctrl-x в rtorrent, либо прописав в конфиге

ip_filter=/path/to/ipfilter/file

Можно загружать несколько файлов так:
ip_filter=file1,file2,file3

Патч ipfilter - http://libtorrent.rakshasa.no/ticket/239

Конкретно эта сборка - с версией ip_filter_0.8.4_no_boost.diff

kostik_bk
20-10-2009, 07:03
Добрый день!
Большое спасибо за такую версию! Вчера попробовал установить, все работает, фильтр фильтрует:)
Осталось понять, надо оно мне или нет, но попробовать было охота:)

A1ex
30-11-2009, 13:44
В общем, получилось собрать rtorrent с патчем ipfilter

Спасибо! Очень даже пригодилось. Не все еще на безлимитах сидят ;).
Вчера очередной раз напоролся на внешний трафик, а оказывается уже готовое решение для лентяев ;) есть.

A1ex
19-03-2010, 13:04
. а на andLinux удалось собрать?

нет , виртуальный диск там маленький, место кончилось. А с увеличением возиться не хотелось.

p.s. список пакетов, которые я ставил на lenny для сборки toolchain и rtorrent

subversion gawk g++ bison bzip2 patch flex libwww-perl libtool automake curl gettext make libcurl4-openssl-dev

derrij
19-03-2010, 18:07
Помогите скомилировать (скомпилируйте) libtorrent-0.12.6.tar.gz с немного подправленным src/tracker/tracker_http.cc


никак не получается
./configure --build=mipsel-unknown-linux-gnu --host=mipsel-unknown-linux-gnu
........
...........
checking for OPENSSL... configure: error: Package requirements (openssl) were not met:

al37919
19-03-2010, 19:12
rtorrent/libtorrent нативно скомпилить не удастся. Надо поднимать кросскомпиляцию optware на ПК.

Asgard
22-03-2010, 17:21
С недавних пор libtorrent можно собрать с опцией --with-posix-fallocate
а в конфиге самого рторрента прописать system.file_allocate.set = yes

все работает прекрасно

А можно по-подробнее что надо сделать чайнику в Линуксе, чтобы не было дефрагментации в rtorrent-е.

haccker
22-03-2010, 23:56
Найти libtorrent (сейчас это libtorrent-0.12.6), скомпилированный под Вашу платформу с опцией --with-posix-fallocate ;)

Или скомпилировать самому, вот инструкции:
http://code.google.com/p/wl500g/wiki/CompilingCustomFirmware
http://vectormm.net/linux/60-samostoyatelnaya-kompilyaciya-rtorrent.html

Если руки дойдут и получиться - выложу сюда

brain-ripper
27-03-2010, 16:54
нет , виртуальный диск там маленький, место кончилось. А с увеличением возиться не хотелось.

p.s. список пакетов, которые я ставил на lenny для сборки toolchain и rtorrent

subversion gawk g++ bison bzip2 patch flex libwww-perl libtool automake curl gettext make libcurl4-openssl-dev

уф, наконец-то победил тулчейн :)
отработало на debian 5, в процессе пришлось раз 5 увеличивать размер виртуальних дисков. в итоге получилось - 8Гб для системы, 6Гб для каталога optware (всего виртуалка занимает 7,5 Гб).

в итоге вызов "/optware/oleg/make toolchain" корректно отработал.

Такой вопрос от новичка: хочу скомпилировать поддержку файловой системы YAFFS2, чтоб флешки подольше жили в роутере.
Исходники есть, в корне имеется файл Makefile.
Подскажите, в какую директорию optware положить сорцы YAFFS'а и откуда и какой командой запускать компиляцию?

Ну или, например, тот же rtorrent - в какой каталог класть сорцы и как запускать компиляцию?

haccker
28-03-2010, 02:56
Ну или, например, тот же rtorrent - в какой каталог класть сорцы и как запускать компиляцию?
C той же папки /optware/oleg запустить make rtorrent.
Скрипт полезет в /optware/make и будет искать там rtorrent.mk, который содержит опции компиляции, патчей и прочего. В результате получите тот же вариант, если бы сделали на роутере ipkg install rtorrent.
По идее для Вашей файловой системы должен быть аналогичный *.mk файл.
Иначе набирать опции компиляции Вам придётся самостоятельно, по аналогии с другими файлами там же.

haccker
28-03-2010, 03:07
Есть ли возможность заменить кросс-компилер gcc-4.1.1-uclibc-0.9.28 на более совершенный (пусть и не такой компактный)?
Дело в том, что на Асусе до сих пор rtorrent жутко фрагментирует все файлы. Дело в том, что функция posix_fallocate, которая наконец-то включена в libtorrent (библиотека rtorrent'а) для захвата цельного пространства на диске под файлы, не имплементирована в самом компиляторе, там стоит заглушка и извинения в документации.
Соответственно для прошивки Олега posix_fallocate отключены в makefile детектом uclibc компилятора

al37919
28-03-2010, 08:28
brain-ripper:
ссылку на инструкцию по добавлении пакетов я давал в этой теме здесь: http://wl500g.info/showpost.php?p=95785&postcount=10

haccker:
была подобная попытка: http://wl500g.info/showthread.php?t=20841 Однако, до полноценного нового тулчейна оптваре еще далеко. Основная причина --- кто-то должен этим серьезно заняться.

haccker
28-03-2010, 11:46
На гугле народ использует тулчейн с gcc-4.2.4-uclibc-0.9.30 с теми ж проблемами.
Думаю в данном случае мне проще будет самому дописать реализацию posix_fallocate.

theMIROn
28-03-2010, 22:59
На гугле народ использует тулчейн с gcc-4.2.4-uclibc-0.9.30 с теми ж проблемами.
Думаю в данном случае мне проще будет самому дописать реализацию posix_fallocate.

интересно было бы потом поглядеть

haccker
29-03-2010, 11:53
Проблема оказалась несколько глубже, кросс-компиляторы, вплоть до последнего рабочего, который мне попался gcc-4.2.4-uclibc-0.9.30 не в состоянии реализовать функцию posix_fallocate.
Так что я решил просто дописать функцию захвата и заполнения файла нулями в саму библиотеку rtorrent'a.
К сообщению приложено 2 пропатченых библиотеки libtorrent_0.12.6 : с TEXT PADDING и ZERO PADDING. Библиотека c TEXT PADDING вместо нулей вписывает текст NO MORE FRAGMENTATION, по этому тексту удобно наблюдать за заполнением файла и вы уверенны что он создан и rtorrent работает как надо.
Библиотека c ZERO PADDING рекомендуется для настроенного rtorrent'a - заполнение нулями даёт возможность предварительного прослушивания/просмотра недокачанных файлов плеерами.

Дамп области файла, где хорошо видно границу закачанного блока данных в зарезервированное пространство: http://img6.imageshack.us/img6/9757/nofragmentationpadding.jpg

Как пользоваться простому юзеру:
Обновиться до rtorrent 0.8.6 (libtorrent 0.12.6), сейчас для этого достаточно набрать, предварительно остановив программу:
ipkg update
ipkg upgrade rtorrent
ipkg upgrade libtorrent (если это не произойдёт автоматически)

Подменить библиотеку libtorrent скачанной отсюда с архива, обычно достаточно заменить только файл: /opt/lib/libtorrent.so.11.0.6, это должен быть файл около мегабайта размером, не симлинк. У Вас путь может быть другим.
Не забудьте добавить в rtorrent.conf строчку system.file_allocate.set = yes

Если кому интересно код патча с ZERO PADDING:

root@darkstar:/wl500g/optware/oleg/builds/libtorrent/src/data# cat socket_file.cc.diff
114,135c114
< //return !posix_fallocate(m_fd, offset, length);
< {
< bool success;
< char buf[ 4 * 1024 ] = {0};
< uint64_t len;
< uint64_t sb = sizeof( buf );
<
< if (offset > length) throw internal_error("SocketFile::posix_fallocate()incorrect offset");
<
< len = length-offset;
< success = 1;
< lseek(m_fd, offset, SEEK_SET);
< while ( len > 0 && success )
< {
< if (len < sb) sb = len;
< len -= sb;
< success = write( m_fd, buf, sb );
< }//while
<
< lseek(m_fd, offset, SEEK_SET);
< return true;
< }//block
---
> return !posix_fallocate(m_fd, offset, length);

Код патча с TEXT PADDING:

root@darkstar:/wl500g/optware/oleg/builds/libtorrent/src/data# cat socket_file.cc.text_padding.diff
114,147c114
< //return !posix_fallocate(m_fd, offset, length);
< {
< bool success;
< char buf[ 4 * 1024 ] = {0};
< uint64_t len;
< uint64_t sb = sizeof( buf );
< uint64_t i;
<
< if (offset > length) throw internal_error("SocketFile::posix_fallocate()incorrect offset");
< //return false;
<
< //fill in padding buffer
<
< //printf("sb = %i \r\n", sb);
< for (i=0;i<sb-27;i+=32) {
< strncpy(&buf[i]," -~+= NO MORE FRAGMENTATION =+~- ",32);
< }
<
< len = length-offset;
< success = 1;
< lseek(m_fd, offset, SEEK_SET);
< while ( len > 0 && success )
< {
< if (len < sb) sb = len;
< len -= sb;
< success = write( m_fd, buf, sb );
< // printf("success = %i, len = %i,", success, len );
< // printf(" sb = %i \r\n", sb );
<
< }//while
<
< lseek(m_fd, offset, SEEK_SET);
< return true;
< }//block
---
> return !posix_fallocate(m_fd, offset, length);


Тестирование работоспособности:

до патча:
root# filefrag Ferry_143.mp3
Ferry_143.mp3: 1282 extents found, perfection would be 1 extent
после патча:
root# filefrag Ferry_140.mp3
Ferry_140.mp3: 1 extent found

Не забывайте, что для захвата пространства на диске роутеру может потребоваться значительное время, ведь максимальная скорость работы с диском колеблется в пределах 3.5МБайт/сек. Тоесть для первичного создания файла в таком режиме потребуется примерно столько же времени, сколько на перехеширование. Клиент на это время блокируется.

Прошу отписаться тех, кто скачал и потестировал пропатченную библиотеку.

haccker
29-03-2010, 12:02
Пока пропатчил библиотеку libtorrent_0.12.6, полёт нормальный:

Тестирование на файлах по ~100МБ:
до патча:
root# filefrag Ferry_143.mp3
Ferry_143.mp3: 1282 extents found, perfection would be 1 extent
после патча:
root# filefrag Ferry_140.mp3
Ferry_140.mp3: 1 extent found

Как говорится, результат говорит сам за себя :cool:

theMIROn, код пока такой:
с ZERO PADDING:

root@darkstar:/wl500g/optware/oleg/builds/libtorrent/src/data# cat socket_file.cc.diff
114,135c114
< //return !posix_fallocate(m_fd, offset, length);
< {
< bool success;
< char buf[ 4 * 1024 ] = {0};
< uint64_t len;
< uint64_t sb = sizeof( buf );
<
< if (offset > length) throw internal_error("SocketFile::posix_fallocate()incorrect offset");
<
< len = length-offset;
< success = 1;
< lseek(m_fd, offset, SEEK_SET);
< while ( len > 0 && success )
< {
< if (len < sb) sb = len;
< len -= sb;
< success = write( m_fd, buf, sb );
< }//while
<
< lseek(m_fd, offset, SEEK_SET);
< return true;
< }//block
---
> return !posix_fallocate(m_fd, offset, length);


До полноценной реализации с проверками поддержки нативного posix_fallocate ядром и файловой системой далеко, да и некогда разбираться, до переноса в glibc ещё очень далеко, как минимум надо изучить реализацию на других платформах (на slackware,FreeBSD7 сходу не нашёл например), там одних только вариантов возвратов десятки.
А здесь хватит.

Здесь описано более подробно и выложены пропатченные библиотеки: http://wl500g.info/showthread.php?p=191197#post191197

dfayruzov
23-11-2010, 11:22
Здравствуйте!
Упражняюсь в кросс компиляции.
Стенд: Ubuntu 10.10, установлены след пакеты для компиляции:

sudo apt-get install gcc cvs subversion flex bison make pkg-config rsync gettext libglib2.0-dev autoconf libtool automake sudo patch bzip2 gzip wget sed build-essential texinfo


Тулчейн вчера худо-бедно победил, transmission победил, теперь воюю с rtorrent.
Компиляция вываливается с ошибкой:


Fatal server error:
Server is already active for display 0
If this server is no longer running, remove /tmp/.X0-lock
and start again.


Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.

ddxSigGiveUp: Closing log
/opt/optware/oleg/builds/rtorrent/libtool: line 832: X.libs:: command not found
/opt/optware/oleg/builds/rtorrent/libtool: line 766: libtool: link: Failed to create `.libs': command not found
make[4]: *** [rtorrent] Error 1


Как-то непонятно, какое иксы могут иметь отношение к rtorrent, в поиске такую же ошибку не нашел -- буду рад советам про траблшутингу.

Ну а цель конечно, deluge.

Zyxmon
23-11-2010, 21:14
Упражняюсь в кросс компиляции.
Стенд: Ubuntu 10.10, установлены след пакеты для компиляции:
Для Ubuntu есть мастер Makefile - http://www.nslu2-linux.org/Makefile
Все делаете так - http://www.nslu2-linux.org/wiki/Optware/AddAPackageToOptware ?

Сам немного "балуюсь" кросс компиляцией.
Могу попробовать собрать rtorrent, правда для совсем другой платформы.
После плясок с бубном вокруг нескольких дистрибутивов Linux остановился на Mandriva 2010.0 и Debian 5.06. C остальными были проблемы. Все под VirtualBox.

PS deluge слишком ресурсоемок для таких железок.
PPS Если не ошибаюсь, для сборки deluge понадобится cmake, cmake кросскомпиляцией не собирается, только нативно. Хотя возможно я тут путаю с другим пакетом.

dfayruzov
24-11-2010, 08:45
Отличный туториал, спасибо!
Я ориентировался на посты здесь на форуме, но в них было несколько ошибок.

Если не трудно, попробуйте откомпилировать rtorrent.

Zyxmon
24-11-2010, 08:58
Если не трудно, попробуйте откомпилировать rtorrent.
Сегодня утром попробовал. Вываливается с аналогичной ошибкой.
Потом попробовал собрать в текстовом режиме, без запуска иксов. В этом случае ругается, что не запущен X-сервер.

PS Для работы rtorrent нужна свежая версия xmlrpc-c. Собираться должно, по идее, с любой. Насколько помню перед ошибкой упоминается именно эта библиотека. В качестве танца с бубном можно взять версию посвежее 1.06.41 с http://sourceforge.net/projects/xmlrpc-c/files/
Шансов, что это поможет - немного.
Забавненько.

PS Собирал под Mandriva 2010.0 для arm marvell 88F6281. Будет время, попробую под дебианом. Но дело похоже не в этом.

Novik
24-11-2010, 09:42
Как-то непонятно, какое иксы могут иметь отношение к rtorrent, в поиске такую же ошибку не нашел -- буду рад советам про траблшутингу.
Никакого отношения к rtorrent иксы, конечно, не имеют. Имеет же, скорее всего, некорректное раскрытие выражений вида
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
Т.е. соотв. $arg - пустой.
Вам же выдались номера строчек в libtool - ну и смотрите, что там не так.

dfayruzov
24-11-2010, 10:47
Никакого отношения к rtorrent иксы, конечно, не имеют. Имеет же, скорее всего, некорректное раскрытие выражений вида
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
Т.е. соотв. $arg - пустой.
Вам же выдались номера строчек в libtool - ну и смотрите, что там не так.

пока не очень догоняю, 766я строка жирным:

# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
$ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
}


832:

my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`

Novik
24-11-2010, 11:08
Ну я бы предположил, что что-то не в порядке с $ECHO.
Смотрите определение переменной ранее по коду.
Если смотреть в корень проблемы - что-то не так с используемой версией libtool.

dfayruzov
24-11-2010, 11:29
Некое продвижение, но в странном направлении. )
Я разбирал команду, которая валится с ошибкой (новыми строками выделил для удобства):

/bin/bash ../libtool
--tag=CXX
--mode=link
/opt/optware/oleg/toolchain/mipsel-linux-uclibc/gcc-4.1.1-uclibc-0.9.28/nowrap/mipsel-linux-uclibc-g++ -g -O2 -g -DDEBUG
-I/opt/optware/oleg/staging/opt/include/sigc++-2.0
-I/opt/optware/oleg/staging/opt/lib/sigc++-2.0/include
-I/opt/optware/oleg/staging/opt/include
-I/opt/optware/oleg/staging/opt/include
-I/opt/optware/oleg/staging/opt/include
-L/opt/optware/oleg/staging/opt/lib
-Wl,-rpath,/opt/lib
-Wl,-rpath-link,/opt/optware/oleg/staging/opt/lib
-o rtorrent
command_download.o
command_dynamic.o
command_events.o
command_file.o
command_helpers.o
command_local.o
command_network.o
command_object.o
command_peer.o
command_tracker.o
command_scheduler.o
command_ui.o
control.o
globals.o
main.o
option_parser.o
signal_handler.o
thread_base.o
ui/libsub_ui.a
core/libsub_core.a
display/libsub_display.a
input/libsub_input.a
rpc/libsub_rpc.a
utils/libsub_utils.a
-lncursesw
-L/opt/optware/oleg/staging/opt/lib -lsigc-2.0
-L/opt/optware/oleg/staging/opt/lib -lcurl
-L/opt/optware/oleg/staging/opt/lib -ltorrent
-L/opt/lib -lxmlrpc_server -lxmlrpc -lxmlrpc_util
-L/opt/optware/oleg/staging/opt/lib -lxml2 -lz -lm


Взял и запустил часть этой команды:

/opt/optware/oleg/toolchain/mipsel-linux-uclibc/gcc-4.1.1-uclibc-0.9.28/nowrap/mipsel-linux-uclibc-g++ -g -O2 -g -DDEBUG
-I/opt/optware/oleg/staging/opt/include/sigc++-2.0
-I/opt/optware/oleg/staging/opt/lib/sigc++-2.0/include
-I/opt/optware/oleg/staging/opt/include
-I/opt/optware/oleg/staging/opt/include
-I/opt/optware/oleg/staging/opt/include
-L/opt/optware/oleg/staging/opt/lib
-Wl,-rpath,/opt/lib
-Wl,-rpath-link,/opt/optware/oleg/staging/opt/lib
-o rtorrent
command_download.o
command_dynamic.o
command_events.o
command_file.o
command_helpers.o
command_local.o
command_network.o
command_object.o
command_peer.o
command_tracker.o
command_scheduler.o
command_ui.o
control.o
globals.o
main.o
option_parser.o
signal_handler.o
thread_base.o
ui/libsub_ui.a
core/libsub_core.a
display/libsub_display.a
input/libsub_input.a
rpc/libsub_rpc.a
utils/libsub_utils.a
-lncursesw
-L/opt/optware/oleg/staging/opt/lib -lsigc-2.0
-L/opt/optware/oleg/staging/opt/lib -lcurl
-L/opt/optware/oleg/staging/opt/lib -ltorrent
-L/opt/lib -lxmlrpc_server -lxmlrpc -lxmlrpc_util
-L/opt/optware/oleg/staging/opt/lib -lxml2 -lz -lm

Она скомпилила все исходники в один файл rtorrent размером 13 Мбайт. Я подложил его на роутер и запустил вместо того, что шел в пакете. Все работает.
А странно вот что: rtorrent из пакета "весит" всего 1,6 Мб.

Novik
24-11-2010, 11:34
А странно вот что: rtorrent из пакета "весит" всего 1,6 Мб.
http://citforum.ru/operating_systems/manpages/STRIP.1.shtml

dfayruzov
24-11-2010, 11:44
Спасибо, понял. )
Правда, попытка сделать стрип на машине для кросс-компиляции выглядит вот так:


root@ubuntu-dev:/opt/optware/oleg/builds/rtorrent/src# strip rtorrent
strip: Unable to recognise the format of the input file `rtorrent'

Novik
24-11-2010, 11:49
Спасибо, понял. )
Правда, попытка сделать стрип на машине для кросс-компиляции выглядит вот так

А попытка запустить этот rtorrent на машине для кросс-компиляции как выглядит?
Зачем Вы занимаетесь глупостями?
1) В тулчейне есть соотв. бинарник - что-то-там-strip для работы с кросс-компиленными бинарниками.
2) Что Вам мешает сделать это непосредственно на роутере?

Zyxmon
24-11-2010, 12:14
Позволю себе немного полуофтопика

что-то не так с используемой версией libtool.
Очень похоже на правду. Когда я пытался собрать тулчейн для одной из платформ - с полпинка проходила сборка только если в системе были binutils версии не старше 2.19. Поэтому и остановился на Mandriva 2010.0 и дибиане 5.06.


А странно вот что: rtorrent из пакета "весит" всего 1,6 Мб.
Как подсказали, нужно запускать strip. Он запускается при выполнении make rtorrent-check.


Что Вам мешает сделать это непосредственно на роутере?
Ну это a) неспортивно, б) чаще нужно править сырцы. Glibc кросскомпилится как из пушки, нативно - после танцев (на платформе arm)

Novik
24-11-2010, 12:24
Ну это a) неспортивно, б) чаще нужно править сырцы. Glibc кросскомпилится как из пушки, нативно - после танцев (на платформе arm)
Не совсем понял, зачем для запуска strip rtorrent непосредственно на роутере нужно править какие-то сырцы...
Если речь о компиляции rtorrent непосредственно на роутере - то это не "неспортивно", а невозможно. По крайней мере без очень серьезной работы напильником. Результат прекратит работу после первого же throw из libtorrent.so.

dfayruzov
24-11-2010, 12:33
Novik, во первых, спасибо просто за то что не прошли мимо. )
Во вторых, я этим занимаюсь, чтобы разобраться -- некий туториал, не более того.
Изначально задача выглядит так: у коллеги RT-N16, он попросил помочь настроить ему из роутера качалку торрентов. После чего я первым делам установил и настроил rtorrent из репы и веб-морду. Но пользоваться им нормально не удалось: он стабильно вылетает каждые 10-15 минут. Ни один из предложенных рецептов (а их много, поверьте мне) не помог. В тот момент я решил поучиться и перенести на wl500g deluged, так как пользуюсь им на своей качалке. Нашел пост (http://forum.deluge-torrent.org/viewtopic.php?f=8&t=14875), в котором описывалось, что человек смог перенести демона deluge на платформу mipsel:

I finally realized that there are many parts here. I had cross-compiled rasterbar-libtorrent as a shared object. It uses boost. I was able to use the test client to make sure this worked. I ported Python to my mipsel-linux platform. I had to fight with some packages but it all appears to be working ok. I was able to build the deluge package and take the .egg (and built files) over to my target. This appeared to install ok. After changing some paths, I was able to run "deluge". It will serve the web pages.
Now came the interesting part. Deluged needed the python extensioned versions of the rasterbar-libtorrent libraries. I found how to build those and installed that on the target. I started getting unresolved externals for boost (mangled name items). I found that I needed to do the same for Boost and link the python bound boost libs to the libtorrent SO. I then put that on target hardware (with other headaches of gcc/g++ link issues). Deluged now runs. However, while starting up it is causing an assertion failure in the destructor of disk_io_thread. It appears the disk_io_thread object is being destroyed but was not notified cleanly. My guess is this is an innocent bystander and the real issue is something else went wrong and the object happened to be destroyed prematurely as the disk_io_thread should stay alive for the life of execution.

After running strace I realized that the libtorrent library was trying to make a system call (epoll) that my kernel was not configured with. After changing the bjam config script to disable epoll I am able to run deluge (web ui) and deluged (the daemon). These are successfully running on a little endian MIPS processor (199Mhz I think). It appears to be doing a pretty good job. Once in the web UI under preferences, I set the template to AJAX and the Theme to Classic. It is still pretty responsive and looks good.

Если получилось у кого-то, то почему бы не попробовать? Вот я и разбираюсь. Настроил среду кросс-компиляции, скомпилировал transmission, теперь rtorrent. Вслед займусь deluged. Почему глупости-то?

PS: у коллеги на самом деле уже давно настроен (тоже в порядке эксперимента) и нормально качает кросс-компиленный transmission.
PPS: кросс-компиленный rtorrent точно также падает, как и из репы.

Novik
24-11-2010, 12:54
пользоваться им нормально не удалось: он стабильно вылетает каждые 10-15 минут.
Нужно, IMHO, не искать себе лишнюю работу, а просто разобраться - чего же это он у Вашего друга падает. Тогда как у других нормально работает.
Причина с достаточно большой вероятностью - нехватка памяти. Лечится она добавлением swap (если его почему-то еще нет) и урезанием receive_buffer_size и send_buffer_size до 4К вместо 16К по умолчанию. Возможен и прочий тюнинг.

Вслед займусь deluged. Почему глупости-то?
Потому, что deluge, мягко говоря, не славится малым потреблением ресурсов. В отличие от поминавшихся transmission и rtorrent. Но, разумеется, если Вам таки хочется убедиться в этом лично, то никто Вас неволить не может.

Zyxmon
24-11-2010, 13:05
... Если речь о компиляции rtorrent непосредственно на роутере...
Это я Вас неправильно понял, думал речь именно об этом.

Zyxmon
25-11-2010, 19:18
Да дело, видимо, в версии libtool. Не все новые версии одинаково полезны. Под debian собралось все как из пушки.
В debian

$ libtool --version
ltmain.sh (GNU libtool) 1.5.26 Debian 1.5.26-4+lenny1 (1.1220.2.493 2008/02/01 16:58:18)
в mandriva 2010.0

$ libtool --version
ltmain.sh (GNU libtool) 2.2.6

ekvus
28-11-2010, 13:07
Не совсем понял, зачем для запуска strip rtorrent непосредственно на роутере нужно править какие-то сырцы...
Если речь о компиляции rtorrent непосредственно на роутере - то это не "неспортивно", а невозможно. По крайней мере без очень серьезной работы напильником. Результат прекратит работу после первого же throw из libtorrent.so.

Извините за офтоп, но если Вам не сложно объясните можно ли каким-то образом собрать на роутере WL700GE с прошивкой 1.0.7.8 от kfurge rtorrent с поддержкой magnet ссылок (это нужно для использования ряда трекеров)?

Zyxmon
28-11-2010, 13:20
ekvus
Собирайте на ББ. Novik же написал - нативно не стоит и пытаться. Да и по моему опыту при нативной компиляции без напильника - никак.

4ufak
11-12-2010, 18:25
К сожалению, пока я никак не разбираюсь в линуксе, да и вообще в компьютерах разбираюсь мало.

Из-под Xubuntu, скачал исходники libtorrent, собрал (или как это называется?), выдрал из папки usr/libs (вроде так) установленные библиотеки. Перенес их на роутер.

На момент переноса меня напрягла разительная разница в их весе - было 1.5 Мб, стало ~9 Мб. Так что на всякий случай сделал бекап старой версии.

Там было три файла: libtorrent.so, libtorrent.so.11, libtorrent.so.11.0.6. У первых двух на иконках значки ярлыков и вес около 20 Кб. Как мне подсказала интуиция и команда ls в консоль, это просто что-то вроде ссылок на третий файл, libtorrent.so.11.0.6. Правильно?

Но, вообщем, после того, как третий файл я заменил, ruTorrent перестал видеть rtorrent, из чего я сделал вывод, что rtorrent теперь, несмотря на мои попытки запустить его вручную, запускаться не хочет.

Видимо, хоть и файлы так разительно схожи, на роутере стоит какая-то другая версия. Что-то вроде libtorrent mobile edition? Или, может, при собирании версии с роутера не были включены какие-то библиотеки?

И отсутствие какой-либо работоспособности - из-за некорректной замены libtorrent, из-за слишком большого веса библиотеки, из-за того, что собрана она была под Xubuntu, или еще из-за чего?

И можно ли провернуть эту операцию успешно?

vectorm
11-12-2010, 20:11
К сожалению, пока я никак не разбираюсь в линуксе, да и вообще в компьютерах разбираюсь мало.

Из-под Xubuntu, скачал исходники libtorrent, собрал (или как это называется?), выдрал из папки usr/libs (вроде так) установленные библиотеки. Перенес их на роутер.

И отсутствие какой-либо работоспособности - из-за некорректной замены libtorrent, из-за слишком большого веса библиотеки, из-за того, что собрана она была под Xubuntu, или еще из-за чего?

И можно ли провернуть эту операцию успешно?
Почитайте эту тему, и аналогичные по компиляции софта под роутеры.
И поймете, что сами ответили на свой вопрос.

4ufak
20-12-2010, 13:07
Вооружился данными с этого форума, а заодно вот этой (http://zapiskiobovsem.blogspot.com/2010_02_01_archive.html) статьей.

Надо было собрать libtorrent. Собирал на самом роутере - хотя бы для того, чтобы то, что соберется, гарантированно работало там, где положено.

Вначале проблема была - при выполнении "./configure" оно (то, что там выполняет эту команду) ругалось на отсутствие sigc++-2.0.pc. Но с той статьей я наконец-таки понял, откуда этот файл достать.


6. установка libsigc++
cd libsigc++-2.2.4
./configure --prefix=/opt/libsigc
make
make install
rm -f /usr/lib/pkgconfig/sigc++-2.0.pc
ln -s /opt/libsigc/lib/pkgconfig/sigc++-2.0.pc /usr/lib/pkgconfig/sigc++-2.0.pc

Долгим был путь к этой инструкции, но я все-таки её нашел.

И сразу же - проблема. Вот эта команда не хотела выполняться:
ln -s /opt/libsigc/lib/pkgconfig/sigc++-2.0.pc /usr/lib/pkgconfig/sigc++-2.0.pc

Папка /usr/lib - Read Only.

Исходя из того, что будет дальше (а именно, "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig"), я изменил эту команду вот на что:
ln -s /opt/libsigc/lib/pkgconfig/sigc++-2.0.pc /opt/usr/lib/pkgconfig/sigc++-2.0.pc

А следующую - изменил на это:
export PKG_CONFIG_PATH=/opt/usr/lib/pkgconfig

И та ошибка про отсутствие sigc++-2.0.pc заменилась на другую ошибку. Что-то вроде этого:


Unknown keyword 'URL' in '/opt/usr/lib/pkgconfig/libcurl.pc'

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Гугление ничего не дало. Я даже не знаю, что и подумать. И почему это линукс так неудобен? Можно ли вообще как-нибудь собрать libtorrent?

Novik
20-12-2010, 13:25
Надо было собрать libtorrent. Собирал на самом роутере - хотя бы для того, чтобы то, что соберется, гарантированно работало там, где положено.
Собрать непосредственно на роутере ее можно, но "гарантированно работать там, где положено" результат не будет. Т.к. выброс C++ исключения из динамически линкованной библиотеки приводит к завершению программы, которая эту библиотеку использует - catch не работает. Следствие - либо точите сборку под полную статику, либо не майтесь дурью и собирайте кросс-компиляцией.

Unknown keyword 'URL' in '/opt/usr/lib/pkgconfig/libcurl.pc'
Ну так убрать ключевое слово URL из данного файла. Если написанное выше Вас не останавливает по к/л причинам.

bekkuz
06-03-2011, 16:32
Хотелось бы использовать ipfilter для rtorrent. Искал по форуму и наткнулся на запись сборка - с версией ip_filter_0.8.4_no_boost.diff (http://wl500g.info/showthread.php?t=25228).
Но мне хотелось бы прикрутить ipfilter на уже работающий rtorrent который установлен по инструкций для чайников (вроде версия rtorrent 0.8.6/0.12.6).Скачал файл rtorrent-0.8.6-ip_filter_no_boost-fast-bsd2.patch (http://libtorrent.rakshasa.no/raw-attachment/ticket/239/rtorrent-0.8.6-ip_filter_no_boost-fast-bsd2.patch).
И главный вопрос как установить этот патч на мой роутер и если получиться останутся ли заказчки в rtorrent-е? Объясните подробно как установить патч для чайника :)
Данный ipfilter будет мегаполезным для тех у кого Мегалайн (Казахстан). Сам пользовался на uTorrent-е на ББ.

al37919
07-03-2011, 12:30
патч накладывается на исходники, после чего они компилируются и полученные бинарники копируются на место текущих.

bekkuz
07-03-2011, 17:45
А поподробнее нельзя написать как все это установить на роутер?
Не все же здесь на ты с линуксом :eek:

al37919
07-03-2011, 18:54
вверху страницы есть кнопка поиск. Еще есть тема, где можно попытаться попросить скомпилировать. А персонально разжевывать вряд ли кто будет.

A1ex
07-03-2011, 23:55
Но мне хотелось бы прикрутить ipfilter на уже работающий rtorrent который установлен по инструкций для чайников (вроде версия rtorrent 0.8.6/0.12.6)
есть бинарник 0.8.6

заменить /opt/bin/rtorrent этим файлом

bekkuz
08-03-2011, 06:36
есть бинарник 0.8.6

А как теперь это установить на роутер чтобы сохранились торренты которые раздаются? Был бы очень благодарен. ;)

A1ex
08-03-2011, 08:37
А как теперь это установить на роутер чтобы сохранились торренты которые раздаются? Был бы очень благодарен. ;)
просто заменить /opt/bin/rtorrent этим файлом ;). Естественно надо остановить процесс и сохранить на всякий случай оригинальный файл, создать файл с фильтром и указать на него в конфиге rtorrent'а строчкой
ip_filter = /opt/etc/ipfilter.dat.

bekkuz
08-03-2011, 12:29
просто заменить /opt/bin/rtorrent этим файлом ;). Естественно надо остановить процесс и сохранить на всякий случай оригинальный файл, создать файл с фильтром и указать на него в конфиге rtorrent'а строчкой
ip_filter = /opt/etc/ipfilter.dat.

Остановил процесс. Заменил файл. Добавил в rtorrent.conf строчку
ip_filter = /opt/etc/ipfilter.dat.
В том же месте создал файл ipfilter.dat с таким содержанием:

comment:0.0.0.0 - 2.131.255.255
comment:2.136.0.0 - 9.255,255.255
comment:11.0.0.0 - 82.200.127.255
comment:82.201.0.0 - 88.204.127.255
comment:88.205.0.0 - 89.217.255.255
comment:89.219.0.0 - 92.45.255.255
comment:92.48.0.0 - 95.55.255.255
comment:95.60.0.0 - 169.253.255.255
comment:169.255.0.0 - 172.15.255.255
comment:172.32.0.0 - 178.87.255.255
comment:178.92.0.0 - 192.167.255.255
comment:192.169.0.0 - 212.19.127.255
comment:212.19.160.0 - 212.154.127.255
comment:212.155.0.0 - 255.255.255.255
Сохранил и перезагрузил командой
flashfs save&&flashfs commit&&reboot

После всех этих манипуляций у меня в пирах качает личер с IP 89.208.7.87 с РФ. Что я делаю не так :(?

A1ex
09-03-2011, 08:07
После всех этих манипуляций у меня в пирах качает личер с IP 89.208.7.87 с РФ. Что я делаю не так :(?
надо убрать пробелы из ipfilter.dat. flashfs и перезагрузку всего роутера делать не надо. достаточно перезапустить rtorrent.

voidshah
23-11-2011, 19:13
на сколько реально это дело (rtorrent 0.8.9 и libtorrent 0.12.9) собрать энтузиастским тулчейном, ну и насколько сложно для начинающего собирателя/компильщика? какие подводные камни и т.п.

voidshah
24-11-2011, 07:15
Скорее да, чем нет. Если не лень собрать несколько зависимостей (http://www.wl500g.info/showpost.php?p=238375&postcount=5).

Ок. Буду пробовать. Алексей, еси чо, то с вопросами к вам;). Ок?

ryzhov_al
24-11-2011, 07:46
Ок. Буду пробовать. Алексей, еси чо, то с вопросами к вам;). Ок?Ок.
ЗЫ Если речь про меня, то я Александр.

voidshah
24-11-2011, 14:51
Ок.
ЗЫ Если речь про меня, то я Александр.
Извиняюсь:o, Александр

voidshah
06-12-2011, 14:10
ldd /opt/lib-oleg/libsigc-2.0.so.0
checking sub-depends for '/opt/lib/libstdc++.so.6'
checking sub-depends for '/opt/lib/libm.so.0'
checking sub-depends for '/opt/lib/libc.so.0'
checking sub-depends for '/opt/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x00000000)
libm.so.0 => /opt/lib/libm.so.0 (0x00000000)
libc.so.0 => /opt/lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00000000)
libintl.so.0 => not found (0x00000000)
not a dynamic executable
ldd /opt/lib-oleg/libtorrent.so.14
checking sub-depends for '/opt/lib-oleg/libcrypto.so.1.0.0'
checking sub-depends for '/opt/lib-oleg/libsigc-2.0.so.0'
checking sub-depends for '/opt/lib/libstdc++.so.6'
checking sub-depends for '/opt/lib/libm.so.0'
checking sub-depends for '/opt/lib/libc.so.0'
checking sub-depends for '/opt/lib/libgcc_s.so.1'
checking sub-depends for '/opt/lib/libdl.so.0'
checking sub-depends for 'not found'
libcrypto.so.1.0.0 => /opt/lib-oleg/libcrypto.so.1.0.0 (0x00000000)
libsigc-2.0.so.0 => /opt/lib-oleg/libsigc-2.0.so.0 (0x00000000)
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x00000000)
libm.so.0 => /opt/lib/libm.so.0 (0x00000000)
libc.so.0 => /opt/lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00000000)
libdl.so.0 => /opt/lib/libdl.so.0 (0x00000000)
libintl.so.0 => not found (0x00000000)
/opt/lib/ld-uClibc.so.0 => /opt/lib/ld-uClibc.so.0 (0x00000000)
libintl.so.0
В /opt/lib есть libintl-0.9.28.so, но ведь эта либа собрана с uClibc 0.9.28 (если я правильно понял), а энтузиастский тулчейн содержит uClibc 0.9.32 .... И как быть??? libintl составляющая gettext (так вроде?), и gettext собирать???

ryzhov_al
06-12-2011, 16:48
ldd /opt/lib-oleg/libsigc-2.0.so.0
checking sub-depends for '/opt/lib/libstdc++.so.6'
checking sub-depends for '/opt/lib/libm.so.0'
checking sub-depends for '/opt/lib/libc.so.0'
checking sub-depends for '/opt/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x00000000)
libm.so.0 => /opt/lib/libm.so.0 (0x00000000)
libc.so.0 => /opt/lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00000000)
libintl.so.0 => not found (0x00000000)
not a dynamic executable
Не допустимо, чтобы софт, собранный с энтузиастким тулчейном с uClibc 0.9.32 линковался с optware'овской uClibc 0.9.28. Ниже представлены связи libsigcxx из энтузиасткого тулчейна с ключевыми библиотеками:

$ ldd /opt/lib/libsigc-2.0.so.0
checking sub-depends for '/opt/lib/libstdc++.so.6'
checking sub-depends for '/lib/libm.so.0'
checking sub-depends for '/lib/libc.so.0'
checking sub-depends for '/lib/libgcc_s.so.1'
checking sub-depends for '/lib/ld-uClibc.so.0'
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x00000000)
libm.so.0 => /lib/libm.so.0 (0x00000000)
libc.so.0 => /lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x00000000)
not a dynamic executable
Пусть путь /opt/lib в примере вас не смущает - у меня не optware, а OpenWRT, собранный энтузиастким тулчейном.


ldd /opt/lib-oleg/libtorrent.so.14...
libintl.so.0
В /opt/lib есть libintl-0.9.28.so, но ведь эта либа собрана с uClibc 0.9.28 (если я правильно понял), а энтузиастский тулчейн содержит uClibc 0.9.32 .... И как быть??? libintl составляющая gettext (так вроде?), и gettext собирать???Скачайте готовый пакет из Optware (http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/rtorrent_0.8.6-1_mipsel.ipk) или из OpenWRT (http://wl500g-repo.googlecode.com/svn/ipkg/openwrt) и посмотрите зависимости самостоятельно.

voidshah
06-12-2011, 17:32
Так я и не линковал. По -rpath ищет зависимости просто. Правильно ли я понимаю, что можно взять у тебя (плз не выкай мне больше:)) libstdc++ - и этого будет достаточно?
UPD.
Вау! Работает!:)


[admin@RT-20CF30CE0B4E rtorrent 0.8.9]$ ldd /opt/lib-oleg/libsigc-2.0.so
checking sub-depends for '/opt/lib-oleg/libstdc++.so.6'
checking sub-depends for '/opt/lib/libm.so.0'
checking sub-depends for '/opt/lib/libc.so.0'
checking sub-depends for '/opt/lib/libgcc_s.so.1'
libstdc++.so.6 => /opt/lib-oleg/libstdc++.so.6 (0x00000000)
libm.so.0 => /opt/lib/libm.so.0 (0x00000000)
libc.so.0 => /opt/lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00000000)
not a dynamic executable
ldd /opt/lib-oleg/libtorrent.so.14
checking sub-depends for '/opt/lib-oleg/libcrypto.so.1.0.0'
checking sub-depends for '/opt/lib-oleg/libsigc-2.0.so.0'
checking sub-depends for '/opt/lib-oleg/libstdc++.so.6'
checking sub-depends for '/opt/lib/libm.so.0'
checking sub-depends for '/opt/lib/libc.so.0'
checking sub-depends for '/opt/lib/libgcc_s.so.1'
checking sub-depends for '/opt/lib/libdl.so.0'
libcrypto.so.1.0.0 => /opt/lib-oleg/libcrypto.so.1.0.0 (0x00000000)
libsigc-2.0.so.0 => /opt/lib-oleg/libsigc-2.0.so.0 (0x00000000)
libstdc++.so.6 => /opt/lib-oleg/libstdc++.so.6 (0x00000000)
libm.so.0 => /opt/lib/libm.so.0 (0x00000000)
libc.so.0 => /opt/lib/libc.so.0 (0x00000000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x00000000)
libdl.so.0 => /opt/lib/libdl.so.0 (0x00000000)
/opt/lib/ld-uClibc.so.0 => /opt/lib/ld-uClibc.so.0 (0x00000000)
И rtorrent подал признаки жизни!:)

rtorrent -h
Rakshasa's BitTorrent client version 0.8.9.

All value pairs (f.ex rate and queue size) will be in the UP/DOWN
order. Use the up/down/left/right arrow keys to move between screens.

Usage: rtorrent [OPTIONS]... [FILE]... [URL]...
-h Display this very helpful text
-n Don't try to load ~/.rtorrent.rc on startup
-b <a.b.c.d> Bind the listening socket to this IP
-i <a.b.c.d> Change the IP that is sent to the tracker
-p <int>-<int> Set port range for incoming connections
-d <directory> Save torrents to this directory by default
-s <directory> Set the session directory
-o key=opt,... Set options, see 'rtorrent.rc' file

Main view keys:
backspace Add a torrent url or path
^s Start torrent
^d Stop torrent or delete a stopped torrent
^r Manually initiate hash checking
^q Initiate shutdown or skip shutdown process
a,s,d,z,x,c Adjust upload throttle
A,S,D,Z,X,C Adjust download throttle
I Toggle whether torrent ignores ratio settings
right View torrent

Download view keys:
spacebar Depends on the current view
1,2 Adjust max uploads
3,4,5,6 Adjust min/max connected peers
t/T Query tracker for more peers / Force query
* Snub peer
right View files
p View peer information
o View trackers

Report bugs to <jaris@ifi.uio.no>.

ryzhov_al
06-12-2011, 17:36
Да. Или сам возьми из тулчейна /opt/brcm/hndtools-mipsel-uclibc/lib

ЗЫ. Только не устраивай в /opt/lib кашу из библиотек optware и собранных с помощью энтузиасткого тулчейна. До добра не доведёт.


UPD.
Вау! Работает!:)Класс. Осталось проверить в боевых условиях.

voidshah
08-12-2011, 23:28
Класс. Осталось проверить в боевых условиях.
Еще прикрутил xmlrpc-c и...

http://i28.fastpic.ru/thumb/2011/1209/58/5a449a335b8e354e40cd561c4a8cb558.jpeg (http://fastpic.ru/view/28/2011/1209/5a449a335b8e354e40cd561c4a8cb558.jpg.html)
РАБОТАЕТ!:)

ryzhov_al
09-12-2011, 06:22
Спасибо за протоптанную тропинку. Постараюсь вскоре включить обновлённый rtorrent в репозиторий OpenWRT.

voidshah
09-12-2011, 07:49
Спасибо за протоптанную тропинку. Постараюсь вскоре включить обновлённый rtorrent в репозиторий OpenWRT.

Угу. только там настройки поменяли некоторые, а ман старый остался. Надо разбираться.

ryzhov_al
13-12-2011, 11:19
При кросс-компиляции (http://www.wl500g.info/showthread.php?p=241892#post241892) rTorrent 0.8.9/0.12.9 энтузиастким тулчейном (gcc 4.4.6 и uClibc 0.9.32 c epoll и posix_fallocate) возникает засада: в rtorrent не обрабатываются exceptions из динамически прилинкованной libtorrent. В момент между окончанием проверки хеша перед началом сидирования возникает необрабатываемое исключение std::exception.

Где же баг? в uClibc? В GCC? В моей ДНК?
При статической линковке никаких необрабатываемых исключений не возникает. Ниже приложена информация о конфигурации софта и ключах при компиляции.

Ключи:

CFLAGS="-Os -pipe -mips32 -mtune=mips32 "
CXXFLAGS="-Os -pipe -mips32 -mtune=mips32 "
CPPFLAGS=" -fno-strict-aliasing -fno-inline "
Лог rtorrent до момента возникновения исключения:

(12:28:27) Using 'epoll' based polling.
(12:28:27) Using 'epoll' based polling.
(12:28:27) XMLRPC initialized with 897 functions.
(12:28:27) The SCGI socket is bound to a specific network device yet may still p
ose a security risk, consider using 'scgi_local'.
(12:28:27) Ignoring ~/.rtorrent.rc.
(12:28:28) Starting DHT server on port 12345.

Tracker[0:0]: Connecting to http://tracker.ccc.de:80/announce
terminate called after throwing an instance of 'torrent::close_connection' what(): std::exception
Статически линкованная стабильная рабочая сборка зависит от:

$ ldd /opt/bin/rtorrent
libpthread.so.0 => /opt/lib/libpthread.so.0 (0x2aac0000)
libncursesw.so.5 => /opt/lib/libncursesw.so.5 (0x2aae5000)
libsigc-2.0.so.0 => /opt/lib/libsigc-2.0.so.0 (0x2ab2a000)
libcurl.so.4 => /opt/lib/libcurl.so.4 (0x2ab43000)
libxmlrpc_server.so.3 => /opt/lib/libxmlrpc_server.so.3 (0x2ab98000)
libxmlrpc.so.3 => /opt/lib/libxmlrpc.so.3 (0x2abad000)
libxmlrpc_util.so.3 => /opt/lib/libxmlrpc_util.so.3 (0x2abcf000)
libxmlrpc_xmlparse.so.3 => /opt/lib/libxmlrpc_xmlparse.so.3 (0x2abe3000)
libxmlrpc_xmltok.so.3 => /opt/lib/libxmlrpc_xmltok.so.3 (0x2abfc000)
libstdc++.so.6 => /opt/lib/libstdc++.so.6 (0x2ac22000)
libm.so.0 => /lib/libm.so.0 (0x2ad14000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x2ad30000)
libc.so.0 => /lib/libc.so.0 (0x2ad52000)
libcrypto.so.1.0.0 => /opt/lib/libcrypto.so.1.0.0 (0x2adcb000)
libdl.so.0 => /lib/libdl.so.0 (0x2aefd000)
libssl.so.1.0.0 => /opt/lib/libssl.so.1.0.0 (0x2af10000)
libz.so.1 => /opt/lib/libz.so.1 (0x2af61000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x2aaa8000)
Не удивляйтесь тому, что некоторые прошивочные библиотеки, например libstdc++ и libpthread лежат в /opt/lib. Это - задел на будущее для томатовцев.

Патчи (https://dev.openwrt.org/browser/packages/libs/libtorrent?rev=26652) - из транка OpenWRT плюс выкидывание непроходимого теста AM_PATH_CPPUNIT при конфигурировании.

Конфиг libtorrent, сгенерированный GNU Build System, во вложении.

lly
13-12-2011, 12:04
При кросс-компиляции (http://www.wl500g.info/showthread.php?p=241892#post241892) rTorrent 0.8.9/0.12.9 энтузиастким тулчейном (gcc 4.4.6 и uClibc 0.9.32 c epoll и posix_fallocate) возникает засада: в rtorrent не обрабатываются exceptions из динамически прилинкованной libtorrent. В момент между окончанием проверки хеша перед началом сидирования возникает необрабатываемое исключение std::exception.

Где же баг? в uClibc? В GCC?

Во-первых, для полноты картины всё же лучше видеть вывод backtrace gdb.

Проблема, скорее всего, в связке c++ exceptions handler и uClibc. Гугл выдаёт несколько вариантов по этой проблеме:
http://dev.openwrt.org/ticket/4924
http://libtorrent.rakshasa.no/ticket/1686
http://lists.busybox.net/pipermail/buildroot/2006-August/000152.html
http://gcc.gnu.org/ml/gcc/2007-07/msg00275.html

И интересное исследование по данной теме(еще не прочитал полностью сам) - http://filodej.blogspot.com/2008/07/wmu-6500fs-deluge-torrent-part-ii.html

ryzhov_al
13-12-2011, 12:22
И интересное исследование по данной теме(еще не прочитал полностью сам) - http://filodej.blogspot.com/2008/07/wmu-6500fs-deluge-torrent-part-ii.htmlУгу. Filodej смотрит ключи, с которыми был собран gcc:

$ /opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc -v
Using built-in specs.
Target: mipsel-linux-uclibc
Configured with: /home/lly/Wl500/toolchain/build_dir/toolchain-mipsel_gcc4.4.6/gcc-4.4.6/configure --prefix=/opt/brcm/hndtools-mipsel-uclibc-4.4.6-K26 --build=x86_64-suse-linux --host=x86_64-suse-linux --target=mipsel-linux-uclibc --with-gnu-ld --enable-target-optspace --disable-libgomp --disable-libmudflap --disable-multilib --disable-nls --disable-__cxa_atexit --with-gmp=/home/lly/Wl500/toolchain/staging_dir/host --with-mpfr=/home/lly/Wl500/toolchain/staging_dir/host --disable-decimal-float --with-mips-plt --enable-libssp --enable-languages=c,c++ --enable-shared --enable-threads --enable-tls
Thread model: posix
gcc version 4.4.6 (GCC)
И делает вывод:

... it seems that it is not configured with --enable-sjlj-exceptions.Но, на мой взгляд, эти рассуждения относились к более ранним версиям GCC 3.3..4.1.
Вообще, после гугления по теме у меня сформировалась следующая картина: сначала обработка исключений была поломана (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29132) в старых версиях GCC, затем дело упиралось в заглушки uClibc до ~0.9.30. Здоров ли механизм exceptions в современной uClib 0.9.32 я так и не понял, т.к. жалобы на него пишутся до сих пор.

lly
13-12-2011, 12:40
Но, на мой взгляд, эти рассуждения относились к более ранним версиям GCC 3.3..4.1.
Да, но пару готовых примеров - throw1.cpp, throw2.cpp можно попробовать прогнать.

Ключ "-fno-inline" не помогает?


Вообще, после гугления по теме у меня сформировалась следующая картина: сначала обработка исключений была поломана (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29132) в старых версиях GCC, затем дело упиралось в заглушки uClibc до ~0.9.30. Здоров ли механизм exceptions в современной uClib 0.9.32 я так и не понял, т.к. жалобы на него пишутся до сих пор.
Скорее всего, не совсем :( И, так как проблема у тебя всплывает только при динамической линковке, она находится в ld.so

P.S. Если есть возможность поковыряться с gdb - лучше сделать, т.к. фикс апстрима можно ждaть очень долго.

ryzhov_al
13-12-2011, 12:58
Ключ "-fno-inline" не помогает?Нет.
Отключение фич posix_memalign\posix_fallocate\epoll тоже. Сейчас пересоберу без ключей оптимизации -Os -mtune=mips32 и попробую в работе, хотя это метод научного тыка.

P.S. Если есть возможность поковыряться с gdb - лучше сделать, т.к. фикс апстрима можно ждaть очень долго.gdb в руках не держал но заблаговременно собрал. Придётся взяться. Будет от него толк на strip'нутых бинарниках?

lly
13-12-2011, 13:13
gdb в руках не держал но заблаговременно собрал. Придётся взяться. Будет от него толк на strip'нутых бинарниках?
Небольшой, придётся каждый раз искать соответствие при помощи mipsel-linux-addr2line. Поэтому для отладки лучше без strip'а.

ryzhov_al
13-12-2011, 13:21
Сейчас пересоберу без ключей оптимизации -Os -mtune=mips32 и попробую в работе, хотя это метод научного тыка.Заработал! Погоняю в тестах и напишу о выводах позже.

В любом случае, приглашу-ка к диалогу тов.Novik'а - специалиста с мировым именем в области кросс-компиляции rtorrent'а. Он откопал грабли с исключениями годом раньше (http://www.wl500g.info/showthread.php?p=220234#post220234).

lly
13-12-2011, 13:32
Заработал! Погоняю в тестах и напишу о выводах позже.
Скорее всего влияет оптимизация "-Os", а не модель процессора "-mtune=mips32", но лучше перепроверить. Ключи оптимизации убирал только с библиотеки или и при сборке самого бинарника тоже?

Novik
13-12-2011, 13:39
Годом раньше ситуация была следующая - при нативной компиляции выброс c++ исключения из динамической библиотеки не ловился при нативной компиляции. В статике (на простейших примерах) все работало.
При кросс-компиляции данная проблема фиксилась.
С чем сие связано, я тогда полностью не разобрался, и больше сказать по проблеме, к сожалению, ничего не могу - давно отошел от этих дел.

ryzhov_al
13-12-2011, 13:40
Годом раньше ситуация была следующая - при нативной компиляции выброс c++ исключения из динамической библиотеки не ловился при нативной компиляции. В статике (на простейших примерах) все работало.
При кросс-компиляции данная проблема фиксилась.
С чем сие связано, я тогда полностью не разобрался, и больше сказать по проблеме, к сожалению, ничего не могу - давно отошел от этих дел.Ладно. В любом случае, спасибо что присоединились к нам.


Скорее всего влияет оптимизация "-Os", а не модель процессора "-mtune=mips32", но лучше перепроверить. Ключи оптимизации убирал только с библиотеки или и при сборке самого бинарника тоже?С libtorrent и с rtorrent. С других зависимых библиотек ключи оптимизации не убирал.
Насколько я понял, -mips32 задаёт архитектуру, а -mtune только оптимизацию (http://gcc.gnu.org/onlinedocs/gcc-4.4.6/gcc/MIPS-Options.html#MIPS-Options). Что именно gcc делает в процессе этой оптимизации я долго выяснять не стал:)

Чуть позже продолжу метод научного тыка и экспериментально выясню какой из ключей оптимизации ломает механизм исключений.

ryzhov_al
14-12-2011, 10:48
Чтож, экспериментальным путём глюк отловлен и можно сформулировать следующую гипотезу:


Если библиотека libtorrent собрана с ключом компилятора -Os, то выброс c++ исключения из библиотеки libtorrent не сможет быть обработан в rtorrent. Работа rtorrent в этот момент будет аварийно завершена.
Надеюсь, в будущем это сэкономит кому-то время на поиск бага.

В OpenWRT, например, проблема решается добавлением в make-файл строчки TARGET_CFLAGS= -pipe -mips32 -mtune=mips32, которая перекроет заданные по умолчанию ключи CFLAGS="-Os -pipe -mips32 -mtune=mips32 ".

lly
14-12-2011, 11:05
Если библиотека libtorrent собрана с ключом компилятора -Os, то выброс c++ исключения из библиотеки libtorrent не сможет быть обработан в rtorrent. Работа rtorrent в этот момент будет аварийно завершена.
Баг оптимизатора gcc :(

Если вдруг у тебя найдется куча времени, было бы замечательно локализовать проблему.
Во-первых, таки снять backtrace в gdb.
Потом, если это не даст ясности, собирать часть исходников libtorrent с "-Os" и так попытаться найти проблемный файл/модуль.

ryzhov_al
22-04-2012, 20:48
Проверил, что при использовании тулчейна с GCC 4.5.3 баг остаётся на месте. Ключ -Os делает библиотеку libtorrent.so "худее" на несколько килобайт, но по прежнему "ломает" обработку исключений.

У меня была надежда на то, что с обновлением GCC с 4.4.6 на GCC 4.5.3 ситуация изменится.