小bug引起的C程序32位-64位移植问题

2008/04/20 | 07:35 | 分类:计算机科学与编程 | 标签: | 939次阅读

  在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。

相关文章

  1. 3条评论 关于 “小bug引起的C程序32位-64位移植问题”

  2. Aaron 发表于2008-09-13

    请问“另一个”文件与A和B什么关系?gcc如何通过那个文件找到f()的?thanks

  3. 林健 发表于2008-09-19

    “另一个”文件与A和B是同一个工程中的三个.c文件,gcc具体是怎么找到的我也没有仔细分析过,我想应该和GNU连接器的机制相关,有空可以分析之。

  1. 1 Trackback(s)

  2. 2009-03-21: 编译器与标准——严格还是智能? | 林健的BLOG

发表您的评论

您的名字: (必填)

您的邮箱: (不会被公布,必填)

您的网站:

* 正确填写邮箱可支持Gravatar头像服务。
* 与主题无关的内容请用邮件或IM与我联系。