Aktualności:

Nowy polski projekt BOINC - Universe@Home

Menu główne

Kompilacja a przenośność aplikacji

Zaczęty przez sesef, 31 Maj 2010, 16:38

sesef

Jak to wygląda z przenośnością aplikacji po skompilowaniu ich na linuxie? Trzeba dodawać jakieś konkretne dyrektywy podczas kompilacji? Potrzebuje skompilować wrapper do projektu i wypadałoby, żeby działała nie tylko na moim kompie.

buninek

#1
Jeśli skompilujesz statycznie, to w obrębie danej architektury będzie pracować na każdym systemie.
LDFLAGS="-static" make
       
W przypadku dynamicznego linkowania, linkowane są wersje bibliotek z systemu na którym, go budujesz. Zgodne "w górę".
Stąd, aby taka aplikacja była jak najbardziej przenośna, dobrze jest to budować na jak najbardziej leciwym systemie.
Na przykład zainstalować na wirtualce system z (nawet) glibc w wersji 2.2(2.3) - starego Centosa, Debiana.


Najwygodniej będzie zrobić całkowicie statyczny wrapper.
http://www.dwheeler.com/program-library/Program-Library-HOWTO/index.html
http://boinc.berkeley.edu/trac/wiki/CompileApp

buninek

#2
Jeśli będziesz miał problem w zbudowaniu całkowicie statycznego wrappera, skorzystaj z tych bibliotek.
http://dl.dropbox.com/u/349831/boinc-5.10.45-i686.tar.bz2

To jest boinc w wersji 5.10.45, całkowicie przenośny zbudowałem go na Red Hat Enterprise Linux AS 2.1.
Sprawdzałem na standardowym wrapperze, źródła pobrane stąd: genwrapper.sourceforge.net

Buduje się w wersji całkowice statycznej bez problemów.

sesef

Cytat: buninek w 31 Maj 2010, 17:09
Jeśli skompilujesz statycznie, to w obrębie danej architektury będzie pracować na każdym systemie.
LDFLAGS="-static" make

A kompilacja statyczna odwołuje się od bibliotek z danego systemu? Kombinuje jak tutaj skompilować wrapper na PS3 nie posiadając tej architektury.

buninek

Zdaje mi się, że taka aplikacja nie będzie przenośna na arch PPC.  Choć szczerze mówiąc, to ani nie mam odpowiedniej wiedzy, ani praktyki, żeby to jednoznacznie stwierdzić. XD

http://stackoverflow.com/questions/588814/will-static-linking-on-one-unix-distribution-work-but-not-another
http://wiki.allegro.cc/index.php?title=Unix_architecture

Jest możliwość cross kompilacji, czyli budowanie aplikacji na inne architektury. Z tym, że zbudowanie takiego pełnego środowiska, to nie takie sobie hop-siup.
Inna możliwość to wykorzystanie qemu-ppc.

Troll81


sesef

Jeszcze jedna sprawa jaka flagę trzeba dodać żeby skompilować wersję x86 na systemie x64.

buninek

#7
gcc -m32 prog.c -o prog

Mowa o dynamicznym linkowaniu. Trzeba zainstalować podstawowe biblioteki (32-bit), tzw. multi-lib, niezbędne do budowy.
Nazwy pakietów, to już specyfika danej dystrybucji.

W przypadku Debiana, Ubuntu, to chyba te pakiety

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386



TJM

Z kompilacją statyczną wcale nie jest tak za różowo, zakres kompatybilności mocno się zwiększa, ale i tak jest pewna dolna granica wersji systemu, poniżej której progs się wysypie. Swego czasu gdy miałem jeszcze jeden z serwerów na starym Slackware z kernelem 2.2, praktycznie nic BOINCowego na nim nie ruszało - samego core clienta musiałem zbudować ze źródeł (działały wersje do max 5.4 co już wtedy było przestarzałe i do bani), 5.8 wywalały SIGSEGV przy starcie.
Podobnie BOINCowe aplikacje - jedyny projekt jaki działał to Enigma, bo przekompilowałem aplikację ze źródeł i użyłem app_info. Statyczna wersja nie miała chęci ruszyć, ani moja, ani dostarczona przez Stefana Kraha.
Jako wielki plus tej maszyny i systemu trzeba zaliczyć fakt, że dzięki niej powstała jedna z najbardziej uniwersalnych optymalizacji - 0.76-pIII która do tej pory jest najszybsza na dużej części maszyn. Oraz, co ciekawe - mimo dynamicznej kompilacji, rusza na 80% systemów lub lepiej.


W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

buninek

Duży plus dynamicznej aplikacji to jej rozmiar. Przy ogólnym transferze może to mieć znaczenie, o ile popularność platformy linuksowej będzie duża.

Aplikacja enigmy to się fajnie kompiluje z diet libc. Rozmiar aplikacji statycznej 61 kB.
W pamięci RAM 180kB. Co się przekłada na jej ogólną wydajność, lepsza o ok 5%.