聊聊目标文件到底长什么样子
2016-03-05 18:47
260 查看
为了了解目标文件的布局方式,我写了几行简单但是有非常实用的测试代码 见图
在程序中我已经加入了注释,现在我们通过objdumg这个命令来观察一下,还是先上图
我们可以看到这条命令将目标文件文件中的存储区域都标记了出来
<1>.text段为代码段
<2>.data段为数据段,存储的是初始化的全局变量(包括静态全局变量)和已经初始化的静态局部变量
<3>.rodata段为只读存储段,存储的是只读变量和字符串常量
<4>.comment段存储的是编译器版本信息
<5>.note.GNU-stack段堆栈提示段
<6>.eh_frame 记录调试信息,详细可以查询Dwarf(http://blog.csdn.net/wuhui_gdnt/article/details/7283483/)
[b]
现在我们来证明一下:[/b]
观察代码与命令执行结果 代码中一共有两个初始化了的全局整形变量所以一共占8BYUTE,验证。继续观察,代码中一共有3个未初始化的全局变量(包括那个赋值为0的静态全局变量),但是这个是跟不同的编译器与不同的语言实现由管,详情见<程序员的修自我修养>,验证。接着是printf里面的字符串常量HelloWorld\0,一共11个BYTE,存储在.rodata段。
其实这些结果只是在正常的情况下正常的代码下才得到的结论,但是还是有许多的其他情况,有兴趣的朋友可以将.c改为.cpp文件,然后在各种MSVC编译器下查看字符串常量的摆放位置。或者我们可以利用GCC提供的扩充机制__attribute__((section("FOO")))int num来自定存储
对这方面有兴趣的朋友可以看一看<程序员的自我修养>
在程序中我已经加入了注释,现在我们通过objdumg这个命令来观察一下,还是先上图
我们可以看到这条命令将目标文件文件中的存储区域都标记了出来
<1>.text段为代码段
<2>.data段为数据段,存储的是初始化的全局变量(包括静态全局变量)和已经初始化的静态局部变量
<3>.rodata段为只读存储段,存储的是只读变量和字符串常量
<4>.comment段存储的是编译器版本信息
<5>.note.GNU-stack段堆栈提示段
<6>.eh_frame 记录调试信息,详细可以查询Dwarf(http://blog.csdn.net/wuhui_gdnt/article/details/7283483/)
[b]
现在我们来证明一下:[/b]
观察代码与命令执行结果 代码中一共有两个初始化了的全局整形变量所以一共占8BYUTE,验证。继续观察,代码中一共有3个未初始化的全局变量(包括那个赋值为0的静态全局变量),但是这个是跟不同的编译器与不同的语言实现由管,详情见<程序员的修自我修养>,验证。接着是printf里面的字符串常量HelloWorld\0,一共11个BYTE,存储在.rodata段。
其实这些结果只是在正常的情况下正常的代码下才得到的结论,但是还是有许多的其他情况,有兴趣的朋友可以将.c改为.cpp文件,然后在各种MSVC编译器下查看字符串常量的摆放位置。或者我们可以利用GCC提供的扩充机制__attribute__((section("FOO")))int num来自定存储
对这方面有兴趣的朋友可以看一看<程序员的自我修养>
相关文章推荐
- python and or and-or
- hadoop 相关操作
- 微信分享的时候为怎么不生成缩略图呢?我来总结一下
- python爬虫方法小结
- leetcode 每日一题 110. Balanced Binary Tree
- Spring配置错误java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataS
- UIDatePicker(loading...)
- 双线性插值原理与实现
- CF 615 B Longtail Hedgehog(dfs/dp)
- TOEFL(20160123)分析
- 机器学习(十三)k-svd字典学习
- 合作开发-实现后台管理框架
- Activity的启动模式
- TeamTalk——ubuntu服务端部署
- c++语言段错误
- ssh公私钥登录方式设置
- 同态滤波
- java.lang.NoSuchMethodException:com.yxq.action.AdminAction.addGoods()《转载》
- 电脑双网卡同时上内外网亲自实践教程
- PHP spl_autoload和class_exsits使用技能