可执行文件复制到内存后,动态链接器是否修改引用?

does the dynamic linker modify the reference after executable is copied to memory?

假设我们有以下代码:

main.c

extern void some_function();

int main()
{
   some_function();
   return 0;
}

mylib.c

void some_function()
{
   ...
}

并且我已经创建了一个共享库 mylib.so 并且 link 我要执行 table 目标文件 prog

linux> gcc -shared -fpic -o mylib.so mylib.c
linux> gcc -o prog main.c ./mylib.so

假设下图是prog

的executable对象格式

通过动态linking,我们知道mylib.so中的代码或数据部分的none此时实际上被复制到executable prog2l中。相反,linker 复制了一些重定位和符号 table 信息,这些信息将允许在加载时解析对 mylib.so 中代码和数据的引用。

我只是想仔细检查一下我的理解是否正确:

prog被加载器加载到内存中时如下图所示

那么动态linker会修改内存中prog.data段,这样就可以linked/relocated到[=19=的指令地址了] 在 mylib.so.text 部分。

我的理解正确吗?

相当接近。动态链接器将修改数据段中的某些内容,而不是特定的 .data 部分 - 段是 coarser-grained 对应于文件如何映射到内存而不是原始语义分解的东西。实际部分通常称为 .got.got.plt 但可能因平台而异。修改不是“将其重定位到指令地址”,而是解析对函数名的重定位引用以获取其加载的地址,并将该地址填入。