How do global variables get initialized by the elf loader
For global variables in C like
int aglobal = 5;
When does the 5 get transferred into aglobal by the loader and how does it know to put 5 in aglobal.
Same situation with a static declaration in a function. Like
int afunc() { static int astatic = 8; r开发者_JAVA技巧eturn astatic; }
An int-sized space is made in a data section, with the value 5 encoded in it and a global non-function symbol named 'aglobal' is added to the symbol table pointing at it. References to aglobal are turned into relocations that are resolved at link-time to point to that data block, so in a fully-linked image instructions will load directly from that spot in memory that holds the 5 value
For example, the (x86) assembly might look something like:
.data
.globl aglobal
aglobal: .long 5
.text
main:
mov eax, aglobal
In an object file, the mov instruction will turn into mov eax, 0
with a relocation R_386_32 aglobal+0
, because the object file doesn't know for sure where the data section will be in memory.
In a fully-linked image, it might be something like:
mov eax, 0x804a010
Now the actual address of the 4 bytes in the data section is known, so it's specified directly
精彩评论