현재 사용 중인 gcc 의 버전을 알고 싶은 경우에는 gcc -v
라고 셸 프롬프트에서
실행시키면 된다. 또한 이렇게 명령을 내리면 여러분의 시스템이 ELF로 세팅되어
있는지 아니면 a.out 으로 되어 있는지 확실하게 알아낼 수 있다. 필자의
시스템에서는 다음과 같이 나온다.
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
여기서 알아두어야 할 핵심적인 내용은 다음과 같다.
i486
. 이는 여러분이 486 프로세서 용으로 컴파일된 gcc를 사용하고
있다는 말이다. 이 부분은 다를 수 있는데 어떤 사람은 386, 586 에 따라 다를 수도
있다. 하지만 이 3 가지 칩에서 컴파일된 것들은 상관없이 서로 잘 실행된다.
차이점이라고 한다면 486 코드가 어디엔가 더해짐으로써 486 에서는 더욱 더 빨리
실행된다는 정도이다. 386 에서 실행하는데 해가 된다거나 하지는 않는다. 하지만
약간 바이너리가 커질 것이다.
box
. 이건 전혀 중요한 부분이 아니다. 예를 들어서 box라는
말 대신에 slackware
나 debian
등의 단어로 교체될 수도 있고
아예 이 부분이 없을 수도 있다. 보통은 i486-linux
이런 식일 것이다.
만약 gcc 를 컴파일해서 사용한다면 본인이 따로 i486-box-linux 라고 지정했듯이
gcc를 만들 때 정해줄 수 있다.
linux
. 이 단어 대신에 linuxelf
라든가
linuxaout
이라는 단어가 들어갈 수도 있다. 또는 리눅스 커널 버전이
들어가도록 할 수도 있다. 암튼 리눅스용임을 잘 나타내고 있다. 간단히 결론을
말하자면, 이 단어의 뜻은 사용중인 GCC 버전에 따라 다르게 해석된다.
2.7.2
이것은 버전 번호이다.따라서 종합해보면 필자는 지금 ELF 실행코드를 생성시키는 gcc 2.7.2 를 가지고 있다는 것이다.
그냥 아무 생각없이 gcc 를 설치했거나 배포판을 설치할 때 자동으로 설치하게 했다면, 도대체 리눅스 화일 시스템 상에서 어디에 위치하는지 알고 싶을 것이다. 대답은 이렇다.
/usr/lib/gcc-lib/
target/
version/
(그리고 모든 하위 디렉토리들)이 컴파일러의
대부분이 위치하는 장소이다. 컴파일을 수행하는 실행화일 그 자체와 gcc 버전에
따른 라이브러리와 헤더화일들이 들어있다.
/usr/bin/gcc
는 컴파일러 운전사(Compiler Driver)역할을 한다.
커맨드 상에서는 gcc 라고만 명령한다. 만약 여러 버전의 컴파일러를 가지고 있다면
여러 버전과 함께 사용할 수 있다. gcc 가 사용하게 될 디폴트 버전의 컴파일러를
알아내기 위해서는 gcc -v
라고 해보면 된다. 다른 버전으로 강제로 컴파일하게
하려면 gcc -V
version 이런 식으로 사용하면 된다. 예를 들어서...
# gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
# gcc -V 2.6.3 -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs
gcc driver version 2.7.2 executing gcc version 2.6.3
/usr/
target/(bin|lib|include)/
. 여러분이 여러
개의 목표 형식을 가지고 있다면 (일단 ELF인가 a.out 인가 또는 여러 형태의 크로스
컴파일러 등) 디폴트 목표 형식용이 아닌 라이브러리, 바이너리 유틸리티 (as
, ld
등...), 헤더 화일들도 찾아볼 수 있을 것이다.
오로지 한 종류의 gcc 를 가지고 있다 하더라도 매우 많은 것들이 그 디렉토리에
깔려있음을 확인할 수 있다. 그렇지 않다면 아마도
/usr/(bin|lib|include)
에 있을 것이다.
/lib/
,/usr/lib
그리고 여타 라이브러리 디렉토리들이
기본 시스템을 위한 라이브러리 디렉토리이다. 여러분은 또한 상당히 많은
프로그램에 대하여 /lib/cpp
를 가지고 있어야 한다. (X 가 실제로 많이
사용하고 있다.) /usr/lib/gcc-lib/
target/
version/
에 있는 cpp 를 카피해놓던가? 아니면 심볼릭 링크를 해준다.
여러분이 손수 /usr/local/include
에 설치한 것들 빼고 리눅스에는 3
가지 중요 헤더 디렉토리가 있다.
/usr/include/
와 그 하부 디렉토리들은 H J Lu 의 libc
바이너리 배포판에 의해서 제공된다. 여기서 본인은 "대부분"이라는 표현을 썼는데,
그 이유는 다른 소스 (예를 들어 curses
, dbm
라이브러리)에서 온
헤더화일들도 있기 때문이다. 특히나 최근 libc 배포판을 가져오면 그러한
헤더화일들은 없다. (예전에는 같이 달려서 왔지만)
/usr/include/linux
와 /usr/include/asm
(<linux/*.h>
화일과
<asm/*.h>
에 의해
참조되는 헤더화일들이 있는 장소)는 각각 커널 소스에서 linux/include/linux
와 linux/include/asm
을
가리키는 심볼릭 링크여야 한다. 뭔가 조금이라도 큰 작업을 하려고 한다면
분명히 설치해야 한다. 커널 컴파일을 하기 위해서만 있는 것은 아니다.
또한 커널 소스를 풀고 나서 make config
라는 작업을 해주어야 할 것이다.
많은 화일들이 그 과정을 통해서 생겨나는 <linux/autoconf.h>
라는
화일에 의존하기 때문이다. 그리고 어떤 버전의 커널에서는 asm
이라고 하는
것이 심볼릭 링크일 뿐, make config
할 때만 생기는 경우가 있다.
asm 은 보통 asm-i386
으로 링크되어 있다. 그전에는 오로지 인텔 머신용
헤더화일만이 있었기 때문에 asm 만이 있었지만 이제는 리눅스가 명실상부하게
멀티플랫폼 운영체제로 나아가고 있기 때문이다. asm-i386
말고도
asm-alpha
, asm-generic
, asm-m68k
, asm-mips
, asm-ppc
, asm-sparc
등의 헤더 화일 디렉토리가 있는
것을 발견할 수 있다.
따라서 /usr/src/linux
라고 하는 디렉토리에 이미 소스를 풀어놓았다면...
$ cd /usr/src/linux
$ su
# make config
[answer the questions. Unless you're going to go on and build the kernel
it doesn't matter _too_ much what you say]
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .
<float.h>
, <limits.h>
,
<varargs.h>
, <stdarg.h>
그리고
<stddef.h>
등의 화일들은 컴파일러 버전마다 다를 것이다. 그리고
그들은 /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/
에 위치하고 있다.
여러분이 지금 gcc 소스 코드를 가지고 있다고 생각하겠다. 보통은 GCC 에 대한
INSTALL 화일에서 지시하는 대로 따르면 된다. configure --target=i486-linux --host=XXX
이런 식으로 해주는데,
XXX
는 플랫폼을 말한다. 다음에는 make
과정을 거치면 된다. 리눅스
헤더화일, 커널 헤더화일이 필요하며, 크로스 컴파일러와 크로스 링커를 만들기
위해서도 필요하다.
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/에서
구할 수 있다.
흠. 소스를 리눅스에서 작성한 뒤에 도스에서 돌아가는 프로그램으로 컴파일하기
위해서는 emx
패키지나 go extender
라는 것을 필요로 한다.
ftp://sunsite.unc.edu/pub/Linux/devel/msdos에 가서 관련 화일을 찾아보기 바란다.
본인으로서는 테스트해본 적이 없으며, 쓸만하다고 단언하기는 힘들다.