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.so 而不是如图所示,它的代码在本节中, 08048000 4K r-x-- /home/anirudh/Documents/DUMP/a.out 即我的代码的代码段。

我什至尝试打印更多函数的地址,getpid()scanf()它们都显示为我程序代码段的一部分,而不是libc-2.12.1.so

这是什么原因?提前致谢。

4

2 回答 2

1

查看地址处的代码printf;它可能只是调用的间接跳转或调用libc. 通常,对共享库的调用会变成对调度函数的引用,该调度函数使用(或查找)printf加载的实际地址进行修补。如果您readelf -a在可执行文件上运行并查找找到的地址printf,它可能会被标记为重定位,以指向libc.

于 2011-03-10T17:32:02.027 回答
0

不确定,但可能是您正在打印实际 printf 调用的块?

就像,当你调用一个必须在动态链接时解析的符号时,那里必须有一些代码,比如蹦床或类似的东西,所以当你调用它时,解析发生并且实际的库调用被调用。

于 2011-03-10T17:33:10.343 回答