當我使用命令: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
。