c - 应用程序运行时动态链接器如何解析引用?
问题描述
假设我有一个源文件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.so
some_function()
我的问题是:
Q1-在我看来,RAM(可执行文件复制到内存中)中的.text
部分(some_function()
属于哪里)需要由动态链接器修改,以便some_function()
可以解析引用,我的理解是否正确?
Q2-如果动态链接器需要修改.text
RAM中的部分,它是怎么做的?据我了解,.text
部分是RAM中的只读段,如果只读段被称为只读段,如何修改它?
解决方案
Q1-在我看来,RAM(可执行文件被复制到内存中)中的 .text 部分(some_function() 所属的部分)需要由动态链接器修改,以便可以解析 some_function() 的引用,是我的理解正确吗?
它不必是那样的。有PLT(过程联动表)。它本质上是这样的:
foo@PLT:
jmp <someTemporaryAddress>
main:
call foo@PLT
然后,在运行时,动态链接器只修补此部分,因为它比在大量机器代码中查找调用更简单。
Q2-如果动态链接器需要修改 RAM 中的 .text 部分,它是怎么做的?据我了解, .text 部分是RAM中的只读段,如果只读段被称为只读段,如何修改它?
它在使其可执行/只读之前完成。
推荐阅读
- r - 如何从 MuMIn model.avg() 摘要中绘图
- c# - 存储子项相对于其父项的旋转在 Unity3d 中无法正常工作
- javascript - curl只加载第一页为什么wordpress很麻烦
- verilog - Verilog - 从多个“传感器”接收输入,增加“计数”
- typescript - Karma-typescript 找不到模块“可读流/duplex.js”
- spring - 不能在spring boot中使用多个索引
- json - 元素隐式具有“任何”类型,因为在使用源自提取的 JSON 的对象时,类型“{}”没有索引签名错误
- asp.net - “Microsoft.ACE.OLEDB.16.0 提供程序未在本地计算机上注册”但我已经安装了它
- javascript - 组件获取道具VueJS时的forceUpdate
- python - 获取html标签的文本内容,例如python的js textcontent属性