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


20

Дозвольте пояснити проблему на прикладі. Я використовую якусь стару програму в своїй щоденній роботі, наприклад, наприклад , Xfig і PDFedit .

Зараз ці програми досить старі і не надто часто оновлюються; мій страх полягає в тому, що одного чи іншого дня вони більше не працюватимуть через відсутність бібліотеки чи несумісного оновлення.

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

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

Як я можу зробити статичну двійкову (або подібну річ), якщо у мене є динамічна одна та всі бібліотеки, але немає вихідного коду, на Ubuntu?

Я обшукував навколо. Однією з можливостей є статифікатор (2), але у нього багато проблем з рандомізацією адреси , тому це "ні-ні". Невільна версія, Ermine , здається, працює, але я дійсно вважаю за краще варіант з відкритим кодом.

Інша можливість - використовувати докер або подібну систему упаковки. Але весь підручник, який я знайшов, досить орієнтований на RedHat ; і, чесно кажучи, досить складною для наслідування.


Виноски :

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

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

Відповіді:


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/. Але це застосувало б зміни в цілому.


Це гарна ідея --- хоча я дуже хотів би знайти спосіб упакувати все це у виконуваний файл; на це рішення можуть вплинути зміни навантажувача (хоча, я сподіваюся, ніхто не зробить подібного в невідповідному сумісному режимі). Присуджує суму, якщо не з’явиться кращих рішень --- спасибі.
Рмано

Ну, ви можете додати це до невеликого інсталяційного сценарію та пов’язати його з місцевим шляхом. Мені подобається це рішення, я міг би використати його назад.
WalyKu

1
@Klaus, linux-vdso.so.1 ніде не видно, я гадаю, це в ядрі, правда?
Рмано

1
Так. З man 7 vdso: "" vDSO "(віртуальний динамічний спільний об'єкт) - це невелика спільна бібліотека, яку ядро ​​автоматично відображає в адресний простір усіх програм простору користувача."
Клаус Д.

Хоча це не суворо відповідь на питання, це розумне вирішення. Спасибі.
Рмано

2

Одна пропозиція щодо статифікатора :

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

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

Вона запустить цю команду з вимкненим рандомізованим макетом (не потрібно мати корінь).


Нічого собі, цікавого. Тепер, якщо я лише міг скласти statifier...
Рмано

Складено і перевірено. xfig_statifiedвсе-таки основні звалища ... шкода. Все одно, дякую.
Рмано

Так, шкода. Мені цікаво, якщо це не буде 64-бітовою проблемою, спробуйте запустити статифікатор на 32-бітній установці?
limmonsqueeze

Перевірено на 32-бітній машині, досі основне звалище.
Рмано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.