构建 Android 内核时出错:"multiple target patterns"
Error building Android kernel: "multiple target patterns"
我试图按照 Google 在 this page
上的说明为 Nexus 5X 构建一个新内核
- 构建系统:Ubuntu14.04x86_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
我不太确定接下来要尝试什么。感谢您的帮助。
从 link-vmlinux.sh
中删除了 trap
行并开始 make
。内核构建并成功运行。
运行 link-vmlinux.sh
独立仍然报错,但 make
成功。
第 44 和 45 行看起来像这样:
${LD} ${LDFLAGS} -r -o ${KBUILD_VMLINUX_INIT} \
--start-group ${KBUILD_VMLINUX_MAIN} --end-group
所以发生的事情是 $LD
和 $LDFLAGS
未定义,这使得命令只是 -r ...
,而 -r
不是您系统上的命令,因此找不到命令。
定义 $LD
和 $LDFLAGS
然后它将 运行 无论 $LD
与 $LDFLAGS
+ 其他命令的其余部分。
如果您还有问题,请添加评论,我会进一步调查。
很老的问题了,但我刚遇到同样的问题,我想告诉大家只有当 CROSS_COMPILE
设置不正确时才会出现此问题。无需注释掉 trap
、显式导出 LD
和 LDFLAGS
或进行其他修改。
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-gnu
、gcc-arm-linux-gnueabi
并将 CROSS_COMPILE
设置为 /usr/bin/aarch64-linux-gnu-
我已将 CROSS_COMPILE 变量固定为有效路径。但同样的错误仍然存在。
然后我添加
$(info VAR="$(vmlinux-deps)")
就在 vmlinux 调用之前。问题变得清晰:
/usr/bin/aarch64-linux-gnu-gcc: No such file or directory Is your PATH set correctly?
我只安装了g++,没有安装gcc。安装 'gcc' 包解决问题。
在 ubuntu:
sudo apt-get install gcc-aarch64-linux-gnu
@dmitry-screwer 的鼓舞人心的方式,我发现真正的错误不见了
aarch64-linux-gnu-gcc
。由于工具链是从 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
克隆的,因此丢失某些文件是没有意义的。然后我意识到 git 远程文件可能已更改并且不适合我的 makefile。所以我获取了几年前创建的 android-5.1.1_r37
标签,以成功获取丢失的 gcc。
我遇到了和你一样的问题
文档(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)
检查 aarch64-linux-android-4.9
的版本。如果不匹配,可能会出现这样的错误:
Makefile:796: *** multiple target patterns. Stop.
devicetable-offsets.c: 11:2: error: unexpected token at start of statement. DEVID_FIELD
arch/arm64/Makefile:57: Detected assembler with broken .inst; disassembly will be unreliable
解决方法:
查看所有分支:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/+refs
并下载 Android 版本的分支。
例如:
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 --depth=1 -b android-8.1.0_r81
此外,aarch64-linux-android-gcc
已为新分支删除,因此您需要下载早期版本。
我试图按照 Google 在 this page
上的说明为 Nexus 5X 构建一个新内核- 构建系统:Ubuntu14.04x86_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
我不太确定接下来要尝试什么。感谢您的帮助。
从 link-vmlinux.sh
中删除了 trap
行并开始 make
。内核构建并成功运行。
运行 link-vmlinux.sh
独立仍然报错,但 make
成功。
第 44 和 45 行看起来像这样:
${LD} ${LDFLAGS} -r -o ${KBUILD_VMLINUX_INIT} \
--start-group ${KBUILD_VMLINUX_MAIN} --end-group
所以发生的事情是 $LD
和 $LDFLAGS
未定义,这使得命令只是 -r ...
,而 -r
不是您系统上的命令,因此找不到命令。
定义 $LD
和 $LDFLAGS
然后它将 运行 无论 $LD
与 $LDFLAGS
+ 其他命令的其余部分。
如果您还有问题,请添加评论,我会进一步调查。
很老的问题了,但我刚遇到同样的问题,我想告诉大家只有当 CROSS_COMPILE
设置不正确时才会出现此问题。无需注释掉 trap
、显式导出 LD
和 LDFLAGS
或进行其他修改。
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-gnu
、gcc-arm-linux-gnueabi
并将 CROSS_COMPILE
设置为 /usr/bin/aarch64-linux-gnu-
我已将 CROSS_COMPILE 变量固定为有效路径。但同样的错误仍然存在。 然后我添加
$(info VAR="$(vmlinux-deps)")
就在 vmlinux 调用之前。问题变得清晰:
/usr/bin/aarch64-linux-gnu-gcc: No such file or directory Is your PATH set correctly?
我只安装了g++,没有安装gcc。安装 'gcc' 包解决问题。 在 ubuntu:
sudo apt-get install gcc-aarch64-linux-gnu
@dmitry-screwer 的鼓舞人心的方式,我发现真正的错误不见了
aarch64-linux-gnu-gcc
。由于工具链是从 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
克隆的,因此丢失某些文件是没有意义的。然后我意识到 git 远程文件可能已更改并且不适合我的 makefile。所以我获取了几年前创建的 android-5.1.1_r37
标签,以成功获取丢失的 gcc。
我遇到了和你一样的问题
文档(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)
检查 aarch64-linux-android-4.9
的版本。如果不匹配,可能会出现这样的错误:
Makefile:796: *** multiple target patterns. Stop.
devicetable-offsets.c: 11:2: error: unexpected token at start of statement. DEVID_FIELD
arch/arm64/Makefile:57: Detected assembler with broken .inst; disassembly will be unreliable
解决方法: 查看所有分支:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/+refs 并下载 Android 版本的分支。
例如:
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 --depth=1 -b android-8.1.0_r81
此外,aarch64-linux-android-gcc
已为新分支删除,因此您需要下载早期版本。