《coredump问题原理探究》Linux x86版3.6节栈布局之gcc内嵌关键字
在intel CPU平台下,可以在代码加上__attribute__((regparm(number ) ) )指定函数调用时通过寄存器eax,edx,ecx来传递参数。其中number就是指定有多少个参数是通过寄存器来传递。由于只有这3个寄存器可以传递参数,所以number最大值为3。
那么,使用这个属性会对栈布局产生什么样的影响呢?会不会影响之前探讨过的两个规律?
多说无谓,重要是写例子来实验。
先看一下例子:
(gdb) tbreak mainTemporary breakpoint 1 at 0x80484ed(gdb) tbreak addOneTemporary breakpoint 2 at 0x804848d(gdb) tbreak addTwoTemporary breakpoint 3 at 0x80484aa(gdb) tbreak addThree(int, int, int, int) Temporary breakpoint 4 at 0x80484ca(gdb) rStarting program: /home/buckxu/work/3/5/xuzhina_dump_c3_s5 Temporary breakpoint 1, 0x080484ed in main ()Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.i686 libgcc-4.7.2-2.fc17.i686 libstdc++-4.7.2-2.fc17.i686(gdb) i r ebpebp 0xbffff488 0xbffff488(gdb) x /2x $ebp0xbffff488: 0x00000000 0x4362f635(gdb) info symbol 0x4362f635__libc_start_main + 245 in section .text of /lib/libc.so.6(gdb) cContinuing.Temporary breakpoint 2, 0x0804848d in addOne(int, int, int, int) ()(gdb) x /2x $ebp0xbffff460: 0xbffff488 0x0804853c(gdb) info symbol 0x0804853cmain + 85 in section .text of /home/buckxu/work/3/5/xuzhina_dump_c3_s5
由于在main函数在执行时,压入了函数桢指针,分配了0x20个字节的局部变量空间,在调用addOne时,没有压入参数,使用了局部变量空间。所以,main函数返回地址的单元和__libc_start_main返回地址的单元应该是相差0x20 + 4 + 4 = 0x28个字节。和上面的结果一样。其它像addTwo,addThree也是同样的结果。