外部Toolchain编译OpenWRT<iMX6UL>

1,编译环境:

我用的是外部的gcc,linaro gcc 4.9,可以从linaro官网下载

下载地址: [ Linaro GCC Latest 4]

2,配置

由于iMx 6UL是coretex-A7架构,openwrt的 iMX6是coretex-A9架构,因需要修改对应项目的Makefile

vim target/linux/imx6/Makefile

修改CPU_TYPE,CPU_SUBTYPE还是用neon


diff --git a/target/linux/imx6/Makefile b/target/linux/imx6/Makefile
index 479b48e035..6b4fc04619 100644
--- a/target/linux/imx6/Makefile
+++ b/target/linux/imx6/Makefile
@@ -10,8 +10,9 @@ ARCH:=arm
 BOARD:=imx6
 BOARDNAME:=Freescale i.MX 6
 FEATURES:=audio display fpu gpio pcie rtc usb usbgadget squashfs targz nand ubifs
-CPU_TYPE:=cortex-a9
+CPU_TYPE:=cortex-a7
 CPU_SUBTYPE:=neon
+# CPU_SUBTYPE:=vfp
 MAINTAINER:=Luka Perkov <luka@openwrt.org>

 KERNEL_PATCHVER:=3.18

然后直接 Make menuconfig 进行配置
由于用到外部GCC,可能会遇到一些错误

A,缺失 libc.so.6, libpthread.so.0, libgcc_s.so.1

Package libnl-tiny is missing dependencies for the following libraries:
libc.so.6
Package dmesg is missing dependencies for the following libraries:                                                                                                                                               
librt.so.1

错误的原因是找不到对应的库文件,因此make menuconfig,找一下配置
external toolchain setup
其中Toolchain libc 修改一下,从uclibc --> glibc
再看看libc 的配置,make menuconfig –> Base system —> -- libc Configuration —>libc shared library base directory
因为用到外部GCC,因此这里的libc,libpthread,librt等都要到toolchain获取。
这里我们看到它引用的是跟extern toolchain一样的位置,但是到这个位置我们找不到libc.so.6 ,不同的toolchain对应的库文件路径也会有不一样,因此,我们到toolchain目录去搜索一下,找到对应路径后,把绝对路径填上去
libc 配置

其中libgcc和libstdc++这两个要比较注意,用$TOOLCHAIN/arm-linux-gnueabihf/libc 可以编译通过,但是无法运行,然后修改为 $TOOLCHAIN/arm-linux-gnueabihf/lib 后就正常了
如果还是会报缺少 librt.so.1,我们全局搜一下libc放到哪里了

find -name libc-*.so
./build_dir/target-arm-linux-gnueabihf/toolchain/ipkg-imx6/libc/lib/libc-2.19-2014.08-1-git.so
./build_dir/target-arm-linux-gnueabihf/root-imx6/lib/libc-2.19-2014.08-1-git.so
./staging_dir/target-arm-linux-gnueabihf/root-imx6/lib/libc-2.19-2014.08-1-git.so

OK,参考libc,我们也把librt-*.so cp到这些位置,然后链接为librt.so.1
好像我这样做了,dmesg还是报错,没办法,先不用dmesg编译过去再算,make menuconfig 干掉dmesg,却还是在alsa-lib里报librt.so.1出错,尝试干掉build_dir和staging_dir重新编译试试,这时候再搜索一下librt.so.1就和libc.so.6一致,再以上几个地方都有了,看来还是得重新编译啊

B,找不到-lgcc_pic

procd 在链接的时候,报错

ld: cannot find -lgcc_pic collect2: error: ld returned 1 exit status

找了一下,根本就没有 libgcc_pic.so 这个东西,链接肯定出错,因此找到对应出错的位置

vim build_dir/target-arm-linux-gnueabihf/procd-2015-10-29.1/upgraded/CMakeLists.txt

把-lgcc_pic去掉,编译pass

C,Werror=format-nonliteral

gdate.c:2497:7: error: format not a string literal, format string not checked [-Werror=format-nonliteral]                                                                                                               tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);

从log看到是编译host端的出错,本来尝试修改makefile,添加CFLAG的,不过好像不行,参考 https://forum.openwrt.org/viewtopic.php?id=70369 修改对应文件,跳过检查

vim build_dir/host/glib-2.43.4/glib/glib/gdate.c 
diff --git a/glib/gdate.c b/glib/gdate.c
index 0dfd801..44ba06d 100644
--- a/glib/gdate.c
+++ b/glib/gdate.c
@@ -2494,7 +2494,10 @@ g_date_strftime (gchar       *s,
        * recognize whether strftime actually failed or just returned "".
        */
       tmpbuf[0] = '\1';
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
       tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
+#pragma GCC diagnostic pop
       if (tmplen == 0 && tmpbuf[0] != '\0')
         {
           g_free (tmpbuf);

如此基本就没问题一直make到底了,make完后文件都存放再bin目录下

后记

其实我编译最小系统的时候(没用scrips/feeds install -a)就只遇到libc.so.6找不到的错误。编译全系统的话还会遇到很多错误,后期遇到再更新

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值