Целевая специфичность GCC и двоичная совместимость - PullRequest
5 голосов
/ 31 января 2011

Начальное примечание: в вопросе упоминается AIX, поскольку это исходный контекст, но вопрос действительно относится к самому gcc, скорее всего независимо от платформы.

Предполагается, что AIX обратно совместим с двоичными данными: программа на C, скомпилированная в AIX 5.1, будет работать как есть на 5.2, 5.3, 6.1 и 7.1.

В моем понимании gcc должен быть построен для целевой системы (будь то текущая или другая в случае кросс-компиляции). Итак, gcc, построенный на AIX 6.1, нацелен на AIX 6.1 и создает двоичные файлы, которые можно использовать как на 6.1, так и на 7.1 благодаря двоичной совместимости.

Тем не менее, сам gcc, созданный на AIX 6.1, является программой 6.1, поэтому он должен работать на 7.1 как есть. Конечно, если я скомпилирую программу с ее помощью в 7.1, эта программа может быть связана или использовать заголовки, специфичные для 7.1, что делает получающийся двоичный файл требующим 7.1. Итак, насколько я понимаю, я должен иметь возможность запускать gcc, созданный на AIX 6.1, на машине 7.1 и создавать, возможно, неоптимальные, но совершенно корректные двоичные файлы, хотя для них потребуется 7.1 в качестве побочного эффекта связывания.

Это слишком похоже на радугу и единорогов, танцующих в блестящем небе. Я чувствую что-то подозрительное, но мне не хватает знаний о внутренностях gcc. Пожалуйста, могучая толпа, просветите меня.

tl; dr : Может ли gcc, созданный и ориентированный на версию N ОС / платформы, запускаться и использоваться в версии N + 1 благодаря двоичной совместимости платформы для создания двоичных файлов, работающих в версии N + 1? Если нет, то какой механизм предотвратит это?

1 Ответ

2 голосов
/ 03 сентября 2011

Вот просветление: ваш вопрос слишком слишком общий . Чтобы ответить на это, кто-то должен был бы знать

  • операционных систем, которые вас интересуют
  • версии ОС, которые вас интересуют
  • версии gcc, которые вам нужны

, а затем исследуйте бинарную совместимость в этой трехмерной матрице.

Механизмов, препятствующих бинарной совместимости, слишком много, и они напрямую связаны с изобретательностью вашей ОС и поставщика компилятора при ее взломе. Одним из наиболее распространенных и документированных способов является официальное устаревание вызовов API, удаление отправляемых библиотек совместимости и сжигание мостов, например переход от a.out к ELF.

...