繁体   English   中英

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

[英]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.

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