繁体   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