2012-02-28 25 views
11

Mam plik o nazwie commanKT i chcę go uruchomić w terminalu Linux. Czy ktoś może pomóc, wydając polecenie uruchomienia tego pliku? Próbowałem ./commonRT ale dostaję błąd:Jak uruchomić plik binarny w systemie Linux

"bash: ./commonrt: cannot execute binary file" 

[[email protected] MainApp]$ ls -al commonKT 
-rwxrwxr-x. 1 sijith sijith 10314053 Feb 27 16:49 commonKT 
+1

jesteś pewien, że jest to plik wykonywalny? spróbuj użyć polecenia 'file' – meteorgan

+4

Zakładając, że problem nie jest tylko mieszaniem nazw (' commonrt' kontra 'commonKT'), co mówi polecenie' plik commonKT/bin/sh'? Jeśli daje dwie różne architektury (być może jedną dla ARM i jedną dla Intela), to właśnie dlatego nie można uruchomić ARM-a na komputerze Intela. –

+0

Oprócz użycia 'file', sugeruję również użycie' ldd'; być może dynamiczny linker lub inna podstawowa biblioteka współdzielona jest inna lub brakuje jej ... –

Odpowiedz

4

:-) Jeśli nie typo, dlaczego używasz ./commonRT zamiast ./commonKT ??

+0

nawet './Commonrt' we wszystkich małych literach. :) –

5

Głośność, na której jest włączony, jest zamontowana noexec.

1

Albo, plik jest typu pliku i/lub architektury, której nie można uruchomić ze sprzętem i/lub nie ma również zastępczego wpisu binfmt_misc, który mógłby obsługiwać określony format w inny sposób. Użyj file(1), aby określić.

18

Aby wykonać plik binarny, użyj: ./binary_name.

Jeśli pojawi się błąd:

bash: ./binary_name: cannot execute binary file

to będzie, ponieważ został skompilowany przy użyciu łańcucha narzędzie, które było na inny cel do tego, co ty próbujesz uruchomić binarnych.

Na przykład, jeśli skompilujesz "binary_name.c" z arm-none-linux-gnueabi-gcc i spróbujesz uruchomić wygenerowany plik binarny na komputerze x86, otrzymasz powyższy błąd.

8

Aby uruchomić plik binarny lub .run w Linuksie od powłoki, użyj znajomego kropka ukośnik

./binary_file_name 

i jeśli nie powiedzieć, bo z uprawnieniami, można spróbować tego przed wykonaniem go

chmod +x binary_file_name 
# then execute it 
./binary_file_name 

Nadzieja pomaga

2

jest możliwe, że skompilowany plik binarny z ustawieniami niezgodne architektura na hoście build vs. hosta wykonania. Czy możesz rzucić okiem na włączonych ustawieniach systemu docelowego poprzez

g++ {all-your-build-flags-here} -Q -v --help=target 

na hoście kompilacji? W szczególności zmienna COLLECT_GCC_OPTIONS może dostarczyć cennych informacji diagnostycznych. Następnie spojrzeć na możliwości procesora na gospodarza poprzez wykonanie

cat /proc/cpuinfo | grep -m1 flags 

Zwróć uwagę na rozbieżności takie jak -msse4.2 [enabled] na hoście budować, ale brakującym sse4_2 flagą w możliwościach procesora.

Jeśli to nie pomoże, proszę podać dane wyjściowe ldd commonKT na hoście budowania i wykonywania.

+0

@ craq Widzę, że dałeś mi swoją nagrodę, dzięki! Czy możesz podać informacje o błędzie? – user1978011

2

Jest to odpowiedź na @craq:

I just compiled the file from C source and set it to be executable with chmod. There were no warning or error messages from gcc.

Jestem nieco zaskoczony, że trzeba było „ustawić go do wykonywania” - mój gcc zawsze ustawia samą flagę wykonywalny. Sugeruje to, że gcc nie spodziewał się, że będzie to końcowy plik wykonywalny, lub że nie spodziewał się, że będzie on wykonywalny w tym systemie.

Teraz starałem się po prostu utworzyć plik obiektu, tak jak poniżej:

$ gcc -c -o hello hello.c 
$ chmod +x hello 

(hello.c jest typowym programem „Hello World”). Ale mój komunikat o błędzie jest nieco inny:

$ ./hello 
bash: ./hello: cannot execute binary file: Exec format error` 

z drugiej strony, w ten sposób, wyjście komendy file jest identyczna jak twoja:

$ file hello 
hello: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped 

Podczas gdy kompiluję poprawnie, jego wydajność jest znacznie dłuższa.

$ gcc -o hello hello.c 
$ file hello 
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=131bb123a67dd3089d23d5aaaa65a79c4c6a0ef7, not stripped 

To, co mówię, to: podejrzewam, że ma to jakiś związek ze sposobem kompilacji i łączenia kodu. Może możesz rzucić trochę światła na to, jak to robisz?

0

Jeśli to nie jest literówka, jak wskazano wcześniej, może to być złe opcje kompilatora, takie jak kompilacja 64-bitowa w 32-bitowym formacie. To nie może być łańcuch narzędzi.

1

Jedynym sposobem, który pracuje dla mnie (wyciąg z here):

chmod a+x name_of_file.bin 

Następnie uruchom go poprzez pisanie

./name_of_file.bin 

Jeśli pojawi się błąd pozwolenie może trzeba uruchomić aplikację z uprawnienia root:

sudo ./name_of_file.bin 
0

Twoja opcja kompilacji -c tworzy kompilację tylko kompilacji i montażu, ale bez łącza.

-1

pełna ścieżka do pliku binarnego. Na przykład:/home/vitaliy2034/binary_file_name. Lub użyj dyrektywy "./+podstawna_nazwa_pliku". "./" w systemie unix zwraca pełną ścieżkę do katalogu, w którym otwierasz terminal (shell). Mam nadzieję, że to pomaga. Niestety, dla mojego języka angielskiego)

Powiązane problemy