外部Toolchain編譯OpenWRT

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 <[email protected]>

 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找不到的錯誤。編譯全系統的話還會遇到很多錯誤,後期遇到再更新

目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章