Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -=Кросс-компиляция под ARM — Midnight Commander=-
- Задача — скомпилировать известный файловый менеджер Midnight Commander (mc) под систему с архитектурой ARM. В наших руках компьютер с процессором Intel, с операционной системой Ubuntu 18.04.
- В качестве компилятора будем использовать пакет arm-linux-gnueabi, который отлично пребывает на репозиториях. Исходный материал — исходные коды необходимых библиотек и код самого mc.
- Сперва начнем с простого — установки необходимых пакетов:
- $sudo apt-get install gcc-arm-linux-gnueabi
- $sudo apt-get install libglib2.0-dev
- $sudo apt-get install libmount-dev
- $sudo apt-get install libffi-dev
- Загружаем исходники. Нам потребуются следующие исходники:
- zlib-1.2.11.tar.gz
- ncurses-6.0.tar.gz
- libffi-3.2.1.tar.gz
- glib-2.53.4.tar.gz
- mc-4.8.19.tar.gz
- Скачать исходники можно тут
- https://yadi.sk/d/nqvHImVNN5qKiQ
- https://drive.google.com/file/d/1AfwRM74wBfiXk_pdzzQ7wuKUqETU2GWR/view?usp=sharing
- Собственно, при компиляции самого mc нужно скомпилировать сначала ему вышеприведенные либы.
- Есть проблемы сборки с относительными путями описанной в статье http://tetraquark.ru/archives/10. Дословно суть проблемы.
- Кто не в курсе, проблема вот в чем — при компиляции определенных библиотек, им необходимо указывать пути до уже скомпилированных зависимых библиотек. Собственно, при компиляции самого mc нужно скармливать ему вышеприведенные либы. Указав полные пути (а конфигурационные скрипты почему то требуют указывать именно абсолютные пути), ваш mc запустится только по таким путям файловой системы, в которых все было скомпилировано.
- В нашем случае сборку будем делать в домашней папке пользователя /home/user/cross/build.
- $ mkdir -p /home/user/cross/build
- В каталог /home/user/cross/ кладем наш архив mc_src.tar.gz и выполняем разархивацию в данный каталог содержимого всех архивов оконным приложением, либо так (перед выполнением сначала перейдите в каталог с архивом)
- $ cd /home/user/cross/
- $ tar -xf mc_src.tar.gz && for f in *.tar*; do tar xf $f; done
- Необходимо будет создавать исполняемый bash-скрипт в корне каталога компилируемой библиотеки, прописывать в данный скрипт нужные команды и выполнять этот скрипт. От нас лишь требуется правильно предоставить требуемые зависимости и скормить скриптам нужные флаги и параметры.
- -=Компиляция zlib-1.2.11=-
- Как узнать какие ключи и параметры принимает скрипт конфигурации?
- Давайте запустим из текущей директории (/home/user/cross/zlib-1.2.11) утилиту configure с ключем --help.
- $cd /home/user/cross/zlib-1.2.11
- $./configure --help
- На экране появиться список доступных ключей:
- usage:
- configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]
- [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]
- [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]
- Создадим первый файл скрипта конфигурации пакета и дадим права на исполнение:
- $cd /home/user/cross/zlib-1.2.11
- $touch zlib.sh
- $chmod +x zlib.sh
- Копируем в этот файл следующий текст:
- #!/bin/bash
- ARCH=arm CC=arm-linux-gnueabi-gcc ./configure \
- --prefix=/home/user/cross/build \
- --static
- ARCH=arm и CC=arm-linux-gnueabi-gcc задаются переменные окружения при запуске ./configure.
- CC - компилятор и ARCH - архитектура.
- Символ \ в конце строки означает продолжение строки переносится ниже.
- --prefix=/home/user/cross/build - это путь куда копируются исходники после команды make install.
- Если префикс не указать, файлы будут скопированы в разные подпапки в папке /usr/local/, что в дальнейшем
- усложнит процесс извлечения нужных файлов.
- Запускаем скрипт конфигурации пакета.
- $ ./zlib.sh
- если не появилось ошибок, то можно запустить процесс сборки.
- $ make
- если ошибок не появилось, то можна запустить процесс неправильной установки.
- $ make install
- После этой команды все необходимые файлы будут скопированы в папку указанную по ключу --prefix.
- В нашем случае нужные файлы копирутся в папку /home/user/cross/build.
- Вообще в ubunte есть определенные правила сборки и установки программного обеспечения из исходников.
- https://help.ubuntu.ru/wiki/programs_installation
- Но так как наша цель является тонкий клиент TC-20 или TC-50, на борту которых стоит сильно урезанный Linux и
- возможно что там нет полноценного менеджера пакетов.
- Поэтому главная стратегия сборки - это собрать все библиотеки и сам mc в одну папку.
- Потом эту папку с помощью утилиты scp скопируем на тонкий клиент.
- Утилита scp по ssh позволяет копировать файлы на удаленный хост.
- -=Компиляция ncurses-6.0=-
- Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
- $cd /home/user/cross/ncurses-6.0
- $touch ncurses.sh
- $chmod +x ncurses.sh
- Копируем в этот файл следующий текст:
- #!/bin/bash
- ARCH=arm \
- CC=arm-linux-gnueabi-gcc ./configure \
- --target=arm-linux-gnueabi \
- --with-gcc=arm-linux-gnueabi-gcc \
- --host=arm-linux-gnueabi \
- --prefix=/home/user/cross/build \
- --without-cxx \
- --enable-static=yes
- Запускаем скрипт конфигурации пакета.
- $ ./ncurses.sh
- если не появилось ошибок, то можно запустить процесс сборки.
- $ make
- Может вовремя сбоки будет появиться ошибка.
- In file included from ./curses.priv.h:325:0,
- from ../ncurses/lib_gen.c:19:
- _9903.c:843:15: error: expected ‘)’ before ‘int’
- В файле ncurses-6.0/ncurses/base/MKlib_gen.sh в 65 строчку кода нужно добавить ключ -P.
- Бало
- preprocessor="$1 -DNCURSES_INTERNALS -I../include"
- стало
- preprocessor="$1 -P -DNCURSES_INTERNALS -I../include"
- Заново запускаем процесс компиляции:
- $ make
- если ошибок не появилось, то можно запустить процесс установки.
- $ make install
- -= Компиляция libffi-3.2.1 =-
- Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
- $cd /home/user/cross/libffi-3.2.1
- $touch libffi.sh
- $chmod +x libffi.sh
- Копируем в этот файл следующий текст:
- #!/bin/bash
- ARCH=arm \
- CC=arm-linux-gnueabi-gcc ./configure \
- --host=arm-linux-gnueabi \
- --prefix=/home/user/cross/build \
- --enable-static=yes
- Запускаем скрипт конфигурации пакета.
- $ ./libffi.sh
- если не появилось ошибок, то можно запустить процесс сборки и установки.
- $ make
- $ make install
- -= Компиляция glib-2.53.4 =-
- Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
- $cd /home/user/cross/glib-2.53.4
- $touch glib.sh
- $chmod +x glib.sh
- Копируем в этот файл следующий текст:
- #!/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=arm \
- CC=arm-linux-gnueabi-gcc ./configure \
- ZLIB_CFLAGS="-I/home/user/cross/build/include/" \
- ZLIB_LIBS="-L/home/user/cross/build/lib -lz" \
- LIBFFI_CFLAGS="-I/home/user/cross/build/lib/libffi-3.2.1/include" \
- LIBFFI_LIBS="-L/home/user/cross/build/lib -lffi" \
- --host=arm-linux-gnueabi \
- --prefix=/home/user/cross/build/ \
- --enable-static=yes \
- --without-pcre \
- --with-gnu-ld \
- --enable-libmount=no \
- --cache-file=arm-linux.cache
- Запускаем скрипт конфигурации пакета.
- $ ./glib.sh
- если не появилось ошибок, то можно запустить процесс сборки и установки.
- $ make
- $ make install
- -= Компиляция mc-4.8.19 =-
- Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
- $cd /home/user/cross/mc-4.8.19
- $touch mc.sh
- $chmod +x mc.sh
- Копируем в этот файл следующий текст:
- #!/bin/bash
- ARCH=arm \
- CC=arm-linux-gnueabi-gcc ./configure \
- GLIB_CFLAGS="-I/home/user/cross/build/include/glib-2.0 -I/home/user/cross/build/lib/glib-2.0/include" \
- GLIB_LIBS="-L/home/user/cross/build/lib -lglib-2.0" \
- GMODULE_CFLAGS="-I/home/user/cross/build/include/glib-2.0 -I/home/user/cross/build/lib/glib-2.0/include" \
- GMODULE_LIBS="-L//home/user/cross/build/lib/glib-2.0 -lgmodule-2.0" \
- --host=arm-linux-gnueabi \
- --prefix=/home/user/cross/build/ \
- --enable-static=yes \
- --with-screen=ncurses \
- --with-ncurses-includes="/home/user/cross/build/include" \
- --with-ncurses-libs="/home/user/cross/build/lib"
- Запускаем скрипт конфигурации пакета.
- $ ./mc.sh
- если не появилось ошибок, то можно запустить процесс сборки и установки.
- $ make
- $ make install
- Если все отработалось без ошибок, то идем в папку сборки и смотрим что получилось
- $ cd /home/user/cross/build/
- $ ls
- Увидим автоматически созданные папки.
- bin etc include lib libexec share
- $ cd /home/user/cross/build/bin
- $ file mc
- Увидим
- mc: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0 .....
- Если видим ARM, а не x86-64 значит программа собрана под ARM.
- Для копирования собранных файлов на тонких клиент воспользуемся утилитой scp.
- $ scp -r /home/user/cross/build root@172.21.0.62:/tmp
- Дословно скопируем все папку /home/user/cross/build и подпапки (ключ -r) на удаленный хост
- с адресом 172.21.0.62 в папку /tmp. Используется для доступа логин root.
- Потребуется указать пароль. Надеюсь все знают какой пароль у root в ТС? (ирония)
- Теперь чтобы проверить как работает mc на ТС воспользуемся ssh.
- $ ssh root@172.21.0.62
- # cd /tmp/build/bin
- # ./mc
- Возможно появится ошибка связанная с xterm.
- Можно создать дополнительный скрипт запуска mc-launch.sh
- Копируем в этот файл следующий текст:
- #!/bin/sh
- export TERMINFO=`pwd`/share/terminfo
- ./bin/mc
- Отправляем файл на ТС и запускаем:
- $ scp mc-launch.sh root@172.21.0.62:/tmp/build
- $ ssh root@172.21.0.62
- # cd /tmp/build
- # ./mc-launch.sh
Add Comment
Please, Sign In to add comment