U-boot 构建失败 - 找不到 lgcc / libgcc.a

U-boot 构建失败 - 找不到 lgcc / libgcc.a

我正在使用 Ubuntu 12.04 LTS 64 位,并尝试为 SAMA5D36-EK 创建 Linux 映像。为此,我需要 mkimage 命令。根据本网站

mkimage 源随 U-boot 源一起提供,并在 U-boot 编译期间构建。但我遇到了问题。

步骤1。

我已经安装了以下内容:git 1.7.5,tar 1.2.4,python 2.7.3

我也做过:

$ sudo apt-get install gawk wget git-core diffstat unzip textinfo gcc-multilib build-essentail
$ sudo apt-get install chrpath libsdl1.2-dev xterm autoconf automake libtool libglib2.0-dev
$ sudo apt-get install linux-image-generic linux-headers-generic
$ sudo dpkg –add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libxss1:i386 libxft2:i386

第2步。

我已根据 Yocto ADT 手册第 3.1/3.2 节安装了交叉工具链,如下所示:

$ tar -xjf adt_installer.tar.bz2
$ cd adt_installer
$ gedit adt_installer.conf   and set
    YOCTOADT_TARGETS=”arm”
    YOCTOADT_ROOTFS_arm=”minimal sato-sdk”
    YOCTOADT_SYSROOT_IMAGE_arm=”sato-sdk”
    (and other arm based settings then save)
$ cd adt-installer
$ ./adt_installer   (using the default cross-toolchain location)
$ sudo chmod +x /opt/poky/1.6/envrionment-setup-arm5te-poky-linux-gnueabi
$ sudo /opt/poky/1.6/envrionment-setup-arm5te-poky-linux-gnueabi

交叉开发工具链现在位于 /opt/poky/1.6/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.8.2/

步骤3.

从源代码创建 U-boot

$ git clone git://github.com/linux4sam/u-boot-at91.git
$ cd u-boot-at91
$ make distclean
$ make sama5d3xek_nandflash_config
$ make CROSS_COMPILE=/opt/poky/1.6/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.8.2/

工作一段时间后出现错误:ld: 找不到 -lgcc

步骤4。

如果我跑

$ sudo find /usr/ -name libgcc*

我得到以下信息:

/usr/lib/x86_64-linux-gnu/libgccpp.so.1
/usr/lib/x86_64-linux-gnu/libgccpp.so.1.0.3
/usr/lib/ure/lib/libgcc3_uno.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s_32.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so.1
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_eh.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s_x32.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc_eh.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc_eh.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc_s.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc.a
/usr/lib32/libgcc_s.so.1
/usr/share/lintian/overrides/libgcc1
/usr/share/doc/libgcc1
/usr/share/doc/libgcc-4.8-dev
/usr/libx32/libgcc_s.so.1

如果我跑

$ sudo /sbin/ldconfig -p | grep libgcc*

我得到:

libgcrypt.so.11 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcrypt.so.11
libgcr-ui-3.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgcr-ui-3.so.1
libgcr-base-3.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgcr-base-3.so.1
libgconf-2.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgconf-2.so.4
libgck-1.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgck-1.so.0
libgccpp.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgccpp.so.1
libgcc_s.so.1 (libc6,x32) => /usr/libx32/libgcc_s.so.1
libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /lib/i386-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1
libgcc_s.so (libc6,x32) => /usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc_s.so
libgcc_s.so (libc6,x86-64) => /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so
libgcc_s.so (libc6) => /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc_s.so
libgc.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgc.so.1

似乎没有提及子目录 /32/ 和 /x32/ 中出现的两个版本的 libgcc.a 文件

然后我找到以下两个文件:

/etc/ld.so.conf.d/x86_64-linux-gnu.conf
/opt/poky/1.6/sysroots/x86_64-pokysdk-linux/etc/ld.so.conf

并在两个文件中添加以下行:

/usr/lib/gcc/x86_64-linux-gnu/4.8
/usr/lib/gcc/x86_64-linux-gnu/4.8/32
/usr/lib/gcc/x86_64-linux-gnu/4.8/x32

我现在重复步骤 3 中的三个“make”命令。它生成了大约 200 个文件(tools、arch、common、drivers、fs、lib、net、test),但随后出现以下相同错误:

LD      examples/standalone/hello_world
/opt/poky/1.6/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/4.8.2/ld: cannot find -lgcc
make[2]: *** [examples/standalone/hello_world] Error 1
make[1]: *** [examples/standalone] Error 2
make: *** [examples] Error 2

步骤5.

在 Makefile 中有以下条目

