日期:2014-05-16  浏览次数:20776 次

字节对齐 ARM VS Not ARM,经验人士请指点!!
#pragma pack指令在Linux下好使,但是交差编译在ARM板上运行没有效果。。。
如下代码在Linux打印出来是3,在ARM上打印出来是4
#pragma pack(push,1)
typedef struct _myHeader {
  u16 char2;
  unsigned char ch;
} MYHEADER;
#pragma pack(pop)

MYHEADER myheader1;
printf("size of myheader1 = %d\n", sizeof(myheader1));
请问应该怎么办?
1、是否有比pragma pack更强的指令?
2、arm-linux-gcc是否有什么可以设的?
谢谢指点!

------解决方案--------------------
gcc
-fpack-struct选项是取消字节对齐
------解决方案--------------------
这种make -c的编译方式要加编译选项你必须清楚KERNELDIR中Makefile的变量设置,如你要增加include选项可以

$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=../include

其实下面这个Makefile已经可以满足绝大部分的模块编译需要,主要是可以根据需要手动添加一些编译选项。
gcc -c -D__KERNEL__ -DMODULE -o fps200usb.ko fps200usb.c


另外有个疑问,楼主既然是交叉编译,也可以$(MAKE) -C $(KERNELDIR) M=$(PWD)这样编译么?那怎么指定交叉编译链?
------解决方案--------------------
ARM中如果想禁止对齐, 在结构声明的时候加上__packed
如:
__packed typedef struct _myHeader
{
...
...
}MYHEADER;

不过据说会影响性能.
------解决方案--------------------
gcc请在结构定义后用__attribute__ ((packed))
如果用-fpack-struct请注意一下gcc手册中的warning。