Добавить в FacebookДобавить в Google BookmarksДобавить в TwitterДобавить в OdnoklassnikiДобавить в Vkcom

Буквально недавно у моего друга возникла необходимость в файловом менеджере Midnight Commander на сетевом накопителе NAS Seagate Central. В стандартной прошивке его нет и не предвидится. Поиск скомпилированного MC тоже был безрезультатен - все собранные под процессор arm версии не работают на этом устройстве. Хочешь не хочешь, а придется собрать mc (Midnight Commander) под NAS Seagate Central самим.

Для начала нужно зайти на устройство по ssh и выяснить его архитектуру.

Для выяснения архитектуры выполним следующие команды:

$ cat /etc/*release
MontaVista Linux 6, (.dev-snapshot-20130726)

и

$ cat /proc/cpuinfo
Processor : ARMv6-compatible processor rev 4 (v6l)
BogoMIPS : 279.34
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb02
CPU revision : 4

Hardware : Cavium Networks CNS3420 Validation Board
Revision : 0000
Serial : 0000000000000000

Дальнейший поиск в интернете привел меня на форум stackowerflow, где обсуждалась эта проблема и предлагалось решение. Собственно проблема заключается в следующем - процессор NAS Seagate Central использует page size/offset 0x10000, тогда как по умолчанию для ARM GCC используется 0х8000. Именно по этой причине найденный в сети интернет, скомпилированный MC, не запускался на данном устройстве. Там-же было предложено использовать флаги -march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000. Отдельно хочу отметить интересный метод узнать правильное смещение текст-сегмента в заголовке раздела и размер страницы в заголовках программы. Для этого нужно выполнить для одной из встроенных программ, например nano, команду #readelf -a /usr/bin/nano. Итак идея ясна, пора приступать к сборке. В сети интернет я нашел замечательную статью с названием "Кросс-компиляция под arm Midnight Commander". Дальнейшее изложение я буду делать в том-же стиле, что и автор этой статьи, включив только необходимые для целевой архитектуры флаги. На своем нетбуке я использую операционную систему Ubuntu 14.04. Для нее нужно установить инструменты для кросс-компиляции. Все действия я выполняю с правами суперюзера. Выполним команду  #apt-get install gcc-4.7-arm-linux-gnueabi arm-linux-gnueabi-gcc pkg-config-arm-linux-gnueabi libglib2.0-dev. Я решил что Midnight Commander  на сетевом накопителе NAS будет находиться в папке /opt/mc . Создадим необходимые папки в нашей системе (я создал их в своей системе Ubuntu)выполнив #mkdir /opt/mc, #mkdir /opt/mc/sources, #mkdir /opt/mc/builds. Назначение папок вполне ясно. Для чего это делается? Мы будем компилировать МС и библиотеки со статической линковкой. Именно поэтому нужно создать структуру папок идентичную той, которую мы планируем использовать на нашем устройстве.

Зайдите мою страницу Google+ (ссылка автора внизу) и посмотрите там исходники. Положите исходники в папку /opt/mc/source. Далее, также как и автор вышеуказанной статьи, будем создавать скрипты в каталоге компилируемой библиотеки. Весь исходный код должен быть в папке /opt/mc/sources. Еще раз обратите внимание на то что это будет компиляция со статической линковкой библиотек.

Компиляция check-0.10.0:

создадим файл скрипта - #nano /opt/mc/sources/check-0.10.0/my_make

и добавим туда код

#!/bin/bash
ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
--host=arm-linux-gnueabi \
--prefix=/opt/mc/builds/build_check-0.10.0/ \
--enable-static=yes
make
sudo make install

сохраним файл, нажав комбинацию клавиш ctrl+o. При этом nano спросит будем ли сохранять? Ответим Y что означает Yes. После этого нажмем ctrl+x.

Дадим файлу права на выполнение #chmod 755 /opt/mc/sources/check-0.10.0/my_make.

Перейдем в папку с исходниками #cd /opt/mc/sources/check-0.10.0/ и выполним скрипт #./my_make.

По окончанию выполнения скомпилированная библиотека будет находиться в папке /opt/mc/builds/build_check-0.10.0.

Таким же образом компилируем и остальные библиотеки и сам MC. Привожу содержимое файлов.

Компиляция libffi-3.2.1:

#!/bin/bash
ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
--host=arm-linux-gnueabi \
--prefix=/opt/mc/builds/build_libffi-3.2.1 \
--enable-static=yes
make
sudo make install

Компиляция zlib-1.2.8:

#!/bin/bash
ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
--static
make
sudo make install DESTDIR=/opt/mc/builds/build_zlib-1.2.8

Компиляция ncurses-5.9:

#!/bin/bash
ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
--target=arm-linux-gnueabi \
--with-gcc=arm-linux-gnueabi-gcc \
--host=arm-linux-gnueabi \ --prefix=/opt/mc/builds/build_ncurses-5.9 \
--enable-static=yes
make
sudo make install


Компиляция glib-2.16.6 (С этой библиотекой отдельная история. Более новые библиотеки не работают с libc.so.6 (GLIBС 2.11). Эмпирическим путем, разбирая пакеты Debian Lenny, было выявлено что сборка делалась с библиотекой glib-2.16.6) :

#!/bin/bash
echo "glib_cv_stack_grows=no" > arm-linux.cache
echo "glib_cv_uscore=no" >> arm-linux.cache
echo "ac_cv_func_posix_getpwuid_r=no" >> arm-linux.cache
echo "ac_cv_func_posix_getgrgid_r=no" >> arm-linux.cache

ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
ZLIB_CFLAGS="-I/opt/mc/builds/build_zlib-1.2.8/usr/local/include/" \
ZLIB_LIBS="-L/opt/mc/builds/build_zlib-1.2.8/usr/local/lib -lz" \
LIBFFI_CFLAGS="-I/opt/mc/builds/build_libffi-3.2.1/lib/libffi-3.2.1/include" \
LIBFFI_LIBS="-L/opt/mc/builds/build_libffi-3.2.1/lib -lffi" \
--host=arm-linux-gnueabi \
--prefix=/opt/mc/builds/build_glib-2.16.6 \
--enable-static=yes \
--cache-file=arm-linux.cache
make
sudo make install

Компиляция mc-4.8.14:

#!/bin/bash
ARCH=armv6k \
CFLAGS="-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000" \
CC=arm-linux-gnueabi-gcc ./configure \
CHECK_CFLAGS="-I/opt/mc/builds/build_check-0.10.0/include/" \
CHECK_LIBS="-L/opt/mc/builds/build_check-0.10.0/lib/ -lcheck" \
GLIB_CFLAGS="-I/opt/mc/builds/build_glib-2.16.6/include/glib-2.0 -I/opt/mc/builds/build_glib-2.16.6/lib/glib-2.0/include" \
GLIB_LIBS="-L/opt/mc/builds/build_glib-2.16.6/lib -lglib-2.0" \
GMODULE_CFLAGS="-I/tmp/mc/builds/build_glib-2.16.6/include/glib-2.0 -I/opt/mc/builds/build_glib-2.16.6/lib/glib-2.0/include" \
GMODULE_LIBS="-L/opt/mc/builds/build_glib-2.16.6/lib/glib-2.0 -lgmodule-2.0" \
--host=arm-linux-gnueabi \
--prefix=/opt/mc/builds/build_mc-4.8.14 \
--enable-static=yes \
--with-screen=ncurses \
--with-ncurses-includes="/opt/mc/builds/build_ncurses-5.9/include" \
--with-ncurses-libs="/opt/mc/builds/build_ncurses-5.9/lib"
make
sudo make install

После последовательного перехода в папки с исходным кодом и запуска всех файлов my_make у вас появятся папки со скомпилированными библиотеками и MC в каталоге opt/mc/builds.

Теперь упаковываем папку builds в архив  #tar -cvzf mc.tar.gz /opt/mc/builds. Скопируем архив на NAS командой scp /путь_к_архиву/builds.tar.gz root@nas:/opt. Подключимся к NAS по ssh. Перейдем в нужную папку # cd /opt. Распакуем архив # tar -xvzf mc.tar.gz. Проверяем работоспособность командой #/opt/mc/builds/build_mc-4.8.14/bin/mc. У меня с другом все прекрасно запустилось и работает. В принципе, после проверки работоспособности, можно добавить переменную окружения export PATH=/opt/mc/builds/build_mc-4.8.14/bin:$PATH. Тогда можно будет просто запустить Midnight Commander командой #mc. Для того, чтобы это работало на постоянной основе из под суперюзера нужно выполнить команду user@FC3> sudo nano /etc/profile найти строчку PATH="/usr/local/bin:/usr/bin:/bin"
и переписать ее вот так PATH="/usr/local/bin:/usr/bin:/bin:/opt/mc/builds/build_mc-4.8.14/bin"
и сохранить файл. Для того, чтобы МС работал из под учетной записи пользователя NAS необходимо сделать пользователя владельцем папки /opt/mc и всех находящихся в ней файлов. Делается это командой #chown -R user:root /opt/mc, где user - имя пользователя на устройстве. Для русского языка в меню нужно настраивать локаль.

По просьбе в комментарии выкладываю готовую сборку, перейдите по ссылке с тегом "автор:" внизу страницы на мой профиль Google+ и поищите там. Яндекс банит весь сайт за прямые ссылки на скомпилированные программы. Уж не обессудьте.

Вот, пожалуй, и все. Развлекайтесь.

Желаю Вам удачи.

Автор: Darkeye.  

Еще интересное в сети.

  

 

Похожие материалы

Перейти к ленте статей

Комментарии   

#4 Darkeye 13.07.2016 04:12
В принципе ничего сложного. Если привык писать код. Удачи.
Цитировать
#3 TalWar 12.07.2016 17:40
Ай молодца!
Спасибо за мануал, попробую повторить =)
Цитировать
#2 Darkeye 09.01.2016 09:34
Без проблем. Перейдите на мой google+. Там в ленте есть ссылка. Хотя, думаю, многим будет интересно собрать самим. Поднять свой уровень знаний и получить навыки компиляции программ и библиотек. Пользуйтесь на здоровье.
Цитировать
#1 iRET 08.01.2016 21:31
Отлично, Молодец. Но что мешает теперь выложить архив своей папки mс , что бы избавить остальных владельцев от компиляции.
Цитировать

Добавить комментарий


Защитный код
Обновить