小bug引起的C程序32位-64位移植问题
在64位平台上测试原来在32位平台上工作正常的一个Linux C工程,访问某个函数的返回值时总是出现Segmentation fault。经查,是缺少一个extern声明引起的:
在A.c中调用了B.c定义的函数f(),该函数返回类型是char *。在A.c中遗漏了对该函数的extern声明。由于在另一个文件中声明过,gcc在符号表中可以找到f(),就按那个声明的地址连接了,所以编译、连 接以及函数本身的运行没有出错。但由于没有声明函数原型,所以在A.c中,默认为f()返回了int型:
在32位平台上,gcc的int和char *都是4字节,所以工作正常,函数返回值可用。
在64位平台上,gcc默认的int是4字节,char *是8字节,函数返回值被截短,地址无效,故出现了Segmentation fault