생성해야 해요MeapsC 프로그램을 실행할 때 내 컴퓨터에 특정 코드가 있습니다. 막 달리고 있을 때,
gcc -O2 -S -c hello.c
내 시스템에서는 hello.s
일부 어셈블리 코드를 생성하는 것 같지만 그렇지 않은 것 같습니다.Meaps특정 코드. 파일의 내용은 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
어떻게 생성할 수 있나요?Meaps내 컴퓨터에 특정 코드가 있나요?
내 컴퓨터 세부 정보는 다음과 같습니다.
arch
x86_64
답변1
기본 사항 알아보기
~에서위키피디아MIPS 아키텍처의 진입점은 다음과 같습니다.
MIPS(원래는 Interlocked Pipeline Stages가 없는 마이크로프로세서)는 MIPS Technologies(이전 MIPS Computer Systems, Inc.)에서 개발한 RISC(Reduced Instruction Set Computer) ISA(명령 세트)입니다.
~에서위키피디아x86-64에 대한 항목은 다음과 같이 설명됩니다.
x86-64(x64, x86_64 및 AMD64라고도 함)는 x86 명령어 세트의 64비트 버전입니다.
따라서 arch
질문의 결과를 바탕으로 내가x86_64내가 만들려고 하는 기계Meaps컴파일러를 실행한 후의 아키텍처별 코드입니다 gcc
.
이는 다음과 유사합니다.가솔린 엔진으로 디젤 자동차를 운전해 보세요.. 아무리 노력해도 가스 엔진을 튜닝하지 않고는 가스 엔진으로 디젤 자동차를 운행할 수 없습니다.
기술적인 용어로 설명하기, gcc
다음을 포함한 광범위한 아키텍처에 대한 어셈블리 코드를 생성할 수 있습니다.Meaps. 그러나 특정 인스턴스 gcc
의 대상 아키텍처는 gcc
컴파일 타임에 결정됩니다. Ubuntu 시스템의 사전 컴파일된 바이너리 다음에 대해 알아보세요.x86(아마도 32비트 및 64비트 모드 모두) 그러나 그렇지 않음Meaps.
C 프로그램을 MIPS 어셈블리 코드로 컴파일하는 방법
다시 인용같은 대답, 기본적으로 실행될 아키텍처 gcc
와 다른 gcc
대상 아키텍처로 컴파일하는 것을 크로스 컴파일 도구 체인 준비라고 합니다. 아니면 평신도의 말로,이 크로스 컴파일 툴체인은 디젤 자동차를 작동시키기 위해 가솔린 엔진을 튜닝하는 것과 유사합니다..
그러나 크로스 컴파일 툴체인을 설정하는 것은 상당히 지루한 작업이므로 설정 방법보다는 기본 MIPS 컴파일러를 MIPS 가상 머신에 설치하는 방법을 설명하겠습니다. 여기에는 가상 머신용 에뮬레이터를 설정하고 운영 체제를 해당 환경에 설치하는 추가 단계가 포함되지만, 크로스 컴파일러를 컴파일하는 대신 미리 빌드된 네이티브 컴파일러를 사용할 수 있습니다.
qemu
먼저 시스템에서 가상화된 운영 체제를 실행하도록 설치하겠습니다 . 다시 말하지만, 크로스 컴파일된 툴체인을 설치하는 등 여러 가지 방법이 있습니다.여기서 토론하세요그리고빌드 루트 사용이전에 링크한 답변에서 제안한 대로.
- tar 패키지 다운로드게임여기에서.
tar ball을 다운로드한 후 다음 명령을 실행합니다.
bzip2 -d qe* tar -xvf qe* ./configure make make install
qemu
이제 컴퓨터에 설치한 후 제안된 대로 데비안 OS에 대한 여러 네트워크 부팅 방법을 시도했습니다.여기그리고 여기. 하지만 안타깝게도 올바른 이미지가 없기 때문에 네트워크 부팅을 사용하여 데비안 OS 설치를 수행할 수 없습니다.
MIPS 아키텍처용 Debian 이미지를 얻었습니다.
여기위 링크에서 이미지를 다운로드하고 아래 단계를 따랐습니다 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"
데비안 시스템이 시작된 후
gcc
다음 컴파일러를 설치했습니다.apt-get update && apt-get upgrade apt-get install build-essential
이제 gcc
qemu의 MIPS 데비안 가상 머신에 완벽하게 작동하고 C 프로그램을 다음과 같이 컴파일하는 기본 컴파일러가 있습니다.Meaps특정 어셈블리 코드.
시험
내 데비안 컴퓨터에 샘플 C hello world 프로그램을 넣고 아래와 같이 저장했습니다 hello.c
.
#include<stdio.h>
int main()
{
printf("Hello World");
}
hello.c 프로그램에 대한 MIPS 아키텍처 코드를 생성하기 위해 gcc
컴파일러를 사용하여 다음과 같이 C 프로그램을 실행합니다.
gcc -O2 -S -c hello.c
위 명령은 hello.s
내 파일을 생성하는 파일을 생성했습니다.Meaps스키마 코드.
.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"
하지만 위에서 생성된 코드가 다음과 같은지 어떻게 알 수 있나요?Meaps조립코드?
이 arch
명령의 출력은 머신의 아키텍처를 알려줍니다. 내 데비안 컴퓨터에서 생성되는 출력은 다음 과 같으며 컴퓨터에 크로스 컴파일러 도구 체인이 설치되어 mips
있지도 않습니다 .binutils
따라서 생성된 어셈블리 코드는 다음과 같습니다.Meaps특정한.
답변2
x86_64에서 실행되지만 mips 바이너리를 출력하는 크로스 툴체인 gcc(+binutils)가 필요합니다.
처음부터 직접 구축해 보거나(예: google: Build cross toolchain) 사전 구축된 툴체인을 다운로드할 수 있습니다(예:코드 소스)
또는 다음과 같은 도구를 사용할 수 있습니다.크로스툴-ng
이런 시스템도 있어요루트 디렉터리 구축자체 크로스 툴체인을 구축(또는 다운로드)합니다(OpenWRT도 제 생각에는 그렇습니다).