소스 컴파일을 마치고, 필요한 프로젝트에 넣어서 사용하는데는 별 문제가 없지만..
역시나 문제가 생기면 디버깅을 해야죠.

ms\do_ms.bat 를 보시면 다음과 같이 나와있습니다.

perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl no-asm VC-WIN32 >ms\nt.mak
perl util\mk1mf.pl dll no-asm VC-WIN32 >ms\ntdll.mak
perl util\mk1mf.pl no-asm VC-CE >ms\ce.mak
perl util\mk1mf.pl dll no-asm VC-CE >ms\cedll.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def

위의 환경은 일반적인 디버깅이 빠진 상태의 메이크 파일을 만드는 과정이고..
아래와 같이 debug 라고 하는 키워드를 추가하시면 디버깅이 가능한 메이크 파일을 생성해 줍니다.

perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl no-asm VC-WIN32 >ms\nt.mak
perl util\mk1mf.pl dll debug no-asm VC-WIN32 >ms\ntdll.mak
perl util\mk1mf.pl no-asm VC-CE >ms\ce.mak
perl util\mk1mf.pl dll no-asm VC-CE >ms\cedll.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def

저렇게 수정하신 후 command line 에서 ms\do_ms.bat 를 돌리시면 새로운 환경 설정이 적용된 ntdll.mak 파일 생성됩니다.
해당 파일을 열어 보시면 다음과 같이 바껴 있는걸 볼 수 있습니다.

CFLAG= /MDd /Od -DDEBUG -D_DEBUG /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_CMS -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE    

일단 저렇게 만들어서 컴파일을 해보니 out32dll.dbg tmp32dll.dbg 처럼 디버깅용 폴더가 생기면서 필요한 파일이 작성됩니다.
그런데, 메뉴얼 대로 다 해서 소스와 물려 돌려봤는데, -_-??? 역시나 디버깅시 openssl 함수 호출부를 추적하면 내부로 못들어 가네요.

CFLAG= /nologo /MDd /W3 /Gm /GX /ZI /Od /I /FR"Debug/" -DDEBUG -D_DEBUG   -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_RC5  -DOPENSSL_NO_MDC2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_CMS -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED

위에 꺼는 이전에 맨땅에 해딩하면서 만들었던 (0.9.8b 버전 당시..) 내용을 추려서, 0.9.8i 버전에 맞도록 수정한 내용입니다.

이렇게 수정해 놓고, 다시 몽땅지우고 재컴파일 한 후, 새로 생성된 라이브러리와 dll을 복사해놓고.. 
작업 프로그램을 빌드 한 후, 소스 추적에 들어가니 ssl 소스로도 잘 추적이 들어가네요.. 

수고하세요..

PS. 다 만들어진 라이브러리를 작업하는 프로젝트에 첨부하고 빌드했을 때, unresolved external symbol 류의 에러가 발생하면
      ssleay32.def 에 해당 함수를 추가 하시면 됩니다. 참고로 ssleay32.def의  마지막 오디너리 넘버가 293번 이니까..
      294번 부터 추가하세요.. 그리고, openssl 을 다시 한번 빌드하셔서 복사하시고 사용하시면 됩니다.


 

지금까지 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가지 버전으로
모두 수정해서 처리해야 할거 같네요.

디버깅 버전을 생성하는건 다음에 시간나면 또 한번 올려보도록 하겠습니다.

+ Recent posts