我需要从内核访问进程的程序头表(或者部分头),以便从linux内核模块中找到.eh_frame和.eh_frame_hdr部分的地址。在用户空间中,我会使用dl_iterate_phdr(),但我需要一个内核空间解决方案。如果可能的话,它不需要通过elf文件。
辅助向量具有ATH-PHDR字段,但它没有帮助找到动态链接/加载库的PHDR。
我的另一个想法是迭代vm_区域,从任务内存中具有可执行mmap的每个文件中找到PHDR地址。此解决方案的问题是,加载后可以更改或删除elf文件。
有没有一种只依赖内存而不依赖elf文件的方法?
最佳答案
看起来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_区域的开始处。