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개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
24 효율적인 동기화를 위한 아이디어 하나 단장 2007.09.29 3284
23 버텍스버퍼의 효율적인 사용 단장 2007.10.01 5100
22 NAT 홀펀칭 단장 2007.10.25 1294
21 한국운전면허를 일본운전면허로 바꾸기 [2] 단장 2007.10.26 1351
20 Nat기반 P2P 프로그래밍 단장 2007.11.21 1627
19 개인적으로 만들어 본 리눅스 게임 서버 FAQ 단장 2007.11.27 1125
18 Networking Best Practices in XBOX360 단장 2007.12.19 10896
17 일본어 날짜 단장 2008.02.19 1150
16 std::tr1 단장 2008.03.13 1848
15 제트 추력 엔진 단장 2008.04.29 1600
14 vTune 사용법 단장 2009.01.13 3234
13 Fast Bit Counting 단장 2009.02.21 1883
12 골프의 물리학 단장 2009.05.30 1681
11 Stream of Life 단장 2009.06.29 1285
10 마력 구하는 공식 단장 2013.07.11 7383
9 Windows 8.1 복구 파티션 만들기 단장 2013.11.13 6692
8 비디오 카드의 정의 단장 2013.11.30 269
7 디카 이미지 슬라이드필름처럼 보정하기 file 단장 2014.02.13 241
6 마포에서 AF되는 포서드용 렌즈들 단장 2014.02.13 436
5 빠른 1/sqrt(n) 계산방법 단장 2014.03.05 549