我正在尝试构建一个与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
幸运的是,我发现here gcc有一个选项-mx32
用于在x86_64机器上生成32位指针。但是,当试图使用它时,我收到一个错误说:
$ gcc -mx32 test.c -o test.e
cc1: error: unrecognized command line option "-mx32"
适用于gcc版本 4.4.3 和 4.7.0 20120120(实验性)。
为什么这个选项不起作用?有办法解决这个问题吗?
编辑:根据v4.4.7 manual,没有可用的-mx32选项,这一直属于v4.6.3。 OTOH,v4.7.0确实显示了这个选项,所以可能是我使用的Jan-20版本不是最终的版本?!
答案 0 :(得分:6)
不要这样做。首先,x32是一个独立的架构。它不仅仅是一个编译器开关。您需要链接到的每个库的x32版本才能使其正常工作。 Linux发行版尚未生成x32版本,因此这意味着您将静态链接或滚动自己的库环境。
更广泛地说:那只是在寻找麻烦。如果你的结构包含指针,那么它们应该是指针。如果它包含“32位地址”,则它们应该是32位整数类型。