Czy mój binarny system Linux działa na wszystkich dystrybucjach?

24

Znalazłem dobre zastępcze IDE dla Delphi o nazwie Lazarus. Ale nie mam pytania do programistów.

Czy statycznie powiązany plik binarny Linuksa będzie działał na wszystkich dystrybucjach Linuksa? To znaczy, nie ma znaczenia, jaką dystrybucję Linux zbudowałem i będzie działał na Debian / ArchLinux / Ubuntu / OpenSUSE / ... cokolwiek?

W wyniku moich ustaleń, czy naprawdę ma to znaczenie tylko 32-bitowe vs 64-bitowe? Chcę mieć pewność, zanim opublikuję.

LinuxSecurityFreak
źródło
Niejasno związanych: System Linux wywołuje w C na OSX .
G-Man mówi „Przywróć Monikę”
Czy możesz bardziej szczegółowo określić, z jakiego rodzaju bibliotekami chcesz połączyć swój program? Niektóre biblioteki mają ukryte zależności (pliki danych, podsystemy dynamiczne) lub w inny sposób dorozumiane założenia dotyczące systemu, na którym działają.
Thomas Erker,

Odpowiedzi:

29

Ta odpowiedź została napisana po raz pierwszy na bardziej ogólne pytanie „czy mój plik binarny będzie działał na wszystkich dystrybucjach”, ale dotyczy statycznie powiązanych plików binarnych w drugiej połowie.


W przypadku wszystkiego, co jest bardziej złożone niż statycznie powiązany świat cześć, odpowiedź brzmi prawdopodobnie nie .
Bez testowania na dystrybucji X załóżmy, że odpowiedź brzmi „ nie” dla X.

Jeśli chcesz wysłać oprogramowanie w formie binarnej, ogranicz się do

  • kilka popularnych dystrybucji w dziedzinie użytkowania oprogramowania (komputer stacjonarny, serwer, wbudowane, ...)

  • najnowsza jedna lub dwie wersje każdego z nich

W przeciwnym razie znajdziesz setki różnych rozmiarów, wersji i grup wiekowych (dystrybucja dziesięcioletnia jest nadal używana i obsługiwana).

Przetestuj dla tych. Tylko kilka wskazówek na temat tego, co może (i pójdzie) źle pójść inaczej:

  • Pakiet potrzebnego narzędzia / biblioteki ma inną nazwę w różnych dystrybucjach, a nawet wersjach tej samej dystrybucji

  • Potrzebne biblioteki są za nowe lub za stare (zła wersja). Nie zakładaj tylko dlatego, że twój program może łączyć, łączy się z odpowiednią biblioteką.

  • Ta sama biblioteka (plik na dysku) ma różne nazwy w różnych dystrybucjach, co uniemożliwia połączenie

  • 32-bitowy na 64-bitowy: środowisko 32-bitowe może nie zostać zainstalowane lub niektóre nieistotne biblioteki 32-bitowe zostaną przeniesione do dodatkowego pakietu oprócz środowiska 32-bitowego, więc w tym przypadku masz dodatkową zależność.

  • Shell: nie zakładaj wersji Bash. Nie zakładaj nawet Bash.

  • Narzędzia: nie zakładaj, że jakieś narzędzie wiersza poleceń inne niż POSIX istnieje w dowolnym miejscu.

  • Narzędzia: nie zakładaj, że narzędzie rozpoznaje opcję tylko dlatego, że robi to wersja GNU twojej dystrybucji.

  • Interfejsy jądra: nie zakładaj istnienia lub struktury plików /proctylko dlatego, że istnieją / mają strukturę na twoim komputerze

  • Java: czy naprawdę jesteś pewien, że Twój program działa w środowisku JRE IBM dostarczanym z SLES bez testowania go?

Premia:

  • Zestawy instrukcji: plik binarny skompilowany na twoim komputerze nie działa na starszym sprzęcie.

