상세 컨텐츠

본문 제목

ARM, MIPS, PPC등 크로스 컴파일 및 바이너리 실행하기 (gcc-multilib, qemu-user-static 이용)

0x00 프로그래밍/0x01 c, c++

by sweetchip 2016. 5. 9. 14:30

본문

반응형

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



생각보다 간편한 크로스컴파일과 실행 ㅋㅋ

반응형

관련글 더보기