컴퓨터공부/Linux & Unix

GCC 3.4 / GCC 3.3 / GCC 2.95 크로스컴파일러 설치방법

achivenKakao 2007. 4. 28. 03:56

아래의 다섯개를 깔아야 한다..

1) binutils : 어셈블러 및 로더 기타 툴 ( GNU )

2) glibc : 크로스 컴파일 구축을 위한 라이브러리 및 일반 라이브러리

3) gcc : 컴파일러

4) 커널 : 커널 쏘스

5) gdb : 디버거

================
=========================================================================================



 

크로스컴파일러 GCC 3.4 구축방법


1. 개요.

 

   이 문서는 ARM 용 크로스 컴파일 환경을 구축하기 위한 방법의 하나로 GNU에서 제공하는 소스 패케지를 이용하여 구성하는 방식에 대하여 기술한 문서입니다.

 커널 2.6 이상을 컴파일 하기 위해선 gcc3.3 이상의 버전을 요구합니다 그러나 컴파일러를 설치 하기 위해 필요한 커널 소스는 2.6이 아니어도 무방합니다.

 

 2. 구해야 할 프로그램소스.

 

리눅스를 이용한 크로스 컴파일 환경을 구축 하기 위해서는 다음과 같은 패케지가 필요로 하고 이 패케지들의 모음을 일반적으로 크로스 컴파일 툴 체인이라고도 한다.

 

1) binutils : 어셈블러 및 로더 기타 툴 ( GNU )

2) glibc : 크로스 컴파일 구축을 위한 라이브러리 및 일반 라이브러리

3) gcc : 컴파일러

4) 커널 : 커널 쏘스

5) gdb : 디버거

     binutils-2.15.91.0.1

     gcc-3.4.2

     gdb-6.3

     glibc-2.3.3

     glibc-linuxthreads-2.3.3

 

3. 구할수 있는곳.

 

1) binutils   : 어셈블러 및 로더 기타 툴 ( GNU )

ftp://ftp.kernel.org/pub/linux/devel/binutils/binutils-2.15.91.0.1.tar.bz2

2) glibc      : 크로스 컴파일 구축을 위한 라이브러리 및 일반 라이브러리

  ftp://ftp.gnu.org/gnu/glibc/glibc-2.3.3.tar.bz2

  ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.3.tar.bz2

3) gcc        : 컴파일러

  ftp://ftp.gnu.org/gnu/gcc/gcc-3.4.2/gcc-3.4.2.tar.bz2

4) gdb      : 디버거    

 ftp://ftp.gnu.org/gnu/gdb/gdb-6.3.tar.gz

 

4. 설치 전 주의 사항

   각 설치되는 패케지들의 의존 관계가 있기 때문에 진행하는 순서는 꼭! 지켜야 합니다.

   설치는 root 권한으로 하시기 바랍니다

   root 권한으로 설치하므로 자칫 실수로 인해 시스템을 날려버릴 수 있으므로 주의

   ( chattr +i /lib   <- 라이브러리를 못 지우게 함)

 

5. 설치 전 작업

 

설치하려고 하는 리눅스 머신에 다음 디렉토리를 만듭니다.

 

    mkdir -p work/cross3.4/

    (work/cross3.4/ 디렉토리 는 각자 적당한 디렉토리명을 선택.)

    work/build/ 에 다운 받은 화일을 가져다 놓습니다.

binutils-2.15.91.0.1

     gcc-3.4.2

     gdb-6.3

     glibc-2.3.3

     glibc-linuxthreads-2.3.3

등 총 5개가 됩니다.

 

6. 커널 소스 설치.

 

커널 소스를 Binutils 패케지 다음에 설치하는 이유는 헤더 화일 때문입니다.

다음의 소스를 work/ 에 가져다 놓습니다.

linux-2.4.18.tar.gz

patch-2.4.18-rmk7.gz

patch-2.4.18-rmk7-evm2440a.gz

 

먼저 커널소스를 풉니다.

tar -zxvf linux-2.4.18.tar.gz

생성된 디렉토리의 이름을 변경

mv linux linux-evm2440a

cd linux-evm2440a

먼저 Arm용으로 패치 합니다

gzip -cd ../ patch-2.4.18-rmk7.gz | patch -p1

보드에 맞게 다시 패치를 합니다.

gzip -cd ../patch-2.4.18-rmk7-evm2440a.gz | patch -p1

커널 설정을 합니다.

make xconfig  (취향에 따라 .)