Czy łączenie statyczne (lub: łączenie wszystkich potrzebnych bibliotek z oprogramowaniem) jest rozwiązaniem? Nawet jeśli działa to technicznie, związane z tym koszty mogą być zbyt wysokie. Niestety, odpowiedź brzmi prawdopodobnie nie.

  • Bezpieczeństwo: przenosisz odpowiedzialność za aktualizację bibliotek od użytkownika oprogramowania do siebie.

  • Rozmiar i złożoność: dla zabawy spróbuj zbudować statycznie powiązany program GUI.

  • Interoperacyjność: jeśli twoje oprogramowanie jest „wtyczką” jakiegokolwiek rodzaju, zależysz od oprogramowania, które Cię wzywa.

  • Projekt biblioteki: jeśli połączysz swój program statycznie z GNU libc i korzystasz z usług nazw ( getpwnam()itp.), Skończysz dynamicznie połączony z NSS libc (przełącznik usługi nazw).

  • Projekt biblioteki: biblioteka, do której program łączy się statycznie, wykorzystuje pliki danych lub inne zasoby (takie jak strefy czasowe lub ustawienia regionalne).


Ze wszystkich wymienionych wyżej powodów testowanie jest niezbędne.

  • Zapoznaj się z KVM lub innymi technikami wirtualizacji i uzyskaj maszynę wirtualną każdej dystrybucji, którą planujesz obsługiwać. Przetestuj swoje oprogramowanie na każdej maszynie wirtualnej.

  • Używaj minimalnej instalacji tych dystrybucji.

  • Utwórz maszynę wirtualną z ograniczonym zestawem instrukcji (np. Bez SSE 4).

  • Tylko połączone statycznie lub tylko w pakiecie: sprawdź, czy pliki binarne lddsą naprawdę połączone statycznie / użyj tylko bibliotek dołączonych.

  • Tylko połączone statycznie lub tylko w pakiecie: utwórz pusty katalog i skopiuj do niego oprogramowanie. chrootdo tego katalogu i uruchom oprogramowanie.

Thomas Erker
źródło
To dość wyczerpująca odpowiedź +1
sirlark
2
Shell: W szczególności Debian nie korzysta z bash , a ponieważ znacznie zmniejszyło to lukę Shellshock w systemach Debian, nie wyobrażam sobie, aby zmieniała się w najbliższej przyszłości.
Kevin
1
Ponadto, jeśli chcesz wysyłać pliki binarne, połącz je statycznie .
user253751
Dlaczego „zestaw instrukcji” nazywa się „premią”? Jeśli dystrybuujesz w formie binarnej, naprawdę musisz rozważyć, dla których ISA będziesz kompilować. Możesz nie dbać o użytkowników m68k, ale ciężko jest zignorować przynajmniej ARM, IA32 i X86_64.
Toby Speight,
@TobySpeight Pomyśl o SSE4 i tym podobnych. Może cię ugryźć tylko, jeśli użyjesz asemblera.
Thomas Erker,
9

Odpowiedź brzmi: to zależy. , ale w większości przypadków tak, o ile niezbędne biblioteki są zainstalowane w systemie operacyjnym.

Ogólnie rzecz biorąc, większość głównych dystrybucji, takich jak te, o których wspomniałeś, ma narzędzia do zarządzania pakietami, które instalują wersję aplikacji obsługiwaną przez społeczność. Dba to o wszystkie wymagane pakiety, które będą potrzebne aplikacji. Jeśli instalujesz go bez menedżera pakietów, od Ciebie zależy, czy wszystkie niezbędne pakiety i biblioteki zostaną zainstalowane w systemie operacyjnym. Dobrym pomysłem jest zawarcie w dokumentacji listy tych wymagań wstępnych.

AlexJerez
źródło
2

Najpierw kiepska odpowiedź: to zależy

Jeśli wypuszczasz pliki binarne, załóż, że odpowiedź brzmi „nie”, chyba że rozpowszechniasz wszystkie biblioteki, które kiedykolwiek się z tym wiążą (od podstaw, co jest denerwujące, chyba że zapewniasz naprawdę ogromny system, który i tak działa samodzielnie) ) lub statycznie łączą ekwiwalent.

... ale czarodzieje i pieniądze i czarodzieje pieniądze ...

