Czy istnieje jakikolwiek otwarty sposób na utworzenie statycznego pliku z dynamicznego pliku wykonywalnego bez dostępności kodu źródłowego?

20

Pozwól mi wyjaśnić problem na przykładzie. W codziennej pracy używam starego programu, na przykład xfig i pdfedit .

Teraz te programy są dość stare i nie są zbyt często aktualizowane; obawiam się, że któregoś dnia nie będą już działać z powodu braku jakiejś biblioteki lub jakiejś niekompatybilnej aktualizacji.

Jeśli program jest teraz łatwy do skompilowania na działającym systemie, rozwiązanie jest przydatne: spróbuj zhakować nieco źródło i skompilować je statycznie - wynikowy plik wykonywalny będzie duży i nie tak wydajny, ale będzie działał dla dająca się przewidzieć przyszłość (1). Wydaje się, że tak jest xfigi postaram się jak najszybciej.

Ale na przykład pdfeditzależy od Qt3, a skonfigurowanie systemu do jego kompilacji jest w tej chwili dość skomplikowane. Na szczęście można go teraz uruchomić dzięki temu, że biblioteka, której potrzebuje, nie koliduje z niczym. Ale to może się zmienić w przyszłości, dlatego chciałbym rozwiązać ten problem:

Jak mogę utworzyć statyczny plik binarny (lub coś podobnego), jeśli mam bibliotekę dynamiczną i wszystkie biblioteki, ale bez kodu źródłowego, na Ubuntu?

Rozejrzałem się. Jedną z możliwości jest statifier (2), ale ma wiele problemów z randomizacją adresu , więc jest to nie-nie. Niewolna wersja, Ermine , wydaje się działać, ale naprawdę wolałbym opcję open source.

Inną możliwością jest użycie dokera lub podobnego systemu pakowania. Ale wszystkie samouczki, które znalazłem, są zorientowane na RedHat ; i, szczerze mówiąc, dość skomplikowane do naśladowania.


Przypisy :

(1) nie jest taki szalony. Używam na przykład statycznego ffmpeg , działa dobrze i bez żadnych problemów ze zgodnością ...

(2), aby skompilować statifier, zobacz /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
źródło

Odpowiedzi:

19

Możesz rozwiązać problem w inny i prostszy sposób:

Użyj lddw pliku wykonywalnym, aby zobaczyć połączone biblioteki, na przykład:

$ 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)

Następnie zbierz wszystkie biblioteki w folderze i ustaw zmienną środowiskową LD_LIBRARY_PATH przed uruchomieniem programu, aby wskazywał ten folder:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Alternatywnie możesz dodać wpis do folderu lib /etc/ld.so.conf.d/. Ale to zastosowałoby zmianę w całym systemie.

Klaus D.
źródło
To dobry pomysł --- chociaż naprawdę chciałbym znaleźć sposób na spakowanie tego wszystkiego do pliku wykonywalnego; na to rozwiązanie mogą wpływać zmiany w module ładującym (chociaż mam nadzieję, że nikt nie zrobi czegoś takiego w sposób niekompatybilny wstecz). Przyznam nagrodę, jeśli nie pojawią się lepsze rozwiązania --- dzięki.
Rmano,
Możesz dodać to do małego skryptu instalacyjnego i połączyć z lokalną ścieżką. Podoba mi się to rozwiązanie, mogłem go użyć kiedyś.
WalyKu,
1
@Klaus, linux-vdso.so.1 nigdzie nie ma, przypuszczam, że jest w jądrze, prawda?
Rmano,
1
Tak. From man 7 vdso: „„ VDSO ”(wirtualny dynamiczny obiekt współdzielony) to mała biblioteka współdzielona, ​​którą jądro automatycznie mapuje na przestrzeń adresową wszystkich aplikacji w przestrzeni użytkownika.”
Klaus D.
Chociaż nie jest to ściśle odpowiedź na pytanie, jest to rozsądne obejście. Dzięki.
Rmano,
2

Jedna sugestia dotycząca rejestratora :

Jeśli przyczyną losowania układu przestrzeni adresowej (ASLR) jest awaria, nie musisz go wyłączać dla całego komputera. Możesz to wyłączyć tylko dla tego procesu:

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

Uruchomi to polecenie z wyłączonym układem losowym (nie trzeba być rootem).

lemonsqueeze
źródło
Wow, ciekawe. Teraz gdybym tylko mógł skompilować statifier...
Rmano,
Skompilowane i sprawdzone. xfig_statifiedwciąż zrzuty rdzenia ... szkoda. W każdym razie dzięki.
Rmano,
Tak szkoda. Zastanawiam się, czy nie byłby to problem 64-bitowy, może spróbuj uruchomić statifier na konfiguracji 32-bitowej?
lemonsqueeze
Sprawdzane na 32-bitowej maszynie, nadal zrzuty rdzenia.
Rmano,