libtomcrypt 의 소스 중에서 md5 부분만 발췌해서 사용하고자 다음과 같이 파일을 추려냈다.


  • md5.c
  • md5.h
  • crypt_argchk.c
  • tomcrypt_argchk.h
  • tomcrypt_custom.h
  • tomcrypt_macros.h


윈도우 환경에서는 별다른 수정없이 빌드가 가능하나,

리눅스에서는 다음과 같이 에러가 발생한다.


tomcrypt_macros.h: In function ‘ROLc’:

tomcrypt_macros.h:267:4: warning: asm operand 2 probably doesn’t match constraints [enabled by default]

tomcrypt_macros.h:267:4: error: impossible constraint in ‘asm’


소스 코드는 다음과 같다.


static inline unsigned ROLc(unsigned word, const int i)

{

   asm ("roll %2,%0"

      :"=r" (word)

      :"0" (word),"I" (i));

   return word;

}


static inline unsigned RORc(unsigned word, const int i)

{

   asm ("rorl %2,%0"

      :"=r" (word)

      :"0" (word),"I" (i));

   return word;

}


-DLTC_NO_ASM 빌드 옵션을 줘서, 일반 c코드로 빌드해도 되나

전부 다 문제 있는 것도 아니고 ROLc 함수에서만 문제 생기니 애매한 상황이다.


참고: http://code.google.com/p/eid-mw/issues/detail?id=49


그러다가, 여기 글에서 (1) https://github.com/libtom/libtomcrypt/issues/2 해결 방법을 찾았다.


  1. LTC_NO_ROLC 를 지정해서 ROLc 하고 RORc 두 함수만 c코드로 빌드한다.
  2. 컴파일 옵션에서 -O0 가 아닌 -O3 로 빌드한다.


실제로도 libtomcrypt 라이브러리도 -O3 로 빌드하고 있다.

-O0 은 컴파일 시간을 줄이고, 결과를 예측할 수 있도록 디버깅 정보를 만든다.

이는 gcc 최적화 옵션(-O)의 기본 값이다.


그런데, 인라인 어셈블리 함수가 최적화 되지 않은 경우에 ROLc 에서 변수값 I가 상수이면,

잘못된 것이기 때문에 에러를 발생한다. (위의 링크에서 sporksmith 가 언급한 내용)


따라서 -O0 가 아닌 -O3 로 지정하여 빌드해야 한다.

-O3 에는 인라인 함수에 대해서 최적화를 수행하기 때문이다.

최적화를 수행하면 I 변수에 대해서 대체 처리를 하여 빌드가 된다.


이 문제는 ROLc(), RORc() 두 함수에서 발생하니 이것을 사용하는 소스 파일은 반드시 -O3 를 지정해서 빌드해야 한다.



Eclipse 에서는 md5.c 파일의 Properties > C/C++ Build > Settings > GCC C Compiler - Optimization 에서

Optimization Level 을 None (-O0) 에서 Optimize most (-O3) 로 바꿔주면 된다.


마찬가지로 crypt_argchk.c 파일도 동일하게 -O3 로 지정해준다.


Posted by 집시F