以下暂时做为自己的笔记,不做详细介绍。
首先打印出来Section Header:
可以看到上面.got和.plt节的类型是PROGBITS,也就是代码;而.rel.dyn和.rel.plt是REL,它们是Elf32_Rel类型的结构体数据。这就是为什么用ida查看ELF文件的时候只能看见.got和.plt节的内容,而用readelf查看的时候只列出来.rel.dyn和.rel.plt节的内容了。
.rel.dyn节的每个表项对应了除了外部过程调用的符号以外的所有重定位对象,而.rel.plt节的每个表项对应了所有外部过程调用符号的重定位信息。例如你的程序中需要调用一个libc中的函数,假如是strlen,直接调用的话,这个strlen符号就会在.rel.plt节中,如果在你的程序中定义一个函数指针(假如是my_strlen)指向strlen函数,那么my_strlen符号就会在.rel.dyn节中。.rel.dyn和.rel.plt节中每个重定位项记录了符号的符号表索引,重定位的操作地址,重定位类型的信息,.rel.plt中的类型应该都是R_ARM_JUMP_SLOT。
更多信息,以及具体调用一个外部全局函数的时候跳转流程,请看“Android和Linux动态加载机制及PLT/GOT作用介绍”。
参考链接:
1. http://blog.csdn.net/wangbaochu/article/details/41653571
2. http://www.360doc.com/content/10/1103/11/158286_66208047.shtml