보드 설정에 맞게 초기화 파일을 로드 합니다

Load Configuration from File  -> myconfig

일단 저장 후 빠져나옵니다.

Save and Exit

 

7. GDB 패케지 설치

GDB는 크로스 컴파일 툴체인의 순서와 상관없이 언제든지 설치가 가능하다.

 

[root@me /]# cd work/cross3.4/

[root@me cross3.4]# tar -zxvf gdb-6.3.tar.gz

[root@me cross3.4]#cd gdb-6.3

환경설정을 한다.

[root@me gdb-6.3]# ./configure --target=arm-linux --build=i686-pc-linux-gnu --prefix=/usr

컴파일을 한다.

[root@me gdb-6.3]# make

설치를 한다.

[root@me gdb-6.3]# make install

[root@me gdb-6.3]# cd ..

 

7. Binutils 패케지 설치

[root@me cross3.4]# tar -xjf binutils-2.15.91.0.1.tar.bz2

[root@me cross3.4]# cd binutils-2.15.91.0.1

작업 디렉토리를 만듭니다.

[root@me binutils-2.15.91.0.1]#mkdir build

[root@me binutils-2.15.91.0.1]#cd build

컴파일 환경을 설정한다.

[root@me build] ../configure --target=arm-linux --prefix=/usr --program-prefix=arm-linux-

컴파일 한다.

[root@me build]# make

설치를 한다.

[root@me build]# make install

[root@me build]#cd ..

 

8. gcc 설치

  라이브러리를 컴파일 하기 위한 gcc를 만듭니다.

[root@me cross3.4]# tar -xjf gcc-3.4.2.tar.bz2

몇가지 화일을 수정한다.

[root@me cross3.4]#cd gcc-3.4.2

[root@me gcc-3.4.2]# perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc \

 -D__gthr_posix_h/' gcc/config/arm/t-linux

