Syscall 생성시 자료형 double 에 대한 에러.. ^^
글쓴이: hanseok / 작성시간: 일, 2004/02/08 - 7:05오후
X86에서 시스템 콜을 몇개 정의하여서 사용하고 있었습니다.
이것을 ARM 보드로 포팅하는 과정에서
H/W 의존성이 있는것은
entry.S ==> calls.S
unistd.h ==> unistd.h ( 다른 디렉토리 )
이정도여서 그냥 설정하고 컴파일 했더니..
kernel/kernel.o(.text+0x13abc): undefined reference to `__gtdf2' kernel/kernel.o(.text+0x13acc): undefined reference to `__floatsidf' kernel/kernel.o(.text+0x13ae0): undefined reference to `__divdf3' kernel/kernel.o(.text+0x13b14): undefined reference to `__gedf2' kernel/kernel.o(.text+0x13bfc): undefined reference to `__gedf2' kernel/kernel.o(.text+0x13d44): undefined reference to `__gedf2' kernel/kernel.o(.text+0x13e2c): undefined reference to `__gedf2'
위와 같은 에러를 나타내더군요..
이유를 찾아서 무진장 시간 투자를 했죠. 삽질..
그리고 찾은것이 몇개의 시스템 콜을 구현하는 부분에서
double 자료형을 사용했다는 것이였습니다.
double <== 이놈이 arm 에서 적용이 안되는것인가요?
arm 용 커널에서는 그럼 실수형은 무엇을 사용해야 하는지. 궁금하네요
일단은 제가 사용한 변수들이라. 모두 unsigned long으로 변환을 하고 소스를 수정해 주었습니다.
궁금하네.. double 때문에 저런 에러가 날줄은 전혀 몰랐습니다.
Forums:
커널에서 부동소숫점을 쓰려면 연산에 필요한 런타임을 명시적으로 링크해 주
커널에서 부동소숫점을 쓰려면 연산에 필요한 런타임을 명시적으로 링크해 주어야 합니다. 에러는 런타임 함수들을 링커가 찾지 못했기 때문에 발생한 것입니다. libgcc나 해당 OS의 런타임 소스 코드를 찾아 보시면 함수가 있을 것입니다.
이 문제는 arm뿐만 아니라 다른 아키텍쳐에도 공통적으로 적용되는 문제입니다. 그리고 런타임뿐만 아니라 커널에서의 부동소숫점 연산은 사용자 모드와 커널 모드 전환시 레지스터 보존을 깨뜨릴 가능성이 있기 때문에
부동소숫점연산하겠음();
부동소숫점 연산...
부동소숫점연산다했음();
처럼 코드 블록을 보호해 줄 필요도 있습니다. 사용자 모드에서의 작업보다 까다로운 면이 있죠.
한국 BSD 사용자 포럼
댓글 달기