ZHCADC4A September 2011 – March 2014
通常,当编译器看到对 extern 函数的调用时,它仅生成一条 CALL 指令,而不考虑被调用函数的位置。在静态链接期间,如果函数是在另一源文件或在静态链接库中定义的,则链接器只需重定位 CALL 指令中的位移字段即可解析引用。
如果函数是从共享库导入的,则其地址在静态链接时未知,最终在动态链接时解析。可能需要额外指令来寻址和调用导入的函数。出于这种可能性,以及为了避免必须在动态链接时修补调用,静态链接器会生成与位置无关的存根来调用此函数,并修补初始调用以执行此存根。此存根称为 PLT 条目。PLT 表示过程链接表。(将 PLT 指定为表是历史做法;它的条目是独立生成的代码片段,不会收集到任何内聚实体中。)PLT 条目在概念上类似于 far 调用蹦床函数(请参阅节 3.1)。蹦床函数旨在调用 far-away 函数,而 PLT 条目调用的是导入 函数。