12

我正在将应用程序移植到 Linux 平台上的 64 位。该应用程序目前支持 Linux、Windows、Mac 32 位和 Windows 64 位。我们经常遇到的问题之一是将 long 用于 int,反之亦然。到目前为止,这不是问题,因为 long 和 int 在当前支持应用程序的平台中是可互换的(都是 4 个字节)。代码库是一个庞大的代码库,有许多带有#defines 的遗留代码用于许多数据类型,这使得搜索 long 的所有用法并用 int 适当地替换变得很麻烦。

  1. 作为短期解决方案,有没有办法让 GCC 使用 4 个字节而不是 8 个字节来表示“长”?
  2. 如果有,我们可能会面临哪些问题?如果没有,是否有更简单的方法来解决 long 和 int 问题?
4

3 回答 3

10

-m32生成 32 位代码。

-mx32生成 64 位代码,但使用 32 位长整数和指针。

Intel 386 和 AMD x86-64 选项

于 2012-10-09T07:22:00.840 回答
6
  1. 不会。在 Linux x86_64 上,ABI 指定 long 是 8 字节类型 (LP64)。事实上,大多数(如果不是全部)64 位 Unix 系统(包括 64 位 OS X、AFAIK)都是 LP64,所以这不是 Linux 特有的。

  2. 除了修复你的代码,没有。

如果您需要一个足够大的可移植整数类型来存储指针值,请使用 intptr_t 或 uintptr_t (但通常想要将指针值存储为整数意味着您做错了,所以三思而后行!)。对于能够表示两个指针之间差异的整数类型,请使用 ptrdiff_t。对于对象的大小,请使用 size_t。

于 2012-10-09T07:55:32.100 回答
3

这取决于“移植到 64 位”的含义。

  1. 您只希望您的应用程序在 64 位 linux 上运行:您可以在 32 位上编译它,它将在大多数提供 32 位库的发行版上以兼容模式运行。为此,您必须使用 32 位版本的 gcc(例如gcc:i386Ubuntu 上的包),或者使用-m32带有本地 gcc 版本的标志。

  2. 您想从处理器的长模式(又名 x86_64 架构)中受益,但仍使用大多数 32 位 C 约定(包括long int4 个字节):您可以通过使用 gcc 的标志来使用x32 ABI-mx32,这需要您的发行版允许它(必须在您的内核中启用支持,并且需要特定的库,例如在 中/libx32)。我使用的是 Ubuntu 16.04,这种模式工作得非常好,只是可用的预编译库要少得多。

  3. 您想完全使用 x86_64 架构和 ABI,但使用 4 个字节long:这是不可能的,因为 x86_64 ABI 需要long8 个字节。

于 2018-03-16T12:14:12.650 回答