シンボルテーブルでは、システムコールの値はゼロです。

シンボルテーブルでは、システムコールの値はゼロです。

バイナリファイルのシンボルテーブルを表示するには、次のコマンドを使用します。

readelf -s mybinary

下から出力の一部を見ることができます。 ここに画像の説明を入力してください。

ご覧のとおり、すべてのシステムコール(printfや終了など)の値は00000000です。ところで、このシステムコールのアドレスを探したいと思います。どうすればいいですか?たくさん検索しましたが、何も見つかりませんでした。

ベストアンサー1

printfおよび関数を含むライブラリは、プログラムの起動後に動的にロードされるexit共有ライブラリ()です。*.soこれらの関数のアドレスは、動的リンカーがライブラリをプロセスのアドレス空間に配置するまでは不明です。プログラムが実行されるたびにアドレスが変更されることがあります。

gdbデバッガを使用すると、ブレークポイントまでプログラムを実行し、デバッガp printfプロンプトに入力して、動的リンカが関数を配置した場所を見つけることができます。

動的リンクを回避するには、ライブラリをプログラムに静的にリンクするだけです。これにより、アドレスが事前に知られており、 を利用して確認することができるreadelf。静的コンパイラを使用するには、gccコマンド-staticラインにオプションを追加します。例:

gcc -static myprog.c -o myprog

おすすめ記事