Выполнение двоичных файлов - PullRequest
3 голосов
/ 10 февраля 2012

Я загрузил двоичный файл, который был скомпилирован (программа на C) с использованием GCC 4.4.4 для x86-64 Red Hat Linux.

Это нормально, что когда я пытаюсь запустить его на Mac OS X (под управлением Lion, также x86-64) под управлением GCC 4.2.1, он говорит: cannot execute binary file? Он не может обнаружить его как двоичный файл.

Зачем это делать? Я считаю, что версия gcc не имеет к этому никакого отношения, так как файл уже скомпилирован. Он был скомпилирован для x86-64, на котором работают обе машины. Может кто-нибудь объяснить, пожалуйста?

Ответы [ 4 ]

11 голосов
/ 10 февраля 2012

Существуют разные двоичные форматы.Системы Linux используют ELF для исполняемых файлов и библиотек, но Mac OS X использует формат Mach-O .Windows использует другое фото: PE формат .

8 голосов
/ 10 февраля 2012

Маловероятно, что двоичный файл, скомпилированный для одной ОС, будет работать на другой. Либо получите бинарный файл для Mac, либо получите исходный код и скомпилируйте его самостоятельно.

Есть много вещей, которые могут вызвать проблемы - версия libc и libstdc ++, могут быть различия в версиях библиотек .so - разные интерфейсы API для самой ОС. Или даже другой двоичный формат (т. Е. Двоичные файлы VMS не работают в AIX).

2 голосов
/ 10 февраля 2012

Хотя Rad Hat Linux и Mac OS X основаны на Unix, они не могут запускать двоичные файлы друг друга.Точно так же, как вы не можете запускать двоичные файлы Windows на Mac и наоборот.

0 голосов
/ 10 февраля 2012

двоичные файлы в этом смысле компилируются для выполнения вызовов операционной системы, когда ваша программа имеет функцию printf (), которая сводится к вызовам операционной системы. Если операционная система, для которой он был скомпилирован, скажем, 64-битный RedHat Linux, то это, вероятно, означает, что двоичный файл будет искать имена RedHat Linux для общих библиотек в путях RedHAT Linux. Который не имеет абсолютно никакого отношения к совершенно другой операционной системе, Mac OS X, системным вызовам, общим или статическим библиотекам и т. Д. Это все равно, что снять колесо с мини-бондаря и попытаться его прикрутить на велосипед. Да, когда-то это был сырой металл и резина, и они могли быть превращены в велосипедную шину. Но как только вы сделаете этот двоичный файл, автомобильную шину или велосипедную шину, это то, что есть. иногда вы находите эмулятор, такой как wine, который эмулирует окна поверх системы posix. или виртуальная машина, такая как vmware, которая позволяет вам запускать совершенно другую операционную систему поверх другой, виртуализируя целый компьютер.

также верно, что вы, как правило, не можете рассчитывать на то, что вы возьмете какую-либо старую программу на Си, и она будет скомпилирована и запущена в любой операционной системе, которая, скажем, имеет компилятор gcc. да, вы можете научиться писать c-программы, которые переносимы, но вы должны тщательно придерживаться библиотек, которые поддерживаются на всех целевых платформах. поэтому даже перенос исходного кода вашей программы на mac и его компиляция не обязательно будут работать просто так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...