Suppose we have a simple code :
int* q = new int(13);
int main() {
return 0;
}
Clearly, variable q
is global and initialized. From this answer, we expect q
variable to be stored in initialized data segment (.data) within program file but it is a pointer, so it's value (which is an address in heap segment) is determined at run time. So what's the value stored in data segment within program file ?
My try:
In my thinking, compiler allocates some space for variable q
(typically 8 bytes for 64 bit address) in data segment with no meaningful value. Then, puts some initialization code in text segment before main
function code to initialize q
variable at run time. Something like this in assembly :
....
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:
....
Any idea?
Yes, that is essentially how it works.
Note that in ELF
.data
,.bss
, and.text
are actually sections, not segments. You can look at the assembly yourself by running your compiler:You will typically see a
main
function, and some kind of initialization code outside that function. The program entry point (part of your C++ runtime) will call the initialization code and then callmain
. The initialization code is also responsible for running things like constructors.