我正在尝试构建一个与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
幸运的是,我发现heregcc有一个选项
-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之前是正确的。噢,v4.7.0确实显示了这个选项,所以我使用的1月20日版本可能不是最终版本?啊!
最佳答案
别这样。首先,x32是一个独立的体系结构。它不仅仅是一个编译器开关。您需要链接到的每个库都有一个x32版本才能正常工作。linux发行版还没有生产x32版本,所以这意味着您要么静态链接,要么滚动自己的库环境。
更广泛地说:那只是自找麻烦。如果您的结构包含指针,它们应该是指针。如果它包含“32位地址”,它们应该是32位整数类型。