3

我正在尝试构建一个与 32 位嵌入式系统通信的程序,该程序在基于 Linux 的 x86_64 机器(主机)上运行。在主机程序上,我有一个包含一些指针的结构,这些指针反映了嵌入式系统上的相同结构。

问题是在主机上,指针本身是 64 位的,所以结构成员的偏移量与嵌入式系统中的不一样。因此,当复制结构(作为 memcpy)时,内容最终会出现在主机副本中的错误位置。

struct {
    float a;
    float b;
    float *p;
    float *q;
} mailbox;
// sizeof(mailbox) is 4*4=16 on the embedded, but 2*4+2*8=24 on the host

幸运的是,我在这里发现 gcc 有一个-mx32在 x86_64 机器上生成 32 位指针的选项。但是,当尝试使用它时,我收到一条错误消息:

$ gcc -mx32 test.c -o test.e
cc1: error: unrecognized command line option "-mx32"

这适用于 gcc 版本4.4.34.7.0 20120120 (experimental)

为什么这个选项不起作用?有没有解决的办法?

编辑:根据v4.4.7 手册,没有可用的 -mx32 选项,直到v4.6.3都是如此。OTOH,v4.7.0确实显示了该选项,所以我使用的 Jan-20 版本可能不是最终版本?!

4

2 回答 2

6

不要这样做。首先,x32 是一个独立的架构。它不仅仅是一个编译器开关。您需要链接到的每个库的 x32 版本才能完成这项工作。Linux 发行版还没有生产 x32 版本,这意味着您将要么静态链接,要么滚动您自己的库环境。

更广泛地说:那只是自找麻烦。如果您的结构包含指针,它们应该是指针。如果它包含“32 位地址”,它们应该是 32 位整数类型。

于 2012-06-03T14:40:08.380 回答
0

您可能需要更新版本的binutils

虽然我认为推荐使用gcc 4.8

但一般来说,你需要一个内核编译的 multilib:https ://unix.stackexchange.com/questions/121424/linux-and-x32-abi-how-to-use

于 2021-11-05T17:22:54.567 回答