Как глобальные переменные инициализируются загрузчиком elf - PullRequest
6 голосов
/ 16 апреля 2010

Для глобальных переменных в C, таких как

int aglobal = 5;

Когда 5 переводится в aglobal загрузчиком и как узнать, как поместить 5 в aglobal.

Та же ситуация со статическим объявлением в функции. Как

int afunc () { статический и астатический = 8; вернуть астатику; }

1 Ответ

6 голосов
/ 16 апреля 2010

В секции данных создается пробел с размером int, со значением 5, закодированным в нем, и глобальный нефункциональный символ с именем 'aglobal' добавляется в таблицу символов, указывающую на него. Ссылки на aglobal превращаются в перемещения, которые разрешаются во время соединения, чтобы указывать на этот блок данных, поэтому в полностью связанных изображениях инструкции будут загружаться непосредственно из той точки памяти, которая содержит значение 5

Например, сборка (x86) может выглядеть примерно так:

.data
.globl aglobal
aglobal: .long 5

.text
main:
    mov eax, aglobal

В объектном файле инструкция mov преобразуется в mov eax, 0 с перемещением R_386_32 aglobal+0, поскольку объектный файл не знает наверняка, где будет находиться секция данных в памяти.

В полностью связанном изображении это может быть что-то вроде:

mov eax, 0x804a010

Теперь фактический адрес 4 байтов в разделе данных известен, поэтому он указывается напрямую

...