1. 程式人生 > >為什麼Linux和Windows的可執行檔案不能通用?

為什麼Linux和Windows的可執行檔案不能通用?

主要的原因是格式不同API不同,前者更重要一些。

一個可執行的二進位制檔案包含的不僅僅是機器指令,還包括各種資料、程式執行資源,機器指令只是其中的一部分。

一個可執行檔案要被執行的時候,作業系統需要為其分配資源,這些資源包括:記憶體空間(物理的和虛擬的),程序、執行緒資源等等,其中可執行檔案的機器指令一般都放在程式碼段(組合語言裡稱之為text段),其它資源可能放到資料段以及其它段裡,這裡“段”(segment)可以大致的理解為一段記憶體範圍。作業系統(Windows/Linux)需要知道這個可執行檔案需要多大的記憶體,有多少個段,分別載入到哪些記憶體地址上。可執行檔案需要告訴作業系統,要為可執行檔案準備哪些東西它才能執行。

可執行檔案在執行之前,作業系統要有一些準備工作,因為不同的作業系統,準備工作是不同的,所以可執行檔案的格式不完全相同

。Windows上大部分可執行檔案為PE格式,Linux裡大部分可執行檔案為ELF格式。格式不同導致了不同的可執行檔案無法跨平臺直接使用。這是原因之一。

當然了,我見過網上有大神解決了一些格式不同的問題,但跨平臺執行還需要解決另一個障礙,就是作業系統API不同。一個可執行檔案所執行的絕大多數操作(比如:檔案操作、輸入輸出、記憶體申請釋放、任務排程等等)都需要與作業系統互動才能完成,而不同的作業系統使用這些操作的方法完全不同,所以這個障礙更難跨越。這是原因之二。

如果能解決以上兩個原因,那麼有些可執行檔案理論上是可以跨Windows和Linux在x86平臺上執行的,因為Intel和AMD的CPU裡,主要的硬體指令(機器指令)是相同的,也就是說0101這種二進位制數,是一樣的。但是如果切換到ARM平臺,會有更大的麻煩就是硬體指令也不同,那麼就完全沒辦法了。

有沒有可能有跨平臺執行的可執行檔案呢,理論上是存在的,過去的時候
也有一些辦法,但限制極多,比如Windows過去是支援COM格式的檔案的,這個檔案就沒有檔案頭,大小不能超過64K,只能在一個16位環境裡(真實的或者虛擬的)執行,是真正的裸二進位制檔案。Linux裡某些BIN檔案恰好也是裸二進位制檔案(有些BIN檔案沒有ELF頭,但不是所有的BIN都是這樣的)。經過一些配置以後BIN檔案也是可以在Linux上執行的。於是某些精巧設計的COM/BIN檔案可以在限制極多的情況下跨平臺執行,但也許只能做計算,無法做輸出,大小也只有64K大,並且如果要做稍微複雜點的操作,就需要兩套機器程式碼實現。另外,很不幸的是64位環境裡COM檔案已經不再支援了。


-----------------------------------------

最後,補充一句如果把所有驅動、應用庫等等都打包到一起,再突破格式的限制,那不就是一個作業系統嗎?跟裝雙系統就沒有什麼區別了。

相關推薦

linux,windows 執行檔案(ELF、PE)

很早記接觸這個縮寫英文了。它是什麼意思呢?要理解這個elf檔案是還是比較容易的,如果要掌握它就花點功夫。ELF (Executable And Linkable)UNIX類作業系統中普遍採用的目標檔案格式 。首先要知道它有什麼作用:工具介面標準委員會TIS已經將ELF作為執

將Matlab的M檔案轉為P檔案exe執行檔案達到加密效果

在matlab中如果你的程式碼很重要,需要加密,目前我查到了兩種方法:一、生成p檔案;二、生成.exe檔案 matlab生成p檔案的方法很簡單,在command wondow裡面用 pcode yourfile.m 命令可以將M檔案轉化為對應的pcode檔案yourfile.p,據說是不會被反編

軟體素材---linux C語言:linux下獲取執行檔案的絕對路徑--getcwd函式

      //標頭檔案:#include <unistd.h>     //定義函式:char * getcwd(char * buf, size_t size);    

將Python程式(.py)轉換為Windows執行檔案(.exe)

將Python程式(.py)轉換為Windows可執行檔案(.exe) python開發者向普通windows使用者分享程式,要給程式加圖形化的介面(EasyGUI 學習文件)(在前面的課程中目前只學習了最簡單的EasyGui,後面還會繼續學習 GUI的終極選擇:Tkinter,敬請期待),

Linux C的執行檔案結構以及程序結構

(公共部分):程式碼區,BSS區,資料區. 1.程式碼區:存放可執行的指令.順便規劃局部變數的相關資訊(??).   獨有性:一份指令在記憶體(不管虛擬記憶體還是實際)中只要有一份就可以的   只讀性:彙編指令包含 操作碼+運算元;一般操作碼是不可變的,但是運算元可

