在一个比较模糊的用例中,我不想将整个ELF可执行文件加载到内存中,而只想加载包含特定函数的部分ELF文件。我不知道如何在ELF文件中定位这个特定函数的代码。如果我有这段信息,我会用它来加载磁盘扇区(s)将ELF文件的这一部分包含到内存中,并跳转到它。但是,由于对ELF文件格式和ld
的工作原理不太熟悉,我不知道如何获得这条信息,我所知道的全部信息都是函数名(只有C函数,没有重载),或者,这根本不可能从ELF文件的头中找到函数的位置吗?
如果你能给予我找到ELF可执行文件中的某个函数,我将不胜感激。如果我能知道它的起始位置和结束位置,那就太好了。但只有起始位置也可以。参考一些朝着这个目标前进的阅读材料(如果技术上可行的话)自学也可以。我正在使用的平台是Linux 20.04
,带有GNU开发工具链(ld的版本为2.34)在x86 CPU上(ELF格式为elf32−i386
)。
1条答案
按热度按时间1cklez4t1#
我知道现在说有点晚了,但是为了子孙后代:
请注意,在下面的文本中,大多数数字都是十六进制的,因为binutils就是这样输出它们的。
代码(通常是?)驻留在
.text
部分,因此找出它在ELF文件中的位置:readelf -S <ELF file>
这将输出节标题,相关输出应如下所示:
请注意,在上述输出中,地址为
411000
,偏移量为11000
,因此地址为offset+400000
。找出符号的地址:
nm -gC <ELF file> | grep <func name>
对于函数
main
,我得到了(除其他外):0000000000411455 T main
,这意味着函数main
位于地址411455
处。因为
readelf
告诉我们offset=address-400000
,所以main
的代码应该从文件开头的11455
字节开始。另请注意OP:AFAIK在现代计算机上,大多数内存都被标记为不可执行,所以如果你只是将代码加载到内存中并跳转到它,它很可能会崩溃。当然有一些方法可以分配可执行内存,但它们可能比调用
malloc
要复杂一些。