gdb 显示相同功能的不同地址?

gdb showing different address for the same function?

所以我想练习做一个 ret2libc 攻击,我在这个简单的程序上使用 gdb

// File: retlib.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("system = %p\n", system);
    char c[] = "echo 123";
    system(c);

    return 0;
}

现在注意这个

Reading symbols from ./retlib...(no debugging symbols found)...done.
(gdb) p system
 = {<text variable, no debug info>} 0x4004b0 <system@plt>
(gdb) b main
Breakpoint 1 at 0x4005ea
(gdb) r
Starting program: /home/users/mickey/retlib 

Breakpoint 1, 0x00000000004005ea in main ()
(gdb) p system
 = {<text variable, no debug info>} 0x7ffff7a523a0 <__libc_system>
(gdb) c
Continuing.
system = 0x4004b0
123
[Inferior 1 (process 11593) exited normally]

我的问题是,为什么 system 函数地址会得到 2 个不同的输出。甚至在我启动 运行 程序后,gdb 命令说的是一回事,而 printf 说的是另一回事。我注意到每个地址的标签都不同,但为什么会这样?如有任何帮助,我们将不胜感激!

在运行程序之前,gdb会给你程序链接table(.plt)地址,在运行之后,是libc函数地址。