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

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

Ответ 1

Может кто-нибудь объяснить концепцию компиляции программы 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 столкнулась с большими проблемами и расходами, но они практически загнали рынок настольных процессоров, поэтому он того стоил!

Ответ 2

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

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

Ответ 3

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

Ответ 4

Помогает ли ldd помощь?