【发布时间】:2013-11-12 21:17:30
【问题描述】:
我正在尝试为 Android 构建 Perf,从 x86_64 Ubuntu 系统 (12.04) 为 ARM 架构交叉构建。我正在遵循 Linux 内核附带的说明,位于 ./tools/perf/Documentation/android.txt。我尝试了基于 NDK 的构建和 AOSP 派生的 sysroot 方法,这些方法都记录在同一个文本文件中。不过,我更喜欢 AOSP-derived-sysroot 方法。
这是 AOSP 的 4.3_r3.1 标签的同步,添加了内核 3.10.17,并生成了适当的 .config 文件。 (交叉构建的内核是在下面的交叉构建 Perf 尝试之前构建的。)
为主机平台构建 Perf 工作正常。但是 ARM 的交叉构建失败并出现以下错误:
$ cd ~/work/aosp
$ source build/envsetup.sh
$ lunch
$ cd ${ANDROID_BUILD_TOP}/ndk
$ ./build/tools/build-ndk-sysroot.sh --abi=arm
$ export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm
$ export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi-
$ cd ${ANDROID_BUILD_TOP}/kernel/tools/perf
$ make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}"
...
CC perf.o
In file included from /home/rbissell/work/aosp/kernel/arch/arm/include/uapi/asm/posix_types.h:35:0,
from /home/rbissell/work/aosp/kernel/include/uapi/linux/posix_types.h:35,
from /home/rbissell/work/aosp/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/include-fixed/sys/types.h:46,
from /home/rbissell/work/aosp/ndk/build/platforms/android-3/arch-arm/usr/include/unistd.h:33,
from util/util.h:44,
from builtin.h:4,
from perf.c:9:
/home/rbissell/work/aosp/kernel/include/uapi/asm-generic/posix_types.h:4:29: fatal error: asm/bitsperlong.h: No such file or directory
谷歌有很多关于丢失“bitsperlong.h”文件的话题,其中一些甚至是here on SO。在大多数情况下,这些问题和答案属于以下类别之一:
- 有人试图构建内核模块(我不是)
- 不是交叉构建的人,只需要安装主机内核头文件(我不需要)
我在上面提供的 SO 链接中提供的唯一解决方案是编辑 Perf 的源文件以包含 <asm-generic/bitsperlong.h> 而不是 <asm/bitsperlong.h>... 我见过的另一个变体是在后一个目录中创建一个符号链接以前者。
这些解决方案在我看来都不合理,而且无论如何只会导致其他编译错误,例如:
$ ln -s /home/rbissell/work/aosp/kernel/include/asm-generic /home/rbissell/work/aosp/kernel/include/asm
$ make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}"
...
CC perf.o
In file included from /home/rbissell/work/aosp/ndk/build/platforms/android-3/arch-arm/usr/include/unistd.h:33:0,
from util/util.h:44,
from builtin.h:4,
from perf.c:9:
/home/rbissell/work/aosp/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/include-fixed
/sys/types.h:73:1: error: unknown type name '__kernel_nlink_t'
起初我认为这个问题可能是由于在构建 Perf 之前没有在同一源代码树中交叉构建内核本身引起的(因为,也许内核构建设置了一些 $ARCH 适当的符号链接,或其他东西,)但是这样做之后,我仍然遇到了同样的问题。
更新:如果有帮助,这就是我交叉构建内核的方式:
make ARCH=arm CROSS_COMPILE=/home/rbissell/work/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
【问题讨论】:
-
我认为您确实需要先交叉构建内核(至少部分地;类似于构建内核模块时的情况)。当您交叉构建内核和执行 perf make 时,您是否指定了相同的
ARCH=arm和O=...? -
同一个
ARCH=arm,是的。我的命令行上没有O=...(不确定这是否是您的错字。)我将在上面的问题中添加我的内核构建命令。 -
瑞恩,你有没有遇到过这种情况?我遇到了完全相同的问题。将 bitsperlong.h 的内容复制粘贴到 .h 中,包括它只会解决缺少 __kernel_nlink_t 的下一个问题。
标签: android linux linux-kernel arm perf