為什麼 Linux 原生不能執行 exe 格式的檔案?

時間 2021-05-08 15:06:57

1樓:lemon

exe檔案是機器指令,不是彙編指令。exe檔案都是經過編譯連線之後的產物,經過彙編器已經是二進位制指令了。

因為exe檔案是windows下的可執行檔案PE格式,而linux下可執行檔案是ELF格式,首先格式都不一樣。其次程式執行可能需要共享庫,比如動態鏈結庫,在windows下是dll,在linux下是so,動態鏈結庫的格式也不一樣。然後windows和linux的系統呼叫api也不一樣。

如果可執行檔案可以直接跨平台,那還需要交叉編譯那麼麻煩幹嘛。

2樓:穆秋

說說我的非專業化的理解。

我理解的作業系統主要幹兩件事:

1管理硬體資源,對其做抽象,形成系統呼叫,供上層普通程式使用2 管理普通程式,合理的分配硬體資源供其使用,使其能安全有效的執行本質上來講,作業系統主要就是在做管理硬體資源的工作。程式要執行,肯定要使用硬體資源,而這些資源又是作業系統控制的(當然你也可以搞乙個跑在裸機上的普通程式,不過這個普通程式其實也不普通了,因為它要做和作業系統一樣的工作,即直接與硬體打交道),所以想要普通程式跑起來,肯定得經過作業系統這一關。

就好比一座不錯的花園小區,你想進去看看景觀,或者想借用下裡面的廁所,得先經過保安這一關,假如你手裡拿著保安室之前約定好的elf格式的小區出入證,那麼保安檢查一下就把你放進去了,假如你自己胡亂整了乙個pe格式的出入證,保安自然是不會把你放進去的

3樓:「已登出」

其實最根本原因是可執行檔案檔案格式不同。相當於你office寫了乙個word,然後要去用記事本開啟。

雖然他們都是文件編輯工具,但是記事本並不懂得怎麼解析你寫的word. 如此而已。

linux的 loader和windows不一樣,他們都會檢查可執行檔案中的某個特殊字段,在linux中是magic number,windows我不知道。發現如果不是自己所規定的,就拒絕載入。

4樓:lanccd

庫檔案都不一樣,沒法玩的。Linux各種so檔案。windows各種dll。

當然如果解釋和翻譯了是可以。。。。。以嵌入式為栗子。你用glibc搞出的東西也沒法跑在uclibc的環境下。

5樓:panda

執行可執行檔案的本質是作業系統解析可執行檔案,根據它初始化程序資訊,並將可執行檔案中的各個部分裝載到記憶體,windows的exe是pe-coff檔案格式,linux支援的是elf檔案格式,檔案格式不同,導致程式資訊結構,linux的裝載器沒有做對pe-coff檔案格式的支援的話,自然無法正常解析。

emmm,看到標題就直接寫了,沒有仔細看提問,現在補充一下。

windows和linux對系統呼叫的實現機制不同,假設你在windows下call系統呼叫是通過int 0x21,在linux下就可能是int 0x80,因此無法直接使用。另外,os通常根據暫存器的值來確定要呼叫哪個系統呼叫,不同的os實現依然可以不同。

6樓:「已登出」

簡單來說,因為windows下編譯的exe呼叫了很多windows的庫,這些庫linux下沒有啊,linux有的是自有的,和windows同功能的一套。

要讓linux執行windows的exe,1、把庫打包到linux下,讓linux支援介面2、用linux下的api,寫出和windows這些庫介面一模一樣,能直接被win下exe呼叫的庫

3、讓exe基本上把整個windows系統本身給吃下去,還得讓它在linux下跑起來(自帶虛擬機器,以及和linux的通訊介面,如windows的linux子系統)

7樓:

這其實涉及到乙個類哲學問題,就是作業系統是什麼。

對exe來說,作業系統其實就是一堆函式(api),每個函式都可以通過指定的位置或者表找到。

但你把乙個作業系統的可執行檔案丟到另乙個下,就算排除了格式差異,跑起來了,還是會發生悲劇,可執行檔案裡想呼叫的函式不在原來的地方,甚至根本沒有,於是exe就罷工了。

所以,本質上作業系統其實是乙個規範,它定義了它支援的功能以及這些功能函式的入口在那裡,你相容這個規範就能跑。

