Как глобальные переменные становятся инициализированными загрузчиком эльфа

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

интервал aglobal = 5;

Когда эти 5 становятся переданными в aglobal загрузчиком и как он знает для помещения 5 в aglobal.

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

интервал afunc () {статический интервал, неустойчивый = 8; возвратитесь неустойчивый;}

7
задан newguy 15 April 2010 в 22:08
поделиться

1 ответ

В разделе данных создается пространство размером 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 байтов в разделе данных, поэтому он указан напрямую

7
ответ дан 7 December 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: