[英]Can I change the Global Offset Table/GOT or Procedural Linkage Table/PLT programmatically?
[英]Process Linkage Table and Global Offset Table
我正在阅读有关PLT(过程链接表)和GOT(全局偏移表)的文章 。 虽然PLT的目的很明确,但我仍然对GOT感到困惑。 从本文中我了解到,只有在共享库中声明为extern
变量才需要GOT。 对于在共享库代码中声明为static
全局变量,则不需要。
我的理解正确吗,还是我完全忘记了这一点。
也许您的困惑与extern
的含义有关。 由于默认链接是extern
,所以在函数范围之外声明的,没有static
关键字的任何变量都是extern
。
需要GOT的原因是,在生成共享库时,未知由共享库代码访问的变量的地址。 它取决于加载库的加载地址(如果定义在库本身中)或定义变量的第三方代码(如果定义在其他地方)。 因此,编译器不会在代码中插入地址,而是生成代码以读取共享库的GOT,然后在运行时从GOT加载地址。
如果已知该变量是在同一个共享库中定义的(因为它是static
或者因为它使用了hidden
或protected
可见性属性),则可以在生成共享库文件时固定相对于库中代码的地址。 在这种情况下,编译器将生成代码以使用程序计数器相对寻址来访问变量,而不是通过GOT执行查找。 这在运行时和加载时都比较便宜(因为可以在加载时跳过整个符号查找和重定位过程)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.