最近公司作新项目,在老的板子上跑着感觉异常的沉重,arm1176运行我们的程序有点不堪重负,于是产生了强烈的优化想法。
老大给机会让我研究一下gprof && oprofile 一开始搞gprof的过程稍候会补上。
后来参加了一次hello gcc 的活动,那里那些作编译器的推荐使用oprofile,因为gprof只是针对应用层的分析,而oprofile是通过硬件(CPU)本身支持的性能计数器进行的性能分析,贯穿内核到用户应用程序,很有参考价值。
开始了漫长的编译过程
1.下载oprofile-0.9.7进行交叉编译
./configure --host=arm-linux --prefix=/opt/oprofile.test/ --with-kernel-support
提示
checking for poptGetContext in -lpopt... no
configure: error: popt library not found
popt 库找不到
2.下载popt-1.7进行交叉编译
./configure --prefix=/opt/linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/ --host=arm-linux --disable-nls && make && make install
继续编译oprofile-0.9.7
./configure --host=arm-linux --prefix=/opt/oprofile.test/ --with-kernel-support
提示
checking for bfd_fdopenr in -lbfd... no
configure: error: bfd library not found
bfd库找不到
3.下载binutils-2.19.1进行编译
./configure --host=arm-linux --prefix=/opt/binutils.test/ --enable-install-libbfd --enable-shared&& make && make install
继续编译oprofile-0.9.7
./configure --host=arm-linux --prefix=/opt/oprofile.test/ --with-kernel-support--with-binutils=/opt/binutils.test/
4. 会出现如下警告
Warning: QT version 3 was requested but not found. No GUI will be built.
Warning: The user account 'oprofile:oprofile' does not exist on the system.
To profile JITed code, this special user account must exist.
Please add the following user and group:
user name : 'oprofile'
group name: 'oprofile'
The 'oprofile' group must be the default group for the 'oprofile' user.
执行 useradd oprofile
groupadd oprofile
5.继续编译oprofile-0.9.7
./configure --host=arm-linux --prefix=/opt/oprofile.test/ --with-kernel-support--with-binutils=/opt/binutils.test/ && make && make install
编译成功
6.确保内核选项中有oprofile的支持,要弄成模块,方便以后的加载驱动参数更改
7.确保你本地的nfs server 已经导出
/opt/oprofile.test/
/opt/binutils.test/
8.配置开发板运行环境
mkdir -p /opt/binutils.test/ /opt/oprofile.test/ /opt/gtk/
mount -o nolock 192.168.50.54:/opt/binutils.test/ /opt/binutils.test/
mount -o nolock 192.168.50.54:/opt/oprofile.test/ /opt/oprofile.test/
mount -o nolock 192.168.50.54:/opt/gtk /opt/gtk
export PATH=/opt/oprofile.test/bin/:$PATH
export LD_LIBRARY_PATH=/opt/binutils/lib:/opt/oprofile/lib/oprofile.test/:$LD_LIBRARY_PATH
9.拷贝POPT动态库到/opt/binutils.test/lib/下
cp -fra /opt/linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/lib/libpopt.* /opt/binutils.test/lib/
因为我为了编译方便把libpopt直接放到编译器目录下面了,但是这样会导致LD_LIBRARY_PATH无法找到改库提示如下错误
/opt/oprofile.test/bin/ophelp: can't load library 'libpopt.so.0'
10.牛刀小试
opcontrol --init
Kernel support not available, missing opcontrol --init as root ?
出现上述错误,没关系,删除以前的/etc/mtab执行如下命令
ln -s /proc/mounts /etc/mtab
opcontrol --init 这次执行成功
说明我们环境已经配置完毕。
交叉编译OK。