Musl & Alpine Linux

Форум программистов
kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 12 дек 2017, 18:23

Давно искал систему сборки, позволяющую собирать нативно и статически на андроид-устройстве. Компилятор gcc из entware, насколько я понял, не позволяет собирать статически. В Debian (chroot) статически собрать можно не все, причем если и собирается, то размер бинаря будет минимум 500 kb. Недавно наткнулся на библиотеку musl. Она как раз ориентируется (в то числе) на статическую сборку минимального размера. Сначала я установил musl-gcc в Debian (chroot), но затем понял, что удобнее ставить Alpine Linux, основанный на musl-libc. Так, удалось собрать патченный под андроид static dropbear размером 310 kb, и static sftp-server для него размером 146 kb. Причем, почему-то через musl-gcc в Debian dropbear получился еще меньше - 221 kb, но пришлось пройти через ад отсутствующих заголовков и самому собирать zlib. Для openssl и sftp-server мне это показалось слишком. Никаких дополнительных оптимизаций не проводил, но результаты для меня уже более, чем удовлетворительные.

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 12 дек 2017, 18:36

Из забавного - в Alpine Linux пакеты имеют расширение apk. Но в отличие Android это архивы tar.gz, а не zip.

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

Сообщение Zyxmon » 13 дек 2017, 14:55

Если речь идет о минимальном размере бинарников, то сейчас действительно используют или musl или uclibc-ng.
Entware-3x и debian используют системную библиотеку glibc - она самая большая по размеру, но совместимость у нее наилучшая. Поскольку Entware устанавливается на внешний носитель, то задача экономить занимаемое пространство в Entware не стоит.

Аватара пользователя
Александр Рыжов
Сообщения: 447
Зарегистрирован: 12 авг 2015, 14:14
Откуда: Смоленск

Сообщение Александр Рыжов » 13 дек 2017, 16:19

kaztost, размер итогового статического бинарника можно уменьшить комбинируя следующие трюки:
  • не включать в итоговый бинарник не используемые секции кода из внешних библиотек, передавая при сборке ключи:

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

    CFLAGS += -ffunction-sections -fdata-sections
    LDFLAGS += -Wl,--gc-sections
  • исключив debug-информацию утилитой тулчейна strip,
  • сжав бинарник с помощью upx.

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 16 дек 2017, 13:54

Александр Рыжов писал(а):Источник цитаты CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections

Спасибо.

adm_
Сообщения: 13
Зарегистрирован: 02 мар 2018, 07:23

Сообщение adm_ » 08 май 2018, 13:10

kaztost,
может, пригодится, надранная мною по клочкам из разных тем строка макс. оптимизации:
CFLAGS=" -static -static-libgcc-ffunction-sections -fdata-sections -falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1 -fno-unwind-tables -fno-asynchronous-unwind-tables -fomit-frame-pointer -Wl,-Map=ИМЯ_ПРОГИ.mapfile"
LDFLAGS=" -static -Wl,--gc-sections -Wl,-s -Wl,-v"

дралось/собиралось для оптимизации ядра под атом х32, собеседники выкладывали тесты эффективности каждого ключа, этот набор был после несколькодневной дискуссии признан безглючно-безупречным маст-хэвом.
скомпилированное так для armv7 у меня отлично работает, для aarch64 собирал лишь дважды, и нареканий от скачавших не было,


Вернуться в «Собираем софт сами (пакеты, прошивки)»

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

Всего 1 посетитель :: 0 зарегистрированных, 0 скрытых и 1 гость (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость