【问题标题】:Error building Android kernel: "multiple target patterns"构建 Android 内核时出错:“多个目标模式”
【发布时间】:2016-09-16 00:28:48
【问题描述】:

我尝试按照 Google 在this page 上的说明为 Nexus 5X 构建新内核

  • 构建系统:Ubuntu 14.04 x86_64
  • 目标系统:MTC19T/bullhead(实际上是 5X 上的任何棉花糖版本)
  • 工具链:android-6.0.1_r25/prebuilts/gcc/linux-x86/aarch64/

我执行的命令的确切顺序是:

$ git clone https://android.googlesource.com/kernel/msm
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ cd msm
$ git checkout -b android-msm-bullhead-3.10-marshmallow-mr1 origin/android-msm-bullhead-3.10-marshmallow-mr1
$ make bullhead_defconfig
$ make

在最后一个命令之后,我收到以下错误:

Makefile:796: *** multiple target patterns.  Stop.

调查:

现在makefile中的第796行是:

vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE

和其他相关行是:

vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)

export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds

我发现如果我从$(KBUILD_VMLINUX_MAIN) 中删除$(libs-y),这个错误就会消失,并且构建会继续一段时间。我相信我稍后会发现一些或其他问题,所以我决定进一步调试。

免责声明:其余部分对我来说有点灰色

$(libs-y) 定义为:

libs-y      := lib/
libs-y1     := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2     := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y      := $(libs-y1) $(libs-y2)

所以我用参数lib/lib.a lib/built-in.o FORCE 调用了scripts/link-vmlinux.sh 并收到了这个错误:

gps@gps-HP-ProBook-4540s:~/andsrc/kernel/msm$ ./scripts/link-vmlinux.sh lib/lib.a lib/built-in.o FORCE
trap: SIGHUP: bad trap

因为这个输出有:,这个可能解释了原来的make错误。

现在,禁用包含陷阱的行没有帮助,我们得到另一个错误:

gps@gps-HP-ProBook-4540s:~/andsrc/kernel/msm$ ./scripts/link-vmlinux.sh lib/lib.a lib/built-in.o FORCE
  LD      vmlinux.o
./scripts/link-vmlinux.sh: 44: ./scripts/link-vmlinux.sh: -r: not found

我不太确定接下来要尝试什么。任何帮助表示赞赏。

【问题讨论】:

  • 您介意告诉我您是如何解决 $(LD) 问题的吗?

标签: android build kernel android-source


【解决方案1】:

很老的问题,但我也遇到了同样的问题,我想告诉您,只有在您错误地设置了CROSS_COMPILE 时才会出现该问题。无需注释掉trap,明确导出LDLDFLAGS 或做其他hack。

Documentation 不清楚CROSS_COMPILE 的含义。 CROSS_COMPILE 必须是预构建工具的路径前缀,即如果您这样做了

cd /files/src
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6

那么,你必须export CROSS_COMPILE=/files/src/arm-eabi-4.8/bin/arm-eabi-,所以${CROSS_COMPILE}ld 的意思是/files/src/arm-eabi-4.8/bin/arm-eabi-ld

据我所知,您将其完全按照文档显示为CROSS_COMPILE=aarch64-linux-android- 导出,我猜这是错误的路径前缀。

如果您在 ubuntu 上构建,请考虑安装 gcc-aarch64-linux-gnugcc-arm-linux-gnueabi 并将 CROSS_COMPILE 设置为 /usr/bin/aarch64-linux-gnu-

【讨论】:

    【解决方案2】:

    我已将 CROSS_COMPILE 变量固定为有效路径。但同样的错误仍然存​​在。 然后我添加

    $(info VAR="$(vmlinux-deps)")
    

    就在 vmlinux 调用之前。问题变得清晰:

    /usr/bin/aarch64-linux-gnu-gcc: No such file or directory 你的PATH设置正确吗?

    我只安装了 g++,没有安装 gcc。安装“gcc”包解决了这个问题。 在 ubuntu 上:

    sudo apt-get install gcc-aarch64-linux-gnu

    【讨论】:

      【解决方案3】:

      第 44 和 45 行如下所示:

      ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT}  \
              --start-group ${KBUILD_VMLINUX_MAIN} --end-group
      

      所以发生的情况是 $LD$LDFLAGS 未定义,这使得命令只是 -r ...,而 -r 不是您系统上的命令,因此找不到命令。

      定义 $LD$LDFLAGS 然后它将运行 $LD$LDFLAGS + 其他命令的其余部分的任何内容。

      如果您仍有问题,请添加评论,我会进一步调查。

      【讨论】:

      • 是的.. 我认为 $(LD) 早就回来了 :)。对不起,我没有在这里发布。谢谢。
      • 别担心,我其实也遇到了同样的问题,你的问题帮助我找到了问题。
      • 你能告诉我你是如何修复错误的吗,我遇到了同样的问题,这是我的第一次构建
      【解决方案4】:

      我遇到了和你一样的问题。
      文档中的指令(http://source.android.com/source/building-kernels.html) 是正确的,但不要告诉我们应该运行以下命令来设置交叉编译环境:

      cd <aosp source code tree>
      source build/envsetup.sh
      lunch aosp_angler-userdebug  # i want to build kernel for angler(nexus 6p)
      

      上面的代码将为我们初始化构建环境
      构建环境包括/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/下的交叉编译工具

      然后,您运行以下命令来构建内核:

      cd msm # my angler's kernel is under ...kernel/msm
      export ARCH=arm64 # angler is arm64
      export CROSS_COMPILE=aarch64-linux-android-  # use arm64 cross compile tool
      make angler_defconfig   # run kernel config
      make -j16# build kernel with all cpu cores( amd4800H cpu has 16 cores)
      

      【讨论】:

        【解决方案5】:

        通过@dmitry-screwer 的鼓舞人心的方式,我发现真正的错误不见了 aarch64-linux-gnu-gcc。由于工具链是从https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 克隆的,因此丢失某些文件是没有意义的。然后我意识到 git remote 上的文件可能已更改并且不适合我的 makefile。所以我获取了几年前创建的android-5.1.1_r37 标签,以成功获取丢失的 gcc。

        【讨论】:

          【解决方案6】:

          link-vmlinux.sh 中删除trap 行并开始make。内核构建并成功运行。

          独立运行link-vmlinux.sh 仍会报错,但make 成功。

          【讨论】:

            猜你喜欢
            • 2016-08-03
            • 2017-01-01
            • 2022-11-03
            • 2012-05-04
            • 1970-01-01
            • 1970-01-01
            • 2020-12-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多