毕设的时候搞了这个课题,那么到底C代码从IA32到IA64移植到底有何需要修改之处呢?
[1] 首先明确一下我的IA64环境:
安腾2 + RedHat AS3 (64bit version)
[2] 其次是关于64bit的Linux: (64bit的windows使用P64模型)
64位的Linux使用了LP64模型,在这个模型下,long 和 指针(void*) 类型都要占64bit,
而int类型仍然保持在32bit。(而在32位下,这3个都占32bit)
[3] 具体的类型在IA64下所占的空间大小和对齐要求如下:
Type |
Size(byte) |
Alignment |
char |
1 |
1 |
short |
2 |
2 |
int |
4 |
4 |
long |
8 |
8 |
float |
4 |
4 |
double |
8 |
8 |
void * |
8 |
8 |
long long |
8 |
8 |
long double |
10 |
16 |
归根结底,代码移植过程中要注意的主要就是如下几点:(均是和IA32下对比来说)
a. long, int的长度不相同了。
b. void *, int的长度不相同了。
c. void *, long需要64位对齐。
因此在代码中将long或指针类型直接赋给int类型就不行了,会引起数据截断。
当然,在移植过程中还有其他很多要注意的问题,但是最主要的就是以上3点。
Btw: 强烈推荐使用icc编译源代码,它有一个-Wp64编译参数,可以检测代码中的32bit
到64bit的移植问题,并会给出相应的warning,这大大的提高了移植的效率。