ARM, MIPS, PPC등 크로스 컴파일 및 바이너리 실행하기 (gcc-multilib, qemu-user-static 이용)
Ubuntu 기준으로 크로스 컴파일 하는법.
최근 여러 아키텍쳐 환경을 구성해야할 일이 있어서 메모!
1. 아래 명령어로 여러 아키텍쳐 gcc 설치 (arm, mips, ppc 등 다수 포함)
sudo apt-get install -y gcc-multilib-arm-linux-gnueabi;sudo apt-get install -y gcc-multilib-arm-linux-gnueabihf;sudo apt-get install -y gcc-multilib-mips-linux-gnu;sudo apt-get install -y gcc-multilib-mips64-linux-gnuabi64;sudo apt-get install -y gcc-multilib-mips64el-linux-gnuabi64;sudo apt-get install -y gcc-multilib-mipsel-linux-gnu;sudo apt-get install -y gcc-multilib-powerpc-linux-gnu;sudo apt-get install -y gcc-multilib-powerpc64-linux-gnu;sudo apt-get install -y gcc-multilib-s390x-linux-gnu;sudo apt-get install -y gcc-multilib-sparc64-linux-gnu
복사가 어렵다면 http://pastebin.com/iksPEaAH
2. 설치 이후 아래와 같이 컴파일
arm-linux-gnueabi-gcc -o test test.c -> arm
mips-linux-gnu-gcc -o test_mips test.c ->mips
결과
[sweetchip@ubuntu qemutest]$ file test
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=a9248b1c3ba0c940029d23e1f345d3df28f6d39b, not stripped
[sweetchip@ubuntu qemutest]$ file test_mips
test_mips: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=2e9ee6c560f47f28aa1ee329fba06e38bbb0960e, not stripped
보너스
만약 ubuntu 에서 mips나 arm 바이너리를 돌리고 싶다면 아래 명령어를 통해서 qemu를 설치한다
sudo apt-get install qemu-user-static
qemu-user-static 은 이미지를 구하지 않고도 ELF 바이너리를 돌릴수 있도록 도와주는 매우 땡큐한 툴이다.
설치 이후 가능한 목록은 아래와 같다.
[sweetchip@ubuntu qemutest]$ ls /usr/bin/qemu-
qemu-aarch64-static qemu-m68k-static qemu-mipsn32el-static qemu-ppc64-static qemu-sparc64-static
qemu-alpha-static qemu-microblazeel-static qemu-mipsn32-static qemu-ppc-static qemu-sparc-static
qemu-armeb-static qemu-microblaze-static qemu-mips-static qemu-s390x-static qemu-tilegx-static
qemu-arm-static qemu-mips64el-static qemu-or32-static qemu-sh4eb-static qemu-unicore32-static
qemu-cris-static qemu-mips64-static qemu-ppc64abi32-static qemu-sh4-static qemu-x86_64-static
qemu-i386-static qemu-mipsel-static qemu-ppc64le-static qemu-sparc32plus-static
엄청나게 많은 아키텍쳐를 지원한다.
그중 아까 컴파일한 arm과 mips를 돌려보자. (사전에 gdb-multiarch 설치 필요, apt-get 으로 설치한다.)
-> qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test -> GDBServer에 test 바이너리를 돌림 (gdb에서 target remote ip:31338 로 접근 가능)
[root@ubuntu qemutest]$ qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test
[sweetchip@ubuntu qemutest]$ gdb-multiarch
GNU gdb (Ubuntu 7.11-0ubuntu1) 7.11
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) target remote localhost:31338
Remote debugging using localhost:31338
....
(gdb) disas main
Dump of assembler code for function main:
0x00010438 <+0>: push {r11, lr}
0x0001043c <+4>: add r11, sp, #4
0x00010440 <+8>: ldr r0, [pc, #12] ; 0x10454 <main+28>
0x00010444 <+12>: bl 0x102e0 <printf@plt>
0x00010448 <+16>: mov r3, #0
0x0001044c <+20>: mov r0, r3
0x00010450 <+24>: pop {r11, pc}
0x00010454 <+28>: andeq r0, r1, r8, asr #9
End of assembler dump.
(gdb)
======================================================================================
-> qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips -> mips 바이너리 실행
[root@ubuntu qemutest]$ qemu-mips-qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips
hello world
생각보다 간편한 크로스컴파일과 실행 ㅋㅋ
아스키코드표 헥스코드표 | ascii code Hex code (64) | 2013.02.14 |
---|