xeritt

Кросс-компиляция под ARM - Midnight Commander Ubuntu 18.04

Aug 9th, 2019
255
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -=Кросс-компиляция под ARM — Midnight Commander=-
  2.  
  3. Задача — скомпилировать  известный файловый менеджер Midnight Commander (mc) под систему с архитектурой ARM. В наших руках компьютер с процессором Intel, с операционной системой Ubuntu 18.04.
  4. В качестве компилятора будем использовать пакет arm-linux-gnueabi, который отлично пребывает на репозиториях. Исходный материал — исходные коды необходимых библиотек и код самого mc.
  5. Сперва начнем с простого — установки необходимых пакетов:
  6.  
  7.     $sudo apt-get install gcc-arm-linux-gnueabi
  8.     $sudo apt-get install libglib2.0-dev
  9.     $sudo apt-get install libmount-dev
  10.     $sudo apt-get install libffi-dev
  11.  
  12. Загружаем исходники. Нам потребуются следующие исходники:
  13.     zlib-1.2.11.tar.gz
  14.     ncurses-6.0.tar.gz
  15.     libffi-3.2.1.tar.gz
  16.     glib-2.53.4.tar.gz
  17.     mc-4.8.19.tar.gz
  18. Скачать исходники можно тут
  19. https://yadi.sk/d/nqvHImVNN5qKiQ
  20. https://drive.google.com/file/d/1AfwRM74wBfiXk_pdzzQ7wuKUqETU2GWR/view?usp=sharing
  21. Собственно, при компиляции самого mc нужно скомпилировать сначала ему вышеприведенные либы.
  22. Есть проблемы сборки с относительными путями описанной в статье http://tetraquark.ru/archives/10. Дословно суть проблемы.
  23. Кто не в курсе, проблема вот в чем — при компиляции определенных библиотек, им необходимо указывать пути до уже скомпилированных зависимых библиотек. Собственно, при компиляции самого mc нужно скармливать ему вышеприведенные либы. Указав полные пути (а конфигурационные скрипты почему то требуют указывать именно абсолютные пути), ваш mc запустится только по таким путям файловой системы, в которых все было скомпилировано.
  24.  
  25. В нашем случае сборку будем делать в домашней папке пользователя /home/user/cross/build.
  26.     $ mkdir -p /home/user/cross/build
  27. В каталог /home/user/cross/ кладем наш архив mc_src.tar.gz и выполняем разархивацию в данный каталог содержимого всех архивов оконным приложением, либо так (перед выполнением сначала перейдите в каталог с архивом)
  28.     $ cd /home/user/cross/
  29.     $ tar -xf mc_src.tar.gz && for f in *.tar*; do tar xf $f; done
  30.    
  31. Необходимо будет создавать исполняемый bash-скрипт в корне каталога компилируемой библиотеки, прописывать в данный скрипт нужные команды и выполнять этот скрипт. От нас лишь требуется правильно предоставить требуемые зависимости и скормить скриптам нужные флаги и параметры.
  32.  
  33. -=Компиляция zlib-1.2.11=-
  34. Как узнать какие ключи и параметры принимает скрипт конфигурации?  
  35. Давайте запустим из текущей директории (/home/user/cross/zlib-1.2.11) утилиту configure с ключем --help.
  36.     $cd /home/user/cross/zlib-1.2.11
  37.     $./configure --help
  38.    
  39. На экране появиться список доступных ключей:
  40. usage:
  41.   configure [--const] [--zprefix] [--prefix=PREFIX]  [--eprefix=EXPREFIX]
  42.     [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]
  43.     [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]
  44.  
  45. Создадим первый файл скрипта конфигурации пакета и дадим права на исполнение:
  46.     $cd /home/user/cross/zlib-1.2.11
  47.     $touch zlib.sh
  48.     $chmod +x zlib.sh
  49.  
  50. Копируем в этот файл следующий текст:
  51. #!/bin/bash
  52. ARCH=arm CC=arm-linux-gnueabi-gcc ./configure \
  53. --prefix=/home/user/cross/build \
  54. --static
  55.  
  56. ARCH=arm и CC=arm-linux-gnueabi-gcc задаются переменные окружения при запуске ./configure.
  57. CC - компилятор и ARCH - архитектура.
  58. Символ \ в конце строки означает продолжение строки переносится ниже.
  59. --prefix=/home/user/cross/build - это путь куда копируются исходники после команды make install.
  60. Если префикс не указать, файлы будут скопированы в разные подпапки в папке /usr/local/, что в дальнейшем
  61. усложнит процесс извлечения нужных файлов.
  62.  
  63. Запускаем скрипт конфигурации пакета.
  64.     $ ./zlib.sh
  65.    
  66. если не появилось ошибок, то можно запустить процесс сборки.
  67.     $ make
  68.    
  69. если ошибок не появилось, то можна запустить процесс неправильной установки.
  70.     $ make install
  71. После этой команды все необходимые файлы будут скопированы в папку указанную по ключу --prefix.
  72. В нашем случае нужные файлы копирутся в папку /home/user/cross/build.
  73.  
  74. Вообще в ubunte есть определенные правила сборки и установки программного обеспечения из исходников.  
  75. https://help.ubuntu.ru/wiki/programs_installation
  76. Но так как наша цель является тонкий клиент TC-20 или TC-50, на борту которых стоит сильно урезанный Linux и
  77. возможно что там нет полноценного менеджера пакетов.
  78. Поэтому главная стратегия сборки - это собрать все библиотеки и сам mc  в одну папку.
  79. Потом эту папку с помощью утилиты scp скопируем на тонкий клиент.
  80. Утилита scp по ssh позволяет копировать файлы на удаленный хост.
  81.  
  82. -=Компиляция ncurses-6.0=-
  83. Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
  84.     $cd /home/user/cross/ncurses-6.0
  85.     $touch ncurses.sh
  86.     $chmod +x ncurses.sh
  87.    
  88. Копируем в этот файл следующий текст:
  89. #!/bin/bash
  90. ARCH=arm \
  91. CC=arm-linux-gnueabi-gcc ./configure \
  92. --target=arm-linux-gnueabi \
  93. --with-gcc=arm-linux-gnueabi-gcc \
  94. --host=arm-linux-gnueabi \
  95. --prefix=/home/user/cross/build \
  96. --without-cxx \
  97. --enable-static=yes
  98.  
  99. Запускаем скрипт конфигурации пакета.
  100.     $ ./ncurses.sh
  101.    
  102. если не появилось ошибок, то можно запустить процесс сборки.
  103.     $ make
  104.    
  105. Может вовремя сбоки будет появиться ошибка.
  106. In file included from ./curses.priv.h:325:0,
  107.                  from ../ncurses/lib_gen.c:19:
  108. _9903.c:843:15: error: expected ‘)’ before ‘int’
  109.  
  110. В файле ncurses-6.0/ncurses/base/MKlib_gen.sh в 65 строчку кода нужно добавить ключ -P.
  111. Бало
  112.     preprocessor="$1 -DNCURSES_INTERNALS -I../include"
  113. стало
  114.     preprocessor="$1 -P -DNCURSES_INTERNALS -I../include"
  115.  
  116. Заново запускаем процесс компиляции:
  117.     $ make
  118. если ошибок не появилось, то можно запустить процесс установки.
  119.     $ make install
  120.  
  121.  -= Компиляция libffi-3.2.1 =-
  122. Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
  123.     $cd /home/user/cross/libffi-3.2.1
  124.     $touch libffi.sh
  125.     $chmod +x libffi.sh
  126.  
  127. Копируем в этот файл следующий текст:
  128. #!/bin/bash
  129. ARCH=arm \
  130. CC=arm-linux-gnueabi-gcc ./configure \
  131. --host=arm-linux-gnueabi \
  132. --prefix=/home/user/cross/build \
  133. --enable-static=yes
  134.  
  135. Запускаем скрипт конфигурации пакета.
  136.     $ ./libffi.sh
  137.    
  138. если не появилось ошибок, то можно запустить процесс сборки и установки.
  139.     $ make
  140.     $ make install
  141.  
  142.  -= Компиляция glib-2.53.4 =-
  143. Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
  144.     $cd /home/user/cross/glib-2.53.4
  145.     $touch glib.sh
  146.     $chmod +x glib.sh
  147. Копируем в этот файл следующий текст:
  148. #!/bin/bash
  149. echo "glib_cv_stack_grows=no" > arm-linux.cache
  150. echo "glib_cv_uscore=no" >> arm-linux.cache
  151. echo "ac_cv_func_posix_getpwuid_r=no" >> arm-linux.cache
  152. echo "ac_cv_func_posix_getgrgid_r=no" >> arm-linux.cache
  153.  
  154. ARCH=arm \
  155. CC=arm-linux-gnueabi-gcc ./configure \
  156. ZLIB_CFLAGS="-I/home/user/cross/build/include/" \
  157. ZLIB_LIBS="-L/home/user/cross/build/lib -lz" \
  158. LIBFFI_CFLAGS="-I/home/user/cross/build/lib/libffi-3.2.1/include" \
  159. LIBFFI_LIBS="-L/home/user/cross/build/lib -lffi" \
  160. --host=arm-linux-gnueabi \
  161. --prefix=/home/user/cross/build/ \
  162. --enable-static=yes \
  163. --without-pcre \
  164. --with-gnu-ld \
  165. --enable-libmount=no \
  166. --cache-file=arm-linux.cache
  167.  
  168. Запускаем скрипт конфигурации пакета.
  169.     $ ./glib.sh
  170.    
  171. если не появилось ошибок, то можно запустить процесс сборки и установки.
  172.     $ make
  173.     $ make install
  174.  
  175.  -= Компиляция mc-4.8.19 =-
  176. Создадим файл скрипта конфигурации пакета и дадим права на исполнение:
  177.     $cd /home/user/cross/mc-4.8.19
  178.     $touch mc.sh
  179.     $chmod +x mc.sh
  180.    
  181. Копируем в этот файл следующий текст:
  182. #!/bin/bash
  183. ARCH=arm \
  184. CC=arm-linux-gnueabi-gcc ./configure \
  185. GLIB_CFLAGS="-I/home/user/cross/build/include/glib-2.0 -I/home/user/cross/build/lib/glib-2.0/include" \
  186. GLIB_LIBS="-L/home/user/cross/build/lib -lglib-2.0" \
  187. GMODULE_CFLAGS="-I/home/user/cross/build/include/glib-2.0 -I/home/user/cross/build/lib/glib-2.0/include" \
  188. GMODULE_LIBS="-L//home/user/cross/build/lib/glib-2.0 -lgmodule-2.0" \
  189. --host=arm-linux-gnueabi \
  190. --prefix=/home/user/cross/build/ \
  191. --enable-static=yes \
  192. --with-screen=ncurses \
  193. --with-ncurses-includes="/home/user/cross/build/include" \
  194. --with-ncurses-libs="/home/user/cross/build/lib"
  195.  
  196. Запускаем скрипт конфигурации пакета.
  197.     $ ./mc.sh
  198.    
  199. если не появилось ошибок, то можно запустить процесс сборки и установки.
  200.     $ make
  201.     $ make install
  202.  
  203. Если все отработалось без ошибок, то идем в папку сборки и смотрим что получилось
  204.     $ cd /home/user/cross/build/
  205.     $ ls
  206.  
  207. Увидим автоматически созданные папки.
  208. bin  etc  include  lib  libexec  share
  209.  
  210.     $ cd /home/user/cross/build/bin
  211.     $ file mc
  212. Увидим
  213. mc: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0 .....    
  214. Если видим ARM, а не x86-64 значит программа собрана под ARM.
  215.  
  216. Для копирования собранных файлов на тонких клиент воспользуемся утилитой scp.
  217.     $ scp -r /home/user/cross/build root@172.21.0.62:/tmp
  218.  
  219. Дословно скопируем все папку /home/user/cross/build и подпапки (ключ -r) на удаленный хост
  220. с адресом 172.21.0.62 в папку /tmp. Используется для доступа логин root.
  221. Потребуется указать пароль. Надеюсь все знают какой пароль у root в ТС? (ирония)
  222. Теперь чтобы проверить как работает mc на ТС воспользуемся ssh.
  223.     $ ssh root@172.21.0.62
  224.     # cd /tmp/build/bin
  225.     # ./mc
  226.    
  227. Возможно появится ошибка связанная с xterm.
  228. Можно создать дополнительный скрипт запуска mc-launch.sh
  229. Копируем в этот файл следующий текст:
  230. #!/bin/sh
  231. export TERMINFO=`pwd`/share/terminfo
  232. ./bin/mc
  233.  
  234. Отправляем файл на ТС и запускаем:
  235.     $ scp mc-launch.sh root@172.21.0.62:/tmp/build
  236.     $ ssh root@172.21.0.62
  237.     # cd /tmp/build
  238.     # ./mc-launch.sh
RAW Paste Data Copied