【问题】
折腾:
【记录】Ubuntu下用arm-xscale-linux-gnueabi交叉编译uboot
编译最后出错:
1 2 3 4 5 6 7 8 | UNDEF_SYM=`arm-xscale-linux-gnueabi-objdump -x lib_generic /libgeneric .a board /whgs/libwhgs .a cpu /pxa/libpxa .a lib_arm /libarm .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_.*\)/-u\1/p' | sort | uniq `;\ arm-xscale-linux-gnueabi-ld -Bstatic -T /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs/u-boot .lds -Ttext 0x5c010000 $UNDEF_SYM cpu /pxa/start .o \ --start-group lib_generic /libgeneric .a board /whgs/libwhgs .a cpu /pxa/libpxa .a lib_arm /libarm .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 /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /bin/ .. /lib/gcc/arm-xscale-linux-gnueabi/4 .6.0 -lgcc \ -Map u-boot.map -o u-boot /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /bin/ .. /lib/gcc/arm-xscale-linux-gnueabi/4 .6.0 /libgcc .a(_dvmd_lnx.o): In function `__aeabi_ldiv0': /home/crifan/develop/crosstool-ng/crosstool-ng-1 .18.0_build/.build /src/gcc-4 .6.0 /libgcc/ .. /gcc/config/arm/lib1funcs .asm:1266: undefined reference to `raise' make : *** [u-boot] Error 1 crifan@ubuntu:u-boot-1.1.4-whgs$ |
即:
xxx/libgcc.a(_dvmd_lnx.o): In function `__aeabi_ldiv0′: |
如图:
【解决过程】
1.参考:
lib1asmfuncs.asm calls raise unconditionally
但是看不太懂。
2. 参考:
[Buildroot] undefined reference to `raise’ when linking with libgcc
遇到类似问题,但是没说怎么解决。
3.这里也看到讨论:
ibotlog2html for #crosstool-ng
但是还是不知道如何解决。
貌似需要重新build一个???
4.参考:
[Bug c/31798] New: lib1funcs.asm:1000: undefined reference to `raise’
那人是自己手动添加一个了空的raise()函数而使得可以正常编译了。
此处,暂不用这种方法。
5.参考其回复:
[Bug target/31798] lib1funcs.asm:1000: undefined reference to `raise’
说到了:当发生除于0才会出现除的函数,其中会去触发__div0函数
以及,说不是编译器的bug,而需要自己解决:
要么说动实现自己的_div0
要么重新用不同的配置重新去编译交叉编译器。
但是此处:
前者,不太会。
后者,很是麻烦。
所以都放弃。
6.参考:
Re: [nuttx] commit 4573 broke the calypso platform.
其自己解决了:
I fixed locally by linking to src/target/firmware/lib/lib1funcs.S in osmocombb — a/src/target/firmware/lib/lib1funcs.S +++ b/src/target/firmware/lib/lib1funcs.S @@ -323,6 +323,7 @@ ENTRY(__aeabi_idivmod) sub r1, r1, r3 mov pc, lr +ENTRY(__aeabi_ldiv0) Ldiv0: str lr, [sp, #-8]! @@ -332,3 +333,6 @@ Ldiv0: ENTRY(__div0) mov pc, lr + +ENTRY(__aeabi_unwind_cpp_pr0) And linking to it in Make.defs… |
但是还是不太想要这种方法。
7.参考:
build uClibc toolchains using Buildroot for GM812x
其是:
|
此处,也不太会弄。
8.然后看到了
commit 4573 broke the calypso platform
中也有类似的解决办法,但是还是觉得不好。
9.后来看到:
Source object XXX has EABI version 4, but target u-boot has EABI version 0
其中的几个人的解释,比较清楚:
U-Boot is not a GNU/Linux application. However, you’re using the GNU/Linux toolchain to compile it — so the libraries assume the presence of a GNU/Linux C library. In this case, the division routine wants to call "raise" to signal a division-by-zero exception. particular toolchains. |
和:
U-boot explicitly compiles its binaries for ARM with -mabi=apcs-gnu, not EABI, so linking to any EABI compiled libgcc will cause the same error message. I noticed that this question was about an very out-dated version of U-boot, namely 1.1.4, so that might be cause some troubles as well. So, use a proper compiler toolchain (not EABI, but surely a bare metal edition). Several options are possible, you can also use the ARM-ELDK from denx.de |
然后去试试后面给出的解决办法:
(1)修改Makefile,改为:
1 2 | # Add GCC lib #PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc |
(2)再去修改:lib_generic/vsprintf.c
修改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <linux/string.h> #include <linux/ctype.h> #ifdef CFG_64BIT_VSPRINTF #include <div64.h> #endif #include <common.h> ... #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #if 0 #define do_div(n,base) ({ \ int __res; \ __res = ((unsigned long ) n) % (unsigned) base; \ n = ((unsigned long ) n) / (unsigned) base; \ __res; \ }) #endif #ifdef CFG_64BIT_VSPRINTF static char * number( char * str, long long num, int base, int size, int precision , int type) #else |
结果重新编译,则会导致更多的错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | crifan@ubuntu:u-boot-1.1.4-whgs$ make clean find . -type f \ \( -name 'core' -o -name '*.bak' -o -name '*~' \ -o -name '*.o' -o -name '*.a' \) -print \ | xargs rm -f rm -f examples/hello_world examples/timer \ examples/eepro100_eeprom examples/sched \ examples/mem_to_mem_idma2intr examples/82559_eeprom \ examples/test_burst rm -f tools/img2srec tools/mkimage tools/envcrc tools/gen_eth_addr rm -f tools/mpc86x_clk tools/ncb rm -f tools/easylogo/easylogo tools/bmp_logo rm -f tools/gdb/astest tools/gdb/gdbcont tools/gdb/gdbsend rm -f tools/env/fw_printenv tools/env/fw_setenv rm -f board/cray/L1/bootscript.c board/cray/L1/bootscript.image rm -f board/trab/trab_fkt board/voiceblue/eeprom rm -f board/integratorap/u-boot.lds board/integratorcp/u-boot.lds crifan@ubuntu:u-boot-1.1.4-whgs$ make whgs_config Configuring for whgs board... crifan@ubuntu:u-boot-1.1.4-whgs$ make ... make[1]: Leaving directory `/home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/common' UNDEF_SYM=`arm-xscale-linux-gnueabi-objdump -x lib_generic/libgeneric.a board/whgs/libwhgs.a cpu/pxa/libpxa.a lib_arm/libarm.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_.*\)/-u\1/p' |sort|uniq`;\ arm-xscale-linux-gnueabi-ld -Bstatic -T /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/board/whgs/u-boot.lds -Ttext 0x5c010000 $UNDEF_SYM cpu/pxa/start.o \ --start-group lib_generic/libgeneric.a board/whgs/libwhgs.a cpu/pxa/libpxa.a lib_arm/libarm.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 \ -Map u-boot.map -o u-boot cpu/pxa/libpxa.a(interrupts.o): In function `udelay_masked': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/cpu/pxa/interrupts.c:197: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/cpu/pxa/interrupts.c:202: undefined reference to `__aeabi_uidiv' net/libnet.a(tftp.o): In function `TftpHandler': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/net/tftp.c:230: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/net/tftp.c:232: undefined reference to `__aeabi_uidivmod' net/libnet.a(tftp.o): In function `TftpStart': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/net/tftp.c:372: undefined reference to `__aeabi_uidivmod' net/libnet.a(bootp.o): In function `BootpRequest': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/net/bootp.c:672: undefined reference to `__aeabi_uidiv' drivers/libdrivers.a(onenand_uboot.o): In function `flash_print_info': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_uboot.c:65: undefined reference to `__aeabi_uidivmod' drivers/libdrivers.a(onenand_base.o): In function `onenand_command': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:203: undefined reference to `__aeabi_lasr' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:208: undefined reference to `__aeabi_lasr' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:209: undefined reference to `__aeabi_lasr' drivers/libdrivers.a(onenand_base.o): In function `onenand_update_bufferram': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:468: undefined reference to `__aeabi_lasr' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:469: undefined reference to `__aeabi_lasr' drivers/libdrivers.a(onenand_base.o):/home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:439: more undefined references to `__aeabi_lasr' follow drivers/libdrivers.a(onenand_base.o): In function `onenand_probe': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_base.c:1770: undefined reference to `__aeabi_uidiv' drivers/libdrivers.a(onenand_bbt.o): In function `onenand_isbad_bbt': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/drivers/onenand_bbt.c:155: undefined reference to `__aeabi_lasr' common/libcommon.a(cmd_date.o): In function `mk_date': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/common/cmd_date.c:146: undefined reference to `__aeabi_idiv' common/libcommon.a(dlmalloc.o): In function `memalign': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/common/dlmalloc.c:2779: undefined reference to `__aeabi_uidivmod' common/libcommon.a(lists.o): In function `ExpandListSpace': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/common/lists.c:158: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/common/lists.c:160: undefined reference to `__aeabi_idiv' lib_generic/libgeneric.a(display_options.o): In function `print_size': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/display_options.c:53: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/display_options.c:55: undefined reference to `__aeabi_uidiv' lib_generic/libgeneric.a( vsprintf .o): In function `number': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/ vsprintf .c:162: undefined reference to `do_div' lib_generic/libgeneric.a(zlib.o): In function `adler32': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/zlib.c:2157: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/zlib.c:2158: undefined reference to `__aeabi_uidivmod' lib_generic/libgeneric.a(zlib.o): In function `inflate': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/lib_generic/zlib.c:427: undefined reference to `__aeabi_uidivmod' rtc/librtc.a(date.o): In function `GregorianDay': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:61: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:61: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:70: undefined reference to `__aeabi_idivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:70: undefined reference to `__aeabi_idivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:82: undefined reference to `__aeabi_idivmod' rtc/librtc.a(date.o): In function `to_tm': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:90: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:91: undefined reference to `__aeabi_idivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:94: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:95: undefined reference to `__aeabi_idivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:95: undefined reference to `__aeabi_idiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:96: undefined reference to `__aeabi_idivmod' rtc/librtc.a(date.o): In function ` mktime ': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:149: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:149: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/date.c:149: undefined reference to `__aeabi_uidiv' rtc/librtc.a(pcf8563.o): In function `rtc_set': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:93: undefined reference to `__aeabi_idivmod' rtc/librtc.a(pcf8563.o): In function `bin2bcd': /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidiv' /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1.1.4-whgs/rtc/pcf8563.c:141: undefined reference to `__aeabi_uidivmod' make: *** [u-boot] Error 1 crifan@ubuntu:u-boot-1.1.4-whgs$ |
10.然后看到之前的一堆人的讨论:
Re: [arm-gnu] In Function __aeabi_ldiv0 : undefined reference to ‘raise’
Re: [arm-gnu] EABI version 5, but target u-boot has EABI version 0
结果是:
此处我用的交叉编译器是arm-xscale-linux-gnueabi,是EABI的
而uboot中对于arm则显式地要求
-mabi=apcs-gnu
即非EABI的。
结果就是:
我的交叉编译器版本太新,而uboot版本太老:1.1.4
所以出了问题。
如果是用来编译比较新的,尤其是最新的uboot,应该就可以了。
11.所以,先去恢复上述的修改再说。
12.然后再想办法,如何去添加自己的raise()或者__aeabi_ldiv0。
参考:
commit 4573 broke the calypso platform
去找到之前的crosstool-ng的编译的地方:
/home/crifan/develop/crosstool-ng/crosstool-ng-1.18.0_build/.build/src/gcc-4.6.0/libgcc/../gcc/config/arm/lib1funcs.asm
可以找到相关的代码的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* ------------------------------------------------------------------------ */ #ifdef L_dvmd_lnx @ GNU/Linux division-by zero handler. Used in place of L_dvmd_tls /* Constant taken from <asm/signal.h>. */ #define SIGFPE 8 #ifdef __ARM_EABI__ WEAK aeabi_idiv0 WEAK aeabi_ldiv0 ARM_FUNC_START aeabi_idiv0 ARM_FUNC_START aeabi_ldiv0 #else ARM_FUNC_START div0 #endif do_push {r1, lr} mov r0, #SIGFPE bl SYM( raise ) __PLT__ RETLDM r1 #ifdef __ARM_EABI__ FUNC_END aeabi_ldiv0 FUNC_END aeabi_idiv0 #else FUNC_END div0 #endif #endif /* L_dvmd_lnx */ |
但是也不方便改啊。
13.然后是找到了uboot-1.1.4中的,自己的一个.S汇编文件:
board/whgs/lowlevel_init.S
去编辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | crifan@ubuntu:u-boot-1.1.4-whgs$ gedit arm_config.mk CVS/ include/ lib_nios2/ microblaze_config.mk README board/ disk/ lib_arm/ lib_ppc/ mips_config.mk rtc/ CHANGELOG doc/ lib_generic/ m68k_config.mk mkconfig tools/ common/ drivers/ lib_i386/ MAINTAINERS net/ u-boot.map config.mk dtt/ lib_m68k/ MAKEALL nios2_config.mk COPYING examples/ lib_microblaze/ Makefile nios_config.mk cpu/ fs/ lib_mips/ Makefile~ post/ CREDITS i386_config.mk lib_nios/ Makefile.orig ppc_config.mk crifan@ubuntu:u-boot-1.1.4-whgs$ gedit board/ Display all 197 possibilities? (y or n) crifan@ubuntu:u-boot-1.1.4-whgs$ gedit board /whgs/ config.mk ethernetselftest.h lowlevel_init.o old/ selftest.h whgs.c CVS/ ethernetselftest.o lowlevel_init.S phycore_pxa270.h selftest.o whgs.o .depend intel.h lowlevel_init.S.old pxavoltage.S smc91111.h ethernetselftest.c libwhgs.a Makefile selftest.c u-boot.lds crifan@ubuntu:u-boot-1.1.4-whgs$ gedit board /whgs/lowlevel_init .S |
在文件的最后,添加上对应的raise函数:
1 2 3 4 5 6 | @add empty raise () to fix (when use new EABI xscale cross compiler to) compile @error gcc/config/arm/lib1funcs.asm:1266: undefined reference to ` raise ' .globl raise raise : nop mov pc, lr |
然后再去编译试试,看看能否消除此错误,果然消除此错误了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | crifan@ubuntu:u-boot-1.1.4-whgs$ make make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /tools ' make [1]: `.depend' is up to date . make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /tools ' make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make [1]: `.depend' is up to date . make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make [1]: `.depend' is up to date . make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make -C tools all make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /tools ' make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /tools ' make -C post all make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make -C post /cpu all make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make -C ` dirname lib_generic /libgeneric .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /lib_generic ' make [1]: `libgeneric.a' is up to date . make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /lib_generic ' make -C ` dirname board /whgs/libwhgs .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs ' arm-xscale-linux-gnueabi-gcc -M -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -D__KERNEL__ -DTEXT_BASE=0x5c010000 -I /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /include -fno- builtin -ffreestanding -nostdinc -isystem /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /bin/ .. /lib/gcc/arm-xscale-linux-gnueabi/4 .6.0 /include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5 -mtune=xscale lowlevel_init.S whgs.c selftest.c ethernetselftest.c > .depend make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs ' make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs ' arm-xscale-linux-gnueabi-gcc -Wa,-gstabs -D__ASSEMBLY__ -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -D__KERNEL__ -DTEXT_BASE=0x5c010000 -I /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /include -fno- builtin -ffreestanding -nostdinc -isystem /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /bin/ .. /lib/gcc/arm-xscale-linux-gnueabi/4 .6.0 /include -pipe -DCONFIG_ARM -D__ARM__ -march=armv5 -mtune=xscale -c -o lowlevel_init.o /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs/lowlevel_init .S arm-xscale-linux-gnueabi-ar crv libwhgs.a whgs.o selftest.o ethernetselftest.o lowlevel_init.o r - whgs.o r - selftest.o r - ethernetselftest.o r - lowlevel_init.o make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs ' make -C ` dirname cpu /pxa/libpxa .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /cpu/pxa ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /cpu/pxa ' make -C ` dirname lib_arm /libarm .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /lib_arm ' make [1]: `libarm.a' is up to date . make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /lib_arm ' make -C ` dirname net /libnet .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /net ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /net ' make -C ` dirname disk /libdisk .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /disk ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /disk ' make -C ` dirname rtc /librtc .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /rtc ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /rtc ' make -C ` dirname dtt /libdtt .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /dtt ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /dtt ' make -C ` dirname drivers /libdrivers .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /drivers ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /drivers ' make -C ` dirname drivers /sk98lin/libsk98lin .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /drivers/sk98lin ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /drivers/sk98lin ' make -C ` dirname post /libpost .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post ' make -C ` dirname post /cpu/libcpu .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /post/cpu ' make -C ` dirname common /libcommon .a` make [1]: Entering directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /common ' make [1]: Nothing to be done for `all'. make [1]: Leaving directory ` /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /common ' UNDEF_SYM=`arm-xscale-linux-gnueabi-objdump -x lib_generic /libgeneric .a board /whgs/libwhgs .a cpu /pxa/libpxa .a lib_arm /libarm .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_.*\)/-u\1/p' | sort | uniq `;\ arm-xscale-linux-gnueabi-ld -Bstatic -T /home/crifan/develop/crosscompile/wihart_gateway_6_0/old_project_lack_eclipse_project_file/BSP/Bootloader/u-boot-1 .1.4-whgs /board/whgs/u-boot .lds -Ttext 0x5c010000 $UNDEF_SYM cpu /pxa/start .o \ --start-group lib_generic /libgeneric .a board /whgs/libwhgs .a cpu /pxa/libpxa .a lib_arm /libarm .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 /opt/crosscompile/xscale/gcc-4 .6.0-glibc-2.9 /bin/ .. /lib/gcc/arm-xscale-linux-gnueabi/4 .6.0 -lgcc \ -Map u-boot.map -o u-boot arm-xscale-linux-gnueabi-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec arm-xscale-linux-gnueabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin crifan@ubuntu:u-boot-1.1.4-whgs$ |
【总结】
此处,用交叉编译器arm-xscale-linux-gnueabi(gcc-4.6.0-glibc-2.9)去编译老版本的uboot(1.1.4)而出错:
gcc/config/arm/lib1funcs.asm:1266: undefined reference to `raise’
的原因是:
Uboot是个非GNU/Linux的程序,是个裸程序(bare-metal application);
而交叉编译器arm-xscale-linux-gnueabi是GNU/Linux工具链,是可以正常编译Linux内核等东西的,
但是去编译非GNU/Linux的Uboot的话,就会出现:
当出现被0除的情况时,会调用__aeabi_ldiv0(即eabi版本的__div0),当在GNU/Linux系统中时,其会去触发系统的SIGFPE,进而调用到对应的raise(3)函数。
而此处,由于Uboot不是Linux类程序,没有对应的raise()函数,所以报错找不到。
解决办法是:
两种:
1.去用其他对应的配置(估计是用于指定是非GUN/Linux类程序的),重新编译一个新版本的交叉编译器,然后用新的非GNU/Linux的交叉编译器,去编译此旧版本的uboot,即可正常编译
2.修改自己的uboot,加上对应的(随便写个空的)__aeabi_ldiv0或raise函数即可。
此处选用第二种,具体做法:
此处的uboot是whgs的(即配置的时候用的是make whgs_config)
所以找到对应的汇编文件,即:
board/whgs/lowlevel_init.S
在文件最后,添加上
1 2 3 4 5 6 | @add empty raise () to fix (when use new EABI xscale cross compiler to) compile @error gcc/config/arm/lib1funcs.asm:1266: undefined reference to ` raise ' .globl raise raise : nop mov pc, lr |
然后重新编译,即可。
转载请注明:在路上 » 【已解决】uboot交叉编译出错:gcc/config/arm/lib1funcs.asm:1266: undefined reference to `raise’