[root@me gcc-3.4.2# echo 'T_CFLAGS = -Dinhibit_libc -D__gthr_posix_h' >> gcc/config/arm/t-linux

작업 디렉토리를 만듭니다

[root@me gcc-3.4.2]# mkdir build

[root@me gcc-3.4.2]# cd build

이제 환경 설정과 컴파일을 수행합니다.

[root@me build]#../configure --target=arm-linux --prefix=/usr \

  --with-headers=/root/work/linux-evm2440a/include \

--disable-shared --disable-threads --enable-languages="c" --nfp --with-cpu=arm9tdmi \

--without-fp --with-softfloat-support=internal

[root@me build]# make

[root@me build]# make install

 버전을 확인해 봅니다.

[root@me build]# arm-linux-gcc -v

[root@me build]# cd ..

 

9. glibc 패케지 설치

___________기존 설치된 크로스컴파일러가 없을 때____________________

라이브러리를 설치하기 전 커널의 version.h 를 생성합니다.

커널 디렉토리로 이동

현재 설치된 gcc에는 제약이 있으므로.

 

cp arch/arm/Makefile arch/arm/Makefile.org

vi arch/arm/Makefile

47번라인

CFLAGS_BOOT     :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float

CFLAGS          +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float

을 아래와 같이 수정

CFLAGS_BOOT     :=$(apcs-y) $(arch-y) $(tune-y) -msoft-float

CFLAGS          +=$(apcs-y) $(arch-y) $(tune-y) -msoft-float

커널의 의존성검사를 수행합니다.

make dep

원래대로 만들어 놓습니다.

cp arch/arm/Makefile.org arch/arm/Makefile

rm -f arch/arm/Makefile.org

 

vi include/linux/version.h

다시 라이브러리 디렉토리로 가서

_________________________________________________________________

[root@me cross3.4]# tar -xjf glibc-2.3.3.tar.bz2; tar -C glibc-2.3.3 -xjf glibc-linuxthreads-2.3.3.tar.bz2

[root@me cross3.4]# cd glibc-2.3.3

몇가지 수정합니다.

[root@me glibc-2.3.3]# vi Makeconfig

514 라인 gnulib := -lgcc -lgcc_eh --> gnulib := -lgcc 로 수정.

[root@me glibc-2.3.3]# vi csu/Makefile

107라인

CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions

CFLAGS-initfini.s = -O1 -g0 -fPIC -fno-inline-functions 로 수정

 

[root@me glibc-2.3.3]# vi linuxthreads/Makefile

104라인

CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions

CFLAGS-pt-initfini.s = -O1 -g0 -fPIC -fno-inline-functions 로 수정

 

[root@me glibc-2.3.3]# vi sysdeps/generic/framestate.c

추가

#ifndef __USING_SJLJ_EXCEPTIONS__

frame_state_for = fallback_frame_state_for;

#else

frame_state_for = abort;

#endif

 

[root@me glibc-2.3.3]# vi sysdeps/arm/machine-gmon.h

35라인제거

static void mcount_internal (u_long frompc, u_long selfpc);

38라인

static void mcount_internal (u_long frompc, u_long selfpc) 을

void mcount_internal (u_long frompc, u_long selfpc) 로 수정

작업 디렉토리를 만듭니다

[root@me glibc-2.3.3]#mkdir build

[root@me glibc-2.3.3]#cd build

이제 환경 설정과 컴파일을 수행합니다.

[root@me build]# CC=arm-linux-gcc ../configure --host=arm-linux --build=i686-pc-linux-gnu \

--prefix=/usr/arm-linux --with-headers=/root/work/linux-evm2440a/include \

--enable-add-ons=linuxthreads --enable-shared

[root@me build]# make

 

조금 오래 걸리는 일입니다 여유롭게커피라도 한잔

 

설치전 꼭 환경설정이 제대로 되었는지확인필요 잘못하면 /lib에 업어씁니다그럼 시스템은.

[root@me build]# make install

[root@me build]#cd ..

 

10. gcc 재설치

 

gcc를 재설치 한다. 컴파일 할때 라이브러리 의존성 문제가 생기므로 사전에 수정한다.

 

[root@me cross3.4]#cd /usr/arm-linux/lib

[root@me lib]#strings libc.so

[root@me lib]#cp libc.so libc.so.org

[root@me lib]#sed -e '/*** BUG/d' libc.so > libc.so.new

[root@me lib]#sed '/BUG/d' libc.so > libc.so.new

[root@me lib]#mv -f libc.so.new libc.so

 

[root@me lib]#strings libpthread.so

[root@me lib]#cp libpthread.so libpthread.so.org

[root@me lib]#sed '/BUG/d' libpthread.so > libpthread.so.new

[root@me lib]#mv -f libpthread.so.new libpthread.so

 

다시 돌아가서.

[root@me cross3.4]# tar -xjf gcc-3.4.2.tar.bz2

[root@me cross3.4]# cd gcc-3.4.2

작업 디렉토리를 만듭니다

[root@me gcc-3.4.2]# mkdir build

[root@me gcc-3.4.2]# cd build

이제 환경 설정과 컴파일을 수행합니다.

[root@me build]#../configure --target=arm-linux --prefix=/usr --program-prefix=arm-linux- \

 --with-headers=/root/work/linux-evm2440a/include --with-cpu=arm9tdmi \

 --with-softfloat-support=internal --enable-languages=c,c++ --nfp

[root@me build]# make

[root@me build]# make install

 버전을 확인해 봅니다.

[root@me build]# arm-linux-gcc v

설치된 파일들을 확인 c++.기타등등..

[root@me build]#ls /usr/bin/arm-*

 

11. 시험

[root@me build]# vi test.c

      #include <stdio.h>

      main()

      {

                printf( "OK GCC\n" );

      }

 

[root@me build]#arm-linux-gcc -o test test.c

[root@me build]#file test

test: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped

위 처럼 나오면 정상이다.

어떤 프로세스들을 지원하는가를 보고 싶다면

[root@me build]#  arm-linux-gcc -dumpspecs

하면 지원되는 프로세스 목록이 보일 것이다.








 

 

                크로스컴파일러 GCC 2.95 구축방법

 

 

 1. 개요.

 

   이 문서는 ARM 용 크로스 컴파일 환경을 구축하기 위한 방법의 하나로 GNU에서 제공하는 소스 패케지를 이용하여 구성하는 방식에 대하여 기술한 문서입니다.

 

 2. 구해야 할 프로그램소스.

 

   리눅스를 이용한 크로스 컴파일 환경을 구축 하기 위해서는 다음과 같은 패케지가 필요로 하고 이 패케지들의 모음을 일반적으로 크로스 컴파일 툴 체인이라고도 한다.

       1) binutils   : 어셈블러 및 로더 기타 툴 ( GNU )

       2) glibc      : 크로스 컴파일 구축을 위한 라이브러리 및 일반 라이브러리

       3) gcc        : 컴파일러 

       4) 커널       : 커널 쏘스

