LINUX.ORG.RU

Как собрать универсальный бинарник?

 ,


0

1

Привет. Допустим, мне надо собрать универсальный бинарник старой софтины, чтобы этот бинарник можно было запустить как в новом арче, так и в debian oldstable. Как создать среду сборки я приблизительно представляю. chroot, контейнер, виртуалка. Но как собрать статически слинкованный бинарник, или пакет который будет включать в себя все необходимое? Vsevolod-linuxoid упоминал, что это можно провернуть и без снапов с флатпаками. Как?

★☆

Но как собрать статически слинкованный бинарник

Для неуказанной системы сборки, языка и вообще ответом будет «посредством статической линковки».

Допустим, мне надо собрать универсальный бинарник старой софтины, чтобы этот бинарник можно было запустить как в новом арче, так и в debian oldstable.

Сорцы вам надо выложить, барин.

t184256 ★★★★★
()

Тут лучше AppImage использовать. Собрать его на самой старой системе.

James_Holden ★★★
()
Ответ на: комментарий от hateWin

Браузер - это конечно посложнее. Но вот сейчас пишу с Opera 12 (2013г.), который одинаково запускается в *бунту 10.04 и 20.04.

andytux ★★★★★
()
Ответ на: комментарий от andytux

Оказывается, мозиловцы уже собрали такой бинарник. Просто скачиваешь архив, внутри каталог с бинарниками и всеми необходимыми ресурсами. Спокойно запускается в арче.

http://ftp.mozilla.org/pub/firefox/releases/52.0esr/linux-x86_64/en-US/

Собственно, вопрос в том, как собрать программу подобным образом?

hateWin ★☆
() автор топика
Ответ на: комментарий от hateWin

Так и смотри, что она из себя представляет. Вполне может оказаться, что это обычный firefox, только все необходимые ему библиотеки находятся в одном каталоге (каталогов может быть несколько). И при запуске, этот каталог указывается в переменной LD_LIBRARY_PATH. В том числе, можно устроить, что для каждой версии системы будут применятся подходящие для нее библиотеки.

andytux ★★★★★
()

Собираешь бинарник обычным образом (не статически), смотришь через ldd, какие библиотеки он использует, копируешь их все в каталог рядом с бинарником. Запускаешь бинарь вот так:

/path/to/app/ld-linux-x86-64.so.2 --library-path 
/path/to/app /path/to/app/binaryname

Можно простой шелл скрипт написать. И бинарь в итоге работает везде. Я так запускал бинарники, собранные на Arch, на Ubuntu 14.04 - и они работали.

Можно и просто через LD_LIBRARY_PATH попробовать указать путь к библиотекам, но это не сработает, если бинарник был собран с более новой версией glibc, так что вариант с ld-linux надежнее. А еще лучше статическую линковку использовать, если есть такая возможность.

Правда, не уверен, что это будет работать со сложными и огромными программами, но на маленьких утилитах вполне работает.

p.s. Добротно собранные AppImage, кстати, именно так и делают.

Kron4ek ★★★★★
()
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от Kron4ek

И есть еще момент по поводу версий ядра. Например, бинарники, собранные в современном Arch, требуют как минимум ядро версии 4.4, так что их не получится запустить на каком-нибудь Ubuntu 12.04, не обновив ядро. Это тоже нужно учитывать.

Kron4ek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.