簡體   English   中英

給定正確的運行時庫,x86可執行文件可以在任何x86平台上運行嗎?

[英]Can an x86 executable run on any x86 platform given the right runtime libraries?

盡管我確實找到了類似問題,但他們並沒有真正回答這個具體問題。

給定正確的運行時庫,可以在任何x86平台上運行已編譯的x86可執行文件嗎? 假設我制作了一個沒有依賴關系的C ++ 17程序,是否可以在Windows 95上運行該程序,或者操作系統是否需要某種支持?

我還聽說可能並非到處都支持RTTI(對於C ++),這僅僅是由於處理器必須支持此功能,還是操作系統在其中起作用? 這意味着例如Windows 95可能不支持新功能。

編輯

我要做的是,可執行文件(例如x86)是否可以在支持該指令集的任何平台上運行,還是某些功能(如RTTI)需要特定的OS支持,因此並非在所有支持該指令集的平台上都可用。

一般來說,你不能 ,即使你限制你的宇宙x86硬件-至少在沒有二進制或某些特定於平台的“加載”為每個目標平台的一些轉換。

例如,由C或C ++編譯器1發出的典型二進制文件將對OS和運行時具有一些最小的依賴性,例如,在可執行文件上加載和進行運行時鏈接。 不同的平台具有不同的二進制格式(例如Windows上的PE / COFF或跨各種UNIX和Linux的ELF ),並且沒有任何通用的“ x86格式”可直接在任何平台上運行。

此外,任何不平凡的程序,並且在許多情況下, 無論是否平凡, 任何程序都將對語言運行時具有特定於平台的依賴性。 例如,即使一個空的main()函數通常也需要運行時支持才能從OS定義的“ start”方法轉換為main方法,並且在沒有異常構建選項的情況下,經常會在啟動時調用以初始化標准庫的某些部分。

最后,正如您對RTTI的評論所暗示的那樣,各種語言或平台功能本質上都可以編譯為二進制文件並需要OS支持。 RTTI可能顯然不屬於此類,但是諸如位置無關的代碼,線程本地存儲和對異常處理的堆棧展開支持之類的事情通常都可以做到。 在不同平台上,使用此類功能的已編譯x86代碼可能會大不相同 ,因為它需要以這些功能如何工作的假設為基礎。

但是,原則上,您可以想象至少在某些有限的程序子集中,此工作有效。 例如,盡管各種可執行文件格式實際上是不兼容的,但它們並沒有什么不同,並且存在在它們之間轉換的工具 因此,您當然可以在所需的平台上實現最少的運行時,該運行時將x86可執行文件編譯為您選擇的任何固定格式,並在運行時將其轉換為本地格式並運行它。

除此之外,實際嘗試映射標准庫調用也非常困難,因為不同的操作系統使用不同的調用約定 ,但是使用某些重擊程序的“ C”函數可能會將內容放置在正確的位置。 C ++幾乎是正確的,因為ABI有很多更復雜的,特定於編譯器和平台的內容,並且許多實現細節已經針對頭文件中實現的內容進行了編譯。

實際上,x86(的其中一個子集)可能提供一種有趣的中間語言以進行跨平台執行的想法正是Google的[NaCl項目]中所利用的想法。 本質上,NaCl運行時提供了與平台無關的“加載”功能,該功能使x86代碼或多或少可以在各種平台上本地運行。 隨后,添加了其他本機格式,例如ARM,但它最初是x86沙箱。 該項目的很大一部分涉及運行代碼,這些代碼被證明是安全的(即沙盒)-但是它表明,使用某些基礎結構,您可以編寫“便攜式” x86。 但是,標准的C或C ++編譯器不會直接發出與NaCl兼容的代碼。


1確實, 任何編譯成本機格式的編譯器。 我只是稱呼C和C ++,因為它們看起來像您感興趣並且熟悉的對象。

這個問題錯了重點。 首先,C ++是描述計算機程序行為的語言。

使用編譯器創建本機二進制可執行文件以在實際計算機上產生該行為是使用該語言的典型方法。

一旦有了二進制文件,用於生成它的源代碼的所有痕跡都將消失(除非您已出於調試目的而構建了特殊版本)。 二進制文件與特定硬件或操作系統的兼容性超出了C ++本身的范圍。

對於C或通常被編譯為本機二進制代碼的任何其他編程語言,情況也是如此。

或者,更簡單地回答這個問題:

給定正確的運行時庫,可以在任何地方運行已編譯的C ++ / C代碼(即可執行文件)嗎?

沒有。

給定正確的運行時庫,可以在任何地方運行已編譯的x86可執行文件嗎?

不,它只能在x86硬件或模擬x86指令集(例如x64 CPU)的其他硬件(或軟件,例如虛擬機)上運行。 實際上,這很可能與“任何地方”相去甚遠。

即使硬件匹配,x86可執行文件也將具有操作系統依賴性。 即使硬件相同,Windows二進制文件也無法在Linux上運行。 在某些情況下,有多種策略可以使諸如此類的事情“起作用”,Microsoft的Windows Linux子系統就是一個最近的示例,該示例允許Linux二進制文件在Windows上不變地運行。 再說一次,“隨處可見”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM