1、先准备两个程序,一个汇编、一个C语言 逆风者
在汇编中没有定义变量,因为在一个模块中不会有问题;
在C中定义了两个函数,一些局部变量,一些全局变量;
这样我们要考虑的内容都完备了。
ms.asm mc2.c
.386 int sum(int i){
.model flat int k = i;
extrn c m:near int j = 0;
public _start int s = 0;
.code for(j=1;j<=k;j ) s =j;
_start: return s;
mov ax,cs }
mov ds,ax
call m int e = 1;
stop: int f = 2;
jmp stop int ar[6000000L];
end _start
extern void m(){
int d;
long c;
c=1;
2、分别编译成obj文件
ml /c /coff ms.asm //指定生成coff格式的obj文件
cl /c /Fomc.obj mc2.c //指定生成的obj文件名为mc.obj
link /subsystem:windows ms.obj mc.obj //这里使用32位的链接器,要设好lib路径
现在得到ms.obj mc.obj ms.exe 三个文件
3、分析一下源代码,显然程序入口点是_start(在使用/coff参数进行编译时必须有下划线),在汇编中
调用了C中的m函数,这是需要重定位的。在C中m调用了sum函数,这也是要重定位的。
4、现在利用VC6自带的dumpbin.exe工具,生成解析文件:
dumpbin /all ms.obj>msobj.txt
dumpbin /all mc.obj>mcobj.txt
dumpbin /all ms.exe>msexe.txt
现在得到三个解析文件,下面逐个分析
*******************************************************************************
*msobj.txt
*******************************************************************************
Microsoft (R) COFF Binary File Dumper Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file ms.obj
File Type: COFF OBJECT
FILE HEADER valueS
14C machine (i386) //机器类型为386
3 number of sections //ms.obj文件有三节
41AABB57 time date stamp Mon Nov 29 14:01:59 2004
B2 file pointer to symbol table //符号表的文件偏移是 0B2H
B number of symbols //共 0BH=11 个符号
0 size of optional header
0 characteristics
//第一节的头部
SECTION HEADER #1
.text name
0 physical address
0 virtual address
D size of raw data //原始数据长度为 0DH=13 个字节
8C file pointer to raw data //其在文件内的偏移为 8Ch
9A file pointer to relocation table //其重定位表在文件内的偏移为9Ah
0 file pointer to line numbers
1 number of relocations //需重定位的项有 1 项
0 number of line numbers
60300020 flags
Code //这是一个代码段
4 byte align
Execute Read
RAW DATA #1 //这里列出了原始数据,恰好 13=0DH 个字节
00000000: 66 8C C8 66 8E D8 E8 00 00 00 00 EB FE f..f.........
|-->这是偏移7的位置,查下面的重定位表知道它需要重定位。
当前值是 00 00 00 00 ,E8代表call
RELOCATIONS #1 //这是重定位表
Symbol Symbol
Offset Type Applied To Index Name
-------- ---------------- ----------------- -------- ------
00000007 REL32 00000000 7 _m //清楚的指出_m需要重定位
本文章更多内容:1 - 2 - 3 - 下一页>> |