안녕하세요. 까막임돠~
오랜만에 글을 쓰네요, 언제나 항상 오랜만인... 게으른 까막 ㅡㅠ;
오늘은 최근 Open SSL 1.0.2 를 적용하면서 나온 부산물을 글로 적어볼까 합니다.
항상 그렇듯이 windows 기반이고요, 이제는 64 bit OS 만 대상으로 작업을 하게 되네요.
32 bit 는 빌드 환경만 바꾸면 되니, 사실 2개의 작업은 차이가 없습니다.
개발 환경은 Windows 2008 Server R2 x64 이고요, 툴은 MSVS-2013 공짜 버전을 사용하였습니다.
1. 우선 최신 버전을 다운 받아야 겠죠?
https://www.openssl.org/source/
2. Active Perl 사이트에서 커뮤니티 에이션을 다운 받습니다.
http://www.activestate.com/activeperl/downloads
3. 소스는 적당한 곳에 압축을 풀고, 펄은 설치를 합니다.
4. MSVS 2013 에서 콘솔 컴파일을 하려면 손으로 환경설정하는 노가다가 아주 끝내줍니다.
자동으로 이런 환경을 제공해주니 사용해 주어야 겟지요..ㅎ
해당 메뉴를 이용하면 다음과 같은 창이 열립니다.
64비트 컴파일 환경을 수행하면 이런 환경 변수가 모두 적용된 cmd 창이 뜹니다.
모든 작업이 완료될 때까지 쭉 써야할 이쁜이죠..
5. 우선 기본 소스가 풀린 폴더 BASE 라고 표현하죠. 해당 경로로 cmd 창에서 이동합니다.
가장 첫 번째 작업으로 perl 을 이용하여 64비트 빌드 환경을 마춰주죠.
cmd> perl Configure VC-WIN64A
두 번째로. win64a 배치 파일을 수행하여 빌드 환경을 다시 마춰줍니다.
cmd> ms\do_win64a
마지막으로, nmake를 이용하여 빌드하면 끝~
cmd> nmake -f ms\ntdll.mak
이렇게만 해줘도, BASE 폴더에 out32dll 폴더와, tmp32dll 폴더에 빌드된 파일이 쭉 생기죠.
모든 lib, dll, exe 는 BASE\out32dll 폴더에 다 들어있습니다.
이번 1.0.2 버전은 windows 빌드 환경에 세심하게 신경썼는지, 아주 이쁘게 한방에 빌드가 되네요.
6. 이렇게 만 끝내면 상당히 아쉽지요?
다음으로는 보통 가져다 쓰는 libeay32.lib 및 ssleay32.lib 를 사용하게 되는데, 이것 저것 좀 건드리다 보면
unresolved external symbol 에러를 마주 치는 경우가 많습니다.
분명 소스에는 있는 함수인데, 내가 만드는 프로그램에서 호출해서 쓰면 못쓰는 경우죠.
라이브러리를 만들 때, 해당 함수를 export 하지 않았기 때문에 외부에서 못쓰는 거죠.
BASE 폴더의 하위 폴더중에 util 폴더가 있습니다.
libeay.num파일과 ssleay.num 파일이 있습니다.
내가 호출하는 함수가 어느 라이브러리 연관있는지는 개발자 본인이 가장 잘 알테고,
그렇게 사용해야할 함수를 해당 파일을 열어서 등록해주면 됩니다.
노트패드나 다른 에디터로 열어보시면 그냥 아실 수 있습니다.
문제는 이러한 export 등록만 하면 되는게 아니고, 해당 함수의 정의부를 사용하는 해더에도 정의 해주어야 합니다.
BASE\SSL\ssl.h 파일에 내가 사용하는 함수의 정의부를 함께 기록해주어야 합니다.
이렇게 해주시면 ssl 내부의 함수도 내가 만드는 프로그램에서 자유자재로 쓸 수 있습니다.
요렇게 해서 5번 과정을 이용하여 빌드하고 나면 ms 폴더에 있는 ssleay32.def 나 libeay32.def 파일에 추가한 함수가
등록되어 있는걸 볼 수 있습니다. 사실 요걸 직접 수정해도 되는데, 환경 설정할 때마다 자동으로 덮어써지는 파일이기
때문에 귀찬고 실수 할 여지가 많죠.
7. ssl 을 이용하여 개발할 때 필요한 필수 항목이 디버깅 환경을 갖추는 거죠?
지금까지는 그냥 release 환경 하에서, 쓸 수 만 있는거지 디버깅은 안됩니다.
설치 폴더의 ms 폴더에 가서 do_win64a.bat 를 복사하여, do_win64a_debug.bat 파일을 하나 만듭니다.
이 그림이 오리지널 파일이고요.
요 그림이 디버깅 환경으로 변경한 그림입니다. 아주 쉽죠 @.@???
cmd> ms\do_win64a_debug
cmd> nmake -f ms\ntdll_debug.mak
이렇게 빌드하시면, 디버깅 환경도 짠 갖췄습니다.
라이브러리나 dll 을 .dbg 폴더에 있는걸 가져다 쓰시면 디버깅 준비도 끝났습니다.
8. 이렇게 openssl 1.0.2 를 디버깅 환경하에서 사용할 수 있도록 모든 준비가 끝났지만
openssl.exe 툴을 이용하여 디버깅을 하려면 저 소스를 이용해서 직접 빌드하고 수정할 수 있어야겠지요?
저 실행 파일을 직접 디버거에 물려서 소스랑 같이 수정해가면서 빌드하면 좋겠지요?
위의 sample.zip 파일의 압축을 풀어서 해당 내부에 있는 파일 4개를 BASE 폴더의 하부에 있는 apps 폴더에
복사하여 넣어 둡니다.
요렇게 선택된 4개의 파일입니다.
openssl.vcxproj 프로젝트 파일을 열어서 간단하게 F5 키를 눌러서 빌드해 줍니다.
8.1 아무 문제 없으면 좋겠지만 첫번째 오류는 e_os.h 를 찾을 수 없다는 겁니다.
BASE\tmp32dll 폴더나 BASE\tmp32dll.dbg 폴더에 있는 e_os.h 를 복사하여
BASE\apps 폴더에 넣어주고, 다시 빌드 합니다.
8.2 이렇게 끝나주면 가장 좋구요. 다음과 같이 winsock 관련 오류가 뜨면 한가지 작업을
더 진행해 주어야 합니다.
그림과 같이 윈속 관련된 에러가 뜬다. 저번 버전은 안그랬는데.. 안뜨면 좋고 위와 같이 윈속 관련 에러가 뜨면 apps.c 파일의 다 음 위치에 아래 코드를 추가한다.
요렇게 한줄 추가해 주시고, 빌드해주시면 이제 openssl.exe 플젝을 디버거를 걸어 가면서 놀 수 있습니다.
새로운 플젝을 만들 때도, 위에 소스 대충 가져다 만들면 별다른 문제 없이 쓸 수도 있구요..
해당 플젝에 디버거 걸어서 소스 트레이스 하는 모습입니다.
모두 잼난 열공.. 하셔요.. ~