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

时间:2016-05-19 08:31:39

标签: android build kernel android-source

我试图按照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

我发现如果从$(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)

所以我使用参数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

由于此输出为:,因此可能解释了原始制作错误。

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

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

我不太确定下一步该尝试什么。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分: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 +其他命令的其余部分相关的任何内容。

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

答案 1 :(得分:3)

相当古老的问题,但我遇到了同样的问题,我想告诉您,只有在您错误地设置CROSS_COMPILE时才会出现问题。无需评论trap,明确导出LDLDFLAGS或执行其他操作。

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 :(得分:2)

我遇到了和你一样的问题。
文档(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)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

在vmlinux调用之前。问题变得很明显:

  

/ usr / bin / aarch64-linux-gnu-gcc:没有这样的文件或目录您的PATH设置正确吗?

我只安装了g ++,没有安装gcc。安装“ gcc”软件包即可解决该问题。 在Ubuntu上:

  

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

答案 5 :(得分:0)

通过@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。