转自:
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文件视图如下图,所示,可以从链接视图和执行视图两个方面来进行分析与查看
2、如何定位一个函数在elf文件中的偏移
例如现在有elf文件libcac.so,在libcac.so中,定义了add、div、mul、sub四个函数。
1)我们使用readelf来查看相关信息,readelf -s libcac.so 确定函数对应的symbol在挂载的地址,以及二进制代码的大小。
使用readelf -s libcac.so进行符号查看
可以看到我们定义的这些add、div等对应的虚拟地址为0x5cc、0x5f8等,大小为20、23等。
使用
objdump -S libcac.so
获得信息可以验证这个信息的正确性,如下图所示
可以发现是一致的
2)根据函数对应的虚拟地址,找到对应的Section(使用readelf -S [elffilename]),然后确定函数起始地址数据在elf文件中偏移。
在这里使用命令
readelf -S libcac.so
我们发现0x5cc这个地址落在了.text Section中,这个Section 在文件中的偏移位置是0x500。那么0x5cc这个地址在文件中偏移位置就是0x504了。使用hexdump这个工具可验证这个结论的正确性(文件中add函数的源码内容跟objdump输出的一模一样)。
hexdump libcac.so
现在我们只是找到了这样的一个偏移,那么具体的函数地址是什么呢,其实就是这个libcac.so被映射到的进程虚拟地址空间的首地址加上这个偏移0x5cc。