上一篇博客里我说了:“下次一定”
那我们这一篇就来说说这俩方法:
前期准备:
同样的我们需要一份测试代码:
该测试代码的名称为:text.c
int gdata1 = 10;
int gdata2 = 0;
int gdata3;
static int gdata4 = 10;
static int gdata5 = 0;
static int gdata6;
int main()
{
int ldata1 = 10;
int ldata2 = 0;
int ldata3;
static int ldata4 = 10;
static int ldata5 = 0;
static int ldata6;
return 0;
}
我们将该测试代码进行预编译、编译、汇编,生成 text.o 文件
同样地,我们不用一步一步 “gcc -E”、“gcc -S”、"gcc -c"最终生成 “.o” 文件;
我们可以直接通过 “gcc -c text.c” 直接进行最后一步汇编,就自动完成前面的工作;
如果直接对 text.o 文件进行查看(vim 指令)
就会看到一堆“乱码”,这个时候就要用到我们要介绍的这两个方法:
那么首先登场的就是 objdump 方法:
objdump
-是什么?
objdump :显示二进制文件信息
常见的一些选项:
更多详情可以参考:objdump命令
-怎么用?
我们输入指令:“objdump -h text.o”
我们会得到有关目标文件的各个 section 的头部摘要信息。我们输入指令:“objdump -s text.o”
我们会得到指定 section 的全部内容(值),
以此可以判断该 section 段中保存了哪些变量值。
看到这里,我们差不多了解了一些目标文件的知识,
我们来简单总结一些 目标文件( text.o)的格式(在Linux下也叫做:ELF文件)首先是 ELF 文件的相关介绍:
接着是中间文件( text.o )的 ELF 格式:
再下来是可执行文件( a.out )的 ELF 格式:
readelf
-是什么?
readelf :用于显示 elf 格式文件信息
关于 ELF 文件
有关 readelf 命令的常用选项
同样的,详细选项参考readelf 命令
-怎么用?
输入命令:" readelf -h text.o "
我们可以看到:该命令显示了 elf 文件开始的文件头信息;
这样的话," 0x 34" 就和 " 52 "对应了起来。
输入命令:" readelf -s text.o "
我们可以得出结论:
全局、静态变量可以生成符号,而局部变量不可以。
那今天也就先总结到这里⑧,我们下期见。
参考资料
【1】objdump 命令
【2】Cheney_CHEN_JUN.VMA与LMA区别详解.CSDN.2014.04.27
【3】ELF-百度百科
【4】readelf 命令