[Linux]ubuntu中GCC的Stack

近日由于工作上的问题,需要把一个Fedora 17下工程移植到Ubuntu10.04虚拟机下,本来以为主要的工作可能会花在环境配置上,只要搞定编译问题,就基本上算完成了。但事情往往不是我们所想的那样,有时候看上去简单的事情其实很麻烦。

确保代码未做任何改变;

首先,在ubuntu中安装好工程需要的各个库,配置好编译环境,编译通过;

然后在运行时,确出现了错误,一大串Memory map信息,从提示的库信息来看,应该与系统库有关。而又看到*** stack smashing detected ***, ./app terminated,google一下,说是与GCC有关,说Ubuntu 会默认开启GCC的stack smashing proctect 功能,而Fedora 17下没开。

解决办法有:

1、 在ubuntu10.04下,关闭GCC的stack smashing proctect功能,

在编译时要加上fno-stack-protector选项,否则运行时会出现*** stack smashing detected ***: xxx terminated,而不是期望的Segmentation fault。同时还需要加上允许栈执行的选项。

gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -ggdb -o xxx xxx.c

2、 重新装一个Fedora17(无奈之举),

3.、检查代码,消除错误; 由于工程比较大,代码量多,需要花费的时间预估很长,但能彻底解决问题;

根据工作需要,选择合适的解决方法;

找到问题的原因,在一个子函数中,问题代码如下:

    CHAR acMsg[16] = {0};     sprintf(acMsg, "[%d,%d,%d], %d, [%d,%d,%d]",     pas32ImgNum[0], pas32ImgNum[0], pas32ImgNum[0],    pas32ImgNum[1],    pas32ImgNum[2], pas32ImgNum[3], pas32ImgNum[4]);   //pas32ImgNum 为函数的参数(INT32 * pas32ImgNum)

给acMsg赋值时,超出了最大范围;

但我们好多人没想过,勇敢的冷静的理智的去接受失败,

[Linux]ubuntu中GCC的Stack

相关文章:

你感兴趣的文章:

标签云: