Linuksowe linkowanie statyczne jest martwe?

W rzeczywistości, - static flaga gcc na Linuksie nie działa. Pozwolę sobie zacytować z FAQ GNU libc:

2.22. Nawet statycznie powiązane programy potrzebują bibliotek współdzielonych co jest dla mnie nie do przyjęcia. Co? mogę?

{aj} NSS (dla szczegółów wystarczy wpisać ' info libc "Name Service Switch"') nie będzie pracuj poprawnie bez współdzielenia biblioteki. NSS pozwala na korzystanie z różnych usługi (np. NIS, pliki, db, Hezjod) zmieniając tylko jedną konfigurację plik (/etc / nsswitch.conf) bez ponowne łączenie dowolnych programów. Jedyny wadą jest to, że teraz statyczne biblioteki muszą mieć dostęp do współdzielonych biblioteki. To jest obsługiwane przejrzyście przez Bibliotekę GNU C.

Rozwiązaniem jest skonfigurowanie glibc z -- enable-static-nss. W tym przypadku można utworzyć statyczny binarny, który będzie korzystaj tylko z usług dns i plików (Zmień /etc / nsswitch.conf dla tego). Musisz linkować wprost przeciwko wszystkie te usługi. Na przykład:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

Problem z tym podejściem jest że musisz połączyć wszystkie statyczne program wykorzystujący procedury NSS z wszystkie te biblioteki.
{UD} w rzeczywistości nie można już powiedzieć, że libc skompilowana z tą opcją używa NSS. Nie ma przełącznika już nie. Dlatego jest wysoce zalecane nie {[3] } do użycia -- enable-static-nss ponieważ powoduje to zachowanie programów na system niespójny.

Odnośnie tego faktu jest jakiś rozsądny sposób na stworzenie w pełni funkcjonalnej statycznej kompilacji na Linuksie lub statyczne linkowanie jest całkowicie martwe na Linuksie? Chodzi mi o statyczną budowę, która:

  • zachowuje się dokładnie tak samo jak dynamiczny build do (static-NSS z niekonsekwentne zachowanie to zło!);
  • Działa na rozsądnych wariantach środowiska glibc i wersji Linuksa;
Author: Shcheklein, 2010-08-07

5 answers

Jeśli chodzi o ten fakt, czy jest jakiś rozsądny sposób, aby stworzyć w pełni funkcjonalną statyczną kompilację na Linuksie lub statyczne linkowanie jest całkowicie martwe na Linuksie?

Nie wiem, gdzie znaleźć historyczne odniesienia, ale tak, statyczne linkowanie jest martwe na systemach GNU. (Wierzę, że umarł podczas przejścia z libc4 / libc5 do libc6 / glibc 2.x.)

Funkcja została uznana za bezużyteczną w świetle:

  • Luki w zabezpieczeniach. Aplikacja, która był statycznie połączony nie obsługuje nawet aktualizacji libc. Jeśli aplikacja została podłączona do systemu zawierającego lukę w lib, zostanie ona utrwalona w statycznie połączonym pliku wykonywalnym.

  • Kod nadęty. Jeśli wiele statycznie powiązanych aplikacji jest uruchomionych na tym samym systemie, standardowe biblioteki nie byłyby ponownie używane, ponieważ każda aplikacja zawiera wewnątrz swojej własnej kopii wszystkiego. (Spróbuj du -sh /usr/lib zrozumieć zakres problemu.)

Spróbuj wykopać LKML i archiwów list pocztowych glibc sprzed 10-15 lat. Jestem pewien, że dawno temu widziałem coś związanego z LKML.

 21
Author: Dummy00001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 08:54:03

Myślę, że jest to bardzo irytujące i myślę, że aroganckie jest nazywanie funkcji "bezużyteczną", ponieważ ma problemy z radzeniem sobie z pewnymi przypadkami użycia. Największym problemem w podejściu glibc jest to, że ciężko koduje ścieżki do bibliotek systemowych (gconv, jak również nss), a tym samym pęka, gdy ludzie próbują uruchomić statyczną binarną dystrybucję Linuksa inną niż ta, dla której została zbudowana.

