繁体   English   中英

流程链接表和全局偏移表

[英]Process Linkage Table and Global Offset Table

我正在阅读有关PLT(过程链接表)和GOT(全局偏移表)的文章 虽然PLT的目的很明确,但我仍然对GOT感到困惑。 从本文中我了解到,只有在共享库中声明为extern变量才需要GOT。 对于在共享库代码中声明为static全局变量,则不需要。

我的理解正确吗,还是我完全忘记了这一点。

也许您的困惑与extern的含义有关。 由于默认链接是extern ,所以在函数范围之外声明的,没有static关键字的任何变量都是extern

需要GOT的原因是,在生成共享库时,未知由共享库代码访问的变量的地址。 它取决于加载库的加载地址(如果定义在库本身中)或定义变量的第三方代码(如果定义在其他地方)。 因此,编译器不会在代码中插入地址,而是生成代码以读取共享库的GOT,然后在运行时从GOT加载地址。

如果已知该变量是在同一个共享库中定义的(因为它是static或者因为它使用了hiddenprotected可见性属性),则可以在生成共享库文件时固定相对于库中代码的地址。 在这种情况下,编译器将生成代码以使用程序计数器相对寻址来访问变量,而不是通过GOT执行查找。 这在运行时和加载时都比较便宜(因为可以在加载时跳过整个符号查找和重定位过程)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM