что такое поле Value в выводе readelf -s

Вот мой код:

#include <stdio.h>
int variable;
int main(){
    printf("%p", &variable);
}

Вывод за пару прогонов:

~ % ./a.out
0x559bae5c4030
 ~ % ./a.out
0x55b9d1038030
 ~ % 

как видите, в конце обоих адресов есть 30. и таблица символов:

 ~ % readelf -s a.out | grep variable
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    51: 0000000000004030     4 OBJECT  GLOBAL DEFAULT   23 variable
 ~ % 

снова есть эти 30 в конце поля Value. Мой вопрос: что это за поле value и какое отношение оно имеет к выводу кода? и почему последние две цифры сохраняются при каждом прогоне?

извините за мой плохой английский


person grey    schedule 10.08.2020    source источник


Ответы (1)


Поле Value из readelf соответствует адресу variable в исполняемом файле a.out.

То, что вы видите в выводе, — это фактически загруженный адрес variable во время выполнения. Таким образом, ваш исполняемый файл загружается по адресу (начальный адрес) 0x559bae5c0000 при первом запуске (= 0x559bae5c4030 - 0x4030). И загружается в 0x55b9d1034000 во втором запуске (0x55b9d1038030 - 0x4030).

Вы можете увидеть это, проверив /proc/<PID>/maps исполняемого файла a.out во время работы.

Адрес загрузки меняется от запуска к запуску из-за рандомизации макета адресного пространства в Linux.

person P.P    schedule 10.08.2020