gnutls-3.7.10 on CentOS 5.8
공식 홈페이지 : https://www.gnutls.org/
0. 주의사항
2003년 8월 현재 CentOS 5.8 에서 주의사항은 다음과 같다.
- gcc는 4.8.2 로 upgrade 해야 한다(gcc 4.4 안된다).
- gnutls-3.8.1 및 gnutls-3.6.16 은 (소스코드를 수정하지 않는다면) 컴파일 할 수 없다.
1. 준비작업
1.1. 다운로드
https://www.gnutls.org/download.html 에서 다운로드 한다.
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.7/gnutls-3.7.10.tar.xz
gnu 패키지들은 ftp 다운로드 경로를 제공하므로, CentOS 순정 wget 으로 다운로드 받을 수 있다.
1.2. make 및 xz 설치
yum install make xz -y
1.3. gcc 4.8.2 설치
이에 대해서는 필자가 작성한 다른 글을 참조한다.
1.4. gmp-6.3.0 설치
이에 대해서는 필자가 작성한 다른 글을 참조한다.
1.5. nettle-3.6 설치
이에 대해서는 필자가 작성한 다른 글을 참조한다.
1.6. p11-kit-0.25.0 설치
p11-kit 은 PKCS #11 을 위한 것으로 필수는 아니다.
p11-kit-0.25.0 설치와 다음과 같이 의존성 있는 프로그램의 설치에 관해서는 필자가 작성한 다른 글을 참조한다.
- libtasn1-4.19.0
- libffi-3.4.4
2. 컴파일 및 설치
설치 디렉토리(--prefix
) 는 알아서 변경한다.
대부분의 Linux 배포판들은 /usr 이 설치 디렉토리(
--prefix
)이지만, 컴파일해서 설치하는 것들은 /usr/local 이나 /opt 아래에 두는 경우가 많다.
2.1. p11-kit
없이 설치
$ mkdir -p logs/gnutls-3.7.10 $ unxz -k gnutls-3.7.10.tar.xz $ tar xvf gnutls-3.7.10.tar > logs/gnutls-3.7.10/tar.`date +%Y%m%d.%H%M%S`.log 2>&1 $ cd gnutls-3.7.10 $ CC=/opt/rh/devtoolset-2/root/usr/bin/gcc \ GMP_CFLAGS="-I/opt/gmp-6.3.0/include" \ GMP_LIBS="-L/opt/gmp-6.3.0/lib" \ HOGWEED_CFLAGS="-I/opt/nettle-3.6/include" \ HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed" \ NETTLE_CFLAGS="-I/opt/nettle-3.6/include" \ NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle" \ ./configure \ --with-included-unistring \ --without-p11-kit \ --with-included-libtasn1 \ --prefix=/opt/gnutls-3.7.10 > ../logs/gnutls-3.7.10/config.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make > ../logs/gnutls-3.7.10/make.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make install > ../logs/gnutls-3.7.10/install.`date +%Y%m%d.%H%M%S`.log 2>&1
2.2. p11-kit
포함해서 설치
$ mkdir -p logs/gnutls-3.7.10 $ unxz -k gnutls-3.7.10.tar.xz $ tar xvf gnutls-3.7.10.tar > logs/gnutls-3.7.10/tar.`date +%Y%m%d.%H%M%S`.log 2>&1 $ cd gnutls-3.7.10 $ CC=/opt/rh/devtoolset-2/root/usr/bin/gcc \ GMP_CFLAGS="-I/opt/gmp-6.3.0/include" \ GMP_LIBS="-L/opt/gmp-6.3.0/lib" \ HOGWEED_CFLAGS="-I/opt/nettle-3.6/include" \ HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed" \ NETTLE_CFLAGS="-I/opt/nettle-3.6/include" \ NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle" \ P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1" \ P11_KIT_LIBS="-L/opt/p11-kit-0.25.0/lib -lp11-kit" \ LIBTASN1_CFLAGS="-I/opt/libtasn1-4.19.0/include" \ LIBTASN1_LIBS="-L/opt/libtasn1-4.19.0/lib -ltasn1" \ CFLAGS="-I/opt/libtasn1-4.19.0/include" \ ./configure \ --with-included-unistring \ --prefix=/opt/gnutls-3.7.10 > ../logs/gnutls-3.7.10/config.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make > ../logs/gnutls-3.7.10/make.`date +%Y%m%d.%H%M%S`.log 2>&1 $ make install > ../logs/gnutls-3.7.10/install.`date +%Y%m%d.%H%M%S`.log 2>&1
3. 적용
3.1. 현재 환경에 적용
현재 환경에서는 다음과 같이 적용한다.
$ export PATH=/opt/gnutls-3.7.10/bin:${PATH} $ export LD_LIBRARY_PATH=/opt/gnutls-3.7.10/lib:${LD_LIBRARY_PATH}
만약 libnettle.so.8 파일을 열수 없다는 에러가 발생한다면,
$ export LD_LIBRARY_PATH=/opt/nettle-3.6/lib64:/opt/gnutls-3.7.10/lib:${LD_LIBRARY_PATH}
pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/gnutls-3.7.10/lib/pkgconfig
3.2. 현재 로그인한 사용자에게 적용
현재 로그인한 사용자에게 적용하려면, ".bash_profile" 파일의 끝에 위의 내용을 추가한다.
3.3. 시스템 전체에 적용
3.3.1. 환경변수 변경
"/etc/bashrc" 파일의 끝에 위의 내용을 추가한다.
LD_LIBRARY_PATH 는 다음과 같이 ld.so.conf 를 변경하는 방법도 있다.
3.3.2. ld.so.conf 변경
"/etc/ld.so.conf.d/gnutls.conf" 파일을 편집(추가)한다.
$ vi /etc/ld.so.conf.d/gnutls.conf
다음의 내용으로 교체(추가)한다.
/opt/gnutls-3.7.10/lib
만약 libnettle 도 필요하다면, /etc/ld.so.conf.d/gnutls.conf 파일에 다음 내용을 추가한다.
/opt/nettle-3.6/lib64
변경사항을 적용한다.
$ ldconfig
4. 문제해결
4.1. p11-kit/pkcs11.h
파일 등이 없다는 에러
./../pkcs11_int.h:27:28: error: p11-kit/pkcs11.h: No such file or directory ./../pkcs11_int.h:39:29: error: p11-kit/p11-kit.h: No such file or directory ./../pkcs11_int.h:40:25: error: p11-kit/pin.h: No such file or directory ./../pkcs11_int.h:41:25: error: p11-kit/uri.h: No such file or directory
${P11_KIT_CFLAGS}/p11-kit/pkcs11.h
파일이 없다.
P11_KIT_CFLAGS 환경변수가 잘못되었다. 마지막에 p11-kit-1 이 붙어 있음에 주의한다.
P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1"
4.2. Libnettle 3.6 이 없다는 에러
configure: error: *** *** Libnettle 3.6 was not found.
Libnettle 을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.
NETTLE_CFLAGS="-I/opt/nettle-3.6/include"
NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle"
4.3. Libhogweed 3.6 이 없다는 에러
configure: error: *** *** Libhogweed (nettle's companion library) 3.6 was not found. Note that you must compile nettle with gmp support.
Libhogweed 는 Libnettle 에 포함되어 있다.
Libnettle 을 컴파일 할 때, gmp 경로를 추가했는지 확인할 필요가 있다.
다음 2개의 환경변수를 추가한다.
HOGWEED_CFLAGS="-I/opt/nettle-3.6/include"
HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed"
NETTLE_CFLAGS 내지 NETTLE_LIBS 와 동일한 경로이지만, 이를 추가하지 않으면 에러가 해결되지 않는다.
4.4. gmp 가 없다는 에러
configure: error: *** *** gmp was not found.
gmp 를 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.
GMP_CFLAGS="-I/opt/gmp-6.3.0/include"
GMP_LIBS="-L/opt/gmp-6.3.0/lib"
4.5. Libtasn1 4.9 가 없다는 에러
configure: error: *** *** Libtasn1 4.9 was not found. To use the included one, use --with-included-libtasn1
configure 에 --with-included-libtasn1
옵션을 추가하거나,
Libtasn1을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.
LIBTASN1_CFLAGS="-I/opt/libtasn1-4.19.0/include"
LIBTASN1_LIBS="-L/opt/libtasn1-4.19.0/lib -ltasn1"
4.6. Libunistring 이 없다는 에러
configure: error: *** *** Libunistring was not found. To use the included one, use --with-included-unistring
configure 에 --with-included-unistring
를 추가한다.
4.7. rsa_sec_decrypt 함수가 필요하다는 에러
configure: error: Nettle lacks the required rsa_sec_decrypt function
NETTLE_LIBS 환경변수에 -lnettle
이 누락된 경우 발생하는 에러이다.
4.8. P11_KIT 이 없다는 에러
checking for P11_KIT... no configure: error: *** *** p11-kit >= 0.23.1 was not found. To disable PKCS #11 support *** use --without-p11-kit, otherwise you may get p11-kit from *** https://p11-glue.freedesktop.org/p11-kit.html ***
configure 에 --without-p11-kit
옵션을 추가하거나,
p11-kit을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.
P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1"
P11_KIT_LIBS="-L/opt/p11-kit-0.25.0/lib -lp11-kit"
4.9. CK_ULONG 관련 에러
/opt/p11-kit-0.25.0/include/p11-kit-1/p11-kit/uri.h:89: error: redefinition of typedef 'CK_ULONG' /opt/p11-kit-0.25.0/include/p11-kit-1/p11-kit/p11-kit.h:47: error: previous declaration of 'CK_ULONG' was here make[5]: *** [verify.lo] Error 1
gcc 4.1.2 혹은 gcc 4.4 에서 발생하는 에러이다.
gcc를 4.8.2 로 upgrade 해야 한다
4.10. gettime 함수 선언이 잘못되었다는 에러
In file included from cli.c:65:0: benchmark.h:38:20: error: static declaration of 'gettime' follows non-static declaration inline static void gettime(struct timespec *ts) ^ In file included from benchmark.h:32:0, from cli.c:65: ./gl/timespec.h:93:6: note: previous declaration of 'gettime' was here void gettime (struct timespec *) _GL_ARG_NONNULL ((1));
gnutls-3.8.1 에서 발생하는 에러이다.
(소스코드를 수정하지 않는다면) gnutls-3.8.1 는 CentOS 5.8 에서 컴파일 할 수 없다.
4.10. typedef struct _IO_FILE FILE;
관련 에러
In file included from ./stdio.h:33:0, from fopen.c:26: /usr/include/stdio.h:46:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef' typedef struct _IO_FILE FILE; ^ fopen.c:29:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'static' static FILE * ^ fopen.c:29:1: error: unknown type name 'FILE'
gnutls-3.6.16 에서 발생하는 에러이다.
(소스코드를 수정하지 않는다면) gnutls-3.6.16 는 CentOS 5.8 에서 컴파일 할 수 없다.