Ram*_*esh 6 compiling cross-compilation mips assembly
当我运行我的 C 程序时,我需要在我的机器上生成MIPS特定的代码。当我简单地奔跑时,
gcc -O2 -S -c hello.c
Run Code Online (Sandbox Code Playgroud)
在我的系统上,我得到了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
Run Code Online (Sandbox Code Playgroud)
如何在我的机器上生成MIPS特定代码?
我的机器详细信息如下。
arch
x86_64
Run Code Online (Sandbox Code Playgroud)
Ram*_*esh 12
从MIPS架构的wiki条目,它被描述为,
MIPS(最初是 Microprocessor without Interlocked Pipeline Stages 的首字母缩写词)是由 MIPS Technologies(前身为 MIPS Computer Systems, Inc.)开发的精简指令集计算机 (RISC) 指令集 (ISA)。
从x86-64的wiki条目中,它被描述为,
x86-64(也称为 x64、x86_64 和 AMD64)是 x86 指令集的 64 位版本。
因此,根据问题中的arch
输出,很明显我有一台x86_64机器,我尝试在运行编译器后生成MIPS架构特定代码gcc
。
这类似于在汽油发动机上尝试和运行柴油车。无论我们多么努力,如果不调整燃气发动机,我们就无法在汽油发动机上运行柴油车。
用技术的方式来描述它,gcc
可以产生大量架构的汇编代码,包括MIPS。但是给定gcc
实例的目标是什么架构是在gcc
编译时决定的。您将在 Ubuntu 系统中找到的预编译二进制文件了解x86(可能包括 32 位和 64 位模式)但不了解MIPS。
再次引用同一个答案,gcc
使用与gcc
自身将运行的架构不同的目标架构进行编译被称为准备交叉编译工具链。或者通俗地说,这个交叉编译工具链类似于调整汽油发动机以运行柴油车。
然而,设置交叉编译工具链是一项相当繁重的工作,因此我将介绍如何将本机 MIPS 编译器安装到 MIPS 虚拟机中,而不是描述如何设置它。这涉及为 VM 设置模拟器并将操作系统安装到该环境中的附加步骤,但将允许您使用预先构建的本机编译器而不是编译交叉编译器。
我们将首先安装qemu
以使我们的系统运行一些虚拟化的操作系统。同样有几种方法,比如安装一些交叉编译的工具链,如这里讨论的那样,并使用我之前链接的答案中建议的 buildroot。
下载 tar ball 后,运行以下命令。
bzip2 -d qe*
tar -xvf qe*
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)qemu
机器上安装后,我按照此处和
此处的建议尝试了几种针对 debian 操作系统的网络引导方法
。但不幸的是,我无法使用网络引导执行 debian 操作系统安装,因为正确的镜像不可用。我有一个关于debian从针对MIPS架构的图像
在这里,我下载的kernel
和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"
Run Code Online (Sandbox Code Playgroud)在 debian 系统上来后,我安装了gcc
如下编译器。
apt-get update && apt-get upgrade
apt-get install build-essential
Run Code Online (Sandbox Code Playgroud)现在,我gcc
在 qemu 上的 MIPS debian 虚拟机中有一个完美运行的本地编译器,它将我的 C 程序编译为MIPS特定的汇编代码。
在我的 debian 机器中,我只是放入了一个示例 C hello world 程序并将其保存hello.c
如下。
#include<stdio.h>
int main()
{
printf("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
为了为我的 hello.c 程序生成 MIPS 架构代码,我使用gcc
编译器运行了 C 程序,
gcc -O2 -S -c hello.c
Run Code Online (Sandbox Code Playgroud)
上面的命令生成了一个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"
Run Code Online (Sandbox Code Playgroud)
但是我怎么知道上面生成的代码是MIPS汇编代码呢?
该arch
命令的输出会告诉机器的体系结构。在我的 debian 机器中,它产生的输出为mips
,我也没有binutils
在机器中安装任何或交叉编译器工具链。
因此,生成的汇编代码是特定于MIPS 的。