2016-03-09 1 views
1

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

Я знаю, что существует разница между COFF и ELF, и такие вещи, как разделяемые библиотеки, различны (GOT vs независимо от того, что делает Windows), и имена функций, конечно, также различны.

Запрет на все это может быть возможно? Например, ARM имеет такое же соглашение как для Windows, так и для Linux.

+0

Зависит от того, что вы подразумеваете под «общим кодом». У них может быть одинаковый исходный код C/C++ относительно легко, но им будет сложно разделить двоичный код из-за разных исполняемых форматов. Трудность совместного использования одного и того же исходного кода сборки находится где-то посередине. –

+0

Даже с разным стандартным соглашением вы можете катиться самостоятельно, если вам не нужно взаимодействовать с другим кодом. – Jester

+0

Если Windows и Linux были более похожими, то они не были бы Windows и Linux. Трудно понять, насколько вы готовы растянуть гипотезы, но ясно, что они гипотетичны или лучше говорят противоречиво. Если у вас есть вопрос, можете ли вы делиться двоичными файлами между двумя ОС, если они достаточно похожи, то да: можно запустить некоторые BSD-файлы в Linux и наоборот, если они не полагаются на расширения стандартной библиотеки. – rici

ответ

2

Да. Вызывающее соглашение определяет, как параметры хранятся в стеке/регистры, как обрабатываются возвращаемые значения и т. Д. Если бы они были равны, код мог бы быть общим, даже в двоичной форме.

Однако код не должен иметь никаких зависимостей от конкретной платформы. Например, код не может использовать системные вызовы для ввода-вывода, но для этого может использоваться определенная для платформы библиотека.

0

Возможно, кодеки в специально созданных библиотеках.

Но любые бинарные (библиотечные или исполняемые) ссылки в каком-либо конкретном коде ввода ОС, а когда он делает что-то нетривиальное (например, чисто кодеки обработки потока снова), он взаимодействует с ОС. Все будет по-другому.

По этой же причине невозможно запустить BSD-файлы в Linux (вопреки неправильным комментариям). Сценарий BSD отличается, обработка параметров в двоичном формате (csu/crt *) различна, а некоторые системные вызовы встроены.

Люди напиваются на POSIX api, но забывают, что POSIX является источником не бинарным соглашением.

Смежные вопросы