Nie można uruchomić 32-bitowego programu na 64-bitowej maszynie wirtualnej

12

Skompilowałem mały program C „hello world” na 32-bitowym komputerze Ubuntu 10.04. Następnie umieściłem plik wykonywalny (a.out) na maszynie wirtualnej Ubuntu 12.10 (64-bitowej) VMWare i spróbowałem go uruchomić (./ a.out). System operacyjny nie identyfikuje pliku i mówi „Brak takiego pliku lub katalogu”. Ale kiedy umieszczam ten sam plik wykonywalny na Ubuntu 12.10 (64-bitowym) działającym na 64-bitowym laptopie, działa dobrze i otrzymuję pożądane wyjście. Maszyna wirtualna działa na serwerach IBM Blade Server. Chciałem wiedzieć, dlaczego wyniki dla maszyny wirtualnej?

Sójka
źródło

Odpowiedzi:

20

Komunikat No such file or directorynie odnosi się do pliku wykonywalnego: a.out. Zamiast tego odnosi się do programu pomocniczego, który jest potrzebny do uruchomienia 32-bitowego dynamicznie połączonego pliku wykonywalnego a.out.

Znalazłem je wszystkie bardzo dobrze wyjaśnione w tym ładnym artykule:

Połączenie statyczne i dynamiczne

Istnieją dwa typy plików binarnych: połączone statycznie i dynamicznie. Najpierw o połączonych statycznie : gdy program chce wywołać funkcję biblioteki, odnosi się do niej po nazwie. Podczas budowania programu ze źródła wszystkie funkcje biblioteczne używane w programie są kopiowane z biblioteki do programu. Następnie program zawiera własny kod oraz kod funkcji bibliotecznych, z których korzysta. Następnie w miejscach wywoływania nazwa jest zmieniana na adres odpowiedniej funkcji w programie. Ten proces nazywa się łączeniem, ponieważ łączy nazwę funkcji z samą funkcją, jej implementacją. Nazywa się to statycznym , ponieważ łącza nie można zmienić po zbudowaniu programu.

Dynamicznie połączone programy działają inaczej: program odwołuje się także do funkcji bibliotecznych według nazwy. Podczas budowania programu, dwie listy są gromadzone i przechowywane razem z programem: lista funkcji bibliotecznych, w których miejscach są używane, oraz lista bibliotek, które zawierają funkcje używane przez program. To wszystko na budowę programu.

Później, w czasie wykonywania , specjalny program pomocniczy, tak zwany dynamiczny linker, wyszukuje w określonych miejscach w systemie plików każdą bibliotekę na liście bibliotek i ładuje ją do pamięci. Teraz dynamiczny linker wie, pod jakim adresem pamięci są dostępne funkcje biblioteki. Używa pierwszej listy do wpisania poprawnego adresu we wszystkich miejscach wywołujących funkcje biblioteczne. Następnie można uruchomić dynamicznie połączony program.

Radu Rădeanu
źródło
3
Ten komunikat o błędzie „Nie znaleziono pliku” mylił mnie również za pierwszym razem ° ͜ °, wtedy zrozumiałem, że oznacza to brak pliku wymaganego przez aplikację.
Ramchandra Apte
@Radu Rădeanu, jak nazywacie program pomocniczy ? Chyba dynamicznie połączoną bibliotekę. Jeśli tak, nazwanie go programem pomocniczym po prostu wprowadza w błąd wyjaśnienie.
golem
Oto link, który uznałem za przydatny do zrozumienia tego problemu - komunikat „Nie znaleziono” podczas uruchamiania 32-bitowego pliku binarnego w 64-bitowym systemie
golem