MyTetra Share
Делитесь знаниями!
Что использовать для статической сборки программ
Время создания: 27.03.2016 21:30
Текстовые метки: статическая сборка, linux, компиляция
Раздел: Компьютер - Программирование - Компилятор GCC
Запись: xintrea/mytetra_syncro/master/base/1459103448zmekka288w/text.html на raw.github.com

Statifier


Когда-то давно, под Linux был такой проект - statifier. Он есть и сейчас, и даже немного шевелится. Вот его сайт:


http://statifier.sourceforge.net/


Чтобы преобразовать динамически слинкованный бинарник в статический, нужно запустить команду


statifier <inputBin> <outputBin>


Вот и все. К сожалению, похоже, что этот проект заточен только под Linux семейства RedHat (о чем недвусмысленно пишут на сайте), поэтому толку от полученного бинарника немного. У меня получалось собрать через Statifier бинарник в RedHat и запустить его на Fedora и AltLinux. Но он же не работал на Debian и Ubuntu.



Использование нестандартных системных библиотек


Одна из проблем, почему полученные через statifier бинарники неработоспособны на других дистрибутивах сводится к тому, что они не могут работать с другой версией glibc. То есть решается только половина задачи - сторонние библиотеки не нужны, но мажорную версию glibc нужно иметь ту же самую, что и у разработчика.


Чтобы обойти эту проблему, люди используют, как минимум, два метода:


  1. Вместо glibc используют musl
  2. Собирают кросскомпилятором с uClibc и хидерами нужного ядра (например 2.6.32)


Здесь следует пояснить, что из себя предстваляют нестандартные библиотеки, которые могут заменить glibc.



musl - новая стандартная Си-библиотека, ориентированная для использования в Linux-устройствах нового поколения. Библиотека имеет небольшой размер и высокую производительность, а разработчики стараются соблюдать стандарты POSIX. Код Musl поставляется под свободной лицензией MIT, допускающей использование библиотеки в закрытых проектах.

Musl является универсальной реализацией libc и подходит для применения как на стационарных ПК и серверах, так и на мобильных системах, сочетая полноценную поддержку стандартов, свойственную для полновесных библиотек, таких как Glibc (GNU C library), с небольшим размером, низким потреблением ресурсов и высокой производительностью, свойственными специализированным вариантам libc для встраиваемых систем, таких как uClibc, dietlibc и Android Bionic. Musl
предоставляет полную поддержку всех обязательных интерфейсов C99 и POSIX 2008, а также частично C11 и набор расширений, получивших распространение в Linux-окружениях. В том числе библиотека предоставляет средства для многопоточного программирования (POSIX threads), управления памятью и работы с локалями.

Проект Musl старается придерживаться совместимости с Glibc в части функциональности, как на бинарном уровне, так и на уровне исходных текстов. При этом, Musl не ставит перед собой цель обеспечения совместимости с Glibc на уровне
ошибок, идущих вразрез со стандартами. На уровне исходных текстов обеспечена достаточно неплохая совместимость с Glibc. На бинарном уровне совместимость ещё оставляет желать лучшего - хотя уже можно загружать при использовании musl некоторые динамические библиотеки, собранные с Glibc.


uClibc — стандартная библиотека языка программирования C, предназначенная для встраиваемых систем на базе Linux. uClibc была разработана для поддержки uCLinux (специальная редакция ядра Linux, способная работать без блока управления памятью [MMU]) и таким образом подходящая для микроконтроллеров. (буква u есть адаптация греческой буквы µ, означающей «микро»). uClibc — свободное программное обеспечение, распространяемое под GNU LGPL.



Касательно методов компиляции с использованием вышеназванных библиотек, есть следующая информация. Существует инструмент Buildroot: https://buildroot.org/. Официальная документация так описывает область его применения (вольный превод):



Buildroot является инструментом, который упрощает и автоматизирует процесс создания целостной системы Linux для встраиваемых систем с помощью кросс-компиляции.

Buildroot с помощью кросс-компиляции способен генерировать набор основных инструментов, корневую файловую систему, образ ядра Linux и загрузчик. Buildroot может быть использован для любой части системы, независимо от других частей. В Buildroot можно, например, использовать существующий набор инструментов кросс-компиляции, и строить только корневую файловую систему.


Казалось бы, что этот инструментарий весьма далек от задачи получения статического бинарника. Однако в нем есть функционал по сборке кросс-компилятора под нужную архитектуру, с нужным uClibc или musl и для нужных хедеров ядра. А потом с полученным компилятором без проблем можно собирать статические бинарники.

Как использовать Buildroot можно прочитать в англоязычной документации, которая написана весьма подробно. Информации в рунете по этой теме крайне мало. Но может быть, эта заметка кого-то направит на правильный путь.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования