答え1
printf
および関数を含むライブラリは、プログラムの起動後に動的にロードされるexit
共有ライブラリ()です。*.so
これらの関数のアドレスは、動的リンカーがライブラリをプロセスのアドレス空間に配置するまでは不明です。プログラムが実行されるたびにアドレスが変更されることがあります。
gdb
デバッガを使用すると、ブレークポイントまでプログラムを実行し、デバッガp printf
プロンプトに入力して、動的リンカが関数を配置した場所を見つけることができます。
動的リンクを回避するには、ライブラリをプログラムに静的にリンクするだけです。これにより、アドレスが事前に知られており、 を利用して確認することができるreadelf
。静的コンパイラを使用するには、gcc
コマンド-static
ラインにオプションを追加します。例:
gcc -static myprog.c -o myprog