Нет, вы не можете скомпилировать исполняемый файл исполняемых файлов во всех дистрибутивах Linux. Тем не менее, вы можете скомпилировать исполняемый файл, который работает в большинстве дистрибутивов, о которых люди будут заботиться.
Компиляция 32-битная. Компилируйте для минимального уровня ЦП, который вы готовы поддерживать.
Создайте свою собственную версию glibc. Используйте параметр --enable-kernel
, чтобы установить минимальную версию ядра, которую вы хотите поддерживать.
Скомпилируйте все остальные библиотеки, которые вы планируете использовать самостоятельно. Используйте заголовки из вашей сборки glibc и выбранные вами флаги CPU / компилятора.
Ссылка статически.
Для чего-либо, на что вы не можете ссылаться статически (например, если вам нужен доступ к разрешению имен системы по умолчанию или вам нужен PAM), вы должны разработать свой собственный вспомогательный процесс и API. Передайте исходный код вспомогательному процессу и дайте им (или вашему установщику) скомпилировать его.
Тщательно протестируйте все платформы, которые вам нужны.
Возможно, вам придется настроить некоторые библиотеки, если они вызывают функции, которые не могут работать с этим механизмом. Это включает в себя dlopen
, gethostbyname
, iconv_open
и так далее. (Эти виды функций в основном полагаются на динамическое связывание. См. Шаг 5 выше. При связывании вы получите предупреждение.)
Кроме того, временные зоны имеют тенденцию разрушаться, если вы не будете осторожны, потому что ваш код может не понимать формат зоны системы или расположение файлов зоны. (Вы не получите никакого предупреждения за это. Это просто не сработает.)
Большинство людей, которые делают это, собирают с минимально поддерживаемым процессором Pentium 4 и минимальной поддерживаемой версией ядра 2.6.0.