Компиляция программы C с определенной архитектурой

Я недавно боролся с некоторыми проблемами, пытающимися скомпилировать библиотеку с открытым исходным кодом по моему Mac, который зависел от другой библиотеки и получил некоторые ошибки о несовместимой архитектуре библиотеки. Кто-то может объяснить понятие позади компиляции программы C для определенной архитектуры? Я видел -arch флаг компилятора прежде и видел, что значения передали ему такой как ppc, i386 и x86_64 который я принимаю карты к ЦП "язык", но мое понимание останавливается там. Если одна программа использует конкретную архитектуру, все библиотеки, что она загружает потребность быть на той же архитектуре также? Как я могу сказать, под какой архитектурой данная программа/процесс работает?

13
задан Marplesoft 13 March 2010 в 00:37
поделиться

4 ответа

Может ли кто-нибудь объяснить концепцию компиляции программы на C для конкретной архитектуры?

Да. Идея состоит в том, чтобы преобразовать C в последовательность машинных инструкций, в которых программа закодирована в двоичной форме. Под «архитектурой» здесь понимается «архитектура с набором инструкций», то есть как инструкции кодируются в двоичном формате. Например, в каждой архитектуре есть свой способ кодирования инструкции, которая складывает два целых числа.

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

Если одна программа использует определенную архитектуру, все ли загружаемые библиотеки должны быть на одной архитектуре?

Да. (Исключения существуют, но они редки.)

Как я могу определить, на какой архитектуре работает данная программа / процесс?

Если процесс запущен на вашем оборудовании, он работает на собственной архитектуре, которую вы используете в Unix. можно обнаружить, запустив команду uname -m , хотя для читателя-человека вывод из uname -a может быть более информативным.

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

% file /lib/libm-2.10.2.so 
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

Вы можете видеть, что эти двоичные файлы были скомпилированы для самой старая архитектура 80386, хотя у меня оборудование более современное i686. I686 (Pentium Pro) обратно совместим с 80386 и запускает двоичные файлы 80386, а также собственные двоичные файлы.Чтобы сделать эту обратную совместимость возможной, Intel пошла на большие хлопоты и расходы, но они практически загнали в угол рынок процессоров для настольных ПК, так что это того стоило!

16
ответ дан 1 December 2019 в 22:38
поделиться

Одна вещь, которая может сбить с толку, заключается в том, что платформа Mac имеет то, что они называют универсальным двоичным файлом, который на самом деле представляет собой два двоичных файла в одном архиве, один для архитектуры intel, а другой для архитектуры ppc. Ваш компьютер автоматически решит, какой из них запустить. Вы можете (иногда) запустить двоичный файл для другой архитектуры в режиме эмуляции, а некоторые архитектуры являются надмножествами других (т.е. код i386 обычно работает на i486, i586, i686 и т.д.), но в основном вы можете запускать только код для архитектуры вашего процессора.

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

3
ответ дан 1 December 2019 в 22:38
поделиться

Для сборки с архитектурой, отличной от собственной архитектуры вашего ЦП, вам понадобится кросс-компилятор, что означает, что сгенерированный код не может выполняться изначально на машина, на которой ты сидишь. GCC может с этим справиться. Чтобы узнать, для какой архитектуры построена программа, проверьте команду file. По крайней мере, в системах на базе Linux 32-битная программа x86 потребует 32-битных библиотек x86 для работы с ней. Думаю, для большинства ОС так же.

1
ответ дан 1 December 2019 в 22:38
поделиться

Поможет ли ldd в этом случае?

1
ответ дан 1 December 2019 в 22:38
поделиться