2010-07-01 31 views
1

假設所有32位庫都存在,似乎大多數32位應用程序都將在64位Linux上運行。但在我看來,可能存在與架構相關的功能問題,在這裏我正在考慮信號和setjmp/longjmp。我想知道是否有經驗豐富的人可以評論哪些功能(如果有的話)會導致32位應用程序與64位操作系統不兼容。什麼可以使32位應用程序與64位Linux操作系統不兼容?

回答

6

即使setjmplongjmp也應該正常工作。用戶空間應用程序沒有特別的問題,這會引發任何問題。實際的32位仿真是由處理器完成的。系統調用是返回到64位內核的接口,Linux正確處理該內核。

如果應用程序是惡意的,並將可執行代碼發送到另一個64位進程來執行,那麼各種事情都會中斷。

3

對於在64位系統上運行的32位應用程序,最大的問題是程序員錯誤地對整數或指針長度做出假設,然後用它們做非可移植的事情。對於C/C++程序員在this article中考慮的問題有很好的綜述,例如Sun

+0

我見過很多很多項目,當爲x64編譯時,僅僅因爲這個問題就會產生數百甚至數千的警告。這包括最近的項目,所以沒有任何藉口像'是的,但當時沒有64位' – stijn 2010-07-01 18:49:36

+1

當你想重新編譯64位體系結構的32位應用程序時,這些問題。但我在問一個已經用32位編譯器編譯的應用程序。編譯器當然已經對指針大小做出了假設!據我瞭解,這是由64位操作系統來適當處理一個32位應用程序。 – 2010-07-01 18:50:01

+0

你說得對。當然,當編寫傳統的32位應用程序時,他們不會知道它們可能會在以後運行在64位系統上。通過其鏈接器/加載程序(例如ld.so或ld.linux.so)的64位操作系統必須將地址重新映射到其64位進程地址空間,以使其正常運行。如果32位應用程序寫得很好(按照文章),那麼一切都應該繼續。 – bjg 2010-07-01 19:02:29

1

如果Linux編譯時沒有32位傳統支持,32位程序將無法正常工作。

+0

正如我所說,假設所有的32位庫都存在,這意味着內核也是用32位支持構建的:-) – 2010-07-01 19:11:28

0

我們以32位應用程序爲例,它有一個主模塊並加載一個32位相關的dll。如果您正在遷移主模塊以及32位相關DLL,該應用程序在64位計算機上運行良好。但是,如果只遷移主模塊,即使存在,也不能從64位機器加載依賴64位的dll。 的原因是 -

  1. 在數據存儲器的不同取向在數據類型大小

  2. 差異

請參閱:

http://dev-faqs.blogspot.com/2008/03/accessing-32-bit-dlls-from-64-bit-code_02.html

http://dnjonline.com/article.aspx?ID=jun07_access3264

也許這是你在找什麼!

1

有真的只有兩個,與在64位Linux上運行32個應用程序的出現,假設你有必要的32位庫的問題:

  • 一些ioctl() S代表較少使用的驅動程序無法正常工作時,在64位內核上由32位用戶進程使用;

  • 應用已經硬編碼/usr/lib和/或/lib路徑搜索,如果32個庫位於其他地方的動態庫將無法正常工作。

相關問題