我正在尝试为Android构建Perf,从x86_64 Ubuntu系统(12.04)为ARM体系结构交叉构建。我按照Linux内核的说明,在./tools/perf/Documentation/android.txt。我尝试了同一文本文件中记录的基于NDK的构建和AOSP派生的sysroot方法。但是,我更喜欢AOSP派生的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-
答案 0 :(得分:0)
你看过external / linux-tools-perf /
吗?