Нативная компиляция в Entware-ng (gcc в Entware)

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1103
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 26 ноя 2015, 18:00

В репозитории arm* и x86* добавлен пакет gcc. В mipsel фид решено не добавлять gcc (слишком слабое железо).
Пакет gcc имеет статус бета в Openwrt, поэтому и в Entware у него аналогичный статус. Имеются некоторые ограничения использования gcc. Т.к. в пакете (пакетах) нет статических библиотек возможна только динамическая линковка, статической линковки нет.

Пакет был проверен на НАС QNAP TS-231+ (armv7), на других архитектурах не проверялся.
Существует ряд подводных камней при использовании gcc в Entware, они рассмотрены в следующих сообщениях.

На мой взгляд гораздо проще и надежнее собирать бинарники и пакеты на linux компьютере, это просто - https://github.com/Entware-ng/Entware-n ... om-sources

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1103
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 26 ноя 2015, 18:00

Итак начнем.
0. Установим gcc

Код: Выделить всё

opkg update
opkg install gcc

1. В Entware нет *dev пакетов (как у наследника Openwrt). Обычные пакеты в отличии от Optware не содержат include файлы и статические библиотеки. Я заархивировал __ВСЕ__ include файлы в один tar.gz архив и выложил его. Если воспользоваться include файлами из архива, то configure скрипты могут определить наличие библиотек, которые еще не были установлены в Entware!

Скачаем и распакуем архив с include файлами. Для armv7 это делается командой

Код: Выделить всё

 wget -qO- http://entware.zyxmon.org/binaries/armv7/include/include.tar.gz | tar xvz -C /opt/include

Замените amv7 на (armv5,x86-32,x86-64) если используете другой фид.
2. При сборке бинарников в Entware _обязательно_ использовать rpath=/opt/lib и нестандартный dynamic linker. При установке пакета gcc будет установлен скрипт /opt/bin/gcc_env.sh упрощающий задание обпций сборки. Для armv7 он такой

Код: Выделить всё

#!/bin/sh
export LDFLAGS="-Wl,-rpath=/opt/lib -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 -L/opt/lib"
export CFLAGS="-O2 -pipe -march=armv7-a -mtune=cortex-a9 -fno-caller-saves -mfloat-abi=soft "

Для установки переменных окружения gcc выполните

Код: Выделить всё

source /opt/bin/gcc_env.sh

или используйте флаги сборки в ручном режиме - примерно так:

Код: Выделить всё

gcc $CFLAGS $LDFLAGS helloworld.c -o helloworld

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1103
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 26 ноя 2015, 18:01

Пред использованием gcc рекомендуем установить пакеты busybox, ldd, make, gawk, sed:

Код: Выделить всё

opkg install busybox ldd make gawk sed

Продемонстрируем использование gcc для сборки бинарника htop.
Предположим, что исходники htop распакованы в текущей директории. Сначала "подсмотрим", как собирается htop в Entware - https://github.com/Entware-ng/entware-p ... p/Makefile
Кака видим, при сборке используется опция `--disable-unicode`, и мы станем ее использовать. Запустим выполнение скрипта configure:

Код: Выделить всё

./configure --prefix=/opt --disable-unicode 

Наиболее важная здесь опция `--prefix=/opt` - ее следует использовать всегда.
Теперь запустим make

После завершения работы в текущей директории появится бинарный исполняемый файл htop.
Проверим зависимости:

Код: Выделить всё

ldd ./htop
	libncurses.so.6 => /opt/lib/libncurses.so.6 (0xb6eb3000)
	libm.so.6 => /opt/lib/libm.so.6 (0xb6e12000)
	libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0xb6dfe000)
	libc.so.6 => /opt/lib/libc.so.6 (0xb6cc9000)
	/opt/lib/ld-linux.so.3 (0xb6f01000)

Все нормально - используются so библиотеки из /opt/lib и динамический загрузчик /opt/lib/ld-linux.so.3.
Можно запустить и проверить работу htop

Можно и установить htop

Код: Выделить всё

make install


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 4 посетителя :: 3 зарегистрированных, 0 скрытых и 1 гость (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: CCCP, mesb, Yandex [Bot] и 1 гость