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

上一篇文章学习了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

strings.com 是强大的纯DOS环境 下的文本处理工具 STRINGS常用方法: 1、把文本文件 LIST.TXT 包含的行数赋值给变量 LN STRINGS LN=LINESIZE LIST.TXT 2、把文本文件 LIST.TXT 的大小传递给变量FS STRINGS FS=FILESIZE LIST.TXT 3、读取文本文件 LIST.TXT 的第5行内容并赋值给变31333137量 LN STRINGS LN=READ LIST.TXT,5 4、把变量 N 在原有基础上+1 和 -1 STRINGS N=ADD %N%,1 STRINGS N=SUB %N%,1 5、把字符串 ABCDEFG 中第四个字符以及后面共3个字符传递给变量 LX (DEF) STRINGS LX=MID ABCDEFG,4,3 6、查找字符串 ABCDEFG 中D所在的位置并赋值给变量DX,如果没找到DX=0 STRINGS DX=FIND ABCDEFG,D 7、找出字符串 ABCD EFG HIJ KLMN 中第二个单词并赋值给变量L2 STRINGS L2=PARSE ABCD EFG HIJ KLMN ,2 应用举例:逐一显示文件 LIST.TXT 各行内容 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT各行内容。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% ECHO %LX% IF %N%*==%L%* GOTO END GOTO LOOP :ERROR ECHO LIST.TXT IS NULL :END SET FS= SET L= SET N= SET LX= --------------------------------------------- NSET 的常用方法: 1、把某一命令的执行结果传递给变量。 A.把 DIR 命令执行结果第7行中的第2个单词传递给变量 DIRX DIR /A /S |NSET /L7 DIRX=$2 B.把当前路径传递给变量 CDX CD |NSET CDX=$0 2、获取 LIST.TXT 文件第5行第2个单词的内容并赋值给变量 L52 NSET /L5 L52=$2 <LIST.TXT 举例:显示出 LIST.TXT 文件中第二个单词是 SYSTEM 的行的内容。 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT中第二个单词是 REM SYSTEM 的行的内容,每找到一个符合条件的行,就把变量M在原有基础上+1。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 SET M=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% REM STRINGS LX2=PARSE %LX%,2 NSET /L%N% LX2=$2 diskn.txt REM 如果存在DISKN2.TXT 就删除之 if exist diskn2.txt del diskn2.txt >nul REM 获取DISKN.TXT文件行数并用N做计数器逐行判断,并把需要的信息传递给DISKN2.TXT REM 如果该行前两个字符是 NO 说明没有硬盘,就退出脚本 RE
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值