构建 Android 内核时出错:“多个目标模式”

GPS*_*GPS 6 android kernel build android-source

我尝试按照 Google 在此页面上的说明为 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
Run Code Online (Sandbox Code Playgroud)

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

Makefile:796: *** multiple target patterns.  Stop.
Run Code Online (Sandbox Code Playgroud)

调查:

现在 makefile 中的第 796 行是:

vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
Run Code Online (Sandbox Code Playgroud)

和其他相关线路是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

$(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)
Run Code Online (Sandbox Code Playgroud)

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

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

由于此输出具有:,这可能解释了最初的 make 错误。

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

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
Run Code Online (Sandbox Code Playgroud)

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

Gri*_*ief 6

很老的问题,但我遇到了同样的问题,我想告诉您,只有在您设置CROSS_COMPILE不正确时才会出现该问题。无需注释trap、明确导出LD和/LDFLAGS或进行其他黑客攻击。

文档是什么CROSS_COMPILE意思不清楚。CROSS_COMPILE 必须是预建工具的路径前缀,即如果你这样做了

cd /files/src
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6
Run Code Online (Sandbox Code Playgroud)

然后,你必须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-


Jos*_*ock 2

第 44 行和第 45 行看起来像这样:

${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT}  \
        --start-group ${KBUILD_VMLINUX_MAIN} --end-group
Run Code Online (Sandbox Code Playgroud)

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

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

如果您仍然遇到问题,请添加评论,我会进一步研究。