ブログ

バイナリ実行時にopen()しているファイルを調べる方法

at_ito
2015年1月4日 12時38分

DebianパッケージをAtmark Distで作ったユーザーランドに追加する際に、バイナリを実行しても必要なファイルが見つからずに正常に起動しないことがあるかと思います。その際に、何が必要なファイルかを調べる方法を紹介します。

バイナリ実行時に必要なファイルは、open()システムコールで開かれます。そのため、バイナリ実行時にどのシステムコールが使用されたかを調べるstraceを使うことで、どのファイルをopen()しようとしたかを調べることができます。このstraceはLinuxのデバッグユーティリティであり、引数に渡されたバイナリが使用するシステムコールを見ることができます。

Atmark Distのコンフィギュレーションで選択できるstraceでは、ビルド時にエラーが発生するため、Debian Packagesからstraceのバイナリを持ってくる必要があります。

以下のページを参考に、straceをユーザーランドに追加してください。

例として、「i2cdetect -l」コマンドを実行した際の結果を以下に抜粋します。

[armadillo ~]# strace i2cdetect -l 2>&1 | grep ^open
(省略)
open("/proc/bus/i2c", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/proc/mounts", O_RDONLY)          = 3
open("/sys/class/i2c-dev", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
open("/sys/class/i2c-dev/i2c-0/name", O_RDONLY) = 4
open("/dev/i2c/0", O_RDWR)              = -1 ENOENT (No such file or directory)
open("/dev/i2c-0", O_RDWR)              = 4
open("/sys/class/i2c-dev/i2c-1/name", O_RDONLY) = 4
open("/dev/i2c/1", O_RDWR)              = -1 ENOENT (No such file or directory)
open("/dev/i2c-1", O_RDWR)              = 4
open("/sys/class/i2c-dev/i2c-2/name", O_RDONLY) = 4
open("/dev/i2c/2", O_RDWR)              = -1 ENOENT (No such file or directory)
open("/dev/i2c-2", O_RDWR)              = 4