Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Почему объектные файлы не кроссплатформенны?

#c #gcc #компиляция #компилятор


По определению, объектный код - набор инструкций для определённой архитектуры процессора.
Возьмём компилятор GCC. Если компилировать один и тот же код из-под разных платформ(Linux/Windows
etc.), но на одном железе, на выходе получим с виду одинаковые *.o файлы, которые не
будут кросплатформенны. Почему?

Чтобы исключить разность реализаций библиотек, возьмём код без них, что-то вроде:

//main.c
int main()
{
    return 5+3;
}
//main.c EOF

    


Ответы

Ответ 1



По определению, объектный код - набор инструкций для определённой архитектуры процессора. Это правда. Но НЕ вся правда. Кроме собственно инструкций процессора он содержит таблицу внешних ссылок, таблицу перемещаемых адресов и т.д. Эти таблицы используются загрузчиком/линкером при подготовки объектного модуля к выполнению. Ни сами таблицы, ни метод настройки объектного модуля не стандартизованы. В силу этого, объектный модуль, подготовленный для исполнения на одной платформе, не может быть выполнен на другой. Можно было бы попытаться написать не очень сложный транслятор одного формата в другой, но проблема практически неразрешима, т.к. различается не только сам формат объектного модуля, но и формат вызовов внешних функций (структура стека) и даже формат вызова функций ОС. Дело дохлое...

Комментариев нет:

Отправить комментарий