“bitsperlong.h”:麻烦交叉构建Perf for ARM(Android)

时间:2013-11-12 21:17:30

标签: android linux linux-kernel arm perf

我正在尝试为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-

1 个答案:

答案 0 :(得分:0)

你看过external / linux-tools-perf /

吗?