繁体   English   中英

在64位Linux机器上的gcc中创建'long'4个字节

[英]Making 'long' 4 bytes in gcc on a 64-bit Linux machine

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

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

-m32生成32位代码。

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

Intel 386和AMD x86-64选项

  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。

这取决于你的意思是“移植到64位”。

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

  2. 您希望从处理器的长模式 (也称为x86_64体系结构)中受益,但仍然使用大多数32位C约定(包括4个字节的long int ):您可以使用gcc的-mx32标志来使用x32 ABI ,要求您的发行版允许它(必须在您的内核中启用支持,并且需要特定的库,例如/libx32 )。 我正在使用Ubuntu 16.04,这种模式工作得很好,除了可用的预编译库少得多。

  3. 您希望使用x86_64架构和ABI,但long为4个字节:这是不可能的,因为x86_64 ABI要求long为8个字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM