Met*_*est 11 c linux gcc x86-64
我正在阅读有关PLT(流程链接表)和GOT(全球抵消表)的这篇文章.虽然PLT的目的对我来说很清楚,但我仍然对GOT感到困惑.我从文章中了解到,GOT仅对于extern在共享库中声明的变量是必需的.对于static在共享库代码中声明的全局变量,它不是必需的.
我的理解是正确的,还是我完全忽略了这一点.
R..*_*R.. 18
也许你的困惑与意义有关extern.由于默认链接是extern,在函数范围之外声明的任何变量都没有static关键字extern.
GOT必要的原因是因为共享库代码访问的变量的地址在生成共享库时是未知的.它取决于库加载的加载地址(如果定义在库本身中)或定义变量的第三方代码(如果定义在其他地方).因此,编译器生成代码以读取共享库的GOT,然后在运行时从GOT加载地址,而不是将地址放在代码中.
如果已知变量在同一共享库中定义(因为它static或它使用的hidden或者protected可见性属性),则可以在生成共享库文件时修复相对于库中代码的地址.在这种情况下,编译器不是通过GOT执行查找,而是生成用于通过程序计数器相对寻址访问变量的代码.这在运行时和加载时都较便宜(因为在加载时可以跳过整个符号查找和重定位过程).