История изменений
Исправление firkax, (текущая версия) :
LTO это аналог ситуации, когда ты все исходники слил в один файл и компилируешь только его, тем самым дав компилятору возможность, например, заинлайнить функцию из другого .c-файла. Память жрёт потому что компилирует весь проект целиком а не помодульно. В .o файлах не объектный код а что-то типа предразобранного синтаксического дерева + ещё какие-то лёгкие преобразования.
Поскольку оптимизации вообще могут ломать код, эта оптимизация тоже может что-то сломать. Например: A.c
void my_zero(void * p, size_t n) { bzero(p,n); }
B.c
void some_func() {
char password[100];
// ....
my_zero(password, 100);
}
Если без LTO компилятор, компилирующий B.c, не знает о том, что скрывается внутри my_zero и не может его выкинуть, то с LTO он теперь знает, видит что там не влияющий на логику функционал и может выкинуть этот вызов, повредив безопасности кода.
Исходная версия firkax, :
LTO это аналог ситуации, когда ты все исходники слил в один файл и компилируешь только его, тем самым дав компилятору возможность, например, заинлайнить функцию из другого .c-файла. Память жрёт потому что компилирует весь проект целиком а не помодульно. В .o файлах не объектный код а что-то типа предразобранного синтаксического дерева + ещё какие-то лёгкие преобразования.