GCC: маскировка между версиями GCC - PullRequest
1 голос
/ 13 марта 2012

Этот вопрос возник из этого вопроса.

Проблема в том, что существует NVidia драйвер для Linux, скомпилированный с GCC 4.5. kernel компилируется с GCC 4.6. Ну, материал не работает из-за разницы в номерах версий между GCCs. (установщик говорит, что драйвер не будет работать - для получения подробной информации, пожалуйста, перейдите по ссылке выше)

Можно ли замаскировать двоичный файл, скомпилированный с помощью GCC 4.5, в двоичный файл, скомпилированный с GCC 4.6? Если это возможно, при каких обстоятельствах это будет работать хорошо?

1 Ответ

3 голосов
/ 13 марта 2012

Ваша проблема называется ABI: двоичный интерфейс приложения.Это набор правил (среди прочих), как функции в фрагменте кода получают свои аргументы (упорядочение, заполнение типов в стеке), именование функции, чтобы компоновщик мог разрешать символы и заполнение / выравнивание полей в структурах.

GCC пытается поддерживать стабильный ABI между версиями компилятора, но это не всегда возможно.

Например, GCC 4.4 исправил ошибку в упакованных битовых полях , что означает, чтостарый / новый код больше не может правильно читать структуры, использующие эту функцию.Если бы вы смешивали версии до и после 4.4, повреждение данных происходило бы без сбоев.

В примечаниях к выпуску 4.6 нет указания, что ABI был изменен, но это то, что ядро ​​Linux не может знать -он просто читает версию компилятора, использованную для компиляции кода, и если первые два числа меняются, он предполагает, что запуск кода небезопасен.

Существует два решения:

  1. Вы можете скомпилировать драйвер Nvidia с тем же компилятором, что и ядро. Настоятельно рекомендуется

  2. Вы можете исправить строку версии в двоичном файле.Это обманет ядро ​​при загрузке модуля, но может привести к повреждению данных во внутренних структурах данных.

...