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

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

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

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

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

Как я могу создать статическую двоичную (или подобную вещь), если у меня есть динамическая и все библиотеки, но нет исходного кода на Ubuntu?

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

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


Сноски :

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

(2) для компиляции statifier, см. https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os- причин-фатальная ошибка

18 голосов | спросил Rmano 15 +04002014-10-15T22:15:40+04:00312014bEurope/MoscowWed, 15 Oct 2014 22:15:40 +0400 2014, 22:15:40

2 ответа


17

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

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

ответил Klaus D. 6 42014vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2014 13:02:48 +0300 2014, 13:02:48
2

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

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

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

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

ответил lemonsqueeze 9 72014vEurope/Moscow11bEurope/MoscowSun, 09 Nov 2014 16:12:43 +0300 2014, 16:12:43

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132