[gcc][Linux] Flaga -march tak, by była obsługiwana przez 32 bitową wersją Linuksa

Od razu zaznaczam, że na sprzęcie nie znam się za bardzo.

 

Szukam flagi march takiej, by była obsługiwana przez 32 bitowe Linusky(nowsze wersje). Linux porzucił obsługę i386, a więc wyborem powinno być i586. Niestety, ale są problemy z działaniem mojego programu na tej architekturze. Testowałem uruchamianie przez 64 bitowe linuksy z programem linux32. Program kompilowałem, z -march=i386, jak również -march=i586. Na moim sprzęcie nie śmiga program, bo mam nowsze jądro, program nie działa, a na sprzętach znajomych działa. Jaka architektura (możliwie najniższa) powinna być obsługiwana. Pod swój procesor nie mogę kompilować, bo zależy mi na przenośności.

 

Wydaje mi się, że generalnym wyborem powinno być i686, ale to nie działa.

Linux (jako jądro) porzucił wsparcie i386 w wersji 3.8, ja mam 3.13 i aplikacje skompilowane pod i386 chodzą bez problemu. Chyba źle rozumiesz co oznacza porzucenie wsparcia. To tylko tyle, że jak masz procesor z chipem https://en.wikipedia.org/wiki/Intel_80386 to nie uruchomisz już na nim jądra >= 3.8. Chyba najszybsze procesory wydane z tym chipsetem to były 40 Mhz. Aplikacje napisaną przez siebe powinieneś móc normalnie uruchomić, bo linia x86 jest kompatybilna wstecznie.

Refrazując szukałbym błędu gdzie indziej, z racji tego, że nie możesz uruchomić aplikacji x86 na amd64. Może twój procesor nie wspiera już w ogóle instrukcji 32 bitowych? Borąc pod uwagę, że nie działa ci żadna x86, to jest to całkiem prawdopodobne.

 

Więc czemu dystrybucje też tego nie zrobią? czemu wychodzą distra pod architekturę x86 (w tym również przecież 388) skoro kernel ich nie obsługuje? Arch jest prekompilowany pod i686 wzwyż i widać wyraźną poprawę wydajności. Pozostałe liczące sie dystrybucje też powinny iść tym śladem.

re up: W drugim poście osoba ma rację, ale mam taki problem, że występuje błąd, który podobno jest związany z różnicą w architekturze. Kompiluję wszystko pod x86, więc powinno śmigać. Jednak mogły dojść do zmian w ABI, ale raczej do komunikacji z jądrem wykorzystuje się przerwania.

Co rozumiesz przez liczące się? Ubuntu porzuciło wsparcie dla i386 w wersji 10.10 (też jest kompilowany pod i686 - chodzi o gotową paczka do instalacji), to że w repozytorium znajdziesz pakiety od i386, to tylko dlatego, że twórca aplikacji zdecydował się je skompilować pod i386. Jeśli pytasz mnie jaki tego jest sens - to pewnie dlatego, że ktoś może sobie wziąć kod i sam skompilować dystrybucję pod i386, czyli najzwyczajniej w świecie kompatybilność wsteczna. Oczywiście standardowo Ubuntu nie uruchomisz na 40Mhz. Jak chcemy, by nasz pakiet chodził na wersji headless maszyny na jakimś komputerze sprzed lat, to może ma to sens. Dla 99,(9)% użytkowników będzie dobrze z paczką pod i686.

 

[EDIT]

Czasami też są złe opisy paczek i ludzie wstawiają i386 (bo wszyscy przy 32 bitach tak piszą) nie wiedząc, że domyślnie kompilator skompilował im to w i686, jeśli nie podali odpowiedniej flagi. Ale tak jak mówiłem, jest to bez znaczenia, normalny użytkownik Linuksa nawet się nie zorientuje.

@nintyfan

Za mało informacji. Może linkujesz dynamicznie do bibliotek ze złej architektury? Ja dla przykładu dość dużo piszę w  JNI (interfejs do komunikacji Java i kodu natywnego). Jeśli chcę wykorzystać zależności x86 muszę moją bibliotekę napisać też z użyciem instrukcji x86 i uruchomić na 32 bitowej maszynie. A jeśli dla amd64 to analogicznie, tak by moja biblioteka była amd64 i maszyna 64 bit.

https://sourceforge.net/projects/libgreattao/

 

Możecie pobrać 32 bitowy instalator(to z nim są problemy). Dostępu do komputera z Ubuntu na razie nie mam (rozładowany akumulator), Możecie też pobrać źródła z svn-a, uruchomić Installer/create_installer.sh i sprawdzić rezultaty.

Dobra.

 

Dodałem do Ubuntu 32-bitową wersję libc, w taki sposób:

apt-get install libc6-32

Teraz nie działa coś innego i znowu tylko w 32 bitowej wersji, a na moim systemie nadal wszystko działa poprawnie. Muszę zainstalować sobie źródła i zdebugować.

Wtrącę się i napiszę bo nie wiem :wink:

Czy nie możesz utworzyć configa z flagą march=native?

Tak, ale wtedy wymagałoby to dystrybucji w formie źródłowej, a tego chcę uniknąć. Native oznacza pobranie flag dla obecnego w komputerze, gdzie program jest kompilowany, procesora i kompilację pod niego. Ja chcę dystrybuować program w formie binarnej(w ramach m.in eksperymentu). Jak widać, to 64 bitowe Ubuntu ma problemy z uruchamianiem 32 bitowych aplikacji. Zdebuguję program i będzie wszystko w porządku.