GDB을 사용하다가 떠오른 생각이다.


 GCC는 DeBug를 막는 방법이 없는가? 라는 점이다.


 여기서 구글릉을 하다가 찾은 블로그를 보고 작성할려고한다.


 참조 : http://developinghappiness.com/?p=313


 왜 릴리즈 모드여야 하는가?


 디버그는 개발자가 버그를 추측/분석/수정을 할 때 매우 유용한 도구이다.

 디 어셈블리어 또한 도움되는 도구인데, 여기서 문제는 악용이다.


 소스를 보고 이것에 대해서 소스를 분석할 수 있게 되고, 이것은 곧 소프트웨어가 소스화 시킬 수 있다는 뜻이다.(이것은 소프트웨어의 복제품을 늘어나기 쉽다는 뜻이다.)


 그래서 이것을 막아야 된다.


 일단, 디 어셈블리어를 완벽하게 막는 것은 절대로 없다.


 왜냐면, 아무리 디 어셈블리어를 막더라도 컴퓨터 안에서 작동이 되어야 된다.


 예을 들어서 제 3자에게 결과물을 받아들이는 형태라면, 앞에 말한 것이 불가능하다. 이유는 결과물만 봐서는 이것을 추측할 뿐이지 진정으로 프로그램이 어떻게 돌아가는지는 모르기 때문이다.


 하지만, 우리는 컴퓨터에 프로그램이 저장되어 있다. 적어도 이 프로그램을 분석하거나 메모리 안에 들어가 있다. 그래서 이것을 분석하게 되면, 당연히 프로그램의 내용물을 알 수 있다. 라는 뜻이다.


 즉, 완벽한 디 어셈블리어를 막을 수는 없다.


 이것에 대해서 이야기 할려고 하지 않는다. 그냥 컴파일 안에서 디버그 기능을 막는 것을 표현 할려고 한다.


 GCC을 사용하는 방법은 다음과 같다.


1
2
gcc -DNDEBUG
 
cs



 -DNDEBUG을 이용해서 DEBUG용 옵션이 막히게 된다.


 DEBUG를 하기 위해서는 -DDEBUG 옵션을 사용하면 된다.


 그리고 연습삼아 gcc -c -DNDEBUG와 gcc -c DDEBUG를 비교 해서 링크를 걸어 봤는데, 여기에서는 기본적으로 DNDEBUG라는게 있다.


 이렇게 본다면, 링커에서 디버그 유무를 설정하는 것이다.


 여기서 Object에서는 릴리즈 모드가 기본이라면, Source에서는 디버그 모드로 컴파일이 일어난다. 라고 볼 수 있을 것이다.

Posted by JunkMam
,