我需要从内核访问进程的程序头表(或者部分头部),以便从linux内核模块中查找.eh_frame和.eh_frame_hdr部分的地址。在用户空间我会使用dl_iterate_phdr(),但我需要一个内核空间解决方案。如果可能的话,它不需要通过elf文件。
辅助向量具有AT_PHDR字段,但它无助于查找动态链接/加载库的PHDR。
我的另一个想法是迭代vm_areas以从任务内存中具有可执行mmap的每个文件中查找PHDR地址。此解决方案的问题是加载后可以更改或删除elf文件。
有没有办法只依赖内存而不依赖于精灵文件?
答案 0 :(得分:0)
看起来Elf标头(它具有到phdr表的文件偏移量 - 通常与内存中的偏移量相同)始终位于可执行mmaps的开头。它似乎不太可靠,因为我找不到任何有关Ehdr外观的文档,但它似乎在实践中存在。这可能是因为它必须位于Elf文件的开头,并且页面大小和对齐使可执行段从偏移量0x0开始。
我们可以验证可执行映射是从所有正在运行的进程的偏移量0x0开始,并使用此bash行加载共享对象:
sudo cat /proc/*/maps | awk '{ print $2 " " $3 " " $6;}' | egrep '^..x.' | grep -vE '.... 0{8}'
它输出所有不在偏移量0x0处开始的可执行映射,因此没有输出意味着Ehdrs位于可执行文件vm_areas的开头。