2011-09-03 93 views
1

我在Windows上覆制函數的機器代碼。從windows可執行文件複製機器代碼並在linux上運行

例如:

void func() 
{ 
    printf("hello"); 
} 

在上述情況下,我想複製func()的十六進制代碼段的數據和printf()的十六進制代碼數據加上其他依賴關係和數據,並重新連接它在不同的充機中運行的Linux ,如果重新鏈接正確,是否可以在Linux機器上運行代碼?

如果是這樣會有一個授權問題? (是否合法?)

P.S.這個問題涉及分佈式系統問題。

+0

可能不是。當你觸摸OS API調用時(例如輸出到屏幕上,除非C編譯器正在使用BIOS或直接硬件寫入,這是行不通的。 –

+2

這個問題無法回答......那麼處理器架構呢?函數是特別的意思(因爲許可是個案評估)?你的目標是什麼???? – Yahia

+0

如果是Windows,最可能的CPU是x86或x86-64 – osgx

回答

1

這是一個非常模糊/無法解決的問題,但這將是非常困難的,如果不是不可能的話。你有一些需要解決的困難。也就是說,可執行格式(Linux上的ELF,Windows上的PE),系統/編譯器之間的調用約定等。

我能想到的最大問題是,Linux和Windows之間的文件處理是非常不同的。最好的辦法不是複製printf(),而是將該調用重定向到Windows實現,因爲在所有庫函數工作之後,低級寫入控制檯是非常不同的。

+0

這是非常困難的,但它是真實的,有一個Wine和一個CrossOver辦公室,它們可以在Linux上運行Windows的PE, – osgx

+1

另外它也可能是相反的,我正在開發一個3D引擎,90%的代碼是OS所以如果你在引擎框架中編譯這樣一個模塊,那麼給定的CPU架構下,每個操作系統的結果代碼都是一樣的,所以我繼續寫了一個跨平臺的ELF加載器/鏈接器。編譯獨立於操作系統的部件只有一次這也意味着,由於引擎的操作系統接口部分是目標應用程序獨立的,因此該遊戲引擎的應用程序可以在引擎支持的任何操作系統上運行。 – datenwolf

+0

thnx喬納森...和其他人的幫助... 但假設它是一個Windows機器,而不是一個Linux的 那麼它將有可能使用Windows機器的printf和其他文件功能......但如何我會重新鏈接十六進制代碼以在另一臺機器上正確執行......即,對c函數printf的調用現在可能會指向不同的內存位置 –

6

有一個wine program (and project)這不是一個模擬器。它會從Windows中獲取exe文件並直接在Linux中運行它。大多數使用的WinAPI將被轉換爲Linux和X11圖形系統。

如果你只想在linux下運行windows下的exe文件 - 這將是答案。如果你想知道如何做到這一點,你可以閱讀葡萄酒和/或葡萄酒和/或文檔的來源及其設計。或者在郵件列表中詢問葡萄酒的作者。

相關問題