是否正确实现了-mx32 GCC标志?

ysa*_*sap 3 c gcc pointers x86-64 32bit-64bit

我正在尝试构建一个与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
Run Code Online (Sandbox Code Playgroud)

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

$ gcc -mx32 test.c -o test.e
cc1: error: unrecognized command line option "-mx32"
Run Code Online (Sandbox Code Playgroud)

这适用于gcc版本4.4.34.7.0 20120120(实验性).

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

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

And*_*oss 6

不要这样做.首先,x32是一个独立的架构.它不仅仅是一个编译器开关.您需要链接到的每个库的x32版本才能使其正常工作.Linux发行版尚未生成x32版本,因此这意味着您将静态链接或滚动自己的库环境.

更广泛地说:那只是在寻找麻烦.如果你的结构包含指针,那么它们应该是指针.如果它包含"32位地址",则它们应该是32位整数类型.