Mac OS X에서 Linux 바이너리 만들기
OSXDEV
목차 |
[편집] Linux Kernel Source 설치
- 다운로드 : http://kernel.org (최신버젼:2.6.21.5)
- 소스풀기
# 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
- 휴 -_- 일단 정리는.. 빌드 완료되면.. --;;




