当我使用命令:GDB算术
打印/ X & _start - >我得到:0x08049054 打印/ X & _key - >我得到:0x0804916d
这是很容易弄清楚,所不同的是:119H
但是,如果我使用命令:
打印/ X & _key- & _start - >我得到:0×46(!!)
为什么?有没有人确认,如果调试他自己的程序?
当我使用命令:GDB算术
打印/ X & _start - >我得到:0x08049054 打印/ X & _key - >我得到:0x0804916d
这是很容易弄清楚,所不同的是:119H
但是,如果我使用命令:
打印/ X & _key- & _start - >我得到:0×46(!!)
为什么?有没有人确认,如果调试他自己的程序?
你看到的是指针算术。
这是因为您使用的指针为unsigned int
或其他类型(对于_start
和_key
),其宽度为4个字节。你会注意到,即使在C/C++中使用指针算术,你也会得到相同的结果。
写入到这个foo.cpp
:
#include <cstdio>
int main(int argc, char** argv)
{
unsigned int* _start = (unsigned int*)0x08049054, * _key = (unsigned int*)0x0804916d;
printf("start(%p), key(%p) -> [key - start](%li)\n", _start, _key, _key - _start);
}
现在make文件(GNUmakefile
):
CXXFLAGS=-ggdb -g3 -O0
foo: foo.cpp
通过调用make
构建它(GNU做,要准确)。
输出将是:
start(0x8049054), key(0x804916d) -> [key - start](70)
...和70 == 0x46
。