vak: (Default)
[personal profile] vak
Взялся я поисследовать Си-шный рантайм. Глянуть, что делается в программе до main() и после. Беру пустую программу:
$ cat empty.c 
int main()
{
// empty
}
Компилирую, причём линкую статически, чтобы избежать сложностей динамического загрузчика:
$ cc -static -Os empty.c -o empty
Глянем размер бинарника. На процессоре x86_64 под Ubuntu получается 667 килобайт:
$ size empty
text data bss dec hex filename
667574 23384 22440 713398 ae2b6 empty
На процессоре arm64 выходит чуть получше, 497 килобайт:
$ size empty
text data bss dec hex filename
497904 22180 21616 541700 84404 empty
Такие объёмы настораживают. Хорошо, запустим и посчитаем количество выполненных машинных команд. На процессоре x86_64:
$ bintrace -o x86.trace ./empty
$ grep '^0x' x86.trace | wc
170979 1371361 10303769
На процессоре arm64:
$ bintrace -o arm64.trace ./empty
$ grep '^0x' arm64.trace | wc
108719 565684 5186654
Ну офигеть просто. Больше ста тысяч команд чтобы просто стартонуть Си-шный код. Неладно что-то в Датском королевстве.

У меня иногда мелькает вопрос, чем занимаются компьютеры, когда мы на них не глядим. Какие-то бесполезные биты на байты множат. 😀