Zasadniczo programy nie są kompatybilne z powodu różnic w ich binarnym interfejsie aplikacji (ABI) .
Czy program nie działa bezpośrednio na procesorze?
NIE ! To zadanie dla systemu operacyjnego, aby zapobiec aplikacji z systemem „bezpośrednio” na CPU. Zazwyczaj na najniższym poziomie (tj. Tym, na którym zbudowany jest interfejs API systemu operacyjnego) aplikacja łączy się z jądrem systemu operacyjnego .
Czy to dlatego, że sam skompilowany program musi odwoływać się do bibliotek specyficznych dla systemu operacyjnego?
Tak . Wiele bibliotek systemu operacyjnego zostało napisanych w celu ułatwienia współpracy z samym systemem operacyjnym, ale jest ich tak wiele, że są przeznaczone dla różnych platform. Ukrywają one interfejs programisty niskiego poziomu przed deweloperem i zakładają, że skompilowana wersja dla tego systemu będzie dostępna w czasie wykonywania (patrz poniżej).
Chociaż biblioteki można pisać wieloplatformowo, po skompilowaniu nie można ich uruchamiać na różnych platformach. Nadal trzeba je ponownie skompilować dla konkretnego docelowego systemu operacyjnego, ponownie, aby wykorzystać określone podstawowe komponenty systemu operacyjnego (jądra).
Jaka jest różnica między skompilowanym programem dla jednego systemu operacyjnego a innym?
Wreszcie, same pliki wykonywalne często zawierają bardzo specyficzne binarne nagłówki ładujące i tak dalej (np. Format pliku wykonywalnego PE [.exe, .dll, itp ...] dla systemu Windows lub ELF dla systemu Linux [brak, .o, .so itp.]). Mogą one również zawierać kod do ładowania skompilowanych plików binarnych specyficznych dla systemu operacyjnego dla określonej biblioteki oprogramowania.
Wreszcie z perspektywy programisty: konwencja wywoływania . Skompilowany kod przekazuje zmienne do funkcji w określony sposób (tj. Przez rejestry lub na stosie) w bardzo określonej kolejności. Nawet wtedy należy również ustalić, kto jest odpowiedzialny za „wyczyszczenie” wywołań funkcji (osoba dzwoniąca czy odbiorca?). Chociaż istnieje kilka standardowych i powszechnie używanych konwencji wywoływania x86 , niektóre mogą nie być obsługiwane przez niektóre systemy operacyjne (jest to część ABI).