Så här fixar du 'kan inte köra binär fil: Exec-formatfel' på Ubuntu



Prova Vårt Instrument För Att Eliminera Problem

Även om det inte borde hända när du använder de officiella apt-get-förvaren, om du laddar ner programvara från Internet och kör den, finns det en chans att du ser den fruktade bash: ./nameOfProgram: kan inte köra binär fil: Exec-formatfel . Detta fel, som vanligtvis följs av bash: ./nameOfProgram.sh: Tillstånd nekad eller något liknande, indikerar att Ubuntu inte kunde gränssnitt korrekt med den binära du laddade ner. Detta beror på att även om det tydligen är en giltig Linux-binär, är den utformad för en annan chipset än din kärna för närvarande stöder.



De flesta som använder Ubuntu är på 32-bitars eller 64-bitars processorer baserat på en standardarkitektur som Intel släppte, oavsett vem som faktiskt skapade sina mikrochips. Det är viktigt att komma ihåg att 64-bitarsprocessorer kan köras i 32-bitarsläge, så om du får detta fel trots att du har en 64-bitars processor finns det en chans att du kör en 32-bitarsversion av Ubuntu. Några enkla kommandon är allt som krävs för att berätta vad ditt chip fungerar som.



Metod 1: Använda arch-kommandot

Om du inte känner till vilken typ av mikroprocessor du har installerat på din maskin, vill du först använda arch-kommandot från kommandoraden. Du ser bara en enstaka rad med utdata som returneras till dig när du kör det här kommandot. I många fall ser du i686, vilket betyder att du har en 32-bitars processor och därför inte kan köra x86_64-binärer. Om du istället ser amd64 eller något liknande, använder du en x86_64-processor och borde åtminstone teoretiskt kunna köra de flesta 32-bitars och 64-bitars binärer. Till skillnad från Microsoft Windows innehåller Ubuntu Linux faktiskt de rätta verktygen för att tillåta användare av 644-bitars chipset att köra 16-bitars Windows-program i sitt operativsystem i många fall också.



Dessa termer är fortfarande sanna även om du inte faktiskt använder just den modellen av mikrochip. Till exempel, i686 är hur Linux hänvisar till många 32-bitars processorer även om de inte är Intel 80686-chips. Även om du använder 64-bitars Intel-teknik kan arch fortfarande kalla din processor ett amd64-chip. Detta indikerar inte ett fel och kan säkert ignoreras. Du kan använda katt / proc / cpuinfo eller mer / proc / cpuinfo för att ta reda på exakt vilken typ av processor du använder. Eftersom raderna i den här filen är långa kanske du vill trycka på F11 innan du utfärdar den om du använder ett grafiskt terminalfönster. Användare av en virtuell konsol, särskilt de som arbetar med Ubuntu-servern, behöver inte oroa sig lika mycket.

Du kanske ser några andra typer av utdata, vilket ytterligare kan begränsa dina alternativ när det gäller att köra programvara. Ubuntu stödde PowerPC-arkitekturen under lång tid, vilket finns i vissa arbetsstationer, liksom i många Classic Macintosh och äldre OS X Macintosh-maskiner. Du kan faktiskt fortfarande hitta Ubuntu-arkiv för dessa arkitekturer, även om de får lite stöd idag. Men du kommer mer än troligtvis inte att kunna köra många Linux-binärer som du laddar ner från Internet utanför de officiella förvaren i det här fallet. Det betyder inte att Ubuntu inte fungerar på dessa maskiner, men du kanske vill titta på den lättare distributionen av Lubuntu.

Metod 2: Använda filen Command

Filkommandot identifierar vad olika filer innehåller, och det är vanligtvis mycket exakt. Försök att identifiera filen i fråga genom att skriva filen nameOfProgram för att se om du får ELF 32-bit eller ELF 64-bit som utdata. Om det talar om för dig att det är en ELF 64-bitars binär och du fick i686 som utdata från arch-kommandot, finns det inget sätt du rimligen kan köra den på din maskin. Om du använder en 64-bitars mikroprocessor som kör 32-bitars Ubuntu kan du tekniskt installera om operativsystemet, även om det här är lite av ett extremt steg för att köra ett enda program.



Det finns också den mycket verkliga möjligheten, hur liten det än är, att du istället kan stöta på en binär som när du försöker köra ut den skräpkaraktärer till terminalen även om du har kört en malware-genomsökning på den. Dessa karaktärer har vanligtvis form av antingen pastillformade block eller alternativt rektangulära kuber som har numeriska värden i sig. Vissa datavetare kallar den senare tofu och representerar Unicode-värdena för tecken som dina för närvarande installerade typsnitt inte kan visa. Om terminalen visar dem så här kan du vara säker på att detta varken är ett teckensnittsfel eller något som har att göra med skadlig kod. Snarare beror det helt enkelt på att den kompilerade mikroprocessorns opcode inuti binären är så främmande för ditt system att den inte vet hur man tolkar en del av koden.

Det bästa sättet att åtgärda detta är att installera rätt paket för din arkitektur. Om du installerar paket inifrån Ubuntu, har apt-get-systemet eller den grafiska Synaptic-chefen täckt dig utan problem. Om du laddar ner paket från en annan distribution måste du hitta rätt för din arkitektur. Ta till exempel Arch Linux: s lista över gvim-paketet. Medan standardpaketet har x86_64-arkitekturen, finns det också en för i686-chipsetet. Den här kommer att fungera på 32-bitars maskiner som fungerar med Intel-avbrottsstrukturen, men kom ihåg att termerna i686 och 32-bitar inte är ömsesidigt inkluderande hela tiden eftersom andra chipsets som Linux stöder faktiskt har sina egna 32-bitars implementeringar.

Användare som utforskar hela GNU / Linux-scenen kan stöta på binärer som har sammanställts för mycket mer exotiska teknologier än dessa. Linux är verkligen en kodplattform på flera plattformar, så du ser OpenRISC, MIPS, SPARC, M32R, MN103, ARM, ARC, Alpha och många andra standardbinarier sammanställs för att arbeta med. Mer än troligt kommer du inte att kunna köra någon av dessa, även om ARM är en extremt populär surfplatta och smartphone-plattform. Det är också plattformen som Raspberry Pi är baserad runt, vilket innebär att om du faktiskt kör Ubuntu på en mobil enhet eller Ubuntu MATE-distributionen för Raspberry Pi behöver du faktiskt dessa istället för Intel 32-bitars eller x86_64-binärer.

4 minuter läst