簡體   English   中英

Visual Studio - 在64位項目中編譯32位代碼

[英]Visual Studio - Compiling 32-bit code inside 64-bit project

所以直截了當地問我:如何用32位ASM編譯器編譯我的ASM文件,將它包含在我的64位項目中並使用ASM文件的函數名訪問編譯后的代碼?

如果有點不清楚,我可以詳細說明:

我正在將我的一個項目從32位轉換為64位,我遇到了技術問題。 我的項目編譯ASM文件並使用編譯的二進制文件作為其用法的輸入。

當我的項目是32位時,它很容易。 我在項目中包含了ASM文件,並添加了一個構建規則,用Microsoft Macro Assembler編譯它們 - 然后我可以通過將我想要從ASM訪問的每個函數導出到.h頭,從我的32位項目訪問編譯代碼文件並使用函數名稱訪問它(我能夠這樣做,因為它被編譯為obj,鏈接器知道符號,因為我將原型導出到.h文件)。

現在,我需要將此代碼轉換為64位,但我仍然需要將ASM編譯為32位代碼,並且仍然可以執行相同的操作(從我的64位程序訪問已編譯的32位代碼) )。 但是,當我嘗試編譯它時,它顯然無法識別指令,因為現在整個項目被編譯為64位代碼。

提前致謝。

如果我試圖在64位程序中嵌入32位代碼(這是一個可疑的事情,但是為了論證的緣故,我們說你有充分的理由並且實際上知道你正在對結果做什么) - 我將使用32位代碼,無論是用C語言編寫,匯編還是其他東西 - 並將其編譯為單獨的項目,生成DLL作為輸出。 這在編譯鏈中沒有任何額外的怪異:它只是一個普通的32位DLL。

然后,可以將32位DLL作為二進制資源嵌入到64位應用程序中 - 只需要加載和訪問的內存塊即可。

那么你如何才能真正對該DLL中的編譯代碼做任何事情呢? 我會使用一個有點被黑客攻擊的Joachim Bauch的MemoryModule庫來訪問它。 MemoryModule旨在從大量內存中加載DLL並提供對其導出的訪問 - 它就像Windows API的LoadLibrary() ,僅來自內存而不是文件。 它被設計為與調用進程相同的位大小,但有一點hackery,你可以使它編譯為64位庫,但能夠讀取32位庫。 由此產生的用法非常簡單:

// Load the embedded DLL first from the current module.
hresource = FindResource(hmodule, "MyLibrary.DLL", "binary");
hglobal = LoadResource(hmodule, hresource);
data = LockResource(hglobal);
size = SizeofResource(hmodule, hresource);

// Turn the raw buffer into a "library".
libraryHandle = MemoryLoadLibrary(data, size);

// Get a pointer to some export within it.
myFunction = MemoryGetProcAddress(libraryHandle, "myFunction");

也就是說,正如我之前提到的(以及其他人也提到過),即使你可以獲得指向導出的指針,你也無法調用它們,因為代碼是32位的,甚至可能都沒有加載到存在於4GB標記以下的地址。 但是如果你真的想在64位應用程序中嵌入32位代碼,我就是這樣做的。

暫無
暫無

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

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