您的位置:首页 > 其它

聊聊目标文件到底长什么样子

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来自定存储

对这方面有兴趣的朋友可以看一看<程序员的自我修养>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: