2011年6月29日 星期三

Source object XXX has EABI version 4, but target u-boot has EABI version 0

u-boot-2008.10, uclibc toolchain or Soucery G++ lite arm2009q1-203.
After enabling CFG_64BIT_VSPRINTF, building fails with following message

UNDEF_SYM=`arm-linux-objdump -x board/cavium/cns3000/libcns3000.a lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm11mpcore/libarm11mpcore.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 fs/yaffs2/libyaffs2.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a | \
sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /u-boot-2008.10 && arm-linux-ld -Bstatic -T /u-boot-2008.10/board/cavium/cns3000/u-boot.lds -Ttext 0x00000000 $UNDEF_SYM cpu/arm11mpcore/start.o \
--start-group lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm11mpcore/libarm11mpcore.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 fs/yaffs2/libyaffs2.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a board/cavium/cns3000/libcns3000.a --end-group -L /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3 -lgcc \
-Map u-boot.map -o u-boot
/tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivsi3.o): In function `__aeabi_uidiv':
/home/1/buildroot-2010.05/buildroot-2010.05/output/toolchain/gcc-4.3.3/libgcc/../gcc/config/arm/lib1funcs.asm:810: multiple definition of `__udivsi3'
lib_arm/libarm.a(_udivsi3.o):/u-boot-2008.10/lib_arm/_udivsi3.S:17: first defined here
arm-linux-ld: error: Source object /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivdi3.o) has EABI version 4, but target u-boot has EABI version 0
arm-linux-ld: failed to merge target specific data of file /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivdi3.o)
arm-linux-ld: error: Source object /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_umoddi3.o) has EABI version 4, but target u-boot has EABI version 0
arm-linux-ld: failed to merge target specific data of file /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_umoddi3.o)
arm-linux-ld: error: Source object /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivsi3.o) has EABI version 4, but target u-boot has EABI version 0
arm-linux-ld: failed to merge target specific data of file /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivsi3.o)
arm-linux-ld: error: Source object /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_clz.o) has EABI version 4, but target u-boot has EABI version 0
arm-linux-ld: failed to merge target specific data of file /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_clz.o)
/tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_udivdi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
/tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3/libgcc.a(_umoddi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'


After removing "-L /tools/uclibc-toolchain/arm-linux-le-uclibc-gcc-4.3.3-2010.05/usr/bin/../lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.3 -lgc":
UNDEF_SYM=`arm-linux-objdump -x board/cavium/cns3000/libcns3000.a lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm11mpcore/libarm11mpcore.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 fs/yaffs2/libyaffs2.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a | \
sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /u-boot-2008.10 && arm-linux-ld -Bstatic -T /u-boot-2008.10/board/cavium/cns3000/u-boot.lds -Ttext 0x00000000 $UNDEF_SYM cpu/arm11mpcore/start.o \
--start-group lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm11mpcore/libarm11mpcore.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 fs/yaffs2/libyaffs2.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/phy/libphy.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a board/cavium/cns3000/libcns3000.a --end-group \
-Map u-boot.map -o u-boot
lib_generic/libgeneric.a(vsprintf.o): In function `number':
/u-boot-2008.10/lib_generic/vsprintf.c:165: undefined reference to `__udivdi3'
/u-boot-2008.10/lib_generic/vsprintf.c:165: undefined reference to `__umoddi3'




[U-Boot] [PATCH] ARM: Use do_div() instead of division for "long long".
http://lists.denx.de/pipermail/u-boot/2008-September/040254.html

[U-Boot] [PATCH] ARM - Integrator[AP/CP] - - Correct Improper ulong division
http://lists.denx.de/pipermail/u-boot/2008-August/039531.html

Re: [arm-gnu] EABI version 5, but target u-boot has EABI version 0
http://www.codesourcery.com/archives/arm-gnu/msg02478.html

Re: [arm-gnu] In Function __aeabi_ldiv0 : undefined reference to 'raise'
http://www.codesourcery.com/archives/arm-gnu/msg02332.html
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.

People often try to abuse the GNU/Linux toolchain to build U-Boot because they want to use the same toolchain that they use to build the Linux kernel and GNU/Linux applications. But, U-Boot is really a bare-metal application, and, as such, should be built with a bare-metal toolchain, like our "ARM EABI" toolchains. There are often these kinds of problems with U-Boot when moving between different architectures or toolchain versions because the U-Boot source code has tricks to try to make the GNU/Linux toolchain work, and those tricks only work with
particular toolchains.


Re: [arm-gnu] EABI version 5, but target u-boot has EABI version 0
http://www.codesourcery.com/archives/arm-gnu/msg02479.html
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.

In mainline U-boot currently all libgcc-provided-routines for ARM are also implemented in the lib_arm directory. (yes, it is dirty, but it is done this way for ARM). So, as long as there is an implementation in the lib_Arm directory, nothing will be used from libgcc, and this error will not be seen, even if you use a linux destined compiler.

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

Fixed by:
diff --git a/bootloaders/u-boot-2008.10/Makefile b/bootloaders/u-boot-2008.10/Makefile
index 6004828..e4cd1a6 100644
--- a/bootloaders/u-boot-2008.10/Makefile
+++ b/bootloaders/u-boot-2008.10/Makefile
@@ -267,7 +267,7 @@ LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))

# Add GCC lib
-PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
+#PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc

# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
diff --git a/bootloaders/u-boot-2008.10/lib_generic/vsprintf.c b/bootloaders/u-boot-2008.10/lib_generic/vsprintf.c
index 7c9cfe1..efc6710 100644
--- a/bootloaders/u-boot-2008.10/lib_generic/vsprintf.c
+++ b/bootloaders/u-boot-2008.10/lib_generic/vsprintf.c
@@ -14,6 +14,10 @@
#include <linux/string.h>
#include <linux/ctype.h>

+#ifdef CFG_64BIT_VSPRINTF
+#include <div64.h>
+#endif
+
#include <common.h>
#if !defined (CONFIG_PANIC_HANG)
#include <command.h>
@@ -106,12 +110,14 @@ static int skip_atoi(const char **s)
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */

#ifdef CFG_64BIT_VSPRINTF
+#if 0
#define do_div(n,base) ({ \
unsigned int __res; \
__res = ((unsigned long long) n) % base; \
n = ((unsigned long long) n) / base; \
__res; \
})
+#endif
#else
#define do_div(n,base) ({ \
int __res; \

沒有留言: