首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

《coredump有关问题原理探究》Linux x86版3.6节栈布局之gcc内嵌关键字

2013-01-25 
《coredump问题原理探究》Linux x86版3.6节栈布局之gcc内嵌关键字在intel CPU平台下,可以在代码加上__attrib

《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也是同样的结果。


2楼xuzixuan2013昨天 20:35
收益匪浅
1楼alexandnpu昨天 11:15
博主的文章很好啊,一直在看,受益匪浅。nn不知道博主会不会讲到64位的情况?n期待
Re: xuzhina昨天 17:56
回复alexandnpunintel CPU的话,如果不是安腾架构,没多大区别。对于定位coredump方面,只是寄存器由E前缀变成R前缀而已。具体可以参考一下LP64标准。

热点排行