2011-04-19 237 views
13

我有一個編譯爲32位的共享庫。我可以在64位應用程序中使用它,還是需要將共享庫編譯爲64位?從64位應用程序加載32位共享庫?

+1

什麼操作系統?這可能很重要。 – 2011-04-19 18:29:06

+0

Windows 7和Red Hat Linux。 – Brian 2011-04-19 18:30:56

+1

@保羅:實際上應該沒關係。假定x86-64,處理器在任何給定點處於長模式(64位),保護模式(32位)或實模式(16位)。當一個線程被調度時,該模式被設置爲匹配只能是其中之一的進程。這是x86/x86-64如何工作的核心問題。 – 2011-04-19 19:07:37

回答

13

不,您無法通過常規方式在64位應用程序中加載32位庫。

這裏有一些聰明的黑客,比如有一個32位應用程序加載庫並通過IPC接口導出函數,但是如果您有選擇將庫編譯爲64位,那麼這是是迄今爲止最好的選擇。

+0

您提到的這個巧妙的破解仍然在32位進程中加載​​DLL。你是否知道這些在64位進程中加載​​32位DLL的黑客? – 2011-04-19 21:06:46

+1

@約翰:沒有什麼可行的。你當然可以做一些事情,比如在你的進程中分配內存,並手動讀取32位dll中的二進制代碼。但處理器會將其視爲無法正常運行的64位指令。它不能用x86-64/x86架構完成。 – 2011-04-19 21:20:23

5

無法從64位應用程序動態或靜態加載32位庫,反之亦然。

有許多變通的,我知道的:

  1. 充分利用DLL的64位版本
  2. 使該應用程序的32位版本
  3. 介紹一COM代理對象(也稱爲代理)作爲通信中介。 Described here
  4. 主機的DLL在一個單獨的(32位)和EXE使用IPC技術

有許多的進程間通信(IPC)的技術。這裏有幾個例子:

+2

+1,儘管IPC技術列表中缺少共享內存,共享文件,數據庫表,RFC,COM和視頻屏幕戳);換句話說:我建議「有一些進程間通信IPC)技術:「您添加了」其中一些是:「短語。 – TheBlastOne 2012-10-17 16:02:30

相關問題