0

私のコードでは、printf() 関数のアドレスを出力しようとしました。

22834:   ./a.out
00250000   1372K r-x--  /lib/libc-2.12.1.so
003a7000      8K r----  /lib/libc-2.12.1.so
003a9000      4K rw---  /lib/libc-2.12.1.so
003aa000     12K rw---    [ anon ]
00a14000    112K r-x--  /lib/ld-2.12.1.so
00a30000      4K r----  /lib/ld-2.12.1.so
00a31000      4K rw---  /lib/ld-2.12.1.so
00fb9000      4K r-x--    [ anon ]
08048000      4K r-x--  /home/anirudh/Documents/DUMP/a.out
08049000      4K r----  /home/anirudh/Documents/DUMP/a.out
0804a000      4K rw---  /home/anirudh/Documents/DUMP/a.out
08068000    132K rw---    [ anon ]
b7898000      4K rw---    [ anon ]
b78ac000      8K rw---    [ anon ]
bfc9a000    132K rw---    [ stack ]
 total     1808K

Address of the function "printf()" in HEX = 8048408

私はそのアドレスが

00250000 1372K r-x-- /lib/libc-2.12.1.so08048000 4K r-x-- /home/anirudh/Documents/DUMP/a.out そのコードがこのセクション、つまり私のコードのコードセグメントにある ことを示すのではなく 。

getpid()andのようなさらにいくつかの関数のアドレスを印刷しようとさえしましたscanf()が、それらはすべて、プログラムのコードセグメントではなく、プログラムのコードセグメントの一部であることが示されましたlibc-2.12.1.so

この理由は何ですか。前もって感謝します。

4

2 に答える 2

1

printfアドレスにあるコードを見てください。への呼び出しは、おそらく単なる間接的なジャンプまたは呼び出しですlibc。通常、共有ライブラリへの呼び出しは、ロードされた実際のアドレスでパッチが適用される (またはルックアップされる) ディスパッチ関数への参照に変換さprintfれます。実行可能ファイルを実行readelf -aして、見つかったアドレスを探すと、printfおそらく .xml 内の実際のアドレスを指すように再配置としてマークされますlibc

于 2011-03-10T17:32:02.027 に答える
0

確かではありませんが、実際の printf 呼び出しを行うチャンクを印刷している可能性がありますか?

同様に、動的リンク時に解決する必要があるシンボルを呼び出す場合、トランポリンなどのコードがそこにある必要があるため、それを呼び出すと解決が行われ、実際のライブラリ呼び出しが呼び出されます。

于 2011-03-10T17:33:10.343 に答える