Являются ли статически скомпилированные чисто стандартные программы на C ++ переносимыми, работающими на той же архитектуре? - PullRequest
0 голосов
/ 28 февраля 2019

Когда программа рекурсивно статически компилируется (при условии, что все связанные библиотеки допускают статическую компиляцию и являются своего рода независимыми от платформы в своем коде, я знаю, что это возможно, потому что мне удалосьстатически скомпилировать nano из Ubuntu для запуска на x86 Android, и это сработало, потому что оно не связывалось с системными библиотеками), действительно ли безопасно предполагать, что оно автономно?То есть, нужно ли что-нибудь еще от платформы (например, Linux, Windows, ... и т. Д.)?Я подозреваю, что ответ - да.Итак, соответственно ...

Для простоты, если я возьму эту программу (без зависимостей):

int main(){
      return 0;
}

Я могу легко скомпилировать это статически (поскольку, очевидно, она не имеет зависимостей) и должна произвестинативный код, который работает на базовой архитектуре (скажем, архитектуре x86).

Я знаю, что есть оболочки, которые передают переменные окружения и другие вещи, которые будут различаться в зависимости от платформы (например, Windows EXE или исполняемый файл Linux).

Отложив обертки на минуту, возникает вопрос: если бы я статически скомпилировал предыдущую программу, используя GCC в Linux, смог бы я теоретически быть в состоянии запустить еена винде?

Возвращаясь к оболочкам, если я знаю, как конвертировать оболочки из Windows в Linux и наоборот, нужно ли мне перекомпилировать программу, чтобы переместить ее из одной в другую?

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Теоретически да.С другой стороны (запустить исполняемый файл Windows в Linux) уже довольно давно возможно использование Wine.Теперь, с подсистемой Windows для Linux, я думаю, что вы также можете запускать исполняемые файлы Linux в Windows 10.

0 голосов
/ 28 февраля 2019

действительно ли безопасно предполагать, что он самодостаточен?То есть, нужно ли что-нибудь еще от платформы (например, Linux, Windows, ... и т. Д.)?Я подозреваю, что ответ - да.

Вы были бы правы.Программа, созданная для использования в операционной системе, опирается на службы операционной системы хоста через интерфейсы ОС, специфичные для этой системы.Среди наиболее фундаментальных из них - средства загрузки и запуска программ, которые обрабатывают только определенные форматы программ.Форматы, поддерживаемые Windows, и форматы, поддерживаемые Linux, не перекрываются.

, если бы я статически скомпилировал предыдущую программу, используя GCC в Linux, смогу ли я теоретически запустить ее в Windows?

Нет, не напрямую.Но вы можете запустить его в контейнере Windows Subsystem for Linux, который обеспечивает среду Linux для исполняемых двоичных файлов.

, если я знаю, как конвертировать оболочки из Windows в Linux и наоборот,Мне нужно перекомпилировать программу, чтобы переместить ее из одного в другой?

Чтобы запустить программу самостоятельно, вам нужно собрать ее отдельно для каждой целевой ОС.Возможно, вам даже придется собрать его отдельно для разных версий ОС.Полная статическая компиляция уменьшает площадь поверхности для последней необходимости, но она не решает кросс-платформенные проблемы.

0 голосов
/ 28 февраля 2019

Нет, даже полностью статически скомпилированные двоичные файлы для C ++ не будут кроссплатформенными.Даже самая простая программа

int main() {
}

будет иметь код запуска CRT (статически).И этот CRT будет иметь незначительное количество зависимых от ОС вызовов API (системный вызов exit, чтобы назвать тот, который сразу приходит на ум, но, конечно, еще больше).

Извините, но вам придетсякросс-компиляция или компиляция на целевой платформе

0 голосов
/ 28 февраля 2019

Обычные пользовательские программы, с которыми вы знакомы, встроены в исполняемый файл.Для загрузки программы из такого файла в память требуются сервисы операционной системы, которые зависят от используемого формата.

После загрузки программы используют запросы к операционной системе для выполнения основных операций, таких как чтение ввода, запись вывода,и прекращение программы.Они не могут быть встроены в программу, поскольку обычные пользовательские программы не имеют разрешения на доступ к аппаратным функциям, необходимым для их реализации.

Конечно, можно писать программное обеспечение, которое не зависит от операционной системы.Примером являются сами операционные системы: они предоставляют все свои функции.Тем не менее, они должны быть выполнены на чистом оборудовании (или виртуальной среде, имитирующей его) и должны быть созданы для загрузки загрузчиком для оборудования.

...