지금까지 0.9.8b 버전을 사용하다가, 추가된 cipher를 지원하기 위하여 0.9.8i 버전을 사용하게 되었습니다.
이거 받아서 컴파일 하다보니, 이전 버전과는 또 다른 문제가 튀어나오네요..ㅎㅎ;
이런 종류의 라이브러리 받아서 처음 컴파일하다보면 당황스런 경우가 많은데요 도움이 되셨으면 합니다.
1. ActivePerl 다운 받아서 설치하세요.
http://www.activestate.com/Products/activeperl/index.mhtml
경로에서 다운 받고, 그냥 인스톨 하시면 됩니다.
2. Perl 의 사용상 편의를 위해서 Perl의 설치 경로를 환경 변수에 등록해 주시면
지속적으로 사용하는데 아주 편합니다.
제어판->시스템->고급 탭을 선택합니다.
환경변수를 클릭한다.
편집을 클릭한다.
제일 끝에, 세미콜론을 하나 찍고, 펄의 bin 경로를 추가한다.
이렇게 되면 어떤 경로에서든 Perl을 바로 실행할 수 있다.
3. 다음으로 VC-WIN32 환경에서 컴파일 할수 있도록 컴파일 환경을 설정한다.
=> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
=> 위의 예에서 처럼 오픈SSL을 압축 풀어서 놓은 경로를 지정하여 환경을 설정한다.
4. 필요한 Makefile과 관련 오브젝트를 생성한다.
openssl의 경로로 가서, 콘솔창에 아래의 명령중에 하나를 입력한다.
별문제 없이 넘어가고 싶으면 ms\do_ms 를 추천한다.
=> masm 이 있으면 > ms\do_masm
=> nasm 이 있으면 > ms\do_nasm
=> 어셈블러 없으면> ms\do_ms
5. 이제 본격적으로 컴파일을 해보자.
=> nmake -f ms\ntdll.mak
=> 처음에 컴파일을 하면 제일 먼저 만나는 에러다, 에러 문구는 이것 저것 복잡한게 있지만 필요한 내용은 이거다.
.\crypto\cversion.c(105) : warning C4129: 'k' : unrecognized character escape sequence
=> 해당 파일을 소스를 에디트 할수 있는 툴을 이용하여 열어보자.
=> 저위에서 'k'는 프로그램의 설치경로에 따라 각각 다른 캐릭터로 나타날 수 있다.
#ifdef OPENSSLDIR
return "OPENSSLDIR: \"" OPENSSLDIR "\"";
#else
return "OPENSSLDIR: N/A";
#endif
위의 빨간색 부분을 아래와 같이 바꾼다.
#ifdef OPENSSLDIR
return "OPENSSLDIR: \" OPENSSLDIR \"";
#else
return "OPENSSLDIR: N/A";
대충 원인을 살펴보면, 프로그램(openssl) 설치 경로를 를 나타내는데 "가 앞뒤로 하나 더 붙어있어서 발생하는 문제이다.
아마도 윈도우와 유닉스의 경로 구분문자 차이 때문에 발생하는 것으로 추측된다.
이걸 잘 처리하고 컴파일을 다시 진행하면 다음과 같은 또다른 비슷한 유형의 에러를 만나게 된다.
.\crypto\x509\x509_def.c(65) : warning C4129: 'K' : unrecognized character escape sequence
=> 열심히 해당 파일을 열어서 살펴보자.
=> ./crypto/x509/x509_def.c
아래의 빨간색 항목을 주목하자, 윈도우즈에서는 저걸 프로그램 코드에 밖기 위해서는 역슬래시 두개로 바꾸어 주어야한다.
#ifndef OPENSSL_SYS_VMS
#define X509_CERT_AREA OPENSSLDIR
#define X509_CERT_DIR OPENSSLDIR "/certs"
#define X509_CERT_FILE OPENSSLDIR "/cert.pem"
#define X509_PRIVATE_DIR OPENSSLDIR "/private"
=> 자 다음과 같이 바꾸자 (웹에디터 때문인지, 글자 아래 밑줄이 보이는데 무시하자.)
#ifndef OPENSSL_SYS_VMS
#define X509_CERT_AREA OPENSSLDIR
#define X509_CERT_DIR OPENSSLDIR "\\certs"
#define X509_CERT_FILE OPENSSLDIR "\\cert.pem"
#define X509_PRIVATE_DIR OPENSSLDIR "\\private"
위에서 살펴보면 OPENSSLDIR 라는 디파인이 보인다. 이것도 무언지 살펴보면 또다른 문제가 나타난다.
=> ./crypto/opensslconf.h
=> 아래는 컴파일 환경설정 경로이기 때문에, 사용자 설치 경로에 따라 다를 수 있다.
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
#define ENGINESDIR "D:\K4WORK\2_SRC_LIBRARY\k4lib_openss0.98i/lib/engines"
#define OPENSSLDIR "D:\K4WORK\2_SRC_LIBRARY\k4lib_openss0.98i/ssl"
#endif
=> 요거를 아래꺼로 변경
#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
#define ENGINESDIR "D:\\K4WORK\\2_SRC_LIBRARY\\k4lib_openss0.98i\\lib\\engines"
#define OPENSSLDIR "D:\\K4WORK\\2_SRC_LIBRARY\\k4lib_openss0.98i\\ssl"
#endif
이렇게 모든 작업이 끝나면 한방에 컴파일이 완료된다.
자 이제 컴파일을 하면 끝...
이전에도 언급한적이 있지만, 역시나 VS에 물려서 디버깅은 않됩니다.. 그냥 돌아만 갈뿐...
아마도 이버전도 디버거에서 openssl 소스를 추적해 들어가려고 하면, ntdll.mak 파일을 수정해서
디버깅이 가능하도록 하는 버전과, release 에서 배포할 때 성능향상을 할 수 있도록 2가지 버전으로
모두 수정해서 처리해야 할거 같네요.
디버깅 버전을 생성하는건 다음에 시간나면 또 한번 올려보도록 하겠습니다.