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

Позвольте мне объяснить проблему с примером. Я использую некоторую старую программу в мое время для дневной работы, как, например, 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

20
задан 23 May 2017 в 05:39

3 ответа

Можно решить проблему другим и более простым способом:

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

19
ответ дан 23 November 2019 в 01:52

Одно предложение относительно statifier:

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

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

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

2
ответ дан 23 November 2019 в 01:52

Открытый исходный код mkblob может создать новый бинарный исполняемый файл, который включает в себя все зависимости, необходимые вашей программе, и вы сможете распространять его на другие (также более поздние) дистрибутивы, чем тот, на котором он был скомпилирован. Он работает немного как Statifier и Ermine, о которых уже упоминалось.

2
ответ дан 30 September 2020 в 18:11

Другие вопросы по тегам:

Похожие вопросы: