在Linux ELF格式的文件中定位到对应的函数位置

转自:

https://blog.csdn.net/simaowebex/article/details/53691743

1、Linux ELF文件格式解析

readelf -h elfname (headers) 
readelf -l elfname (segments program headers) 
readelf -S elfname (sections) 
readelf -s elfname (symbols) 

可以通过readelf工具来查看解析ELF文件中的相关信息。elf文件视图如下图,所示,可以从链接视图和执行视图两个方面来进行分析与查看

在Linux ELF格式的文件中定位到对应的函数位置_第1张图片

2、如何定位一个函数在elf文件中的偏移

例如现在有elf文件libcac.so,在libcac.so中,定义了add、div、mul、sub四个函数。

1)我们使用readelf来查看相关信息,readelf -s libcac.so 确定函数对应的symbol在挂载的地址,以及二进制代码的大小。 

使用readelf -s libcac.so进行符号查看

在Linux ELF格式的文件中定位到对应的函数位置_第2张图片

可以看到我们定义的这些add、div等对应的虚拟地址为0x5cc、0x5f8等,大小为20、23等。

使用

objdump -S libcac.so

获得信息可以验证这个信息的正确性,如下图所示

在Linux ELF格式的文件中定位到对应的函数位置_第3张图片

可以发现是一致的

2)根据函数对应的虚拟地址,找到对应的Section(使用readelf -S [elffilename]),然后确定函数起始地址数据在elf文件中偏移。

在这里使用命令

readelf -S libcac.so

在Linux ELF格式的文件中定位到对应的函数位置_第4张图片

我们发现0x5cc这个地址落在了.text Section中,这个Section 在文件中的偏移位置是0x500。那么0x5cc这个地址在文件中偏移位置就是0x504了。使用hexdump这个工具可验证这个结论的正确性(文件中add函数的源码内容跟objdump输出的一模一样)。

hexdump libcac.so

 在Linux ELF格式的文件中定位到对应的函数位置_第5张图片

现在我们只是找到了这样的一个偏移,那么具体的函数地址是什么呢,其实就是这个libcac.so被映射到的进程虚拟地址空间的首地址加上这个偏移0x5cc。

你可能感兴趣的:(Linux动态库)