将Linux 32位应用程序移植到64位?

时间:2010-08-24 15:04:50

标签: c++ c linux 64-bit

我要将非常大规模的应用程序移植到64位, 我注意到在网上有一些文章显示 这个移植的许多陷阱, 我想知道是否有任何工具可以帮助移植到64位,这意味着 找到需要更改的代码中的位置....也许启用了警告的gcc ......是否足够好?还有什么更好的吗?

编辑:伙计们我正在寻找一个工具,如果有任何可能对编译器来说是完整的,       我知道GCC可以asist,但我怀疑它会找到所有不便携的问题       将在运行时发现....也许是强调的静态代码分析工具       移植到64位?

感谢

5 个答案:

答案 0 :(得分:4)

Here是指南。 Another one

某些数据类型的大小在32位和64位操作系统中是不同的,因此请检查代码假定数据类型大小的位置。例如,如果您正在转换指向int的指针,则无法在64位中运行。这应该解决大多数问题。

如果您的应用使用第三方库,请确保它们也能使用64位。

答案 1 :(得分:4)

一个好的工具称为grep ;-) do

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

并用适当的替换所有这些基本整数类型的所有裸使用:

  • 数组索引应为size_t
  • 指针强制转换应为uintptr_t
  • 指针差异应该是 prtdiff_t
  • 假设宽度为N的
  • 类型 应该是uintN_t
等等,我可能忘记了一些。 然后 gcc会发出所有警告,告诉您。您还可以使用clang作为编译器,它可以提供更多诊断。

答案 2 :(得分:1)

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

考虑到大多数发行版都为十多年提供了32位和64位变体。因此,除非你以真正不可移植的方式编程(而且你几乎要尝试),你应该没问题。

答案 3 :(得分:1)

如何在64位操作系统中编译项目? gcc编译器看起来像这样的工具:)

答案 4 :(得分:0)

以下是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手册页。