Mac OS X에서 Linux 바이너리 만들기

OSXDEV

Jump to: navigation, 찾기

목차

[편집] Linux Kernel Source 설치

# tar xvjpf linux-version.tar.bz2
# cd linux-version
  • menuconfig 를 위한 Makefile 수정
# cd scripts/kconfig
# vi Makefile
  • 아래와 같이 164번째 줄 (이 아니더라도 HOSTLOADLIBES_ 근처에 ..) HOSTLOADLIBES_mconf = -lncurses -lintl 을 추가..
160 HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` 
161 HOSTCFLAGS_gconf.o  = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
162                           -D LKC_DIRECT_LINK
163 
164 HOSTLOADLIBES_mconf = -lncurses -lintl
165 
166 $(obj)/qconf.o: $(obj)/.tmp_qtcheck
167 
  • menuconfig 화면이 나타나면 Processor Type 을 i386 으로 수정하고 저장하고 나옴..

[편집] Binutils 설치

# tar xzvf binutils-2.17.tar.gz
# cd binutils-2.17
  • 타겟 호스트로 설정 (prefix 는 툴체인이 위치할 최종 루트라 생각하면 된다.. 아래와 같이 하면 jenix라는 사용자 홈디렉토리 아래 linux 아래로 bin, lib, share, include 등이 만들어지며 이 곳에 binutils 나 gnu c compiler 바이너리등이 설치된다) unknown 은 툴체인을 만드는 vendor 이름이 들어가면 되는데, 필자는 필자 닉네임으로 만들었다. 결과물들은 i386-jenix-linux-gnu-as , i386-jenix-linux-gnu-ld 등으로 나온다.
# ./configure --prefix=$HOME/linux --target=i386-unknown-linux-gnu --disable-nls
  • 컴파일
# make
# make install
  • $HOME/linux 의 bin 에 i386-unknown-linux-gnu- 로 시작하는 binutils 등이 있는지 확인한다. 리눅스 바이너리를 가져와서 테스트해보면 더 확실!
Coffee:~/linux/src jenix$ ls ../bin
i386-jenix-linux-gnu-addr2line i386-jenix-linux-gnu-ld        i386-jenix-linux-gnu-ranlib    i386-jenix-linux-gnu-strip
i386-jenix-linux-gnu-ar        i386-jenix-linux-gnu-nm        i386-jenix-linux-gnu-readelf
i386-jenix-linux-gnu-as        i386-jenix-linux-gnu-objcopy   i386-jenix-linux-gnu-size
i386-jenix-linux-gnu-c++filt   i386-jenix-linux-gnu-objdump   i386-jenix-linux-gnu-strings
Coffee:~/linux/src jenix$ 

[편집] GCC Bootstrap

  • 우선 GNU C Library 를 컴파일하기 위한 최소한의 gcc 컴파일러가 필요하다. 이 과정을 부트스트랩이라고 하는데, C 언어만 활성화하여 C Library 를 빌드하기 위한 최소한의 GCC를 만들도록 한다. GCC는 빌드를 소스 디렉토리에서 하는 것이 아니고 새로 디렉토리를 만들어 해당 디렉토리에서 GCC 소스 디렉토리의 configure 를 호출하여 컴파일 환경을 만들고 빌드를 한다. 예를들어 $HOME/linux/src/gcc-4.2.0 에 gcc 소스를 풀어두었다면 $HOME/linux/src/build_gcc_core 라는 디렉토리를 만들고 해당 디렉토리를 이동하여 아래와 같이 configure, make 를 하도록 한다.
  #  ../gcc-4.2.0/configure --disable-multilib \
                                                --with-newlib \
                                                --disable-nls \
                                                --enable-threads=no \
                                                --enable-symvers=gnu \
                                                --enable-__cxa_atexit \
                                                --enable-languages=c \
                                                --disable-shared \
                                                --prefix=$HOME/linux --target=i386-unknown-linux-gnu
  # make all-gcc
  # make install-gcc

(필자는 역시 unknow 부분을 jenix로 하였다.)

  • gcc 가 설치된 것 확인
Coffee:~/linux/bin jenix$ ls
i386-jenix-linux-gnu-addr2line i386-jenix-linux-gnu-gcc       i386-jenix-linux-gnu-nm        i386-jenix-linux-gnu-size
i386-jenix-linux-gnu-ar        i386-jenix-linux-gnu-gcc-4.2.0 i386-jenix-linux-gnu-objcopy   i386-jenix-linux-gnu-strings
i386-jenix-linux-gnu-as        i386-jenix-linux-gnu-gccbug    i386-jenix-linux-gnu-objdump   i386-jenix-linux-gnu-strip
i386-jenix-linux-gnu-c++filt   i386-jenix-linux-gnu-gcov      i386-jenix-linux-gnu-ranlib
i386-jenix-linux-gnu-cpp       i386-jenix-linux-gnu-ld        i386-jenix-linux-gnu-readelf
Coffee:~/linux/bin jenix$

[편집] GNU C Library

  • config.cache
  1 libc_cv_forced_unwind=yes
  2 libc_cv_c_cleanup=yes
  3 libc_cv_linux2010='2.0.10 or later'
  4 libc_minimum_kernel=ok
  • configure command
BUILD_CC=gcc CC="${TARGET_GCC}-gcc" AR=${TARGET_GCC}-ar RANLIB=${TARGET_GCC}-ranlib ../glibc-2.6/configure --prefix=/usr --host=i386-jenix-linux-gnu --without-cvs --disable-profile --disable-debug --without-gd --with-headers=$HOME/linux/usr/include --enable-shared --build=i386-apple-darwin -C
  • build
554 make LD=${TARGET}-ld RANLIB=${TARGET}-ranlib $GLIBC_INITIAL_BUILD_RULE
555 make install_root=${SYSROOT} $GLIBC_SYSROOT_ARG $GLIBC_INITIAL_INSTALL_RULE
  • 휴 -_- 일단 정리는.. 빌드 완료되면.. --;;

[편집] GCC Post