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,找一下配置
其中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目錄去搜索一下,找到對應路徑後,把絕對路徑填上去
其中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找不到的錯誤。編譯全系統的話還會遇到很多錯誤,後期遇到再更新