8樓:紳士喵

PE 格式的 EXE 檔案在 Linux 下壓根無法進入到最初級的裝載步驟,何來的執行呢?系統 API 不同,動態鏈結失敗,這都是進入裝載之後的事情了。是「可執行」但「無法成功執行」的狀態。

跟「不能執行」還是有區別的。前者在不同 Linux 系統之間都會產生,不是 Linux 執行不了 Windows 程式的本質原因。

很簡單就能理解,你會強迫乙個美中國人讀中文書籍嗎?會用瀏覽器開啟 Office 的文件嗎?

有兩點需要指出來:

PE 和 ELF 格式的結構是相近的,因為它們都源自於共同的祖先「COFF」。但這不表示兩個系統之間的可執行二進位制就互相相容

Linux 仍然保持對 COFF 格式的支援,COFF 可以直接轉換成 ELF。但是對 PE 格式沒有支援

如果核心能支援 PE 了,但是執行不了 EXE 程式,才會是更多的上層原因。

假設你將乙個 x86 的 EXE 程式放在 arm 的 Windows 中執行,系統表示我識別到不支援這個架構,不能執行。

假設你將乙個 x86 的 EXE 程式放在即便同樣 x86 的 Linux 中執行,系統表示這是啥玩意?你強行讓我執行我也不懂怎麼執行啊!

9樓:山楂樹下

windows系統是根據檔案的字尾名來區分檔案的。.exe結尾的檔案是在windows系統上可以直接執行的檔案,也就是可執行檔案;

在linux系統上,一切皆檔案,不區分檔案的字尾。

總之,就是檔案的格式不正確。

10樓:

PE和ELF分別是 Windows和Linux下的可執行檔案標準,標準不一樣自然是不能相容的。

也沒有必要舉男人不能生孩子或者山東人聽不同溫州話的例子,推薦題主去看一本 《程式設計師的自我修養》這本書,工程標準,也沒什麼複雜的,如果能理解這本書,也算是有程式設計師的自我修養了。

11樓:林魚兒

同樣是漢語,為啥山東人聽不懂溫州話?同樣是人,為啥正常人無法理解自閉症的世界?同樣是人,為啥男人不能生孩子?細節差大了。

12樓:

wine 沒用過麼?

linux裡打CS,多麼愜意的一件事情。

原理上需要科普的東西就太多了。

首先PE和ELF檔案的結構就不同。雖然很可能有相同的原始碼【如果依賴系統API,就不行啦。】,但是因為編譯器不同,生成的檔案結構也完全不同。

這裡我就要推一下Golang。一套原始碼,arm linux windows 全相容。嗯就很棒!

13樓:

當然可以,舉個例子,ndis on freebsd,雖然不是exehttps://

svnweb.freebsd.org/base/head/sys/compat/ndis/

14樓:白彬

退一萬步講,就算Linux能「認識」這個.exe檔案,可也會因為這個.exe檔案呼叫的系統API是Windows的,而Linux裡沒有,從而基本無法執行。

15樓:傑林修

先問是不是,再問為什麼……

特別是看到有些回答下面說.net不行的,簡直強答。

撇開wine這種模擬的,其實最早可以在 linux下執行的exe檔案,是基於當時的.net的開源環境mono編譯出來的。

讓我們看看他在debian下的包資訊

f-spot_0.8.2-5_amd64.deb Debian 7 Download

很明顯的能看到,可執行檔名為

/usr/lib/f-spot/f-spot.exe還帶著一堆dll檔案。

當年一堆不喜歡mono的人的口號也是不喜歡在linux裡看到exe和dll。

16樓:Xi Yang

exe裡面存放的不是彙編指令嗎?

exe裡有彙編指令,不等於exe沒有結構、只有裸的彙編指令。詳見PE、ELF格式的詳細資料。

如果是彙編指令的話 x86下Windows編譯的EXE 為什麼不能在 x86下的Linux上執行?還是說Windows其實是乙個大的虛擬機器

電腦的大量基礎功能是由作業系統管控的,你必須經由作業系統才能使用這些功能,而不同系統的介面顯然不一樣。程式已經編譯成了使用這個系統的介面,在另乙個系統上顯然根本不存在那些介面。詳見wine、cygwin、msys、windows linux subsystem這些提供了假環境的玩意。

