[완료] arm target에 ntp 설치하기
처음에는 openwrt 기반 리눅스에서 사용하던 ntp-4.2.4p4을 가지고 시도했습니다.
ntp요청을 보내고 ntp 서버에서 응답을 받으면 ntpd가 죽습니다.
우선 더 최신버전(ntp-4.2.6p2)으로 바꾸어 봤습니다.
$ /usr/local/bin/ntpd -g -l /var/log/ntp.log
/usr/local/bin/ntpd: error while loading shared libraries: libcap.so.1: cannot open shared object file: No such file or directory
libcap이라는 shared library가 없다고 하네요. 구글 열심히 찾아봤습니다. root가 아닌 다른 유저도 ntpd를 실행시키고자 할 때 필요한 library인 것 같아 과감히 --disable-linuxcaps 옵션을 이용해 이 놈을 뺐습니다.
./configure --host=arm-linux --prefix=/home1/ymkim/project/app/ntp-4.2.6p2/local --disable-all-clocks --disable-parse-clocks --enable-NMEA --enable-LOCAL-CLOCK --enable-SHM --disable-linuxcaps
그랬더니 4.2.4p4 버전과 같은 증상으로 프로세서가 죽더군요.
소스 따라가 봤습니다. main함수에서는 rbuf->receiver에서 죽더군요. callback 함수인데, $NTP_HOME/ntpd/ntp_io.c 에 rb->receiver = receive; 로 등록되고, $NTP_HOME/ntpd/ntp_proto.c 에 receive 함수이더군요.
결국 추적해 보면 fabs라는 수학함수 실행 중에 죽는데.. 이 놈은 꼼수로 넘어가도 다음에 sqrt, log등 수학함수가 나와서. 제가 어떻게 해 볼 수 없는 영역이더군요. libm 을 어떻게 해야 하는 건가? 어떻게 해야 할 지 모르겠습니다.
$ uname -a
Linux W5300E01-ARM 2.6.24.4 #22 PREEMPT Tue Nov 9 08:53:00 KST 2010 armv4tl unknown
결국 ntpclient 를 받아서 쓰고 있기는 한데.. 오기가 생기네요..
arm cpu의 floating point 처리 문제
글을 올리고 나서 좀더 찾아본 후 원인을 알게 되었습니다.
수학함수 자체의 문제가 아니라 floating point 연산이 들어간 것이 문제였습니다.
그리고 에러 메시지가 Illegal instruction으로 나오는 것도 중요한데 질문에는 그걸 빠뜨렸었고요..
http://www.informit.com/articles/article.aspx?p=1620207&seqNum=4 링크에 자세한 설명이 나옵니다.
FPU, EABI, VFP등의 용어를 설명해 줍니다.
아래 두 글도 저의 질문과 관련이 있는 것들이고요..
http://kldp.org/node/115720
http://kldp.org/node/108991
이제 원인을 알았으니 해결 방법을 찾아야겠죠?
구글링을 열심히 해서 "-msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t"을 gcc 의 옵션으로 넣어줘야 한다는 것을 알아냈죠? 하지만 다른 옵션은 괜찮은데 -msoft-float을 포함시키면 configure에서 오류를 내더군요.
그래서 조금 더 찾아봤더니 제 개발환경이 ELDK 4.0이었는데, 4.2에서 부터 "soft-float"를 지원하는 것을 알았습니다.
지금 4.2 다운 받고 있는데.. 해보고 다시 글 올리겠습니다.
댓글 달기