IBM ma kilka „ogólnych uniksowych” instalatorów, które zszokowały mnie, pracując wszędzie, gdzie ich wypróbowałem: kilka Linuces z kilku generacji jądra, OpenSolaris (lub jak to się teraz nazywa), Solaris i BSD. Ale są ogromne. A rzeczy, które zapewniają, są równie ogromne. W ten sposób nie są publikowane żadne małe programy wyścigowe, tylko duże korporacyjne rzeczy, których można oczekiwać od IBM.

Jeśli chodzi tylko o pozostawanie w systemie Linux, ale działa dobrze w większości Linuxdom, wydaje się, że jest to możliwe w formie binarnej, o czym świadczy różnorodność instalatorów binarnych typu „dla Linux (ogólnie)”, które zobaczysz od niektórych dostawców. Kilka czatów, przeglądarek, gier, meta-instalatorów itp. Jest publikowanych w ten sposób, ale zawsze przez wielkich sprzedawców, którzy mogą poświęcić czas, aby to zrobić. To niesamowite, że mogą powiedzieć „dla Linuksa” i ogólnie są pewni, że zadziała, ale wydaje się, że tak jest.

Ale...

Rozpowszechniam moje oprogramowanie jako źródło za pomocą narzędzia do kompilacji. Zrobić to w C, Erlang, Python, Guile, itp Daje mi dużo większą elastyczność na temat tego, czy to będzie działać czy nie, a to jest o wiele łatwiej napisać buildscript sprawia, że na pewno właściwe rzeczy istnieją w czasie kompilacji, niż upewnij się, że wszystko jest na swoim miejscu w czasie wykonywania. Gdy już to istnieje, napisanie automatycznego programu aktualizującego dla twojego programu jest proste, jeśli dystrybuujesz źródło: źródło jest zwykle dużo mniejsze niż plik binarny, który zawiera wszystkie deps i inne szaleństwa. Korzystając z tej metody, nie miałem większych problemów z niezawodnym wdrożeniem na Unices (a czasem Windowsie, ale to trochę więcej pracy).

Dość zabawy dla dzieci, uzbrój się!

Kiedy poważnie podchodzisz poważnie, jak srsly srs, do płynnego dopasowania się do świata Linuksa, dystrybuujesz źródła C lub przechodzisz do w pełni zarządzanego środowiska, aby uzyskać zachwycająco zachwycający język, który jest już wstępnie zbudowany. Jeśli piszesz na przykład kod Python, możesz sprawdzić wersje i dowiedzieć się, z którą wersją CPython współpracujesz, i ogólnie oczekiwać, że na danym systemie Linux będzie istniała kompatybilna wersja (i jest to o wiele łatwiejsze do sprawdzenia niż szeroki zakres bibliotek C / wersje, których możesz używać). Erlang, Guile, Python, Perl, CL itd. Są bardzo podobne łatwe cele dla tego rodzaju wdrożenia, a wiele z nich ma centralne repozytorium, takie jak CPAN lub pip (lub cokolwiek innego), w którym użytkownicy mogą uruchomić polecenie, aby samodzielnie pobrać podpisane źródło, i wiedzą, że rzeczy będą na ogół działać zgodnie z zamierzeniami .

[Dodatek: 1. Nawet Haskell może to generalnie wykonać za pośrednictwem Cabala - chociaż byłbym ostrożny w robieniu tego w środowisku produkcyjnym. 2. Istnieją całkowicie różne strategie wdrażania „wydania” w Erlang, które gwarantują, że Twój kod niesie ze sobą kompletne środowisko. 3. Python idzie o krok dalej w środowiskach wirtualnych; nie wszystkie środowiska wykonawcze pomagają ci tak bardzo.]

Ten ostatni fragment dotyczący środowisk zarządzanych w systemie Linux jest niesamowity . Jako bonus umożliwia zdefiniowanie znacznie bardziej ogólnych zależności, automatyczne ich rozwiązywanie bez dodatkowego wysiłku z Twojej strony, nie wymaga pisania paczki dla każdej dystrybucji i możesz przestać dbać o to, czy system ma 32 czy 64 bit (ogólnie zresztą).

zxq9
źródło