안녕하세요.
임베디드 OS만들기라는 책을 보고 OS에 대하여 공부하고 있는 학생입니다.
이곳에 남겨도 될지 모르겠으나, 책 내용중 문제사항이 생겨 질문을 남깁니다.
에러 사항은 U-boot 컴파일시에 에러가 발생하는데 u-boot파일은 도서참고 자료로 올라온 파일을 그대로 사용하였으며 그외 설치 환경은 다음과 같습니다.
설치 환경 : Linux 9.10
크로스 컴파일러 3.4.1
QEMU 에뮬레이터 버젼 0.12.3
확인 사항 : QEMU동작
에러 사항 : U-boot 컴파일시 에러 발생
다음에 에러메세지를 남겨보겠습니다. 이에 대해서 해결할 수 있는 방법이 잇는지 조언 부탁드립니다.
Description
-----------------------------------------------------------
make[1]: Leaving directory `/home/noxqeust/다운로드/gumstix_uboot/common'
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/gumstix/libgumstix.a cpu/pxa/libpxa.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed -n -e 's/.*(__u_boot_cmd_.*)/-u1/p'|sort|uniq`;
arm-linux-ld -Bstatic -T /home/noxqeust/다운로드/gumstix_uboot/board/gumstix/u-boot.lds -Ttext 0xA3F00000 $UNDEF_SYM cpu/pxa/start.o
--start-group lib_generic/libgeneric.a board/gumstix/libgumstix.a cpu/pxa/libpxa.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1 -lgcc
-Map u-boot.map -o u-boot
arm-linux-ld: ERROR: /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_divsi3.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld: failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_divsi3.oS)
arm-linux-ld: ERROR: /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_modsi3.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld: failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_modsi3.oS)
lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):/home/noxqeust/다운로드/gumstix_uboot/lib_arm/_udivsi3.S:67: relocation truncated to fit: R_ARM_PLT32 __div0
lib_arm/libarm.a(_umodsi3.o)(.text+0xa8):/home/noxqeust/다운로드/gumstix_uboot/lib_arm/_umodsi3.S:79: relocation truncated to fit: R_ARM_PLT32 __div0
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_divsi3.oS)(.text+0x11c):/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/gcc/config/arm/lib1funcs.asm:735: relocation truncated to fit: R_ARM_PLT32 __div0
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_modsi3.oS)(.text+0xd8):/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/gcc/config/arm/lib1funcs.asm:795: relocation truncated to fit: R_ARM_PLT32 __div0
make: *** [u-boot] Error 1
댓글 5
-
백창우
2010.03.25 00:56
-
김남형
2010.03.25 01:18
libgcc.a(_divsi3.oS) uses hardware FP, whereas u-boot uses software FP
이 부분이 문제가 되는군요.. toolchain에서 software FP를 지원해야 합니다.
-
송인재
2010.03.25 03:30
두분 답변 감사드립니다
백창우님 말씀대로 버젼 변 환 후 해되었씁니다.
software FP는 무었을 의미하는 것인 지요 ? Floating Point인가요?
-
백창우
2010.03.25 12:59
software FP는 floating point 및 floating point 연산을 S/W로 emulation하는 겁니다.
libgcc.a에는 architecture 지원 코드들이 들어있는데, software FP, 나누기 연산등과 같은 코드들이 들어 있습니다.
쉽게 예를 들면 ARM에는 divide unit이 없는데, 아래와 같은 코드가 C 소스 내에 있다면,
a = b / c;
내부적으로 아래와 같이 변경합니다. (__udivsi3() 함수명은 ABI에 따라 다를수 있습니다.)
a = __udivsi3(b, c);
그리고 나서 실제 컴파일이 진행되고 링킹됩니다. 링킹될때 gcc는 libgcc.a를 같이 링킹하는데,
libgcc.a 라이브러리에 __udivsi3()와 같은 architecture 지원 함수가 있습니다.
software FP도 마찮가지이구요.
-
송인재
2010.03.25 13:32
감사합니다.
.
컴파일러 버전을 2.95.x대로 바꾸어서 컴파일해보십시요.