Есть ли способ использовать gcc для преобразования C в MIPS?
Я завершил преобразование C в MIPS для класса, и я хочу проверить его на сборку. Я слышал, что есть способ настройки gcc, чтобы он мог конвертировать C-код в архитектуру MIPS, а не в архитектуру x86 (мои пользователи компьютеров - процессор Intel i5) и выводит результат.
Запуск терминала в Ubuntu (который поставляется с gcc), какую команду я использую для настройки gcc для преобразования в MIPS? Есть ли что-нибудь, что мне нужно для установки?
EDIT:
Позвольте пояснить. Пожалуйста прочтите это.
Я не ищу, какой компилятор использовать, или люди, говорящие "хорошо, что вы можете перекрестно скомпилировать, но вместо этого вы должны использовать эту другую вещь, у которой нет инструкций по настройке".
Если вы собираетесь опубликовать это, по крайней мере, обратитесь к инструкциям. GCC пришел с Ubuntu. У меня нет опыта в том, как устанавливать компиляторы, и это нелегко найти онлайн-учебники для чего угодно, кроме GCC. Тогда есть случай кросс-компиляции, о котором я должен знать. Спасибо.
Ответы
Ответ 1
GCC может создавать код сборки для большого количества архитектур, включая MIPS. Но какая архитектура заданных целевых объектов GCC определяется, когда сам GCC компилируется. Предварительно скомпилированный двоичный файл, который вы найдете в системе Ubuntu, знает о x86 (возможно, как в 32-битном, так и в 64-битном режимах), но не в MIPS.
Компиляция GCC с целевой архитектурой, отличной от архитектуры, на которой будет работать сам GCC, называется подготовкой инструментальной привязки кросс-компиляции. Это выполнимо, но требует довольно много документации - чтения и терпения; вам обычно нужно сначала построить кросс-ассемблер и сшивающий агент (GNU binutils), а затем построить сам кросс-GCC.
Я рекомендую использовать buildroot. Это набор скриптов и make файлов, предназначенных для создания полной кросс-компиляции toolchain и утилит. В конце дня вы получите полную ОС и инструменты для разработки целевой системы. Это включает в себя кросс-компилятор, который вы используете.
Другое совершенно другое решение - использовать QEMU. Это эмулятор для различных процессоров и систем, включая системы MIPS. Вы можете использовать его для запуска виртуальной машины с процессором MIPS и на этой машине установить операционную систему для MIPS, например. Debian, дистрибутив Linux. Таким образом, вы получаете собственный GCC (GCC, работающий в системе MIPS и создающий код для MIPS).
Способ QEMU может быть немного проще; использование кросс-компиляции требует некоторого понимания некоторых волосатых деталей. В любом случае вам понадобится около 1 ГБ свободного места на диске.
Ответ 2
Это не конфигурация, вам нужна версия GCC, которая кросс-компиляции в MIPS. Для этого требуется специальная сборка GCC и довольно волосатая для создания (создание GCC не для слабонервных).
Я бы рекомендовал использовать LCC. Легче сделать кросс-компиляцию с LCC, чем с GCC, а построение LCC - это вопрос секунд на текущих машинах.
Ответ 3
Вам нужно будет загрузить исходный код в binutils и gcc-core и скомпилировать что-то вроде ../configure --target=mips ...
. Вам может потребоваться выбрать конкретную цель MIPS. Затем вы можете использовать mips-gcc -S
.
Ответ 4
Вы можете перекрестно скомпилировать GCC, чтобы он генерировал код MIPS вместо x86. Это хороший опыт обучения.
Если вам нужны быстрые результаты, вы также можете получить готовый GCC с поддержкой MIPS. Один из них - Codechourder Lite Toolchain. Он бесплатный, поставляется с множеством архитектур (включая MIPS), и они готовы использовать двоичные файлы для Linux и Windows.
http://www.codesourcery.com/sgpp/lite/mips/portal/[email protected]=lite
Ответ 5
Вы должны скомпилировать свою собственную версию gcc, которая может перекрестно скомпилировать. Конечно, это непросто, поэтому вы можете искать другой подход. Например этот SDK.
Ответ 6
Вам следует установить кросс-компилятор из репозиториев Ubuntu. В репозиториях предусмотрено четыре кросс-компилятора GCC MIPS C. Выберите в соответствии с вашими потребностями:
gcc-mips-linux-gnu
- 32-разрядный двоичный код.
gcc-mipsel-linux-gnu
- 32-разрядная последовательность байтов с прямым порядком байтов.
gcc-mips64-linux-gnuabi64
- 64-разрядный байтовый код.
gcc-mips64el-linux-gnuabi64
- 64-битная последовательность байтов с прямым порядком байтов.
(Примечание для пользователей Debian: если вы обычно хотите устанавливать обычные компиляторы с помощью пакета build-essential
, вам будет интересно узнать о существовании crossbuild-essential-mips
, crossbuild-essential-mipsel
и crossbuild-essential-mips64el
)
В следующих примерах я буду предполагать, что вы выбрали 32-разрядную версию с прямым порядком байтов (sudo apt-get install gcc-mipsel-linux-gnu
). Команды для других версий MIPS аналогичны.
Чтобы работать с MIPS вместо собственной архитектуры вашей системы, используйте команду mipsel-linux-gnu-gcc
вместо gcc
. Например, mipsel-linux-gnu-gcc -fverbose-asm -S myprog.c
создает файл myprog.s
, содержащий сборку MIPS.
Другой способ увидеть сборку MIPS: запустить mipsel-linux-gnu-gcc -g -c myprog.c
для создания объектного файла myprog.o
, который содержит информацию об отладке. Затем просмотрите разборку объектного файла, используя mipsel-linux-gnu-objdump -d -S myprog.o
. Например, если myprog.c
это:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("The answer is: %d\n", a + b);
return 0;
}
И если он скомпилирован с использованием mipsel-linux-gnu-gcc -g -c myprog.c
, то mipsel-linux-gnu-objdump -d -S myprog.o
покажет что-то вроде этого:
myprog.o: file format elf32-tradlittlemips
Disassembly of section .text:
00000000 <main>:
#include <stdio.h>
int main() {
0: 27bdffd8 addiu sp,sp,-40
4: afbf0024 sw ra,36(sp)
8: afbe0020 sw s8,32(sp)
c: 03a0f025 move s8,sp
10: 3c1c0000 lui gp,0x0
14: 279c0000 addiu gp,gp,0
18: afbc0010 sw gp,16(sp)
int a = 1;
1c: 24020001 li v0,1
20: afc20018 sw v0,24(s8)
int b = 2;
24: 24020002 li v0,2
28: afc2001c sw v0,28(s8)
printf("The answer is: %d\n", a + b);
2c: 8fc30018 lw v1,24(s8)
30: 8fc2001c lw v0,28(s8)
34: 00621021 addu v0,v1,v0
38: 00402825 move a1,v0
3c: 3c020000 lui v0,0x0
40: 24440000 addiu a0,v0,0
44: 8f820000 lw v0,0(gp)
48: 0040c825 move t9,v0
4c: 0320f809 jalr t9
50: 00000000 nop
54: 8fdc0010 lw gp,16(s8)
return 0;
58: 00001025 move v0,zero
}
5c: 03c0e825 move sp,s8
60: 8fbf0024 lw ra,36(sp)
64: 8fbe0020 lw s8,32(sp)
68: 27bd0028 addiu sp,sp,40
6c: 03e00008 jr ra
70: 00000000 nop
...