当前位置:  技术问答>linux和unix

gcc O2选项造成的错误

    来源: 互联网  发布时间:2016-11-10

    本文导语:  装apache结果出错,invalid argument debug了一下apache的代码,发现GCC编译时带上了O2的选项,造成了函数调用fstat()出错。 于是我试着自己写了一段测试代码,分别用默认不带优化和带O2优化两种编译,结果果然不带编译的...

装apache结果出错,invalid argument
debug了一下apache的代码,发现GCC编译时带上了O2的选项,造成了函数调用fstat()出错。
于是我试着自己写了一段测试代码,分别用默认不带优化和带O2优化两种编译,结果果然不带编译的没问题,带了O2选项的返回一个errno为22的“invalid argument”.
测试环境为:
ivan@Redhat101:/localhome/ivan> uname -a
Linux Redhat101 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

ivan@Redhat101:/localhome/ivan> gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

测试代码为:
#include    
#include    
#include    
#include    
#include    
#include    
#include         
int main ( int argc, char *argv[] )
{
    int fd1=-1;
    struct stat info1;
    fd1=open("/localhome/kana/lingc.txt", O_RDWR);
    printf("fd1=%d",fd1);
    if(fd1 > 0)
    {
        if(fstat(fd1,&info1)!=0)
        printf("failed to open fd1:%d;errorno:%dn",fd1,errno);
        else printf("sucess");
        close(fd1);
    }

    return 0;
}

请各位指教一下。
或者手头刚好有32位的机器也帮忙验证下,是不是32位就没有这个问题。

|
这个有意思,呵呵,上网查了一下,
extern __inline__ int fstat (int __fd, struct stat *__statbuf) __THROW
{
  return __fxstat (_STAT_VER, __fd, __statbuf);
}
// _STAT_VER这个宏是3,和“movl  $3, %edi”这一句可以印证,

int __fxstat (int vers, int fd, struct stat *buf)
{
  if (vers != _STAT_VER)
  {
    __set_errno (EINVAL); // 这就是“Invalid argument”
    return -1;
  }
是不是C库和头文件的版本不一致?

|
32位
i486-linux-gnu
gcc version 4.4.5

没有问题,加不加O2都正确执行。

|
虽然没法再现问题,但是我看看觉得应该是编译器错误,这问题很有趣,因为根据man page,fstat没道理给出invalid argument。把gcc -S和gcc -O2 -S产生的汇编文件发出来看看。

|
应该跟GCC的版本有关, 可能是GCC本身的BUG

我就遇到过GCC-4.1.2的BUG, 对于pch文件的支持有BUG (详见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10591), 换个GCC版本就好了.

我试了一下你的代码, 加-O2, 和不加都一样的结果

gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27)

|
有可能这个版本的GCC或libc库不支持o2的优化选项。你可以用O3可O4试试

    
 
 

您可能感兴趣的文章:

  • 请教一个GCC编译选项
  • 求助:当用 gcc 编译时没,加上优化选项 -02 ,可是提示是 gcc: unrecognized option `-02'
  • 关于gcc优化选项的问题。
  • 询问gcc的一个编译选项
  • GCC的O1、O2、O3选项究竟优化了什么?
  • 请教gcc中如何设置宏选项
  • 求一个GCC编译选项
  • 编程技术其它 iis7站长之家
  • 有关gcc的链接选项
  • gcc/g++中可不可以在编译选项中预定义宏
  • 关于gcc编译选项的一个问题.
  • 关于gcc的-D编译选项?
  • arm-linux-gcc不能识别-02选项?
  • 晕了,solaris系统下,使用gcc -g选项编译出的程序,怎么没有调试信息
  • 讨教gcc编译选项的问题 -lifisam -lisam -lisamnls
  • 请大虾支招啊-gcc 编译选项问题 以及 makefile的问题
  • 在用gcc编译c程序时,打开调试选项是何参数?急急!!!
  • 关于makefile gcc编译选项,请教。
  • gcc的编译选项中 -I.和-I./; -L.和-L./ 是同一个意思吗?
  • 如何判断GCC或者G++ 编译的时候带了 -g选项?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一套未安装gcc的Linux中安装gcc rpm包时时出现错误
  • 我在Solaris8上安装了gcc3.3Solaris8,但是总是出错!错误如下:gcc: syntax error at line 1: `(' unexpected
  • gcc编译错误
  • 编译 cross-gcc 的错误
  • gcc升级,提示insn-attrtab.o错误
  • gcc-4.4.2升级错误
  • 如何将gcc编译的警告及错误信息保存到文件
  • GCC curses动态库链接的错误
  • 如何将gcc的编译错误输出到一个文本文件?
  • arm-linux-gcc编译XML错误
  • 能否把gcc的错误提示输出到一个文件中?
  • gcc 如何打印上此的错误信息
  • 大神们好! yum install gcc出现错误,请大神指点!
  • 使用arm-linux-gcc编译,出现compilation of header file requested错误
  • gcc编译中出现的这种错误提示 stray '357' in program
  • gcc 编译时错误
  • gcc运行程序出现错误,求助。。。
  • linux环境下gcc编译器对sin函数出现的错误
  • ubuntu 10.10出现极其诡异的情况,使用gcc编译没任何反应,可以继续输入,但是不提示任何错误;使用make编译效果一样;
  • gcc helloworld 出现错误......
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 命令:mips_fp_le-gcc,mipsel-gcc 是什么意思?跟一般的gcc有什么区别?
  • 怎样升级我的GCC呀,我用的RH7.2,GCC 2.96 ,我从网上下载了一个gcc-3.2.3.tar.gz
  • arm-elf-gcc 和 arm-linux-gcc有什么区别?arm-elf-gcc里的elf代表什么?
  • gcc-ccore、avr-gcc及arm-gcc的区别
  • gcc在哪里?bash:gcc:command not found
  • 如何删掉GCC3.0(我需要GCC2.0-----)
  • Windows版GCC TDM-GCC
  • 急问:如何卸掉gcc 3.2庄gcc 2.96
  • 有人遇到过吗,在安装GCC时提示,"checking gcc ...no "


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3