Есть ли способ с открытым исходным кодом сделать статический из динамического исполняемого файла без доступности исходного кода?

20

Позвольте мне объяснить проблему на примере. Я использую некоторые старые программы в моей повседневной работе, как, например , Xfig и PDFedit .

Теперь эти программы довольно старые и не обновляются слишком часто; Я боюсь, что в один прекрасный день они больше не будут работать из-за отсутствия какой-либо библиотеки или несовместимого обновления.

Если программу легко скомпилировать сейчас , на работающей системе решение пригодится: попытайтесь немного взломать исходный код и скомпилировать его статически - полученный исполняемый файл будет большим и не очень эффективным, но он будет работать для обозримое будущее (1). Кажется, это так, xfigи я постараюсь сделать это как можно скорее.

Но, например, это pdfeditзависит от Qt3, и настройка системы для его компиляции в настоящее время довольно сложна. К счастью, его можно запустить прямо сейчас, благодаря тому, что нужная ему библиотека ни с чем не конфликтует. Но это может измениться в будущем, поэтому я хотел бы решить эту проблему:

Как я могу создать статический двоичный файл (или аналогичный объект), если у меня есть динамическая и все библиотеки, но нет исходного кода в Ubuntu?

Я искал вокруг. Одна возможность - statifier (2), но у него много проблем с рандомизацией адресов , так что это нет-нет. Несвободная версия, Ermine , похоже, работает, но я бы действительно предпочел вариант с открытым исходным кодом.

Другая возможность - использовать докер или аналогичную упаковочную систему. Но все учебники, которые я нашел, довольно ориентированы на RedHat ; и, честно говоря, довольно сложный для подражания.


Сноски :

(1) не так сумасшедший. Я использую статический ffmpeg, например, работает нормально и без проблем совместимости ...

(2) для компиляции statifier, см. Https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
источник

Ответы:

19

Вы можете решить свою проблему другим, более простым способом:

Используйте 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/. Но это применимо к общесистемным изменениям.

Клаус Д.
источник
Это хорошая идея - хотя мне бы очень хотелось найти способ упаковать все это в исполняемый файл; На это решение могут повлиять изменения в загрузчике (хотя я надеюсь, что никто не будет делать это без обратной совместимости). Наградит награду, если не будет лучшего решения --- спасибо.
Rmano
Ну, вы можете добавить это в небольшой скрипт установки и связать его с локальным путем. Мне нравится это решение, я мог бы использовать его некоторое время назад.
WalyKu
1
@ Клаус, linux-vdso.so.1 нигде не видно, наверное, в ядре, верно?
Rmano
1
Да. From man 7 vdso: «vDSO» (виртуальный динамический общий объект) - это небольшая общая библиотека, которую ядро ​​автоматически отображает в адресное пространство всех приложений пользовательского пространства ».
Клаус Д.
Хотя это не совсем ответ на вопрос, это разумный обходной путь. Спасибо.
Rmano
2

Одно предложение относительно стабилизатора :

Если рандомизация размещения адресного пространства (ASLR) приводит к сбою, вам не нужно отключать его для всей машины. Вы можете отключить его только для этого процесса:

$ setarch `uname -m` -R statified_pdfedit [args...]

Он запустит эту команду с отключенным рандомизированным макетом (не нужно быть пользователем root).

lemonsqueeze
источник
Вау, интересно. Теперь, если бы я только мог скомпилировать statifier...
Rmano
Скомпилировано и проверено. xfig_statifiedдо сих пор дампы ядра ... жаль. Спасибо, в любом случае.
Rmano
Да, жаль. Мне интересно, не будет ли это 64-битной проблемой, попробуйте запустить statifier на 32-битной установке?
Lemonqueeze
Проверено на 32-битной машине, все еще дампы ядра.
Rmano