oprofile環境構築

oprofileのクロスコンパイルは前哨戦だった…orz

ということで、環境構築編。

  • /etc/passwd (ユーザID、グループIDは適当)
	oprofile:x:110:110:oprofile:/dev/oprofile:/bin/sh
  • /etc/group
	oprofile:x:110:
  • /etc/shadow
	oprofile:*:10933:0:99999:7:::
$> mkdir /dev/oprofile
$> rm -f bin/sh
$> ln -s bash sh

/bin/shbashにしたのはopcontrolスクリプトbusyboxのshで実行すると

opcontrol: line 1115: syntax error: Bad Substitution

って怒られるから。

  • 新たに追加したファイル
/lib64
/lib64/libpopt.so
/lib64/libz.so.1.2.3
/lib64/libpopt.so.0.0.0
/lib64/libz.so.1
/lib64/libpopt.so.0
/lib64/libz.so
/usr
/usr/local
/usr/local/lib
/usr/local/lib/oprofile
/usr/local/lib/oprofile/libopagent.so
/usr/local/lib/oprofile/libopagent.so.1.0.0
/usr/local/lib/oprofile/libopagent.so.1
/usr/local/bin
/usr/local/bin/opannotate
/usr/local/bin/opimport
/usr/local/bin/oparchive
/usr/local/bin/opreport
/usr/local/bin/opgprof
/usr/local/bin/opjitconv
/usr/local/bin/oprofiled
/usr/local/bin/ophelp
/usr/local/bin/opcontrol
/usr/local/share
/usr/local/share/oprofile
/usr/local/share/oprofile/x86-64
/usr/local/share/oprofile/x86-64/hammer
/usr/local/share/oprofile/x86-64/hammer/events
/usr/local/share/oprofile/x86-64/hammer/unit_masks
/usr/local/share/oprofile/x86-64/family11h
/usr/local/share/oprofile/x86-64/family11h/events
/usr/local/share/oprofile/x86-64/family11h/unit_masks
/usr/local/share/oprofile/x86-64/family10
/usr/local/share/oprofile/x86-64/family10/events
/usr/local/share/oprofile/x86-64/family10/unit_masks
/usr/local/share/oprofile/i386
/usr/local/share/oprofile/i386/nehalem
/usr/local/share/oprofile/i386/nehalem/events
/usr/local/share/oprofile/i386/nehalem/unit_masks
/usr/local/share/oprofile/i386/p4-ht
/usr/local/share/oprofile/i386/p4-ht/events
/usr/local/share/oprofile/i386/p4-ht/unit_masks
/usr/local/share/oprofile/i386/pii
/usr/local/share/oprofile/i386/pii/events
/usr/local/share/oprofile/i386/pii/unit_masks
/usr/local/share/oprofile/i386/core_2
/usr/local/share/oprofile/i386/core_2/events
/usr/local/share/oprofile/i386/core_2/unit_masks
/usr/local/share/oprofile/i386/ppro
/usr/local/share/oprofile/i386/ppro/events
/usr/local/share/oprofile/i386/ppro/unit_masks
/usr/local/share/oprofile/i386/core
/usr/local/share/oprofile/i386/core/events
/usr/local/share/oprofile/i386/core/unit_masks
/usr/local/share/oprofile/i386/p6_mobile
/usr/local/share/oprofile/i386/p6_mobile/events
/usr/local/share/oprofile/i386/p6_mobile/unit_masks
/usr/local/share/oprofile/i386/atom
/usr/local/share/oprofile/i386/atom/events
/usr/local/share/oprofile/i386/atom/unit_masks
/usr/local/share/oprofile/i386/core_i7
/usr/local/share/oprofile/i386/core_i7/events
/usr/local/share/oprofile/i386/core_i7/unit_masks
/usr/local/share/oprofile/i386/piii
/usr/local/share/oprofile/i386/piii/events
/usr/local/share/oprofile/i386/piii/unit_masks
/usr/local/share/oprofile/i386/p4
/usr/local/share/oprofile/i386/p4/events
/usr/local/share/oprofile/i386/p4/unit_masks
/usr/local/share/oprofile/i386/athlon
/usr/local/share/oprofile/i386/athlon/events
/usr/local/share/oprofile/i386/athlon/unit_masks
/usr/local/share/oprofile/i386/arch_perfmon
/usr/local/share/oprofile/i386/arch_perfmon/events
/usr/local/share/oprofile/i386/arch_perfmon/unit_masks
/usr/local/share/oprofile/rtc
/usr/local/share/oprofile/rtc/events
/usr/local/share/oprofile/rtc/unit_masks
/usr/local/share/oprofile/stlpat


あと、opreportを実行するために以下の2つも追加。

#> cp -ar /opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/lib64/libstdc++.so* lib64/
#> cp -a /opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/lib64/libgcc_s.so* lib64/

これがないと、

opreport: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
opreport: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory

こんな感じに。



ちなみにRAMDISKにobjdumpが入ってないと、カーネルのプロファイルができないっぽい。
とはいえ、あらかじめカーネルのtext領域がわかっていればOKみたい。opcontrolをobjdumpでgrepしたら

# start at the start of .text, and end at _etext
range_info=`objdump -h $FILE_IMAGE 2>/dev/null | grep " .text "`
tmp1=`echo $range_info | awk '{print $4}'`
tmp2=`objdump -t $FILE_IMAGE 2>/dev/null | grep "_etext$" | awk '{ print $1 }'`

こんな感じでobjdumpを使うらしい。

ので、

$> /opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-objdump -h crosstool-0.43/build/x86_64-unknown-linux-gnu/gcc-4.0.2-glibc-2.3.6/linux-2.6.31.5/vmlinux | grep " .text "
$> /opt/crosstool/gcc-4.0.2-glibc-2.3.6/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-objdump -t crosstool-0.43/build/x86_64-unknown-linux-gnu/gcc-4.0.2-glibc-2.3.6/linux-2.6.31.5/vmlinux | grep "_etext$"

ってやって出力された

1 .text 0093954b ffffffff81009000 0000000001009000 00109000 2**12
ffffffff8194254b g .text 0000000000000000 _etext

から、それぞれの行から4つめの「ffffffff81009000」と1つめの「ffffffff8194254b」を使って

opcontrol --vmlinux=vmlinux --kernel-range=ffffffff81009000,ffffffff8194254b

てな感じにすれば良いっぽい。