织梦CMS - 轻松建站从此开始!

罗索

关于32位平台到64位平台的移植

罗索客 发布于 2007-10-09 17:06 点击:次 
现在我要做在将程序从32位的redhat as4到64位的HP unix上的移植,大家随便聊聊都有哪些要注意的地方,集思广益,帮助我好好完成这个工作,在这里感谢了:):) 期待大家的讨论 感谢大家的帮助 ------------------------------------------------------------------- --我
TAG:

现在我要做在将程序从32位的redhat as4到64位的HP unix上的移植,大家随便聊聊都有哪些要注意的地方,集思广益,帮助我好好完成这个工作,在这里感谢了:):)

期待大家的讨论 感谢大家的帮助

-------------------------------------------------------------------
--我是可爱的分割线
-------------------------------------------------------------------
-->
最大的问题就是看看源代码中的数据类型是否有问题,

ILP32到LP64,那么主要就是看L和P了

关于32位平台到64位平台的移植

其实总的说来就是数据类型的长度问题,细说的话要注意以下几个方面

a ) int func();
b ) return val;
c ) void func( int val );
d ) (const void*)&val..
e ) struct stat st;

a) 和 b) : 在函数的定义返回值时要注意此返回值是否会作复值或者类型转换,如果返回值不当会引起数据截断
c) : 函数的参数定义时,要注意在函数外部传递参数和在内部使用参数时会不会有类型转换之类的引起错误的地方
d) : 在强制转换一个数据类型时要注意转换前和转换后的数据长度是否一致,64位强制转换成32位或者反过来都会引起程序错误
e) : 在一些系统的结构体中的一些成员,在64位平台上其长度已经发生变化,不能对其向32位那样的处理,在使用这些结构体时要注意

另外,如果是从x86上移植到spac上或者其他类型的机器上,还要重点注意指针对齐的问题,比如下面一段代码:

char arr[] = "abcefefdsf";
char *p = arr;
int *pi;

for( int i = 0; i < 10; i++,p++) {
pi = (int*)p;
printf("i = %d \\tpi=%d\\n",i,*pi);
}

在x86上是正常工作的,但是换了环境就不行了


-->


x86 I 32 P 32
sparc I 32 P 64

-->

在x86上可以正常运行是因为x86时cisr,在其它不能入arm,sparc, mips等因为是risc,对数据对齐(data alignment)有严格的检查。

-------------------------------------------------------------------
--我是可爱的分割线
-------------------------------------------------------------------

楼上的诸位!!!受教了!!!!
不过我遇到一个问题,想请大家讨论一下!!

在64位平台下只有
ntohl和ntohs两个函数
ntohl类型为long,在64位平台下是8个字节
ntohs类型为short,在64位平台下是2个字节

如果想要将4个字节的int由网络序转换为主机序该调用那个函数来处理呢????


刚才楼上讨论中提到的问题,我在移植的时候都碰到了

64位的用户将会越来越多,以后涉及到的问题也会越多,如何更好的写出可移植的程序,还希望知道的人能继续讨论.

-------------------------------------------------------------------
--我是可爱的分割线
-------------------------------------------------------------------
关于32位平台到64位平台的移植

我的经验:
主要是内存操作的时候可能出问题,像拷贝,强制指针类型转换之类的操作。拷贝的时候,尽量用sizeof来操作,不要用写死的4,8之类的数字。
还有数据类型要统一定义,尽量用确定长度的数据类型,少用long这样的类型(long在不同平台长度不一样)。
不同平台对int64定义的类型名称也可能不一样,代码中要选定一个或自定义一个类型名称来表示,其它的typedef一下。

还有编译的时候,编译64位程序的编译选项不同,也要确定链接的库位数是相同的(比如oracle同时提供了32,64位的库文件).

-------------------------------------------------------------------
--我是可爱的分割线
-------------------------------------------------------------------

有没有编译选项指定使用32位的库,而不用64位的?

-m32选项
/usr/bin/ld: crti.o: No such file: No such file or directory
collect2: ld returned 1 exit status

(iwgh)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200710/6820.html]
本文出处: 作者:iwgh
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容