소스 패케지로 구성하기 위해서는 목록에 해당하는 모든 패케지가 있어야 합니다.

 

       참조 문서 : http://www.armlinux.org/docs/toolchain/toolchHOWTO.pdf

 

3. 구할수 있는곳.

 

     1) binutils   : 어셈블러 및 로더 기타 툴 ( GNU )

         ftp://ftp.gnu.org/gnu/binutils/binutils-2.12.tar.gz

     2) glibc      : 크로스 컴파일 구축을 위한 라이브러리 및 일반 라이브러리

         ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz

         ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz

     3) gcc        : 컴파일러 

         ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3.tar.gz

         ftp://ftp.linuxfromscratch.org/lfs-packages/3.3/gcc-2.95.3-2.patch.bz2

     4) 커널       :

         사용하고자 하는 커널버전의 소스,해당 머신에 맞는패치,보드용 최종패치.

 

 

 

          binutils-2.12.tar.gz

          gcc-2.95.3.tar.gz

          gcc-2.95.3-2.patch.bz2

          glibc-2.2.4.tar.gz

          glibc-linuxthreads-2.2.4.tar.gz

 

4. 설치 전 주의 사항

   각 설치되는 패케지들의 의존 관계가 있기 때문에 진행하는 순서는 꼭! 지켜야 합니다.

   설치는 root 권한으로 하시기 바랍니다

 

5. 설치 전 작업

 

   설치하려고 하는 리눅스 머신에 다음 디렉토리를 만듭니다.

 

    mkdir -p /tmp/build/

    (/tmp/build/ 디렉토리 는 각자 적당한 디렉토리명을 선택.)

 

    /tmp/build/ 에 다운 받은 화일을 가져다 놓습니다.

 

6. Binutils 패케지 설치

 

  [root@me /]# cd /tmp/build/

 

  [root@me build]# tar -zxvf binutils-2.12.tar.gz

 

  [root@me build]# cd binutils-2.12

 

  [root@me binutils-2.12]# ./configure --target=arm-linux

 

  [root@me binutils-2.12]# make

 

  [root@me binutils-2.12]# make install

 

     이 부분을 수행하고 나면 /usr/local/arm-linux 란 디렉토리가 생성됩니다.

 

 7. 커널 소스 설치

 

      커널 소스를 Binutils 패케지 다음에 설치하는 이유는 헤더 화일 때문입니다.

 

  커널 패치방법(kernel Version 2.4.18).

 

  최종적인 암용 커널 패치는 i386용 리눅스커널에서 부터 시작 합니다.  

   i386 용 리눅스 커널 소스

   i386에 arm 용으로 바꾸는 패치 파일

   arm용을 다시 보드에 맞춰 포팅된 커널로 바꾸는 패치 파일 

   패치는 원 파일과 수정된 파일의 비교 파일입니다 그러므로 원본파일이 있어야 하겠지요.

 

   작업 순서

  커널 패치할 디렉토리를 만든다.

 

 

  [root@me / ]# cd tmp

  [root@me /tmp ]# mkdir kernel-2.4.18

  [root@me /tmp ]# cd kernel-2.4.18

  [root@me kernel-2.4.18]#

 

  커널소스를 구합니다.

  i386 용 커널소스.

  ftp://ftp.kr.kernel.org/pub/linux/kernel/v2.4/linux-2.4.18.tar.gz

  Arm 용  패치.

  (Russell King 패치 니코,알랜콕스 패치포함)

  ftp://ftp.arm.uk.linux.org/pub/linux/arm/kernel/v2.4/patch-2.4.18-rmk7.gz

  

  다른 암용패치 암용 포팅시 참조용.

  알랜콕스 패치

  ftp://ftp.kr.kernel.org/pub/linux/kernel/people/alan/linux-2.4/2.4.18/patch-2.4.18-ac1.gz

  Nicolas Pitre 패치

  ftp://ftp.arm.uk.linux.org/pub/linux/arm/people/nico/v2.4

 

  커널 패치하기

 

  i386용 커널소스를 풉니다.

  linux-2.4.18.tar.gz

  [root@me kernel-2.4.18]# tar -zxvf linux-2.4.18.tar.gz

  압축을 풀면 linux 디렉토리가 생깁니다.

 

  암용 패치화일을 풉니다.

  patch-2.4.18-rmk7.gz

  [root@me kernel-2.4.18]# gunzip patch-2.4.18.rmk7.gz

 

  보드패치화일을 준비합니다.

  patch-2.4.18-rmk7-s2410-hl2irw.gz

 

  여기에 패치 파일을 적용합니다.

  [root@me kernel-2.4.18]# cd linux

  [root@me linux]# gzip -cd ../patch-2.4.18-rmk7.gz | patch -p1

 

 

  보드에 맞는 패치를 합니다.

  patch-2.4.18-rmk7-s2410-hl2irw.gz

  [root@me linux]# gzip -cd ../patch-2.4.18-rmk7-s2410-hl2irw.gz | patch -p1

 

  커널의 환경 설정을 합니다.

  [root@me linux ]# make xconfig (menuconfig)          취향에 따라사용.

 

  config file 을 로드한다 (myconfig   보드패치시 생성됨)

  save 하고 빠져나온다.

 

      참고로 커널 소스 위치가 고정될 필요는 없습니다

 

 [root@me linux ]# mkdir /usr/local/arm-linux/include

 

 [root@me linux ]# cp -dR include/asm-arm /usr/local/arm-linux/include/asm

 

 [root@me linux ]# cp -dR include/linux /usr/local/arm-linux/include/linux

 

 [root@me linux ]# cd /usr/local/arm-linux/

 

 [root@me arm-linux]# ln -s include sys-linux  

 

