[英]does the dynamic linker modify the reference after executable is copied to memory?
假设我们有以下代码:
主文件
extern void some_function();
int main()
{
some_function();
return 0;
}
mylib.c
void some_function()
{
...
}
我创建了一个共享库mylib.so
并将 i 链接到可执行目标文件prog
linux> gcc -shared -fpic -o mylib.so mylib.c
linux> gcc -o prog main.c ./mylib.so
假设下图是prog
的可执行对象格式
通过动态链接,我们知道此时 mylib.so 中的任何代码或数据部分实际上都没有被复制到可执行文件 prog2l 中。 相反,链接器会复制一些重定位和符号表信息,这些信息将允许在加载时解析对 mylib.so 中的代码和数据的引用。
我只想仔细检查我的理解是否正确:
当prog
被加载器加载到内存中时,如下图所示
然后动态链接器将修改内存中prog
的.data
部分,以便它可以链接/重定位到mylib.so
的.text
部分中some_function
的指令地址。
我的理解正确吗?
相当接近。 动态链接器将修改数据段中的某些内容,而不是专门修改.data
部分 - 段是粗粒度的内容,对应于文件如何映射到内存而不是原始语义分解。 实际部分通常称为.got
或.got.plt
但可能因平台而异。 修改不是“将其重定位到指令地址”,而是解析对函数名称的重定位引用以获取加载它的地址,并填充该地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.