簡體   English   中英

將Linux 32位應用程序移植到64位?

[英]porting linux 32 bit app to 64 bit?

我要將非常大規模的應用程序移植到64位,我注意到在網上有一些文章顯示了這個移植的許多陷阱,我想知道是否有任何工具可以幫助移植到64位,意味着找到需要更改的代碼中的位置....也許啟用了警告的gcc ......它是否足夠好? 有更好的嗎 ?

編輯:伙計們我正在尋找一個工具,如果有任何可能是完整的編譯器,我知道GCC可以asist,但我懷疑它會找到所有不便攜的問題,
將在運行時發現....也許靜態代碼分析工具,強調移植到64位?

謝謝

是一個指南。 另一個

某些數據類型的大小在32位和64位操作系統中是不同的,因此請檢查代碼假定數據類型大小的位置。 例如,如果您正在轉換指向int的指針,則無法在64位中運行。 這應該解決大多數問題。

如果您的應用使用第三方庫,請確保它們也能使用64位。

一個好工具叫做grep ;-) do

grep -nH -e '\<int\>\|\<short\>\|\<long\>' *

並用適當的替換所有這些基本整數類型的所有裸使用:

  • 數組索引應為size_t
  • 指針強制轉換應該是uintptr_t
  • 指針差異應該是prtdiff_t
  • 假設寬度為N的類型應為uintN_t

等等,我可能忘記了一些。 那么帶有所有警告的gcc會告訴你。 你也可以使用clang作為編譯器,它提供了更多的診斷功能。

首先,為什么要“移植”?

考慮到大多數發行版在十多年內都快樂地提供了32位和64位變體。 因此,除非你以真正不可移植的方式編程(而且你幾乎要嘗試),你應該沒問題。

在64位操作系統中編譯項目怎么樣? gcc編譯器看起來像這樣的工具:)

以下是Oracle網頁的鏈接,該網頁討論了將32位應用程序移植到64位時常遇到的問題:

http://www.oracle.com/technetwork/server-storage/solaris/ilp32tolp64issues-137107.html

一節討論如何使用lint檢測一些常見錯誤。 這是該部分的副本:

使用lint實用程序檢測64位長和指針類型的問題使用lint檢查為32位和64位編譯環境編寫的代碼。 指定-errchk=longptr64選項以生成LP64警告。 還可以使用-errchk=longptr64標志來檢查對於長整數和指針大小為64位且普通整數大小為32位的環境的可移植性。 -errchk=longptr64標志檢查指針表達式和長整數表達式的賦值為純整數,即使使用顯式強制轉換也是如此。

使用-errchk=longptr64,signext選項查找代碼,其中正常的ISO C值保留規則允許在unsigned-integral類型的表達式中擴展有符號整數值的符號。 如果要檢查要在Solaris 64位SPARC或x86 64位環境中運行的代碼,請使用lint的-m64選項。

當lint生成警告時,它會打印違規代碼的行號,描述問題的消息以及是否涉及指針。 警告消息還指示所涉及數據類型的大小。 當您知道涉及指針並且知道數據類型的大小時,您可以找到特定的64位問題並避免32位和更小類型之間存在的預先存在的問題。

您可以通過在上一行放置“NOTE(LINTED())”形式的注釋來禁止給定代碼行的警告。 當您希望lint忽略某些代碼行(如強制轉換和賦值)時,這非常有用。 使用“NOTE(LINTED())”注釋時要特別小心,因為它可以掩蓋實際問題。 使用NOTE時,還包括#include。 有關更多信息,請參閱lint手冊頁。

暫無
暫無

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

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