一、 相关资源
根据Oprofile的官方网站,可知需要安装的库。
Required libraries :These libraries are required : popt
, bfd
, liberty
(debian users: libiberty is provided in binutils-dev package), dl
, plus the standard C++ libraries.
源码包:
busybox-1.8.1.tar.bz2
Oprofile-0.9.4.tar.gz
Popt-1.7.tar.gz
Binutils-2.19.51.0.3.tar.bz2
linux-2.6.25-android-1.0_r1.tar.gz
(在本次实验,内核直接运用经过修改(可以移植)的源码文件)
编译工具:
arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
二、 详细步骤:
1)通过静态交叉编译生成Oprofile的一些相关命令
oparchive opgprof opimport opreport
opannotate opcontrol ophelp opjitconv oprofiled
在交叉编译之前需要做的一些工作:
(1)打开内核的Oprofile选项
通过make menuconfig=>general setup=>
[*] Profiling support (EXPERIMENTAL)
[ ]Activate markers [*] OProfile system profiling (EXPERIMENTAL)
(2)选择安装交叉编译链
选择codeSourcery里下的Sourcery G++ Lite 2009q1-203 for ARM GNU/Linux版(arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2)。 修改~/.bashrc添加arm-none-linux-gnueabi的路径。
PATH=$PATH: /home/kasmile/mydir/work/arm-2009q1/bin/
(3)配置编译、链接参数
export CC=arm-none-linux-gnueabi-gcc
export CXX=arm-none-linux-gnueabi-g++
export CFLAGS=-static
export CXXFLAGS=-static
export CPPFLAGS=-staitc
2)交叉编译popt库
$:tar xfz popt-1.7.tar.gz
$:cd popt-1.7
$:./configure --with-kernel-support --host=arm-none-linux-gnueabi --prefix=/work/popt/poptinstall/
$:make
$:make install
cp /work/popt/poptinstall/lib/* /home/kasmile/mydir/work/arm-2009q1/arm-none-linux-gnueabi/lib
cp /work/popt/poptinstall/include/* /home/kasmile/mydir/work/arm-2009q1/arm-none-linux-gnueabi/include
3)静态交叉编译binutils
$:tar jxf binutils-2.19.51.0.3.tar.bz2
$:cd binutils-2.19.51.0.3
$:./configure --with-kernel-support --host=arm-none-linux-gnueabi --prefix=/work/binutils/binutils-2.19-install-dir/
$:make
$:make install
Cp /work/binutils/binutils-2.19-install-dir/lib/* /home/kasmile/mydir/work/arm-2009q1/arm-none-linux-gnueabi/lib
Cp /work/binutils/binutils-2.19-install-dir/include/* /home/kasmile/mydir/work/arm-2009q1/arm-none-linux-gnueabi/include
4)静态交叉编译oprofile
$: tar zxf oprofile-0.9.4.tar.gz
$:cd oprofile-0.9.4
$:/configure --with-linux=/home/kasmile/mydir/work/kernel-xscale/ --with-kernel-support --host= arm-none-linux-gnueabi --prefix=/work/myOProfile
通过1)-4)操作,可在myoprofile/bin目录下查看到一些oprofile的工具。
kasmile@kasmile:bin$ file ophelp
ophelp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped。
说明:
关于为何不能运用动态链接的可执行程序?见附录4
虽然在之前指定了static参数,但是编译出来的结果仍然是动态链接的。这个是因为Oprofile在链接库时运用到了libtool工具。对于如何通过对libtool文件的修改使其直接产生静态链接的文件,目前未进行研究,而是直接安装郑老师的巧妙方法,手动编译成静态。
具体方法如下:
就ophelp命令来讲:
kasmile@kasmile:oprofile-0.9.4$ cd utils/
kasmile@kasmile:utils$ ls
Makefile Makefile.am Makefile.in opcontrol ophelp ophelp.c ophelp.o
kasmile@kasmile:utils$ rm ophelp
kasmile@kasmile:utils$ cd ..
kasmile@kasmile:oprofile-0.9.4$ make
注:由于ophelp被删除,则它要重新生产,在make过程中可以查看相关生成指令。
arm-none-linux-gnueabi-gcc -W -Wall -fno-common -Wdeclaration-after-statement -o ophelp ophelp.o ../libop/libop.a ../libutil/libutil.a /work/popt/popinstall/lib/libpopt.a -liberty -ldl -Wl,--rpath -Wl,/work/popt/popinstall/lib -Wl,--rpath -Wl,/work/popt/popinstall/lib
kasmile@kasmile:oprofile-0.9.4$ cd utils/
kasmile@kasmile:utils$ rm ophelp
kasmile@kasmile:utils$ arm-none-linux-gnueabi-gcc -W -Wall -fno-common -Wdeclaration-after-statement -o ophelp ophelp.o ../libop/libop.a ../libutil/libutil.a /work/popt/popinstall/lib/libpopt.a -liberty -ldl -Wl,--rpath -Wl,/work/popt/popinstall/lib -Wl,--rpath -Wl,/work/popt/popinstall/lib –static
kasmile@kasmile:utils$ file ophelp
ophelp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, not stripped
则ophelp为静态链接,不依赖库,可以直接在开发板上运行。其他Oprofile指令相应通过手动编译生成。除其中opcontrol为shell脚本,是源码包自带的。
5)移植busybox
由于要运用oprofile工具,必须先运用opcontrol进行初始化工作。而opcontrol是个shell脚本。首先修改opcontrol文件。
#!/bin/sh=>#/system/bin/sh(android的linux文件结构不太相同)
把oprofile工具放在/data/myOprofile目录下。
Export PATH=$PATH:/data/myOprofile
$:./opcontrol –init (出现错误)
test: not found
id: not found
test: not found
grep: not found
test: not found
grep: not found
test: not found
test: not found
test: not found
…………
这是由于android提供的命令过于精简,因此需要移植busybox,来运行opcontrol。
通过下载busybox最新版本,进行交叉编译。(要在make menuconfig中选择静态链接)
把busybox 复制到/data/busybox/下。
$:cd /data/busybox
$:chmod +x busybox
$:export PATH=$PATH:/data/busybox/
$:./busybox -install
修改opcontrol文件:
BINDIR =”/data/busybox”
PATH中加入/data/busybox
6)oprofile初始化
#opcontrol --init
cat: can't open '/dev/oprofile/cpu_type': No such file or directory
Unable to open cpu_type file for reading
Make sure you have done opcontrol --init
cpu_type 'unset' is not valid
you should upgrade oprofile or force the use of timer mode
解决方法:
#rm /etc/mtab
#touch /etc/mtab
#vi /etc/mtab
编辑以下内容:
nodev /dev/oprofile oprofilefs rw 0 0
重新执行:
#opcontrol --init
#
到此,oprofile移植成功。