另外,虛擬機器不等於指令級虛擬。你在x86上跑個x86的虛擬機器,特別是對於支援虛擬化的CPU,通常都是不需要任何轉譯的。

17樓:switwitch

第乙個問題,.net之前的exe。Windows和Linux標準不一樣個,庫不一樣,指令呼叫不一樣所以沒辦法原生執行。

第二個問題,是的Windows就是乙個大虛擬機器,這個虛擬機器叫NT。主要負責把.net和底層連線到一起。編譯好的程式是NT的彙編,NT負責部署給硬體處理。

18樓:徐聖

exe裡面存放的不是彙編指令嗎?

不是彙編指令,是二進位制指令,但是不僅僅只有指令,還包括各種控制資訊,以協助exe載入執行。如果儲存彙編指令,那就不是可執行程式了,將是彙編原始碼。

x86下Windows編譯的EXE 為什麼不能在 x86下的Linux上執行?

linux繼承了unix的ELF(Executable and Linkable Format)物件檔案的格式;windows採用自己獨有的exe(PE)格式,兩種格式都是系統緊耦合的,即exe的格式,linux無法解析載入執行;ELF格式window也不相容。兩家各自玩各自的格式。

還是說Windows其實是乙個大的虛擬機器負責解釋EXE 如果是這樣的話為什麼不直接把EXE推給CPU執行?

window自身不是虛擬機器,它是作業系統。不要和虛擬機器混淆。只不過有兩種安裝方式,一種直接安裝到硬碟上並新增引導分割槽裡了,這也是最常見的開機加電就啟動系統的方式。

另外一種,通過VM安裝的虛擬windows,即通過Vm軟體虛擬出乙個計算機。不過可以忽略這個區別。因為對與使用者你來講,它都是乙個可用的window系統,和window系統直接跑在硬體上還是間接跑在硬體上都和window怎麼載入執行exe無關。

如果非要鑽個牛角尖的話,虛擬機器上的windows可能跑起來會有點卡頓的現象。

為什麼不直接推給CPU,這個問題可大可小,大的講的話,需要把程序管理拉進來,對於初學者聽不懂。還是從小的給個概念原因吧,因為作業系統要全權管理程式的執行。這個執行不是指CPU指令的執行,而是管理程式怎麼開始執行,何時執行,執行多久,如何結束執行,以及資源(記憶體,頁表,CPU)如何分配和釋放等等。

換言之,不能讓程式成為乙個奔放的Mustang,上路了一直狂奔;作業系統需要給Mustang上了韁繩,聽從人的命令,有條不紊的奔向目的地。

解釋執行不浪費效能嗎?

lz好像是把程式的執行理解成解釋。其實不是,專業的講,換成解析可能更好一些。即解析exe中的命令到記憶體中,然後cpu從記憶體中逐條執行命令。

程式語言可以分為編譯型和解釋型,不擴充套件了。

linux為什麼不能硬鏈結目錄?

悟覓 儘管支援目錄硬鏈結不是乙個容易的事情,然而NTFS能夠正確處理檔案與資料夾硬鏈結,管理員用好這項功能可大幅減少重複檔案,讓不同的應用在各自的工作目錄下,而不用維護複雜的跨目錄管理。 hitshouge 徐三響同學的例子一可以說是完美解決這個問題了。但我引申出了乙個問題。很多人都提到一點.和.都...

Linux為什麼不能做到Mac OS那樣漂亮流暢的介面

揚之水 我今天花了九牛二虎之力把centos系統的圖形化介面換成了命令列模式,更醜了,但既然用了Linux又有什麼在意的呢?長哪樣還不是用cd切換目錄,用vi萬能編輯。 isAutodidact Linux 會讓你深刻體會到市場的高效,因為Linux不是市場經濟。說實話,自從vscode remot...

為什麼Linux耗電?

eechen Intel的Linux工程師開發有PowerTop這個工具可以檢視Linux耗電程式排行。Android在設定電量裡也有耗電應用排行。 flyer punk xiaomi pro 13 之前用win10 home版,電腦還有點溫度,換了linux,直接是冰的,感覺Linux很省電,都不...