Сгенерировать код сборки архитектуры MIPS на машине X86

Мне нужно создать специальный код MIPS на моей машине, когда я запускаю свою программу на C. Когда я просто бегу,

gcc -O2 -S -c hello.c 

В моей системе я получаю hello.s который, кажется, генерирует некоторый код сборки, но, похоже, это не код MIPS . Содержимое файла hello.s выглядит следующим образом.

  .file "hello.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "Hello world" .text .p2align 4,,15 .globl main .type main, @function main: .LFB11: .cfi_startproc movl $.LC0, %edi xorl %eax, %eax jmp printf .cfi_endproc .LFE11: .size main, .-main .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)" .section .note.GNU-stack,"",@progbits 

Как я могу создать специальный код MIPS на моей машине?

Моя информация о машине приведена ниже.

 arch x86_64 


Понимание основ


Из вики- записи архитектуры MIPS она описана как,

MIPS (первоначально аббревиатура для микропроцессора без блокированных конвейеров) представляет собой набор инструкций по сокращению набора команд (RISC) (ISA), разработанный MIPS Technologies (ранее MIPS Computer Systems, Inc.).

Из wiki- записи x86-64 он описывается как,

x86-64 (также известный как x64, x86_64 и AMD64) – это 64-разрядная версия набора инструкций x86.

Таким образом, в соответствии с выпуском arch в вопросе, очевидно, что у меня есть машина x86_64, и я пытаюсь создать конкретный код архитектуры MIPS после запуска gcc компилятора.

Это похоже на попытку и запуск дизельного автомобиля на бензиновом двигателе . Как бы мы ни старались, не настраивая газовый двигатель, мы не могли управлять дизельным двигателем на бензиновом двигателе.

Чтобы описать его технически , gcc может создавать код сборки для большого количества архитектур, включая MIPS . Но какая архитектура заданных целевых объектов gcc определяется при компиляции самой gcc . Предварительно скомпилированный двоичный файл, который вы найдете в системе Ubuntu, знает о x86 (возможно, как в 32-битном, так и в 64-битном режимах), но не в MIPS .


Как скомпилировать программу C для кода сборки MIPS


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

Однако создание кросс-компиляционной инструментальной цепочки – это довольно много работы, поэтому вместо описания того, как это установить, я опишу, как установить собственный MIPS-компилятор в виртуальную машину MIPS. Это включает в себя дополнительные шаги по настройке эмулятора для виртуальной машины и установке ОС в эту среду, но позволит вам использовать встроенный компилятор, а не компилировать кросс-компилятор.

Сначала мы будем устанавливать qemu чтобы наша система запускала некоторые виртуализированные операционные системы. Опять же есть несколько подходов, таких как установка некоторой скрещенной скомпилированной цепочки инструментов, как описано здесь, и использование buildroot, как это было предложено в ответе, который я ранее связал.

  • Загрузите tar-мяч из qemu .
  • После загрузки tar-шара выполните следующие команды.

      bzip2 -d qe* tar -xvf qe* ./configure make make install 
  • Теперь, после установки qemu на машине, я попробовал несколько методов netboot для debian OS, как это предлагается здесь и здесь . Но, к сожалению, я не смог выполнить установку debian OS с помощью netboot, потому что правильные зеркала были недоступны.

Я получил изображение для debian, которое нацелено на архитектуру MIPS, и я загрузил изображение kernel и qemu и из приведенной выше ссылки и выполнил следующие шаги.

  • Я начал qemu как qemu ниже.

     qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" 
  • После того как система debian подошла, я установил gcc компилятор, как gcc ниже.

     apt-get update && apt-get upgrade apt-get install build-essential 

Теперь у меня есть отлично работающий родной компилятор gcc внутри виртуальной машины debian MIPS на qemu, который компилирует мою программу C в специальный код сборки MIPS .


тестирование


Внутри моей дебианской машины я просто поместил образец программы приветствия hello world и сохранил ее как hello.c как hello.c ниже.

 #include<stdio.h> int main() { printf("Hello World"); } 

Чтобы генерировать код архитектуры MIPS для моей программы hello.c, я запускал программу C с помощью компилятора gcc ,

 gcc -O2 -S -c hello.c 

Вышеупомянутая команда сгенерировала файл hello.s который сгенерировал мой код архитектуры MIPS .

  .file 1 "hello.c" .section .mdebug.abi32 .previous .gnu_attribute 4, 1 .abicalls .section .rodata.str1.4,"aMS",@progbits,1 .align 2 $LC0: .ascii "Hello World\000" .text .align 2 .globl main .set nomips16 .ent main .type main, @function main: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 .set noreorder .set nomacro lui $28,%hi(__gnu_local_gp) addiu $28,$28,%lo(__gnu_local_gp) lui $4,%hi($LC0) lw $25,%call16(printf)($28) nop jr $25 addiu $4,$4,%lo($LC0) .set macro .set reorder .end main .size main, .-main .ident "GCC: (Debian 4.4.5-8) 4.4.5" 

Но как я узнаю, является ли вышеописанный код кодом сборки MIPS ?

Вывод команды arch укажет архитектуру машины. В моей машине debian он выводит выходные данные как mips и у меня также нет никаких binutils или цепей инструментов кросс-компилятора, установленных в машине.

Таким образом, сгенерированный код сборки специфичен для MIPS .

Вам нужна перекрестная toolchain, gcc (+ binutils), которая запускается на x86_64, но выводит двоичные файлы mips.

Вы можете попытаться построить его самостоятельно с нуля (Google для примеров: build cross toolchain) или загрузить готовый (например, из Codesourcery )

Или вы можете создать свой собственный с помощью некоторого инструмента, такого как crosstool-ng

Также такие системы, как buildroot, строят (или загружают) свою собственную перекрестную цепочку (я думаю, также OpenWRT).

Проект emdebian проделал определенную работу над перекрестными инструментальными целями .

Поскольку эти пакеты сильно страдают от бит-гниения, я бы спросил о текущем статусе с проектом emdebian, либо по списку рассылки, либо по IRC.