当前位置: 技术问答>linux和unix
字节对齐 ARM VS Not ARM,经验人士请指点!!
来源: 互联网 发布时间:2016-02-08
本文导语: #pragma pack指令在Linux下好使,但是交差编译在ARM板上运行没有效果。。。 如下代码在Linux打印出来是3,在ARM上打印出来是4 #pragma pack(push,1) typedef struct _myHeader { u16 char2; unsigned char ch; } MYHEADER; #pragma pack(pop)...
#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 = %dn", sizeof(myheader1));
请问应该怎么办?
1、是否有比pragma pack更强的指令?
2、arm-linux-gcc是否有什么可以设的?
谢谢指点!
如下代码在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 = %dn", sizeof(myheader1));
请问应该怎么办?
1、是否有比pragma pack更强的指令?
2、arm-linux-gcc是否有什么可以设的?
谢谢指点!
|
gcc
-fpack-struct选项是取消字节对齐
-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)这样编译么?那怎么指定交叉编译链?
$(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;
不过据说会影响性能.
如:
__packed typedef struct _myHeader
{
...
...
}MYHEADER;
不过据说会影响性能.
|
gcc请在结构定义后用__attribute__ ((packed))
如果用-fpack-struct请注意一下gcc手册中的warning。
如果用-fpack-struct请注意一下gcc手册中的warning。