Почему размер внешних переменных равен 0 в ELF? - PullRequest
3 голосов
/ 06 июня 2019

Внешние объявления переменных в программе c приводят к размеру 0 в ELF. Почему фактический размер не сохраняется в ELF, когда известен? Я понимаю, что для таких случаев, как неполные массивы, информация о размере отсутствует, но в других случаях должна быть возможность сохранить размер.

Я попробовал несколько простых кодов и подтвердил, что размер ELF равен нулю.

// file1.c

extern int var;
int main()
{
    var = 2;
}
// file 2.c
long long int var = 8;
gcc -c file1.c
readelf -s file1.o
...
9: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND var
...
gcc -c file2.c
readelf -s file2.o
...
7: 0000000000000000     8 OBJECT  GLOBAL DEFAULT    2 var
...

Если размер var был сохранен как 4 в file1.o, компоновщик может фактически обнаружить потенциальное несоответствие из-за размера при связывании с file2.o.

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

1 Ответ

6 голосов
/ 06 июня 2019

В file1, var это просто заполнитель.Это не займет никакой памяти.Внешний идентификатор должен указывать компилятору и компоновщику, что переменная var хранится в другом месте.

Было бы неправильно иметь два места хранения для одной переменной var, как вы предложили.

Это причуда языка C, в которой вы можете определить другой тип для внешней переменной и другой тип для базовой глобальной переменной, как вы сделали в своем примере.Это одна из причин, по которой у нас есть инструменты статического анализа.

...