為什麼Linux和Windows的可執行檔案不能通用?
主要的原因是格式不同和API不同,前者更重要一些。
一個可執行的二進位制檔案包含的不僅僅是機器指令,還包括各種資料、程式執行資源,機器指令只是其中的一部分。
一個可執行檔案要被執行的時候,作業系統需要為其分配資源,這些資源包括:記憶體空間(物理的和虛擬的),程序、執行緒資源等等,其中可執行檔案的機器指令一般都放在程式碼段(組合語言裡稱之為text段),其它資源可能放到資料段以及其它段裡,這裡“段”(segment)可以大致的理解為一段記憶體範圍。作業系統(Windows/Linux)需要知道這個可執行檔案需要多大的記憶體,有多少個段,分別載入到哪些記憶體地址上。可執行檔案需要告訴作業系統,要為可執行檔案準備哪些東西它才能執行。
可執行檔案在執行之前,作業系統要有一些準備工作,因為不同的作業系統,準備工作是不同的,所以可執行檔案的格式不完全相同
當然了,我見過網上有大神解決了一些格式不同的問題,但跨平臺執行還需要解決另一個障礙,就是作業系統API不同。一個可執行檔案所執行的絕大多數操作(比如:檔案操作、輸入輸出、記憶體申請釋放、任務排程等等)都需要與作業系統互動才能完成,而不同的作業系統使用這些操作的方法完全不同,所以這個障礙更難跨越。這是原因之二。
如果能解決以上兩個原因,那麼有些可執行檔案理論上是可以跨Windows和Linux在x86平臺上執行的,因為Intel和AMD的CPU裡,主要的硬體指令(機器指令)是相同的,也就是說0101這種二進位制數,是一樣的。但是如果切換到ARM平臺,會有更大的麻煩就是硬體指令也不同,那麼就完全沒辦法了。
有沒有可能有跨平臺執行的可執行檔案呢,理論上是存在的,過去的時候
-----------------------------------------
最後,補充一句如果把所有驅動、應用庫等等都打包到一起,再突破格式的限制,那不就是一個作業系統嗎?跟裝雙系統就沒有什麼區別了。
相關推薦
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 : 沒有說明文件的檔案
linux和windows的文字檔案 換行格式轉換
在基於雙系統平臺做開發時,我們經常需要將Linux下的文字檔案上傳到windows,或將windows下的文字檔案上傳到Linux,但是會出現亂碼和換行符的問題。這是因為Linux和Window下的文字檔案的編碼格式不同造成的。Windows中預設的檔案格式
Linux which --檢視可執行檔案的位置
我們經常在linux要查詢某個檔案,但不知道放在哪裡了,可以使用下面的一些命令來搜尋: which 檢視可執行檔案的位置。 whereis 檢視檔案的位置。 locate 配合資料庫檢視檔案位置。 find 實際搜尋硬碟查詢檔名稱。 which命
Python指令碼如何生成Windows可執行檔案.exe
作者是 Python是一種簡單而強大的程式語言,適用於編寫指令碼,甚至於應用程式的開發。Python可用的各種GUI包使得利用Python編寫全功能的應用變為可能。這很好,但你有沒有想過將你編寫的Python指令碼轉化為可執行檔案?這似乎是一個很讚的主意,有許
linux和windows多執行緒的異同
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
重學計算機組成原理(七)- 程式無法同時在Linux和Windows下執行?
既然程式最終都被變成了一條條機器碼去執行,那為什麼同一個程式,在同一臺計算機上,在Linux下可以執行,而在Windows下卻不行呢? 反過來,Windows上的程式在Linux上也是一樣不能執行的 可是我們的CPU並沒有換掉,它應該可以識別同樣的指令呀!!! 如果你和我有同樣的疑問,那這一節,我們就一起
find命令,檔名字尾,linux和windows互傳檔案
find命令 which ls 可以檢視ls命令路徑 which 是從環境變數PATH裡面搜尋 whereis ls 也可以搜尋
為什麼Linux和Windows的可執行檔案不能通用?
主要的原因是格式不同和API不同,前者更重要一些。 一個可執行的二進位制檔案包含的不僅僅是機器指令,還包括各種資料、程式執行資源,機器指令只是其中的一部分。 一個可執行檔案要被執行的時候,作業系統需要為其分配資源,這些資源包括:記憶體空間(物理的和虛擬的),程序、執行緒資源等等,其中可執行檔案的機器指令
LCOW —— 單一Docker引擎下可同時執行Linux和Windows容器啦!
本文來自微軟的技術專家Stefan Scherer,主要介紹了LCOW這一新功能將給Windows 10帶來哪些變化,這對基於Windows 10的開發、除錯都意義非凡。本文作者還結合具體的例項,為我們演示了這一系列變化帶來的諸多便利。
linux和Windows檔案不相容(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 #