|
|
如何得到全局变量在堆栈中的地址?
|
|
有以下一段程序:
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigend int codeaddr;
//计算code在堆栈中的地址
codeaddr=0xc0000000-4-(strlen(code)+1);
}
但我觉得这样计算出来的好象不对,我用redhat7.3,kdevelop2.1。
1。不知这段程序中0xc0000000是不是表示堆栈的基地址?但在redhat7.3中堆栈的基地址好象不是0xc0000000。
2。不知这段程序如何改正才能在redhat7.3中正确计算出code在堆栈中的地址?
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
不明白你想干啥.
如果你只是想得到code的地址,为什么不直接printf("%p",code)呢?
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
我是想通过堆栈中存放的数据得到code的地址。
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
想再问个问题:
堆栈中存放的是该全局变量的地址还是全局变量的值(如本例中的字符a)?
(我觉得好象量全局变量的地址,不知对不对?)
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
全局變量不放在堆棧里,放在數據段里
你那個程序很有意思,是你一個人寫的嗎?還是被別人改過?
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
他取得那个是$_的的值
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
但我跟踪程序时,发现堆栈中好象存入了全局变量的地址,不知全局变量的地址是否要存入堆栈中
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
要清楚变量地址和变量的值是不同概念,你的问题翻译一下就是“全局变量的地址是否可以成为局部变量的值?”
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
谢谢大家!
我再描述一下:
c程序:
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigned int code=0;
}
在程序执行时观查到
ebp=0xbffffb88
esp=0xbfffffb80
code地址为&code=0x8049510
内存0xbffffb80开始的8字节数为(按字节显示):
0xbffffb80:0x1c 0x95 0x04 0x08 0x00 0x00 0x00 0x00
0xbffffb88:0xc8 0xfb 0xff 0xbf 0x99 0x74 0x01 0x42
问题:
1.ebp(0xbffffb88)是否为堆栈的起始地址?(堆栈反向生长)
2.地址(0xbffffb84---0xbffffb87)的4个0x00是什么?
3.地址(0xbffffb80---0xbffffb83)的0x1c 0x95 0x04 0x08 有什 么意义?
c程序运行在redhat7.3,kdevelop2.1下.
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
你这样写谁都不清楚,你也没说是在那一步的时候看的积存器的值,其实这写都是很简单的东西,只要你对c堆栈的结构了解的话
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
我在以下程序中画<<<<<处加的断点,观查到的值
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigned int codeaddress=0; <<<<<<
}
谢谢!
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
如果你没有执行那句话,那么*esp的内容是随机的,没有任何意义
如果你执行了那句话,*esp应该是0,至于为什么esp-ebp==8而不是4,那可能是不同的编译器有不同的方式,可能是对越界读写的一个小小的保护措施吧
|
|
|
Re: 如何得到全局变量在堆栈中的地址?
|
|
你到底要做什么?研究堆栈还是程序有问题?如果想研究的话建议你看看intel的开发手册的第一本,会有收获。
|