Внешние объявления переменных в программе 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.
Так почему же размер не излучается, поскольку он может помочь выявить некоторые тонкие проблемы, подобные этой?