rk3399 源碼下查找交叉編譯工具鏈


原因

小伙伴突然問到 android 下交叉編譯鏈在哪個位置,一臉發懵,所以記錄一下


硬件環境

平台 Android版本 內核版本
rk3399 android 7.1 4.4

kernel 和android 的編譯時分為兩部分 所以我們需要分為兩份查看

1.kernel

  • rk的編譯命令基本是:
      cd kernel/
      make ARCH=arm64 rockchip_defconfig
      make ARCH=arm64 rk3399-box-rev2.img -j
    
  • 所以我們從kernel的Makefile入手即可

      VERSION = 4  #kernel版本號
      PATCHLEVEL = 4
      SUBLEVEL = 103
      EXTRAVERSION =
      ...
       ifeq ($(ARCH),arm64)
      ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9),)
      CROSS_COMPILE   ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
      endif
      endif
      ifeq ($(ARCH),arm)
      ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9),)
      CROSS_COMPILE   ?= $(srctree)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-
      endif
      endif

即kerenel的交叉編譯鏈在 prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-


2.Android

  • android 也是使用Makefile編譯的,但里面改的太多,所以不從這兒入手。
    在android 編譯模塊時我們通常
      source build/envsetup.sh
      lunch 22
      mmm 模塊
  • 所以從build/envsetup.sh入手
...

function setpaths()
{
    ....
    # and in with the new
    prebuiltdir=$(getprebuilt)
    gccprebuiltdir=$(get_abs_build_var ANDROID_GCC_PREBUILTS)

    # defined in core/config.mk
    targetgccversion=$(get_build_var TARGET_GCC_VERSION)
    targetgccversion2=$(get_build_var 2ND_TARGET_GCC_VERSION)
    export TARGET_GCC_VERSION=$targetgccversion

    # The gcc toolchain does not exists for windows/cygwin. In this case, do not reference it.
    export ANDROID_TOOLCHAIN=
    export ANDROID_TOOLCHAIN_2ND_ARCH=
    local ARCH=$(get_build_var TARGET_ARCH)
    case $ARCH in
        x86) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
            ;;
        x86_64) toolchaindir=x86/x86_64-linux-android-$targetgccversion/bin
            ;;
        arm) toolchaindir=arm/arm-linux-androideabi-$targetgccversion/bin
            ;;
        arm64) toolchaindir=aarch64/aarch64-linux-android-$targetgccversion/bin;
               toolchaindir2=arm/arm-linux-androideabi-$targetgccversion2/bin
            ;;
        mips|mips64) toolchaindir=mips/mips64el-linux-android-$targetgccversion/bin
            ;;
        *)
            echo "Can't find toolchain for unknown architecture: $ARCH"
            toolchaindir=xxxxxxxxx
            ;;
    esac
      if [ -d "$gccprebuiltdir/$toolchaindir" ]; then
         export ANDROID_TOOLCHAIN=$gccprebuiltdir/$toolchaindir
      fi
      ...
}
...

  • 所以Android的交叉編譯鏈在$gccprebuiltdir/$toolchaindir 也就是 prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-$targetgccversion/bin

其中的$gccprebuiltdir和$targetgccversion 的變量可以從上下文賦值得到
或者在命令行使用命令得到:

~/RK3399_7.1$ get_build_var TARGET_GCC_VERSION
4.9

~/RK3399_7.1$ get_build_var ANDROID_GCC_PREBUILTS
prebuilts/gcc/linux-x86

由上面可以看到ANDROID_TOOLCHAIN也就是android toolchain的位置

使用命令行也可以直接得到

~/RK3399_7.1$get_build_var ANDROID_TOOLCHAIN    
/***/RK3399_7.1/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
~/RK3399_7.1$ 

3.查看Android編譯環境變量 多使用 get_build_var get_abs_build_var

下面時命令實現

105 # Get the exact value of a build variable.
 106 function get_build_var()
 107 {
 108     if [ "$BUILD_VAR_CACHE_READY" = "true" ]
 109     then
 110         eval echo \"\${var_cache_$1}\"
 111     return
 112     fi
 113 
 114     T=$(gettop)
 115     if [ ! "$T" ]; then
 116         echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
 117         return
 118     fi
 119     (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
 120       command make --no-print-directory -f build/core/config.mk dumpvar-$1)
 121 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM