在编译程序时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