# Add GCC lib
ifdef CONFIG_USE_PRIVATE_LIBGCC
ifeq ($(CONFIG_USE_PRIVATE_LIBGCC),y)
PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
else
PLATFORM_LIBGCC = -L $(CONFIG_USE_PRIVATE_LIBGCC) -lgcc
endif
else
PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) -print-libgcc-file-name`) -lgcc
endif

回到终端模式我执行以下操作:

$ CONFIG_USE_PRIVATE_LIBGCC=yes
$ export CONFIG_USE_PRIVATE_LIBGCC

然后重新运行步骤 3 中的三个 make 命令,但出现相同的错误

然后我尝试

$ unset  CONFIG_USE_PRIVATE_LIBGCC

并重新运行这三个命令,但仍然出现错误

然后我尝试

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/gcc/x86_64-linux-gnu/4.8:/usr/lib/gcc/x86_64-linux-gnu/4.8/32:/usr/lib/gcc/x86_64-linux-gnu/4.8/x32
$ echo $LD_LIBRARY_PATH
/usr/lib/gcc/x86_64-linux/4.8:/usr/lib/gcc/x86_64-linux-gnu/4.8/32:/usr/lib/gcc/x86_64-linux-gnu/4.8/x32

并运行三个make命令,但仍然出错

然后我尝试将 makefile 中的条目从:

PLATFORM_LIBGCC := -L $(shell 目录名$(CC) $(c_flags) -print-libgcc-file-name) -lgcc

到:

PLATFORM_LIBGCC := -L /usr/lib/gcc/x86_64-linux-gnu/4.8:/usr/lib/gcc/x86_64-linux-gnu/4.8/32:/usr/lib/gcc/x86_64-linux-gnu/4.8/x32 -lgcc

我保存了文件。返回终端模式后,我执行以下操作:

$ CONFIG_USE_PRIVATE_LIBGCC=yes
$ export CONFIG_USE_PRIVATE_LIBGCC

然后重新运行步骤 3 中的三个 make 命令,但出现相同的错误

然后我尝试

$ unset  CONFIG_USE_PRIVATE_LIBGCC

并重新运行这三个命令,但仍然出现错误

然后我将 Makefile 条目更改为:

PLATFORM_LIBGCC :=/usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc.a

最后终于解决了与 hello_world示例相关的-lgcc错误,但随后又出现了数百个错误,首先是:

LD      u-boot
arch/arm/cpu/armv7/at91/built-in.o: In function `at91_pll_rate':
/home/lachlan/u-boot-at91/arch/arm/cpu/armv7/at91/clock.c:45: undefined reference to `__aeabi_uidiv'
arch/arm/cpu/armv7/at91/built-in.o: In function `at91_clock_init':
/home/lachlan/u-boot-at91/arch/arm/cpu/armv7/at91/clock.c:100: undefined reference to `__aeabi_uidiv'
arch/arm/cpu/armv7/at91/built-in.o: In function `usec_to_tick':
/home/lachlan/u-boot-at91/arch/arm/cpu/armv7/at91/timer.c:50: undefined reference to `__aeabi_uidiv'
arch/arm/cpu/armv7/at91/built-in.o: In function `tick_to_time':
/home/lachlan/u-boot-at91/arch/arm/cpu/armv7/at91/timer.c:42: undefined reference to `__aeabi_uidiv'
common/built-in.o: In function `common_diskboot':
/home/lachlan/u-boot-at91/common/cmd_disk.c:100: undefined reference to `__aeabi_uidiv'
common/built-in.o: In function `do_mem_md':
/home/lachlan/u-boot-at91/common/cmd_mem.c:137: undefined reference to `__aeabi_idiv'
common/built-in.o: In function `bytes_per_second':
/home/lachlan/u-boot-at91/common/cmd_sf.c:86: undefined reference to `__aeabi_uidiv'
common/built-in.o: In function `spi_flash_update':
/home/lachlan/u-boot-at91/common/cmd_sf.c:207: undefined reference to `__aeabi_idiv'
/home/lachlan/u-boot-at91/common/cmd_sf.c:216: undefined reference to `__aeabi_uidiv'
/home/lachlan/u-boot-at91/common/cmd_sf.c:237: undefined reference to `__aeabi_uidiv'
/home/lachlan/u-boot-at91/common/cmd_sf.c:237: undefined reference to `__aeabi_uidivmod'

ETC

然后我将 Makefile 条目更改为:

PLATFORM_LIBGCC :=/usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc.a

并且会出现与上述相同的结果

有人能建议如何解决这个问题吗?

答案1

在某些 Makefile 中,它会尝试通过执行以下命令来查找 libgcc 的搜索路径:

$(CC) -print-libgcc-file-name

如果没有定义 sysroot,此操作将失败,因此请手动添加 sysroot。查看 config.mk,其中有以下内容:

CC := $(CROSS_COMPILE)gcc

更改为:

ifdef PKG_CONFIG_SYSROOT_DIR
CC  = $(CROSS_COMPILE)gcc --sysroot=$(PKG_CONFIG_SYSROOT_DIR)
else
CC  = $(CROSS_COMPILE)gcc
endif

答案2

将 cross_compile 更改为另一个目录,适用于 4.1.15

source /<dir>/environment-setup-cortexa9hf-neon-poky-linux-gnueabi

相关内容