Musl & Alpine Linux

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

Сообщение kaztost » 12 дек 2017, 17: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
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

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

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

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

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

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

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

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

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

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

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

kaztost
Сообщения: 148
Зарегистрирован: 16 июл 2017, 23:29

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

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

Спасибо.

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

Сообщение adm_ » 08 май 2018, 12: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 посетитель :: 1 зарегистрированный, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: CommonCrawl [Bot] и 0 гостей