linux 从ELF可执行文件中查找函数

6jjcrrmo  于 2022-12-22  发布在  Linux
关注(0)|答案(1)|浏览(234)

在一个比较模糊的用例中,我不想将整个ELF可执行文件加载到内存中,而只想加载包含特定函数的部分ELF文件。我不知道如何在ELF文件中定位这个特定函数的代码。如果我有这段信息,我会用它来加载磁盘扇区(s)将ELF文件的这一部分包含到内存中,并跳转到它。但是,由于对ELF文件格式和ld的工作原理不太熟悉,我不知道如何获得这条信息,我所知道的全部信息都是函数名(只有C函数,没有重载),或者,这根本不可能从ELF文件的头中找到函数的位置吗?
如果你能给予我找到ELF可执行文件中的某个函数,我将不胜感激。如果我能知道它的起始位置和结束位置,那就太好了。但只有起始位置也可以。参考一些朝着这个目标前进的阅读材料(如果技术上可行的话)自学也可以。我正在使用的平台是Linux 20.04,带有GNU开发工具链(ld的版本为2.34)在x86 CPU上(ELF格式为elf32−i386)。

1cklez4t

1cklez4t1#

我知道现在说有点晚了,但是为了子孙后代:
请注意,在下面的文本中,大多数数字都是十六进制的,因为binutils就是这样输出它们的。
代码(通常是?)驻留在.text部分,因此找出它在ELF文件中的位置:readelf -S <ELF file>
这将输出节标题,相关输出应如下所示:

[Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
...
[13] .text             PROGBITS         0000000000411000  00011000
       0000000000465bac  0000000000000000  AX       0     0     4096

请注意,在上述输出中,地址为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要复杂一些。

相关问题