《程序员的自我修养》读书笔记:Windows PE/COFF

#pragma data_seg("FOO")

int global = 1;

#pragma data_seg(".data")

将“global”放到“FOO”段里面,然后再换回来,恢复到“.data”。

"cl"是VISUAL C++的编译器。

/c 表示只编译不链接,即将.c文件编译成.obj。如果不加这个参数,cl会在编译 .c后再调用link将 .obj与默认的C运行库链接产生.exe文件。

/Za参数禁用VISUAL C++的一些C和C++的专有扩展。而这些扩展没有定义ANSI C标准或ANSI C++标准。

使用/Za时,编译器自动定义了_STDC_这个宏。

Visual C++提供了一个类似objdump的用于查看目标文件和可执行文件的工具,即“dumpbin”。

“/ALL”打印输出目标文件的所有相关信息,包括文件头、每个段的属性和段的原始数据及符号表。并将其输出到文件。

“/SUMMARY”只输出所有段的段名和长度。

----------------------------------------------------------------------------------------------------------------------------------

COFF文件结构

映像头

段属性描述(以“.drectve”段为例)

-------------------------------------------------------------------------------------------------------------------------------------------------

链接指示信息

“.drectve”段是编译器传递给链接器的指令,即编译器希望链接器怎样链接这个目标文件。

“/DEFAULTLIB:LIBCMT”是“cl”希望传给“link”的参数:该目标文件须要LIBCMT(Library C Multithreaded)这个默认库。

也可以在cl参数里加入/Zl来关闭默认C库的链接指令。

--------------------------------------------------------------------------------------------------------------------------------------------------

调试信息

COFF中所有以“.debug”开始的段都包含调试信息。

“.debug$S”表示包含的是符号相关的调试信息段;

“.debug$P”表示包含预编译头文件相关的调试信息段;

“.debug$T”表示包含的是类型相关的调试信息段;

如图所示,包含了目标文件的原始路径,编译器信息等。

-------------------------------------------------------------------------------------------------------------------------------------------------

符号表

第一列 符号的编号

第二列 符号的大小,即符号所表示的对象所占用的空间

第三列 符号所在的位置,ABS(Absolute)表示符号是个绝对值,即常量,不存在于任何段中;

                                      SECT1表示符号所表示的对象定义在本COFF文件的第一个段中;

                                      UNDEF表示符号是未定义的,即这个符号被定义在其他目标文件。

第四列 符号类型,变量和其他符号位notype,函数为notype()。

第五列 符号的可见范围,Static表示符号是局部变量,只在目标文件内部可见;External表示符号是全局变量,可以被其他目标文件引用。

第六列 符号名,对不需要修饰的符号名,会直接输出原始符号名;对经过修饰的,会将修饰前和修饰后的名字都打印出来,后面括号内为未修饰的。

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Windows下的ELF——PE

前两个部分是为了兼容DOS系统的结构,但效果真的很萌啊= = 

在IMAGE_DOS_HEADER中有个“e_lfanew”成员用来表明PE文件头在PE文件中的偏移。

缺省

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值