程序链接表的目的是什么?

我很好奇为什么程序链接表存在。 它的目的是什么? 程序集不能直接调用全局偏移量表吗? 调用PLT有什么好处,而不是调用Global Offset Table?

整个过程对我来说还是有点困惑,我试图弄清楚dynamic链接的进出,所以任何帮助将不胜感激。

对于PIC代码的调用,您确实不需要PLT。 编译器可以很好地生成GOT查找,并间接调用从GOT获取的地址。 使用PLT往往会使代码略微更高效,但是(至少每个调用的体积膨胀更少),所以通常使用它。

PLT是绝对需要的,但是在非PIC的代码中是动态链接的。 (通常这只发生在主程序中;在许多拱形中,共享库中甚至不允许/不支持非PIC代码。)当编译器为函数调用生成非PIC代码时,无法知道实际目标地址将在运行时通过GOT动态解析。 所以它只是产生一个普通的调用指令。 当链接器看到一个在本地解析不了的符号的调用类型重定位,并且需要运行时链接时,链接器负责生成一个PLT条目,该条目从GOT加载地址并间接跳转到该地址。 这样,原始的非PIC功能调用代码可以不加修改地工作。