linux - 复制初始全局偏移表
问题描述
我正在尝试开发一个功能,该功能基本上会在执行期间的任何时候重置全局偏移表。第一步是通过获取地址找到我成功到达的条目的路径,DT_JMPREL
然后添加基地址。然后遍历具有_JMPSLOT_
类型的条目数。
我测试了代码并将其函数地址与 gdb 输出进行了比较,它工作正常。现在问题来了,我应该检查文件中的哪个部分以glibc/elf/
浏览所有共享库的列表,但 GOT 条目仍然指向 PLT 指令(在惰性绑定之前/与 elf 中的方式相同)?我想dl-load.c
可能是那个,但我不太确定我应该在哪里这样做
解决方案
初始重定位发生在elf/dl-reloc.c
, 附近:
#include "dynamic-link.h"
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
这是glibc仍然使用嵌套函数的地方,整个事情有点……尴尬。此代码也用于 的自重定位ld.so
,因此它不能在某些目标上使用函数调用和全局数据访问。
推荐阅读
- python - 如何仅在错误时获取所有 Python 日志?
- windows - Windows 上的 CMake 共享库:创建 dll 时出错
- docker - docker push 到我的公司 docker 存储库
- asp.net-core - 是否可以添加角度或对现有的 asp.net core 2.1 应用程序作为解决方案中的隔离项目做出反应?
- php - 如何将销售价格四舍五入到小数点后一位?
- java - 获取与 aa Treepath 关联的 DefaultMutableTreeNode(确切的不是临时的)
- javascript - 如何通过循环函数将 N 个数组的所有数组变量推送到一个数组中?
- java - 具有可变参数参数的多个构造函数
- c# - 如何在 Azure Cosmos DB(BotFramework)中存储 UserState 和 ConversationState?
- rust - 是否可以将 char 值分配给枚举变体?