首页 > 解决方案 > 应用程序运行时动态链接器如何解析引用?

问题描述

假设我有一个源文件dll.c,它使用dlopen和函数来加载在运行时dlsym调用的共享库。F.so

dll.c有 的引用some_function(),并且F.so有 的定义some_function()

假设下图是通过以下方式prog获得的可执行对象

linux> gcc -rdynamic -o prog dll.c -ldl

在此处输入图像描述

所以.text部分包含当porgram加载并开始调用some_function()时需要解决的参考F.sosome_function()

我的问题是:

Q1-在我看来,RAM(可执行文件复制到内存中)中的.text部分(some_function()属于哪里)需要由动态链接器修改,以便some_function()可以解析引用,我的理解是否正确?

Q2-如果动态链接器需要修改.textRAM中的部分,它是怎么做的?据我了解,.text部分是RAM中的只读段,如果只读段被称为只读段,如何修改它?

标签: clinuxgcc

解决方案


Q1-在我看来,RAM(可执行文件被复制到内存中)中的 .text 部分(some_function() 所属的部分)需要由动态链接器修改,以便可以解析 some_function() 的引用,是我的理解正确吗?

它不必是那样的。有PLT(过程联动表)。它本质上是这样的:

foo@PLT:
        jmp <someTemporaryAddress>
main:
        call foo@PLT

然后,在运行时,动态链接器只修补此部分,因为它比在大量机器代码中查找调用更简单。

Q2-如果动态链接器需要修改 RAM 中的 .text 部分,它是怎么做的?据我了解, .text 部分是RAM中的只读段,如果只读段被称为只读段,如何修改它?

它在使其可执行/只读之前完成。


推荐阅读