本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/fc185b5da0509b9a631f |
はじめに
13年前(=2008年) に、次のような「コンソールからの関数呼び出し」を作成していたようである.
良い機会なので、C言語のポートフォリオ(作品)を兼ねて、該当コードを振り返ることにした.
当時の仕事で開発していたプログラムは、
stdin(標準入力)からの次の関数呼び出しの機構をサポートしていた.
この機能が存在した理由は以下であった.
プログラム実行環境には ファイルシステムが存在しない.
そのために次の制約があり、少しでもデバッグを捗るようにするためであった.
・gdb は使えない
・ログファイルの書き出しもできない
詳細
次のような仕組みで実装していた
挙動
(1) デバッグ対象のプログラムコード `*.c` が存在する.
⬇️
(2) `*.c` をコンパイルして `*.o` を作成する
⬇️
(3) `*.o` に対して `readelf -s` を実行して公開関数名を抽出する
⬇️
(4) (3) で抽出した公開関数名をヘッダファイルに書き出す
⬇️
(5) (4) のヘッダファイルを include して、コンソールから関数呼び出し機能も持つコードも含めてリンクする
⬇️
(6) 作成された実行ファイル a.out を実行する
⬇️
(7) a.out の stdin から、公開関数 (static 関数以外) とその引数を入力する
⬇️
(8) 上記 (7) で入力した関数が実行される
実行例
次のような公開関数 piyo が存在した場合の実行例である.
コード
void
piyo(char * mesg, char * mesg2)
{
printf("(%s , %s) at piyo()\n", mesg, mesg2);
}