【问题标题】:Porting 64bit code to 32bit machine将 64 位代码移植到 32 位机器
【发布时间】:2013-06-21 16:08:55
【问题描述】:

我见过很多人询问从 32 位到 64 位机器的移植问题。但是将编写在 64 位上的代码移植到 32 位上不是很常见吗?我正在尝试在 C 中将插件从 64 位移植到 32 位,但在将 void * 存储到 64 位整数(反之亦然)的情况下面临类似问题。

在更改代码以使相同的代码在两台(i386 和 x86_64)机器上都可以工作时应该采取什么方法?我认为在 32 位机器上使用 uint64_t * 代替 32 位的 void* 没有意义?此类情况是否存在一些通用方法?

【问题讨论】:

  • 指针永远不应该存储在固定大小的整数中。如果您需要将指针存储为整数类型,正确的类型是uintptr_t,但您根本不应该将指针存储在整数对象中。

标签: c x86-64 porting i386


【解决方案1】:

指针不应该存储在固定大小的整数中。如果您需要以整数类型存储指针,正确的类型是uintptr_t,但您根本不应该将指针存储在整数对象中。 然而,使用太大的整数类型并没有真正的危害;它只会浪费一点内存。因此,如果在 uint64_t 中存储指针是您代码中的唯一问题,它应该可以正常编译为 32 位目标。

【讨论】:

  • 谢谢,所以如果uint64_t 被类型转换为void*,我们应该用uintprt_t 替换它,所有警告都应该消失,而不会对两种架构产生任何副作用。实际上在我的情况下,地址存储在整数中,因为稍后这些用于比较。
  • 代码应该按原样工作。我不确定您所说的“将其替换为uintptr_t,所以请澄清一下。
  • 最后,我可以通过将所有存储地址的整数替换为uintptr_t 代替uint64_t 来解决这个问题,并且在类型转换期间做了类似的事情。谢谢。
【解决方案2】:

如您所知,您可以使用一系列预处理器指令“#define”、“#ifdef”等为 32 位和 64 位架构编写一个源代码。您需要为 32 位和 64 位分别编译一次源代码。这可能是这样的。

test.c 示例代码

#ifdef ARCH_64
    typedef UINT unit64_t;
#else
    typedef UINT unit32_2;

UINT  *my_uint_ptr;

$ gcc -m32 test.c

$ gcc -m64 -DARCH_64 test.c

【讨论】:

  • 如果我们需要定义unsigned int,那么只需使用size_t就可以很容易地完成,编译器会根据架构自动正确地替换它。
  • 这是真的。我只是举一个例子来说明为 32 位和 64 位编写一个源代码并编译它的方式......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2010-12-01
  • 2011-04-03
  • 2014-12-05
  • 2011-01-31
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多