x86_64 Ubuntu システム (12.04) から ARM アーキテクチャ用にクロスビルドされた Android 用の Perf をビルドしようとしています。./tools/perf/Documentation/android.txt にある Linux カーネルに付属の指示に従っています。同じテキスト ファイルに記載されている 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」ファイルが見つからないというトピックについては、Google から多数のヒットがあり、そのうちのいくつかは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-