R6002 floating point not loaded ???

2006.05.16 02:08

단장 조회 수:973 추천:15

float a;
scanf( "%f", &a );


위의 코드를 일부 M$ 컴파일러에서 돌려보면 의외로 이런 에러가 발생한다.




문제의 그분..



imays 님의 포스팅 을 통해서 이미 알고 있던 문제였던지라 상콤하게 volatile a = 1.0f; 를 붙여놓고 안심하고 있었는데 뭔가 난리가 났던것 같다. 해서 오늘 웹질을 해서 알아낸 것을 정리해 본다.

1. scanf() / printf() 계열에서 사용되는 부동 소수점 포멧 문자열("%f") 해석기는 코드 량이 꽤나 크다. 해서 M$ 컴파일러들은 불필요한 경우 최종 실행 이미지에 해당 라이브러리를 포함하지 않는다.

2. 저 라이브러리가 필요한지 아닌지는 일단 컴파일러가 판단한다. 그런데 컴파일러가 저걸 어떻게 판단하는지에 대한 정보는 MSDN 에서도 저마다 얘기가 다르다. 어떤 문서에서는 프로그램 아무데서나 float 변수에 대입만 하면 된다고 하고 ( perform a floating-point assignment elsewhere in the program ), 또 어떤 문서에서는 반드시 포멧 스트링안에 있는 변수에 대입을 하라고 되어 있기도 하다. ( you must specify a floating-point value or a pointer to a floating-point value in the argument list. ) 같은 회사의 문서들이 저마다 다 딴소리를 하고 있으니 이건 경험으로 유추해 내는수밖에는 없겠다. 테스트를 좀보았는데, 최소한 한개의 소스파일에서 float 변수의 대입과 scanf() /printf() 패밀리의 호출이 동시에 일어나야 하는 것 같다. 말하자면 a.cpp 에서 대입하고 b.cpp 에서 호출하면 말짱 꽝이라는 얘기. 그런데 이것은 테스트로 얻어낸 결론이니 역시 믿을만한건 못된다.

3. 조금 더 파고들어가 보자. 부동 소수점 라이브러리 판단은 컴파일러가 하게 되지만 실제로 최종 이미지를 만드는 것은 링커의 몫이다. 그렇다면 컴파일러는 어떤 방식으로 링커에게 라이브러리 사용 여부를 전달하는 것일까? CRT 소스코드를 뒤적거리다 알아낸 바에 따르면, 컴파일러는 해당 정보를 _fltused 에 대한 레퍼런스를 만든다. 그리고 링커는 object 파일들 중에 최소한 한개라도 _fltused 변수 를 참조하면, 부동소수점 라이브러리를 최종 이미지에 링크시킨다.

4. 해서 아래의 코드를 코드 아무데다 쑤셔넣으면 R6002 문제는 사라진다. _fltused 의 인스턴스가 없어도 M$ 링커님이 알아서 잘~ 처리해 주신다.


extern "C" {
extern int _fltused;
volatile int _AVOID_FLOATING_POINT_LIBRARY_BUG = _fltused;
};

사족. 분명히 어딘가에 제시가 되어있을것 같아서 MSDN 을 뒤졌더니 .Net 포팅 관련 해서도 비슷한 문제가 있는듯 하다. 거기서 M$ 가 공식적으로 제시하는 해결책은 _fltused 에 1을 대입하는 것이더군. (그런데 왜 그짓을 해야하는지에 대한건 한마디도 안써놨다. -_- )

댓글 0

파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
» R6002 floating point not loaded ??? 단장 2006.05.16 973
23 해외 취업, 미국으로 가는 길 단장 2006.04.26 849
22 부동산 매수 시 고려해야 할 38가지 단장 2006.04.19 882
21 형법총론 핵심정리 단장 2006.04.19 1246
20 VC 디버그빌드에서 들어가는 쓰레기값들의 의미 단장 2006.04.15 964
19 일어 12월명 [1] 단장 2006.03.21 933
18 아마추어 암호 설계자에게 주는 충고 by 브루스 슈나이어 단장 2005.12.22 983
17 원핸드 스트링 기본. 마운트. [1] 단장 2005.12.05 1075
16 요요회사간의 베어링 규격 단장 2005.12.05 1084
15 니콜라 테슬라 단장 2005.11.26 1168
14 비싼 카메라 이야기 단장 2005.11.21 1000
13 귤화위지의 고사 단장 2005.10.03 924
12 오자서 평전 단장 2005.09.26 855
11 순수 탄소 - 퓔러렌 단장 2005.07.19 989
10 Direct3D API들의 실행 사이클 단장 2005.07.15 988
9 음식 칼로리표 -_-;;; [3] 단장 2005.07.14 1040
8 CPU 평균온도 단장 2005.07.13 1087
7 AMD CPU 리퍼런스 테이블 단장 2005.07.11 978
6 맥 탄생비화 (1) 단장 2005.07.04 1177
5 NOR-플래시 메모리 제어 (2) 단장 2005.07.04 961