OBJ文件解析之OBJ的整体结构

在windows下c语言编程的过程中,你有没有好奇过obj文件的格式呢?以及后续的 静态库,动态链接库.lib文件的格式,在这里我将带领大家 做一下 力所能及的简单分析,

在此过程中做好以下准备工作:


1.用VS创建一个工程:

该工程除了自带的一个stdafx.cpp文件之外,就是我自己创建的一个简单cpp文件了,环境截图如下



2.编译生成一个obj文件,我的cpp文件叫obj1.cpp,那么生成的obj文件就是obj1.obj了



3.来到VS默认安装时时生成的路径C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin   ,搜索dumpbin.exe这是我第一次分析obj文件时用的工具,

我是通过 《程序员的自我修养》这本书,从而有了分析 obj文件的念头的,而且这本书做了很多有用的工作,虽然是那么的晦涩,但是我相信,大家在不断的阅读时

总会有自己的收获的,但是要记得取舍啊。。。




接下来,设置系统环境变量,path路径下添加  ;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin  (注意这是我这里的路径,你那儿情况可能不一样)



之后来到相应的obj文件目录,不选中任何项目,空白处按下shift键 同时点下鼠标右键,选择在 “此处打开命令行窗口” ,在cmd窗口中输入dumpbin


出现以上,说明path变量配置成功了,接下来输入,dumpbin  /all obj1.obj > obj1.txt,在目录下生成一个txt文件,


打开观察



以上即是该工具对obj文件的解析,那么obj文件是什么呢?我们百度搜索一下,可以得到coff文件格式的头绪

以下链接是百度百科对coff文件格式的说明

http://baike.baidu.com/link?url=gnEyune8QQwzoa_XN13cvXM_ERTwM1F_SimFEp8yIelJGnP5tkkWLXSayoT0fWSrjzi2zAzrxUZL-Mb2NqsPfK


4准备相应的文件,工具


下图截自上述链接中,



4.1 Winnt.h头文件

上述只是形象的描述了一下,我们需要精确的数据结构,我这里用的是VS2013, 我可以在IDE中直接打开winnt.h头文件,也就是说我们需要一个winnt.h文件

来查询相关的结构体


4.2 16进制工具,010editor,hex editor,hex workshop均可以,将obj文件加载拖进去, 我们对照着

Winnt.h文件中相关的结构体,16进制工具,刚才dumpbin 生成的 obj1.txt文件,我们三者结合起来分析


5.分析

对照着obj1.txt文件逐段分析

FILE HEADER:



上附链接并没有说明FILE HEADER 结构体的 名称,只是给出了相应字段说明,其实我在这里提前透题吧,它对应的是Winnt.h头文件中的IMAGE_FILE_HEADER结构体


详细的你可以参考百度百科的说明,另外,获取你可以去获取一下 微软官网 的 coff文档说明,这里SizeOfOptionalHeader在obj文件,以及.lib文件都是0,在PE文件格式中非0

这点在你研究PE文件格式之前只需要记住就可以


接着我打开 Hex Editor 了



在这里你要注意的是X86平台的  小端字节序

当一个字段大于1BYTE 时,如Machine 字段,Hex Editor显示的是 4C 01,(地址从低到高)

而人类书写的格式 则是 0X014C ,这就是小端字节序的问题,上图贴图,读者可以自己数着指头戳着看了~,


OPTIONAL HEADER 

由于之前提及到的在obj文件中optional header 大小为0,所以此段没有了


SECTION HEADER 

这个结构体的名字 叫 Winnt.h/IMAGE_SECTIN_HEADER



#节1






一个程序的简单说明的周期 : 编写 》 编译 》链接 》 运行,上述红线框中的 字段跟 行号,链接时重定位表(注意运行时重定位和 链接时的重定位 是两回事)

链接时的重定位,是将各个obj文件对其他obj文件函数引用的处理, 运行时重定位是 由于 加载模块基址 和模块默认基址  不一样时的处理,链接重定位你可以参考《程序员的自我修养》,运行时的重定位的事情等到你分析 PE文件格式的时候再去想吧


(该段后面有个Linker Directive 提示说明是编译器通过这个obj文件传给链接器 的指示)


#节2






#节3


这里由于程序是Debug编译的,则该节显示了相关PDB文件(用于调试,显示符号名称的文件,也可手工分析) 目前前三个节都没有 行号项 和 重定位 项


#4



至于第一个是什么,我可以告诉你是

这个字符串的等价物,为什么等等看后面的符号表, 

该节有4个重定位项。这4个重定位有不同的类型Type,在obj文件中相应处用00填充,等到链接完成后该处数字会发生改变

链接时重定位结构体




#5













最后了,符号表



符号表的数据结构


上上截图中显示符号,可序号为什么是断断续续的呢?一般来说应该是连续的啊?

我可以这样回答你的问题,看见上述结构体的最后一个字段吗? 辅助符号项的个数, 


主符号项加上 辅助符号项 刚好每一行表示其中一类型的一项,只不过 主项显示序号


符号项字段的解析你可以在网上去搜搜,我在这里就不写了,晚上没精力了~


接下来就是字符串表了





最后:

文件布局:


  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值