undefined reference to `__stack_chk_fail'

在编译程序时klib.c中的disp_int报了该错,去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护

lib/klib.o:lib/klib.c
        $(CC) $(CFLAGS) -fno-stack-protector -o $@ $<

然后编译就可以了正常执行了

然后就自己验证了一下,将char output[16];注释掉改为char* output,编译不报错,说明问题就是由于定义数组的栈操作引起。

我反编译了一下

代码test.c:

int main()

{

    char a[16];

    return 0;

}

1.gcc  -o test test.c

gdb test

(gdb)disas main

   0x08048404 <+0>:    push   %ebp
   0x08048405 <+1>:    mov    %esp,%ebp
   0x08048407 <+3>:    and    $0xfffffff0,%esp
   0x0804840a <+6>:    sub    $0x20,%esp
   0x0804840d <+9>:    mov    %gs:0x14,%eax
   0x08048413 <+15>:    mov    %eax,0x1c(%esp)
   0x08048417 <+19>:    xor    %eax,%eax
   0x08048419 <+21>:    mov    $0x0,%eax
   0x0804841e <+26>:    mov    0x1c(%esp),%edx
   0x08048422 <+30>:    xor    %gs:0x14,%edx
   0x08048429 <+37>:    je     0x8048430 <main+44>
   0x0804842b <+39>:    call   0x8048340 <__stack_chk_fail@plt>
   0x08048430 <+44>:    leave  
   0x08048431 <+45>:    ret 

2.gcc -fno-stack-protector -o test test.c

gdb test

(gdb)disas main

   0x080483b4 <+0>:    push   %ebp
   0x080483b5 <+1>:    mov    %esp,%ebp
   0x080483b7 <+3>:    sub    $0x10,%esp
   0x080483ba <+6>:    mov    $0x0,%eax
   0x080483bf <+11>:    leave  
   0x080483c0 <+12>:    ret   


可以明显看到我电脑上的这个版本的GCC默认是要进行栈检查的要调用__stack_chk_fail,而加了-fno-stack-protector的话就不用栈检查就不用调用__stack_chk_fail

你可能感兴趣的:(undefined reference to `__stack_chk_fail')