2013-01-13 1 views
7

Сначала я хочу заявить, что этот вопрос связан со школой/домашним заданием.Совместимость объектного файла C между компьютерами

Предположим, что компьютеры CP1 и CP2 используют одну и ту же операционную систему и машинный язык. Если на CP1 скомпилирована программа C, чтобы переместить ее на CP2, необходимо перенести исходный код и перекомпилировать на CP2 или просто перенести объектные файлы.

Мой ответ кишки состоит в том, что объектные файлы должны быть достаточными. Код C преобразуется в сборку компилятором и собирается ассемблером в машинный код. Поскольку архитектура имеет один и тот же машинный код и операционную систему, я не вижу проблемы.

Но чем больше я думаю об этом, тем больше смущения я начинаю получать.

Мои вопросы:

а) С его ссылкой на объектные файлы и не исполняемые, я предполагаю, что там не было никаких ссылок. Будут ли какие-либо проблемы, возникающие при соединении с CP2?

b) Имеет ли значение, если код использовал стандарт C11 для CP1, но единственным компилятором на CP2 был C99? Я предполагаю, что это не имеет значения, если код был скомпилирован/собран.

c) В вопросе не указаны общие/динамически связанные библиотеки. Таким образом, это будет работать только в том случае, если программа не имеет зависимости от файлов .dll/.so/.dylib, иначе они также потребуются на CP2.

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

Halp!

+0

distcc, который копирует объектные файлы между компьютерами, рекомендует использовать ту же самую версию компилятора на всех узлах, даже для языка C. – aschepler

ответ

3

Ответ, это зависит. Когда вы компилируете программу на C и перемещаете объектные файлы для связи на другом компьютере, она должна работать. Но из-за таких факторов, как endianness или name mangling, ваша программа может работать не так, как предполагалось, и даже может произойти сбой при попытке запустить ее.

C11 не поддерживается компилятором C99, но не имеет значения, был ли источник скомпилирован и собран.

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

Вы можете получить компилятор, который поддерживает EABI, чтобы вы не столкнулись с этими проблемами. Компиляторы, которые поддерживают EABI, создают объектный код, совместимый с кодом, созданным другими такими компиляторами, что позволяет разработчикам связывать библиотеки, сгенерированные с одним компилятором, с объектным кодом, сгенерированным другим компилятором.

Я пытался сделать это раньше, но не так много, а не недавно. Поэтому моя информация может быть неточной на 100%.

+0

«Библиотеки вам не нужны» - это верно только для статической привязки. Динамические библиотеки ссылаются только на вашу программу, а не компилируются в нее. Программа не запускается, если они отсутствуют. –

+0

Спасибо, что поймали это, отредактировали. – syb0rg

+0

Ваш rev 2 по существу прав, вы должны упомянуть о совместимости имен и совместимости во время выполнения, есть системы, в которых вы можете действительно запрашивать различные виды выходных файлов объектов, когда новый [ABI] (http://en.wikipedia.org/wiki/Application_binary_interface) настолько лучше, что стоит переписать инструментальную цепочку, чтобы получить его. – jthill

1

a) Я уже слышал, что термин «объектные файлы» используется для ссылки на связанные двоичные файлы - хотя это и неточно. Так что, может быть, они означают «двоичные файлы».Я бы сказал, что ссылка на другую машину может быть проблематичной, если у нее есть другой компилятор - , если форматы объектных файлов не стандартизированы, о чем я не уверен.

b) Использование разных стандартов или даже компиляторов не имеет значения для двоичного кода - если оно связано статически. Если он полагается на функции из динамического lib, могут быть проблемы. Какие ответы c) также: Да, это будет проблемой. Программа не запускается, если в нужной версии нет всех требуемых динамических библиотек. Зависит от режима привязки (статический или динамический), снова.

0

В: Предположим, что компьютеры CP1 и CP2 используют одну и ту же операционную систему и язык машины.

A: Тогда вы можете запустить тот же .exe на обоих компьютерах

Q: Если программа C составлена ​​на CP1 для того, чтобы переместить его в CP2, является необходимым для передачи исходного кода

A: Нет. Вам нужен только исходный код, если вы хотите перекомпилировать. Вам нужно только перекомпилировать, если это другой, несовместимый процессор и/или ОС.

«Объектные файлы», как правило, не требуется вообще для выполнения программы:

http://en.wikipedia.org/wiki/Object_files

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

Для «исполняемой программы» может потребоваться одна или несколько «разделяемых библиотек» (aka .dll). В этом случае применяются те же ограничения: общие библиотеки, если они еще не резидентны, должны быть скопированы вместе с .exe и также должны быть совместимы с ЦП и ОС.

Наконец, «скрипты» делают не необходимо перекомпилировать. Вы можете свободно копировать сценарий с компьютера на компьютер. Но каждый компьютер должен иметь «интерпретатор» для запуска скрипта: для Perl-скрипта нужен интерпретатор Perl, скрипт Python - интерпретатор python и т. Д.

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