[입 개발] 알면 좋고, 몰라도 상관 없는 gcc 옵션과 linux version 정보

한 두달, 블로그를 쉬었습니다. 사실 쉴려고 한 건 아니고, 번역을 하다 만것들도 꽤 되고, 영어가 점점 더 부족해져가기도 하구요. 캐나다에 오고나서 도리어 필리핀 보다 영어공부하는 시간이 줄다 보니, 이것 저것 블로그도 점점 죽어가고 있습니다. 최근에 영어 공부보다 개발 공부를 더 하다보니, 몇가지 알면 좋고 몰라도 상관없는 정보들을 많이 발견하게 되었습니다.(정정합니다. 조금)

 

1. Linux Kernel 버전 정보나 GLIBC 버전 정보를 어떻게 알아야 할까?

– /usr/include/linux/version.h 에 보면 LINUX_VERSION_CODE 라는 것이 있습니다. 이걸 이용하면 현재 커널 버전을 쉽게 알 수 있습니다.  다만 이때 주의할 것은, 해당 값이 0x020612 이런식으로 되어있고 앞에 1byte가 major, 뒤의 1byte가 minor, 마지막 1byte 가 patch 순서인데 예를 들어 리눅스 커널 2.6.18 이면 0x020612 가 되게 됩니다. 마지막에 12는 hex 코드로 18 -> 12로 매칭되는 겁니다. 이거 실수하시면 많이 틀릴 수 있습니다.

 

2. GLIBC 버전은 어떻게 알까?

– 처음에는 다음과 같은 함수를 이용했습니다.

<pre>#include <stdio.h>
#include <gnu/libc-version.h>

int main()
{
	/* Or we could just run /lib/libc.so.6.  */

	puts(gnu_get_libc_version());
	return 0;
}

그런데 /usr/include/features.h 에 보면 GLIBC 버전에 대한 정의가 있습니다. 다음과 같습니다.

</pre>
#define __GLIBC__ 2
#define __GLIBC_MINOR__ 15

#define __GLIBC_PREREQ(maj, min) \

((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))

 

정말 이거 몰라서 한참을 고민했었네요.

 

3. gcc option -march=native

– gcc 가 CPU에 맞추어서 코드를 만들어주는 것을 다들 아실껍니다. 특별한 옵션을 안주시고 32bit에서 빌드하면 그냥 i386 instruction에 맞춰서 빌드가 되는데, 이럴 경우 “undefined reference to__sync_add_and_fetch_4′” 라는 오류를 만나게 됩니다. i386에 다음과 같은 명령셋이 없기 때문인데요. 이 때 -march=i686 등으로 현재의 CPU 버전을 적어주면 잘 빌드되게 됩니다. 그런데 뒤에 계속 새로운 CPU는 나오고 같은 다시 지원해주지 않는 이슈가 뒤에 발생할 수도 있는데, GCC 4.2 부터 -march=native 라는 옵션이 생겼습니다. 이건 뭐냐 하면 현재 해당 장비에서 쓰는 CPU 타입에 맞춰주겠다는 뜻입니다. 다만 크로스 컴파일이나 이런거 쓰시는 분들은 조심하셔야겠죠? target 이 아니라 host에 최적화될테니 ^^