LINUX.ORG.RU

История изменений

Исправление 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 файлах не объектный код а что-то типа предразобранного синтаксического дерева + ещё какие-то лёгкие преобразования.