How do global variables get initialized by the elf loader

坚强是说给别人听的谎言 提交于 2019-12-06 01:44:41

问题


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; return astatic; }


回答1:


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



来源:https://stackoverflow.com/questions/2649333/how-do-global-variables-get-initialized-by-the-elf-loader

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!