суббота, 11 января 2014 г.

TP-Link TL-WR1043ND. Тренировочный лагерь.

У нас есть Linux-2.6.15 MIPS big-endian и uClibc-0.9.29 в качестве библиотеки C, причем поменять ее на что-нибудь другое не получится, т. к. управлением роутера занимается проприетарный веб-сервер. В принципе, для третьей части этой информации хватит.
Что ж, вот и третья часть. Добро пожаловать, если вам действительно это настолько нужно.

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

Так вот, к делу.
Есть такое понятие - toolchain. Для Ъ в понимании LOR, которые не ходят по ссылкам, объясню в двух словах. Tool (инструмент) и chain (цепочка). Грубо говоря, это набор инструментов для разработки/сборки чего угодно. В его состав входят binutils (комплект для архивации и линковки бинарных файлов, а также парочка полезных утилит), gcc (это в моем случае - на самом деле можно выбрать любой компилятор, исходя их поставленных задач) и набор библиотек языка C (в подавляющем большинстве дистрибутивов используется glibc, в embedded-системах выбор больше - glibc, eglibc, uClibc и еще парочка). Естественно, все это должно быть собрано таким образом, чтобы запускалось на нашей рабочей станции, а результат работы можно было запустить на том девайсе, который мы препарируем. Такой тулчейн называется кросс-тулчейном. И сейчас я расскажу, как его собирать.

Информации в сети про тулчейны не то, чтобы мало, но она в основном не описывает наш запущенный случай с древним ядром и древней библиотекой C. Поэтому предупрежу сразу - вне зависимости от системы, запущенной на рабочей станции, вам придется запускать виртуальную машину (у меня уже запущена). Почему? Очень хороший вопрос, отвечу на него позже. А пока что ставим VirtualBox, качаем Debian Etch (4.0) и водружаем его на виртуалку.
Дальнейшая последовательность действий проста и незатейлива:
# apt-get install build-essential flex bison mc
Естественно, перед этим надо либо добавить архивные репозитории, которые можно найти на www.debian.org, если поискать. Кстати, они НЕ подключатся во время установки, это нормально. Потом допишете в /etc/apt/sources.list
Так вот, на выходе имеем виртуальную машину с системой, в достаточной степени похожей на ту, которая крутится на роутере. Зачем? Да хотя бы потому, что делать постепенный даунгрейд binutils и gcc на рабочей станции, чтобы они без ошибок собрали необходимую нам версию uClibc, слишком долгое и неблагодарное занятие. Собрать тот же gcc-3.4.6 на современной системе можно, а вот соответствующие времени binutils, скажем, 2.17 - уже нет. Да и uClibc-0.9.29 в современных реалиях не слинкуется без вмешательства напильника в некоторые исходники (crtn.S, к примеру). А результат этого издевательства на целевой системе запускаться не будет, оставляя вас гадать, по какой причине собранный статически dropbear вываливается с сообщение SIGUSR сразу после старта. Поменять библиотеку на целевой системе не получится, т. к. откажется запускаться busybox или httpd, например. В общем, если вы являетесь счастливым обладателем исходников TP-Link'овского httpd, вы и так знаете, что делать. А если вы при этом не связаны никакими NDA на этот счет, поделитесь ими со мной. Но скорее всего вы таковым не являетесь, как и я, поэтому продолжаем.
Рекомендую сразу создать каталог, в котором наш тулчейн будет собран. $HOME/mips вполне подойдет. Сразу желательно объявить несколько переменных:
export PREFIX=$HOME/mips
export TARGET=mips-linux
Качаем исходники gcc-3.4.6, binutils-2.18 и uClibc-0.9.29, распаковываем их куда-нибудь, можно для этого создать отдельный каталог, можно не создавать, это не принципиально. Также рекомендую скачать исходники ядра 2.6.18. За основу инструкций по сборке я взял вот этот пост, но парочка отличий все равно присутствует.
Итак, распаковываем binutils, создаем отдельный каталог для сборки, заходим в него и выполняем:
../binutils-2.18/configure --prefix=$PREFIX --with-sysroot=$PREFIX --target=$TARGET --disable-nls && make && make install && export PATH=${PREFIX}/bin:${PATH}
 Теперь у нас есть необходимые binutils для сборки под MIPS. Переходим к ядру:
make ARCH=mips CROSS_COMPILE=mips-linux- headers_install INSTALL_HDR_PATH=${PREFIX}/usr
Заголовки ядра тоже есть, настала очередь gcc_stage1. Создаем каталог gcc1 и собираем gcc для сборки под MIPS без использования библиотеки C, ее нам тоже придется собрать под MIPS, если вы не поняли:
../gcc-3.4.6/configure --prefix=$PREFIX --with-sysroot=$PREFIX --target=$TARGET --with-newlib --enable-languages=c --enable-threads=no --disable-nls --disable-shared --disable-multilib --disable-tls --disable-mudflap && make && make install
Собираем uClibc:
make CROSS=${TARGET}- menuconfig
make CROSS=${TARGET}- KERNEL_HEADERS=${PREFIX}/usr/include
На этом моменте у меня случался небольшой затык, потому что "оно не смогло" найти заголовки ядра в середине процесса сборки. Вариант решения - отредактировать .config и указать в нем явный путь к заголовкам. И наконец:
make CROSS=${TARGET}- install PREFIX=${PREFIX}/ RUNTIME-PREFIX= DEVEL_PREFIX=usr/ KERNEL_HEADERS=${PREFIX}/usr/include
GCC Stage 2 - собираем gcc с поддержкой нужной библиотеки. Создаем каталог gcc2 и из него выполняем:
../gcc-3.4.6/configure --prefix=$PREFIX --with-sysroot=$PREFIX --target=$TARGET --enable-languages=c --enable-threads=posix --disable-shared --disable-multilib --disable-mudflap && make && make install
Готово! Если возникнут проблемы из-за потоков (threads), вместо posix можно поставить single. Вот он - наш кросс-тулчейн. О том, как им пользоваться, будет рассказано в следующей части, которая будет довольно скоро.
 
 

Комментариев нет:

Отправить комментарий