我正在尝试访问“集合结构”(struct r_debug *) 为了找到一个过程的链接图。 但是我一直遇到无效的地址,我真的不知道 发生了什么事。
这就是我继续尝试找到它的方法:
1. Get the AT_PHDR value from the auxiliary vector
2. Go through the program headers until I find the PT_DYNAMIC segment
3. Try to access the vaddr of that segment (PT_DYNAMIC) to get the dynamic tags
4. Iterate through the dynamic tags until I find DT_DEBUG. If I get here I should be done
问题是我无法通过第3步,因为PT_DYNAMIC的vaddr 段始终指向无效地址。
我做错了什么?我是否需要查找vaddr的重定位? 我查看了LLDB的来源,但无法弄清楚它们是如何获得地址的。
更新:@EmployedRussian是正确的,我正在查看与位置无关的可执行文件。 他计算搬迁的解决方案效果很好。
答案 0 :(得分:1)
我在做什么错了?
您很有可能正在查看与位置无关的可执行文件。如果您的readelf -Wl a.out
如下所示:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R 0x8
INTERP 0x000238 0x0000000000000238 0x0000000000000238 0x00001c 0x00001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x016d28 0x016d28 R E 0x200000
LOAD 0x017250 0x0000000000217250 0x0000000000217250 0x0010d0 0x001290 RW 0x200000
DYNAMIC 0x017df8 0x0000000000217df8 0x0000000000217df8 0x0001e0 0x0001e0 RW 0x8
然后您需要通过可执行文件重定位地址来调整Phdr_pt_dynamic.p_vaddr
(关键是第一个Phdr_pt_load.p_vaddr == 0
)。
您可以在aux向量中的AT_PHDR
值和Phdr_pt_phdr.p_vaddr
之间的增量中找到此重定位地址。
(上面我用Phdr_xxx
作为Phdr[j]
和.p_type == xxx
的简写)。
您还以比您要复杂得多的方式执行此操作:动态数组的地址通常为_DYNAMIC[]
。参见this answer。