Позвольте мне объяснить проблему с примером. Я использую некоторую старую программу в мое время для дневной работы, как, например, xfig и pdfedit.
Теперь, эти программы довольно стары и не обновляемые слишком часто; мой страх состоит в том, что один день или другой они не будут больше работать из-за отсутствия некоторой библиотеки или некоторого несовместимого обновления.
Если программу легко скомпилировать теперь в рабочей системе, решение удобно: попытайтесь взломать немного источник, и скомпилировать его статически---получающийся исполняемый файл будет большим и не настолько эффективным, но он будет работать на обозримое будущее (1). Это, кажется, имеет место для xfig
и я попробую его как можно скорее.
Но, например, pdfedit
зависит от Qt3, и установка системы для компиляции его довольно сложна в это время. К счастью, это может быть выполнено прямо сейчас благодаря тому, что библиотека, которую это должно сделать не, конфликтует с чем-либо. Но это может измениться в будущем, таким образом, я хотел бы решить эту проблему:
Как банка, я могу сделать статический двоичный файл (или подобная вещь), если у меня есть динамическое все до одного библиотеки, но никакой исходный код, на Ubuntu?
Я искал вокруг. Одна возможность является statifier (2), но это имеет много проблем с рандомизацией адреса, таким образом, это нет - нет. Небесплатная версия, Горностай, кажется, работает, но я действительно предпочел бы опцию с открытым исходным кодом.
Другая возможность состоит в том, чтобы использовать докера или подобную упаковочную систему. Но все учебное руководство, которое я нашел, вполне ориентировано Redhat; и, честно, довольно сложный для следования.
Сноски:
(1) не является настолько сумасшедшим. Я использую статический ffmpeg, например, работы хорошо и без любых проблем совместимости...
(2) скомпилировать statifier
, см. https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error
Можно решить проблему другим и более простым способом:
Использование ldd
на Вашем исполняемом файле для наблюдения связанных библиотек, например:
$ ldd /bin/bash
linux-vdso.so.1 => (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)
Тогда собирают все библиотеки в папке и устанавливают переменную среды LD_LIBRARY_PATH прежде, чем запустить Вашу программу для указания на эту папку:
$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start
, Кроме того, можно добавить запись для папки lib к /etc/ld.so.conf.d/
. Но это применило бы изменение в масштабе всей системы.
Одно предложение относительно statifier:
, Если рандомизация расположения адресного пространства (ASLR) заставляет его перестать работать, Вы не должны выключать ее для целой машины. Можно выключить его только для того процесса:
$ setarch `uname -m` -R statified_pdfedit [args...]
Это выполнит ту команду с рандомизированным отключенным расположением (никакая потребность быть корнем).
Открытый исходный код mkblob может создать новый бинарный исполняемый файл, который включает в себя все зависимости, необходимые вашей программе, и вы сможете распространять его на другие (также более поздние) дистрибутивы, чем тот, на котором он был скомпилирован. Он работает немного как Statifier и Ermine, о которых уже упоминалось.