很简单的bash脚本,用来在linux上分析源码使用。
如今我在移植内核的tools/perf到android,linux kernel 3.8.0rc才开始正式涉足android移植这个问题,之前都是google公司自己修改后放到external/linux-tools-perf目录下去编译的。根据toos/perf/Documentaion/android.txt的指导去做,结果3.8.0rc的perf都没法编译通过,更不要提我自己去打补丁的3.0.31版本了。3.8.0rc还没正式发布,正在开发中,也能理解。我自己先想办法排除这些编译错误。主要是交叉编译的时候,头文件引用很混乱,比较纠结。刚好借这个机会介绍其中一个小工具searchheader。
find . -regex ".*\.c\|.*\.cpp\|.*\.java|.*\.S|.*\.s" -exec $@ \{\} \;
例子:
onsource grep -H -n helloworld 在目录树上所有源文件中寻找helloworld并列出文件名和行号
find . -regex ".*\.h" -exec $@ \{\} \;
#!/bin/bash for i in util/include \ arch/arm/include \ /home/hzh/linux-kernel/linux/arch/arm/include/uapi \ /home/hzh/linux-kernel/linux/arch/arm/include \ /home/hzh/linux-kernel/linux/include/uapi \ /home/hzh/linux-kernel/linux/include \ /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include \ ; do case $1 in file) [ -a ${i}/$2 ] && echo $2 in $i;; word) [ -d $i ] && grep -R -H -n $2 $i;; esac done
用例:
编译perf android版本,第一个出错信息是__kernel_nlink_t未定义
hzh@fangtian:~/linux-kernel/linux/tools/perf$ make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}" -d 。。。 CC perf.o In file included from /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/unistd.h:33:0, from util/util.h:46, from builtin.h:4, from perf.c:9: /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h:65:1: error: unknown type name '__kernel_nlink_t'
先寻找__kernel_nlink_t在INCLUDE_PATH上的什么头文件中出现过
hzh@fangtian:~/linux-kernel/linux/tools/perf$ searchheader word __kernel_nlink_t /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h:65:typedef __kernel_nlink_t nlink_t; /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/asm/posix_types.h:24:typedef unsigned short __kernel_nlink_t;
看来它在asm/posix_types.h中定义。
然后寻找asm/posix_types.h有几个同名文件:
hzh@fangtian:~/linux-kernel/linux/tools/perf$ searchheader file asm/posix_types.h asm/posix_types.h in /home/hzh/linux-kernel/linux/arch/arm/include/uapi asm/posix_types.h in /home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include
/home/hzh/android/ndk/build/platforms/android-3/arch-arm/usr/include/sys/types.h中只引用了linux/posix_types.h,所以出错。
加上#include <asm/posix_types.h>,因为先搜到/home/hzh/linux-kernel/linux/arch/arm/include/uapi/asm/posix_types.h,依旧出错。
解决方法很纠结,一般采取"全路径"或者在用"asm/posix_types.h",然后在CFLAGS中使用-iquote选项规定引号括起的头文件,先去搜索指定目录。这些都只能是临时解决方法。
如果有谁编译过3.8.0rc下的perf android版,能否留言给个指教?