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/shをbashにしたのは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
てな感じにすれば良いっぽい。