上一篇文章学习了ar工具与nm工具,点击链接查看上一篇文章:点击链接
本片文章学习记录以下三个工具:
- objdump
- size
- strings
1、objdump工具
用法:
-
反汇编目标文件,查看汇编到源码的映射(后面代码案例分析看具体区别)
- objdump -d func.o
- objdump -S func.o
-
查看目标文件中的详细段信息
- objdump -h test.o
其中objdump -h的输出需要说明一下(后面有例子说明):
1.1、代码案例
还是以上一篇文章的代码来说明(运行时出错,但是不影响我们本次的实验)
test.c
#include <stdio.h>
int g_global = 0;
int g_test = 1;
extern int* g_pointer;
extern void func();
int main(int argc, char *argv[])
{
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&g_pointer = %p\n", &g_pointer);
printf("g_pointer = %p\n", g_pointer);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
func();
return 0;
}
func.c
#include <stdio.h>
int* g_pointer;
void func()
{
*g_pointer = (int)"D.T.Software";
return;
}
对上述代码进行编译:
- gcc -g -c func.c -o func.o
- gcc -g -c test.c -o test.o
- gcc func.c test.c -o lyy
- 然后使用objdump -d命令进行反汇编:
- objdump -d func.o
结果如下:
很明显,我们得到了func.o的反汇编文件。但是上来看这个反汇编文件,也很是不方便,如果能够将源代码与汇编代码对应的看就好了。objdump -S正具有这个功能
- 使用objdump -S进行反汇编
- objdump -S func.o
结果如下:
结果显而易见,我们可以看到源代码与汇编语言的的对照。
- 使用objdump -h查看目标文件中的详细段信息
- objdump -h test.o
结果如下:
上述对应的每一列的内容,在上面的表格中已经有所说明。需要注意的地方是VMA与LMA这两列内容一般情况下是相等的。并且在上面的例子中我们看到它们对应的列都是0,其实是因为test.o目标文件是没有链接的文件,它的加载地址都还是不确定的,所以在这里就直接是0.
VMM是虚拟内存地址,实际上就是进程的地址空间中的地址,此时,程序的一个副本进程,已经运行起来了,它的加载地址(LMA)就是加载到虚拟地址空间中的地址。所以LMA与VMA相等。
比如我们对可执行文件lyy进行查询:
- objdump -h lyy
显示如下(不全):
很明显,此时的lyy是可执行文件,是已经链接好的文件,所以它的VMA与LMA都有具体的值。并且相等。
2、size工具
- size工具可以获取目标文件中所有段的大小
如:
- size test.o
3、strings工具
- 获取目标文件中的所有字符串常量
如:
- strings test.o
很明显,双引号下的字符串,都是字符串常量。
4、总结
- 学会使用objdump工具(-d -S -h这三个选项的含义)
- 学会使用size工具查看目标文件各个段的大小
- 学会使用strings工具查看目标文件的所有字符串常量
本文参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群,
群聊号码:199546072
学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994
微信:liu1126137994