株式会社インタフェースのLinuxボードのC言語でできたアプリをSH4からAtomに移植した時の話です。
もともとSH4がリトルエンディアンモードだったのでAtomでも再コンパイルだけで動くと思っていましたが、コンパイルは難無くできたものの、実行するとインタフェースの拡張ボード用ライブラリ内で「Segmentation fault」が発生するようになってしまいました。
最初にGDBで落ちる場所を調べました。拡張ボード用ライブラリから呼ばれているstat()関数をコールして落ちてました。
次にサンプルを動かしてドライバの状態を確認しました。
サンプルでは正常に動作したので移植したアプリに問題があるようです。
次にサンプルのソースコードを移植アプリに張り付けてみたら落ちました。
Makefileに問題がありそうです。
次にMakefileからリンクするオブジェクトを減らしていきました。
そこで特定のファイルのリンクを外すと落ちなくなりました。
そのファイルのコードを確認すると、グローバル変数として「int stat;」が定義されていました。
これです。
この変数がシステム関数のstat()の代わりにリンクされてしまい、拡張ボード用ライブラリがstat()を関数コールするはずのところで「int stat;」のアドレスを関数コールしてしまっていました。
調査に要した時間10時間。
ちゃんとローカル変数にはstaticを付けろ!ということですね。