Подтвердить что ты не робот

Есть ли способ использовать gcc для преобразования C в MIPS?

Я завершил преобразование C в MIPS для класса, и я хочу проверить его на сборку. Я слышал, что есть способ настройки gcc, чтобы он мог конвертировать C-код в архитектуру MIPS, а не в архитектуру x86 (мои пользователи компьютеров - процессор Intel i5) и выводит результат.

Запуск терминала в Ubuntu (который поставляется с gcc), какую команду я использую для настройки gcc для преобразования в MIPS? Есть ли что-нибудь, что мне нужно для установки?

EDIT: Позвольте пояснить. Пожалуйста прочтите это. Я не ищу, какой компилятор использовать, или люди, говорящие "хорошо, что вы можете перекрестно скомпилировать, но вместо этого вы должны использовать эту другую вещь, у которой нет инструкций по настройке".

Если вы собираетесь опубликовать это, по крайней мере, обратитесь к инструкциям. GCC пришел с Ubuntu. У меня нет опыта в том, как устанавливать компиляторы, и это нелегко найти онлайн-учебники для чего угодно, кроме GCC. Тогда есть случай кросс-компиляции, о котором я должен знать. Спасибо.

4b9b3361

Ответ 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
    ...