上一篇文章学习了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
  1. 然后使用objdump -d命令进行反汇编:
  • objdump -d func.o

结果如下:

很明显,我们得到了func.o的反汇编文件。但是上来看这个反汇编文件,也很是不方便,如果能够将源代码与汇编代码对应的看就好了。objdump -S正具有这个功能

  1. 使用objdump -S进行反汇编
  • objdump -S func.o

结果如下:

结果显而易见,我们可以看到源代码与汇编语言的的对照。

  1. 使用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

【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具相关推荐

  1. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用

    上一篇文章学习了C/C++中的指针与数组的区别,点击链接进行查看:[软件开发底层知识修炼]二十七 C/C++中的指针与数组是不同的 本篇文章将学习volatile关键字在C/C++中的作用 文章目录 ...

  2. 【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧

    上一篇文章学习了如何使用GDB进行函数调用栈的查看:[软件开发底层知识修炼]十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看 本篇文章是GDB调试快速学习系列的最后一篇.将综合前几篇文章做一 ...

  3. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

  4. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  5. 【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用

    前面几篇文章学习了链接器相关的内容.现在开始来学习GDB调试.我们的目的是通过这几篇文章将GDB调试完全学会. 文章目录 1 为什么需要GDB 2 GDB 的常规应用 3 GDB调试程序实例 4 总结 ...

  6. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

  7. 【软件开发底层知识修炼】十三 链接器-如何写出不依赖C库函数的代码

    本文将综合以下4篇文章,学习如何写出不依赖libc库的程序: [软件开发底层知识修炼]九 链接器-可重定位文件与可执行文件 [软件开发底层知识修炼]十 链接器-main函数不是第一个被执行的函数 [软 ...

  8. 【软件开发底层知识修炼】二十七 C/C++中的指针与数组是不同的

    上几篇文章学习了ABI-应用程序二进制接口:[软件开发底层知识修炼]二十六 ABI-应用程序二进制接口 学习总结文章目录 本篇文章就指针与数组的联系与区别来学习学习 文章目录 1 疑问 2 指针与数组 ...

  9. 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

    前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...

  10. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

    上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...

最新文章

  1. Linux ssh命令无法使用
  2. 微信 商城 php,PHP微信商城
  3. 数组对象根据某个属性取出重复的个数
  4. 公众号开发 单独 给某个用户 推送消息_韩国5G用户6月底已达134万 较5月底增加近70%...
  5. 修改数据库的兼容级别
  6. 怎么解决python遇到问题_新手常见Python错误及异常解决处理方案
  7. Oracle HTTP 乱码
  8. 中国双导体发热电缆行业市场供需与战略研究报告
  9. 浙大PAT甲级1061-1080题目详细代码解答|标准答案|C++语言|浙软机试
  10. 物联网服务器搭建资料汇总
  11. python汉语词频统计软件_python实现简单中文词频统计示例
  12. html div与span同行,div和span在一行 div和Span及a标签的区别
  13. 李沐动手学深度学习V2-BERT预训练和代码实现
  14. JEESZ 模块开发文档
  15. 电磁阀的分类及应用范围
  16. 876. 链表的中间结点--javaScript实现
  17. 姚能伟:以邻盛智能为例,如何在行业大脑进行创新实践
  18. 使用opencv库出现的问题
  19. viterbi译码算法简介
  20. Full Chip Erase Done.Programming Failed!RDDI-DAP ErrorError: Flash Download failed - “Cortex-M4

热门文章

  1. QT Openssl no OPENSSL_Applink 解决
  2. python 进程池不足_python 进程池pool简单使用
  3. 对比linux终端模式和图形模式,Linux知识-2. Linux初学(CnetOS Linux7)之切换命令模式和图形模式...
  4. 鸿蒙内核是闭源吗_鸿蒙出世,中华有为!
  5. CentOS挂Windows的NFS备忘
  6. 白话经典算法系列之一 冒泡排序的三种实现
  7. ADFS 登录页面自定义
  8. EXC_BAD_ACCESS
  9. Java多线程异常处理
  10. scp和ssh如何连接指定端口的远程主机