Linux下檢視執行檔案、動態庫的ELF頭等資訊

      用法: readelf <option(s)> elf-file(s)       作用: 和Windows下的PE檔案類似,ELF檔案是linux系統下可執行檔案、動態庫檔案、靜態庫檔案的標準格式。有時候我們需要檢視ELF檔案的頭資訊,或者動態庫檔

Linux】查詢執行檔案

一,whereis:檢視檔案的位置   用法:whereis [-bmsu] 檔案或者目錄名稱   引數說 明:  -b : 只找二進位制檔案  -m: 只找在說明檔案manual路徑下的檔案  -s : 只找source原始檔  -u : 沒有說明文件的檔案 

linuxwindows的文字檔案 換行格式轉換

        在基於雙系統平臺做開發時,我們經常需要將Linux下的文字檔案上傳到windows,或將windows下的文字檔案上傳到Linux,但是會出現亂碼和換行符的問題。這是因為Linux和Window下的文字檔案的編碼格式不同造成的。Windows中預設的檔案格式

Linux which --檢視執行檔案的位置

我們經常在linux要查詢某個檔案,但不知道放在哪裡了,可以使用下面的一些命令來搜尋:        which  檢視可執行檔案的位置。       whereis 檢視檔案的位置。        locate   配合資料庫檢視檔案位置。       find   實際搜尋硬碟查詢檔名稱。 which命

Python指令碼如何生成Windows執行檔案.exe

作者是   Python是一種簡單而強大的程式語言,適用於編寫指令碼,甚至於應用程式的開發。Python可用的各種GUI包使得利用Python編寫全功能的應用變為可能。這很好,但你有沒有想過將你編寫的Python指令碼轉化為可執行檔案?這似乎是一個很讚的主意,有許

linuxwindows執行緒的異同

linux多執行緒及執行緒同步和windows的多執行緒之間的異同 並不是所有的程式都必須採用多執行緒,有時候採用多執行緒效能還不如單執行緒。採用多執行緒的好處如下: (1)多執行緒之間採用相同的地址空間,共享大部分的資料,和多程序相比,代價比較節儉,而啟動新的程序必

Ubuntu16.04安裝Windows執行檔案(QQ.exe)

簡述 在Ubuntu系統下安裝常用Windows軟體(*.exe),本篇博文是安裝QQ(使用的是TIM 可以理解為輕聊版QQ),網上好多教程都是安裝國際版QQ或者是QQ2013,效果很差,有的根本無法正常使用,所以在次記錄安裝過程. 安裝wine wi

Linux/Unix平臺執行檔案格式分析

本文討論了 UNIX/LINUX 平臺下三種主要的可執行檔案格式:a.out(assembler and link editor output 彙編器和連結編輯器的輸出)、COFF(Common Object File Format 通用物件檔案格式)、ELF(Exe

重學計算機組成原理(七)- 程式無法同時在LinuxWindows執行

既然程式最終都被變成了一條條機器碼去執行,那為什麼同一個程式,在同一臺計算機上,在Linux下可以執行,而在Windows下卻不行呢? 反過來,Windows上的程式在Linux上也是一樣不能執行的 可是我們的CPU並沒有換掉,它應該可以識別同樣的指令呀!!! 如果你和我有同樣的疑問,那這一節,我們就一起

find命令,檔名字尾,linuxwindows互傳檔案

find命令 which ls 可以檢視ls命令路徑 which 是從環境變數PATH裡面搜尋 whereis ls 也可以搜尋

為什麼LinuxWindows執行檔案不能通用

主要的原因是格式不同和API不同,前者更重要一些。 一個可執行的二進位制檔案包含的不僅僅是機器指令,還包括各種資料、程式執行資源,機器指令只是其中的一部分。 一個可執行檔案要被執行的時候,作業系統需要為其分配資源,這些資源包括:記憶體空間(物理的和虛擬的),程序、執行緒資源等等,其中可執行檔案的機器指令

LCOW —— 單一Docker引擎下同時執行LinuxWindows容器啦!

本文來自微軟的技術專家Stefan Scherer,主要介紹了LCOW這一新功能將給Windows 10帶來哪些變化,這對基於Windows 10的開發、除錯都意義非凡。本文作者還結合具體的例項,為我們演示了這一系列變化帶來的諸多便利。

linuxWindows檔案不相容(shell指令碼執行錯誤 $'\r': command not found)

背景 將linux通過samba服務對映到windows平臺,在win平臺下建立一個指令碼,然後切換到linux下執行,報錯$’\r’: command not found。 原因 win平臺下的換行是:回車符 + 換行符,也就是\r\n。unix下是換行符\n。linux下

Golang 在windows下編譯Linux執行檔案

Golang 支援交叉編譯,在一個平臺上生成另一個平臺的可執行程式,最近使用了一下,非常好用,這裡備忘一下。 Windows 下編譯Linux 64位可執行程式 SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go

windows下設定QT程式的版本資訊、程式圖示執行檔案圖示

一.設定QT程式的版本資訊 windows下的可執行檔案的屬性中有版本這個資訊,她含有版本資訊,描述,版權等等。:新建***.rc檔案,編輯rc檔案的資訊如下: #if defined(UNDER_CE) #include <winbase.h> #else #