【发布时间】:2012-06-07 06:58:00
【问题描述】:
我正在尝试构建一个与 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 版本可能不是最终版本?!
【问题讨论】:
-
如果您正在与不同的系统进行通信,那么使用带有指针的结构似乎是错误的方法,因为指针仅在通信链路的一侧有效,即使在这种情况下指针具有两个系统中的大小相同。或许您可以描述一下您的“大局”问题?
-
@CharlesBailey - 我没有使用主机端的指针来引用任何数据。我只需要嵌入式系统中引用对象的地址。我将这些地址(的值)用于主机大小的某些目的。
-
@CharlesBailey - 顺便说一句,如果主机最终将使用嵌入式主机处理器(在我的情况下是这样),例如带有外部数学加速器的 ARM cpu,它们都共享相同的内存空间, 那么使用地址可能对双方都有效。
-
您使用这些值的目的是什么?你能用索引或句柄值之类的东西来代替吗?
-
@CharlesBailey - 实际目的并不重要,是的,我最终用整数替换了指针。我想要这些指针的原因是这个结构是在一个与宿主项目和嵌入式项目相互关联的头文件中定义的——因为我不想跟踪两个问题参数(如矩阵大小)的变化地方。在嵌入式系统中,我想实际使用指针作为指针。如果编译器标志能够启用它会很好。在那之前,我会使用一些不太漂亮的代码。
标签: c pointers gcc 32bit-64bit x86-64