[yocto] Problems building U-Boot for x86_64

Khem Raj raj.khem at gmail.com
Wed Aug 23 14:51:55 PDT 2017



On 8/23/17 2:29 PM, Ferry Toth wrote:
> Ferry Toth wrote:
> 
>> Khem Raj wrote:
>>
>>> On 8/22/17 11:41 PM, Ferry Toth wrote:
>>>> I am having trouble building a specific U-Boot version with Yocto.
>>>> Outside of Yocto on 64 bit Ubuntu 17.04 with multilib it builds fine.
>>>>
>>>> I am extending meta-intel-edison to build a 64 bit Poke Morty, with a
>>>> vanilla 64-bit kernel (4.12). This is working quite well.
>>>>
>>>> My host is x86_64, the target is core2 with tune=core-64.
>>>>
>>>> Without 64bit tune I can build U-Boot fine. With 64bit it can not link,
>>>> appearently because it needs lbgcc.a
>>>
>>> what is exact error message ? is it while compiling host bits or target
>>> bits ?
>>
>> The failing line is:
>> x86_64-poky-linux-ld.bfd -Bsymbolic -Bsymbolic-functions -m elf_i386
>> --emit- relocs --wrap=__divdi3 --wrap=__udivdi3 --wrap=__moddi3
>> --wrap=__umoddi3 -- gc-sections -pie -Bstatic --no-dynamic-linker -Ttext
>> 0x01101000 -o u-boot -T u-boot.lds arch/x86/cpu/start.o --start-group
>> arch/x86/cpu/built-in.o arch/x86/lib/built-in.o
>> board/intel/edison/built-in.o cmd/built-in.o common/built-in.o
>> disk/built-in.o drivers/built-in.o drivers/dma/built-in.o
>> drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o
>> drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o
>> drivers/mtd/spi/built- in.o drivers/net/built-in.o
>> drivers/net/phy/built-in.o drivers/pci/built- in.o
>> drivers/power/built-in.o drivers/power/battery/built-in.o
>> drivers/power/domain/built-in.o drivers/power/fuel_gauge/built-in.o
>> drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o
>> drivers/power/regulator/built-in.o drivers/serial/built-in.o
>> drivers/spi/built-in.o drivers/usb/common/built-in.o
>> drivers/usb/dwc3/built- in.o drivers/usb/emul/built-in.o
>> drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o
>> drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o
>> drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o
>> drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o dts/built-in.o
>> fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o
>> test/dm/built-in.o --end-group arch/x86/lib/lib.a -Map u-boot.map ERROR:
>> oe_runmake failed arch/x86/lib/built-in.o: In function `__wrap___udivdi3':
>> /home/ferry/tmp/edison-intel/my/edison-
>> morty/out/linux64/build/tmp/work/edison-poky-linux/u-boot/edison-v2017.03-
>> r0/git/arch/x86/lib/gcc.c:25: undefined reference to `__normal___udivdi3'
> 
> I as believe the missing lib is libgcc.a I just my sysroot and found it 
> here:

the linker cmdline above does not link with libgcc and there might be a
good reason for that, many standalone applications dont link with libgcc
intentionally. You could look into the code and see if it can be written
differently such that gcc does not have to invoke a helper function from
gcc runtime. Another option is to link with libgcc explicitly

> sysroots/lib32-edison/usr/lib/i686-pokymllib32-linux/6.2.0/
> sysroots/lib32-edison-tcbootstrap/usr/lib/i686-pokymllib32-linux/6.2.0/
> sysroots/edison/usr/lib64/x86_64-poky-linux/6.2.0/
> sysroots/edison-tcbootstrap/usr/lib64/x86_64-poky-linux/6.2.0/
> 
> How compile log shows:
> NOTE: make 
> -j8 CROSS_COMPILE=x86_64-poky-linux- CC=x86_64-poky-linux-gcc  
> --sysroot=/..../sysroots/edison 
> V=1 
> HOSTCC=gcc  
> -isystem/..../sysroots/x86_64-linux/usr/include 
> -O2 -pipe 
> -L/..../sysroots/x86_64-linux/usr/lib 
> -L/..../sysroots/x86_64-linux/lib 
> -Wl,-rpath-link,/..../sysroots/x86_64-linux/usr/lib 
> -Wl,-rpath-link,/..../sysroots/x86_64-linux/lib 
> -Wl,-rpath,/..../sysroots/x86_64-linux/usr/lib 
> -Wl,-rpath,/..../sysroots/x86_64-linux/lib 
> -Wl,-O1 
> -C /..../out/linux64/build/tmp/work/edison-poky-linux/u-boot/edison-
> v2017.03-r0/git O=/..../out/linux64/build/tmp/work/edison-poky-linux/u-
> boot/edison-v2017.03-r0/build edison_defconfig
> 
> (.... my edits to shorten the uninteresting part of the path)
> 
> I would think: --sysroot points to /edison dir which actually contains 
> libgcc.a, but -i, _l and -W1 options point to host dirs that don't have the 
> lib.
> 
>>>>
>>>> I attempted to add multilib, but although that immediately exposed bugs
>>>> in other recipes but actually adds libgcc.a, it does that for the target
>>>> sysroot only.
>>>>
>>>> And for some reason, U-Boot is built with the native gcc (x86_64-linux),
>>>> and multilib does not add libgcc.a to that sysroot.
>>>>
>>>> So, how do I add multilib to -native sysroot, preferably only to -native
>>>> and not to the target, as the target has not further use for it?
>>>>
>>>> Strangest thing is in u-boot.inc there is:
>>>> EXTRA_OEMAKE = 'CROSS_COMPILE=${TARGET_PREFIX} CC="${TARGET_PREFIX}gcc
>>>> ${TOOLCHAIN_OPTIONS}" V=1'
>>>> EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"'
>>>>
>>>> But when I check my log file:
>>>> NOTE: make -j8 CROSS_COMPILE=x86_64-poky-linux- CC=x86_64-poky-linux-
>>>> gcc  ......
>>>>
>>>> So TARGET_PREFIX resolves to x86_64-poky-linux, but I think my target is
>>>> core2_64 (or something like that). Is that normal for U-Boot?
>>>
>>> thats ok.
>>>
>>>>
>>>> I am a little lost, so any help would be greatly appreciated!
>>>>
>>>> Ferry
>>>>
>>>
>>> --
>>
>>
>> --



More information about the yocto mailing list