8. gcc 패케지 설치

 

 [root@me arm-linux]# cd /tmp/build/

 

 [root@me build]# tar -zxvf gcc-2.95.3.tar.gz

 

 [root@me build]# bunzip2 gcc-2.95.3-2.patch.bz2

 

 [root@me build]# cd gcc-2.95.3

 

 [root@me gcc-2.95.3]# patch -Np1 -i ../gcc-2.95.3-2.patch 

 

 [root@me gcc-2.95.3]# cd gcc/config/arm/

 

    t-linux 화일을 수정합니다.

 

    t-linux 의 선두에 보면

    TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC  이란 내용이 있는데  이것을

 

   TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h

     으로 바꿔줍니다.

 

[root@me arm]# cd ../../../                 <- gcc-2.95.3

 

 [root@me gcc-2.95.3]# mkdir ../gcc-build

 

 [root@me gcc-2.95.3]# cd ../gcc-build   

 

 [root@me gcc-build]# ../gcc-2.95.3/configure --target=arm-linux -v --with-gnu-as --with-gnu-ld

 --with-gnu-newlib

 

 [root@me gcc-build]# ../gcc-2.95.3/configure --target=arm-linux -v --with-gnu-as --with-gnu-ld

 

 [root@me gcc-build]# make -w all-gcc install-gcc LANGUAGE="c c++"

 

      인스톨까지 정상적으로 수행되었습니다.

 

9. glibc 패케지 설치

 [root@me gcc-build]# cd /tmp/build/

 

 /***************************************************

 라이브러리 설치 전(크로스 gcc설치 후) 커널 의존성 체크를 해준다. (커널버전정보생성)

[root@me build ]# cd /tmp/kernel-2.4.18/linux

 

[root@me linux ]# make dep

 

[root@me linux ]# cd /tmp/build/

*****************************************************/

 [root@me build]# tar -zxvf glibc-2.2.4.tar.gz

 

 [root@me build]# cd glibc-2.2.4

 

 [root@me glibc-2.2.4]# tar -zxvf ../glibc-linuxthreads-2.2.4.tar.gz

 

 [root@me glibc-2.2.4]# mkdir ../glibc-build

 

 [root@me glibc-2.2.4]# cd ../glibc-build

 

 [root@me glibc-build]# CC=arm-linux-gcc ../glibc-2.2.4/configure arm-linux

--prefix=/usr/local/arm-linux --enable-add-ons

--with-headers=/tmp/kernel-2.4.18/linux/include

--with-cpu=arm9tdmi

 

 [root@me glibc-build]# make

 

 [root@me glibc-build]# make install

 

10. 잘되었나 시험을 해보자

 

 [root@me glibc-build]# cd /tmp/build/

 

 [root@me build]# vi test.c

 

      #include <stdio.h>

      main()

      {

                printf( "OK GCC\n" );

      }

 

  [root@me build]# arm-linux-gcc -o test test.c

 

  [root@me build]# file test

   test: ELF 32-bit LSB executable, Advanced RISC Machines ARM, version 1, dynamically linked (uses shared libs),

       not stripped

       위와 같이 나오면 잘된 것입니다. 

 

/usr/local/arm-linux/ 에 암용 크로스 컴파일 환경이 구축되게 됩니다.

출처 : http://www.cyworld.nate.com/hl2irw