假设我们有一个简单的代码:
int* q = new int(13);
int main() {
return 0;
}
显然,变量q是全局的并且是初始化的.从this answer开始,我们期望q变量存储在程序文件中的初始化数据段(.data)中,但它是一个指针,因此它的值(它是堆段中的地址)是在运行时确定的.那么程序文件中存储在数据段中的值是多少?
我的尝试:
在我看来,编译器为数据段中的变量q(通常为64位地址通常为8个字节)分配一些空间,没有任何有意义的值.然后,在主函数代码之前的文本段中放入一些初始化代码,以在运行时初始化q变量.汇编中有这样的事情:
....
mov edi, 4
call operator new(unsigned long)
mov DWORD PTR [rax], 13 // rax: 64 bit address (pointer value)
// offset : q variable offset in data segment, calculated by compiler
mov QWORD PTR [ds+offset], rax // store address in data segment
....
main:
....
任何的想法?