2017-08-04 151 views
0

構建環境是Ubuntu 16.04,最新的gcc 5.4.0和GNU Make 3.82。我的目標是可以運行android 4.4的am335x自定義板。我將支持它的android 7.1.1。Android 7.1.1內核編譯錯誤(工具鏈)

該項目是從谷歌Android清單標記android-7.1.1_r46取自內核從msm標記android-7.1.1_r0.63。我使用的交叉編譯器是從prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin

這是環境信息。我還沒有安裝NDK或SDK,因爲我看到android 7.1.1的api級別是25,而最新的NDK只支持24,所以我有點困惑。

如果我運行命令:m -j8 uboot linux uboot編譯得很好,但編譯linux內核時出現了很多錯誤。

/media/yangjiel/disk2/android/kernel/arch/arm/mach-omap2/prm_common.c: In function 'omap_prcm_register_chain_handler': 
/media/yangjiel/disk2/android/kernel/arch/arm/mach-omap2/prm_common.c:293:2: warning: passing argument 2 of 'irq_set_chained_handler' from incompatible pointer type [enabled by default] 
error, forbidden warning: prm_common.c:293 
make[2]: *** [arch/arm/mach-omap2/prm_common.o] Error 1 
make[1]: *** [arch/arm/mach-omap2] Error 2 
make[1]: *** Waiting for unfinished jobs.... 
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:141:13: error: 'KERN_BOOT_REASON' undeclared here (not in a function) 
    { CTL_INT, KERN_BOOT_REASON, "boot_reason" }, 
      ^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:13: error: 'NET_IPV6_ACCEPT_RA_PREFIX_ROUTE' undeclared here (not in a function) 
    { CTL_INT, NET_IPV6_ACCEPT_RA_PREFIX_ROUTE, "accept_ra_prefix_route" }, 
      ^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:2: error: initializer element is not constant 
    { CTL_INT, NET_IPV6_ACCEPT_RA_PREFIX_ROUTE, "accept_ra_prefix_route" }, 
^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:2: error: (near initialization for 'bin_net_ipv6_conf_var_table[24].ctl_name') 
make[2]: *** [kernel/sysctl_binary.o] Error 1 
make[2]: *** Waiting for unfinished jobs.... 
make[1]: *** [kernel] Error 2 
make: *** [sub-make] Error 2 
make: Leaving directory `/media/yangjiel/disk2/android/kernel' 
ninja: build stopped: subcommand failed. 
make: *** [ninja_wrapper] Error 1 
make: Leaving directory `/media/yangjiel/disk2/android' 

如果我放棄在該文件中,其導致此錯誤的線,上述錯誤解決,但我會得到另一個

/media/yangjiel/disk2/android/kernel/kernel/cgroup.c: In function 'subsys_cgroup_allow_attach': 
/media/yangjiel/disk2/android/kernel/kernel/cgroup.c:2138:37: error: invalid operands to binary != (have 'kuid_t' and 'kuid_t') 
    if (current != task && cred->euid != tcred->uid && 
            ^
/media/yangjiel/disk2/android/kernel/kernel/cgroup.c:2139:18: error: invalid operands to binary != (have 'kuid_t' and 'kuid_t') 
     cred->euid != tcred->suid) 
       ^
make[2]: *** [kernel/cgroup.o] Error 1 
make[2]: *** Waiting for unfinished jobs.... 
    CC  kernel/trace/power-traces.o 
    CC  kernel/trace/rpm-traces.o 
    CC  kernel/trace/trace_probe.o 
    LD  kernel/trace/libftrace.o 
    LD  kernel/trace/built-in.o 
make[1]: *** [kernel] Error 2 
make: *** [sub-make] Error 2 
make: Leaving directory `/media/yangjiel/disk2/android/kernel' 
ninja: build stopped: subcommand failed. 
make: *** [ninja_wrapper] Error 1 
make: Leaving directory `/media/yangjiel/disk2/android' 

有更多的錯誤的後面。

我用google搜索過,大部分人都說這是一個工具鏈問題。但是我沒有找到很多有關如何正確安裝工具鏈的說明,尤其是7.1.1。似乎沒有Android 4.4內核所需的工具鏈。我獲取自定義的Android 4.4內核,它編譯得很好。

回答

0

上面的問題是因爲我下載了錯誤版本的Android內核。我下載的是https://android.googlesource.com/kernel/msm/+/android-7.1.1_r0.63,這是內核v3.10。

顯然這不適用於Android 7.1.1(應該使用內核版本4.4)。因此,當我試圖用預編譯的「新」交叉編譯器編譯「舊」內核時,它會生成「舊」編譯器不會出現的大量錯誤。我最終使用內核從https://android.googlesource.com/kernel/common/+/upstream-linux-4.4.yupstream-linux-4.4.y分支,它與Android 7.0到7.1.2兼容。

我不知道爲什麼谷歌將它命名爲android-7.1.1_r0.63,但絕對不適合Android 7.1.1使用。希望沒有人像我那樣有同樣的問題。