W każdym razie, możesz obejść problem gconv, ustawiając GCONV_PATH tak, aby wskazywał na odpowiedni lokalizacja, to pozwoliło mi wziąć binaria zbudowane na Ubuntu i uruchomić je na Red Hat.

 34
Author: Ketil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 13:59:20

Statyczne linkowanie nie wydaje się być zbyt popularne w świecie Linuksa. Oto moje zdanie.

Ludzie, którzy nie widzą atrakcyjności linkowania statycznego, zazwyczaj pracują w sferze jądra i niższego poziomu systemu operacyjnego. Wielu programistów bibliotek * nix poświęciło całe życie na rozwiązywanie nieuniknionych problemów związanych z próbą połączenia ze sobą stu ciągle zmieniających się bibliotek, co robią każdego dnia. Spójrz na autotools, jeśli kiedykolwiek chcesz wiedzieć, jakie są wygodne występ.

Ale nie należy oczekiwać, że wszyscy inni spędzają większość swojego czasu na tym. Statyczne łączenie zajmie ci długą drogę w kierunku buforowania od utraty biblioteki. Programista może uaktualnić zależności swojego oprogramowania zgodnie z harmonogramem oprogramowania, a nie być zmuszony do tego w momencie pojawienia się nowych wersji biblioteki. Jest to ważne dla aplikacji zorientowanych na użytkownika ze złożonymi interfejsami użytkownika, które muszą kontrolować strumień wielu bibliotek niższego poziomu na od których nieuchronnie zależą. I dlatego zawsze będę fanem statycznych linków. Jeśli możesz statycznie połączyć skompilowany, przenośny Kod C i C++, to praktycznie uczyniłeś świat swoim oysterem, ponieważ możesz szybciej dostarczać złożone oprogramowanie do szerokiej gamy ciągle rozwijających się urządzeń na świecie.

Jest z czym się nie zgadzać, z innych perspektyw, i dobrze, że oprogramowanie open source pozwala na to wszystko.

 13
Author: moodboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-01 10:05:37

To, że musisz dynamicznie łączyć się z usługą NSS, nie oznacza, że nie możesz statycznie łączyć się z żadną inną biblioteką. FAQ mówi tylko, że nawet "statycznie" powiązane programy mają jakieś dynamicznie połączone biblioteki. Nie chodzi o to, że statyczne łączenie jest " niemożliwe "lub że"nie działa".

 11
Author: Dean Harding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-07 12:31:39

Dodawanie innych odpowiedzi:

Ze względu na powody podane w innych odpowiedziach, nie jest to zalecane dla większości dystrybucji Linuksa, ale w rzeczywistości istnieją dystrybucje, które są tworzone specjalnie do uruchamiania statycznie powiązanych binariów:

From stali opis:

Static linux jest oparty na ręcznie wyselekcjonowanej kolekcji najlepszych narzędzi dla każdego zadania i każdego narzędzia połączonego statycznie (w tym niektóre X klientów takich jak st, surf, dwm, dmenu),

Celuje również zmniejszenie rozmiaru binarnego poprzez unikanie glibc i innych nadętych bibliotek GNU, tam gdzie to możliwe (wczesne eksperymenty pokazują że statycznie powiązane binaria są zwykle mniejsze od ich dynamicznie połączone odpowiedniki glibc!!!). Uwaga, to jest prawie wbrew temu, co uważa Ulrich Drepper o statycznym łączeniu.

Ze względu na side-korzyść, że statycznie połączone binaria uruchamiają się szybciej, dystrybucja ma również na celu zwiększenie wydajności.

Statyczne linkowanie pomaga również w redukcji zależności.

Możesz przeczytać więcej na ten temat w to pytanie o statyczne i dynamiczne łączenie .

 8
Author: Farid Nouri Neshat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:25