Embedded 환경 용 GDB 컴파일하기

컴퓨터 학습 2017. 4. 3. 10:34

embedded system에서 작업하다 보면 GDB의 도움이 절실할 때가 많다. 물론 개발 시 제공되는 Toolchain에 GDB가 끼어 오는 경우도 많지만 그렇지 않은 경우도 있고, 혹은 이상하게 real-time debugging이 맞지 않는 경우가 많다. 특히 memory가 적은 embedded system의 경우 system 자체에서 GDB를 돌리지 못하는 경우도 은근히 많아서 이럴 때엔 'System에서는 GDB server를 돌리고 개발 서버쪽에서 GDB를 돌려서' 디버깅해야 하는 경우도 많은데 이럴 경우 구버전 GDB면 동작하지 않는 경우도 적잖다.


그래서 개발할 때 그 system에 해당하는 toolchain이 바뀔 때 마다 GDB compile을 따로 하는 게 버릇처럼 되어서 여기에 기록해 놓도록 한다. 여기서 GDB는 embedded용으로 작성되었지만 실행은 개발 서버에서 도는 방식이다.


1. GDB를 다운로드받고 특정 디렉토리에 푼다. 그리고 그 디렉토리로 간다.

2. embedded system에 맞는 환경으로 configure를 맞춘다. 여기서 embedded가 MIPS인 것으로 가정한다.

   ./configure --host=i686-pc-linux-gnu --target=mipsel-linux-uclibc --with-expat=/usr/local/lib/

3. GDB 를 컴파일 한다.

   make

4. GDB server 디렉토리로 들어간다.

   cd gdb/gdbserver

5. GDB server용 configure를 맞춘다. 여기서 주의할 것은 위의 GDB는 'PC에서 실행'임에 반해 GDBserver는 'embedded system에서 실행'하는 물건이다.

   ./configure --host=mipsel-linux-uclibc --target=mipsel-linux-uclibc --build=i686-pc-linux-gnu

6. GDB server를 컴파일한다.

   make

7. strip으로 gdb와 gdbserver의 size를 줄인다. 특히 gdbserver는 embedded system에서 돌아가야 하는 것이기에 반드시 줄여야 한다.

GDB는 개발 PC에 들어있는 PC용 strip을, GDBserver는 Toolchain에서 제공하는 embedded system용 strip을 써야 한다. ('어디서' 실행시키는가를 생각하면 당연하다)

   strip ./gdb

   mipsel-linux-strip ./gdbserver


여기서는 MIPS를 예를 들었지만 ARM도 동일하다. mipsel-linux-uclibc 라고 된 것은 toolchain에 제공하는 pre-fix이고, 다른 system용으로는 그에 맞는 pre-fix를 찾아 쓰면 된다. (arm-linux-gnueabihf)



: