面试官问我:bss段的大小记录在哪里?

善良超锅锅 2013-10-13 09:20:20
昨天面试,面试官问了我一下C语言的各种变量保存在哪
我跟他扯到bss段,我多事的说了一句bss段在可执行文件中不占用位置。程序运行前才开辟并清零。
比如int a[100],在可执行文件中没有记录100个0,而只是记录了a符号和a所用内存的大小。

没想到面试官居然问我那这个bss段的大小记录在哪里?

所以我现在的疑问是:1.bss段中的变量,是为每一个变量记录大小,还是只记录整个bss段的大小?
2.大小记录在哪?

这些我蒙了。完全没想过啊。

刚才用objdump分析了一下,还是无解。求解答
...全文
171473 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
Linux不是开源的吗?研究其加载elf文件相关的代码。
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
引用 15 楼 shimachao 的回复:
[quote=引用 14 楼 zhao4zhong1 的回复:] 《Windows PE权威指南》
Linux下的呢? 我只是去面试C++开发,没想到这也要了解[/quote] wangdahu888应该知道,问他。
善良超锅锅 2013-10-14
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
《Windows PE权威指南》
Linux下的呢? 我只是去面试C++开发,没想到这也要了解
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
《Windows PE权威指南》
  • 打赏
  • 举报
回复
引用 8 楼 shimachao 的回复:
[quote=引用 7 楼 wangdahu888 的回复:] [quote=引用 6 楼 shimachao 的回复:] [quote=引用 5 楼 wangdahu888 的回复:] 整个bss的大小记录在段表里呀
怎样用工具观察具体位置呢?当初我想这么回答,又不肯定,所以说不知道了。[/quote] readelf -S [/quote] readelf也肯定是在文件中读到的,现在是问它在那个地方读到,偏移bss头多少个字节,占用几个字节?[/quote] https://img-bbs.csdn.net/upload/201310/13/1381627858_173561.gif 上图中第二列就是偏移bss头多少个字节的数值呀
  • 打赏
  • 举报
回复
如果你说的编译成可执行文件以后, static int g; static short int h; int main(){} 装载时,bss段会和数据段合并。 至于你说的,如何找到bss段中的变量,当编译成可执行文件时,全局变量,静态变量,都会被相应的地址所替代。装载器,只要在相应的地址,分配合适的空间就行了 比如 static int a[100] 装载时,只要在a所对应的地址,就400个字节的空闲就行了。这得需要链接成可执行文件时其它的一些辅助信息,release文件一般把符号给去掉了。
善良超锅锅 2013-10-14
  • 打赏
  • 举报
回复
引用 24 楼 yangwenjun2017 的回复:
记录你妹呀,那不是0么,要不然还要bss段干嘛,不就是节省硬盘空间么
这么气愤?节约空间也要记录空间的大小啊。
wendale309 2013-10-14
  • 打赏
  • 举报
回复
记录你妹呀,那不是0么,要不然还要bss段干嘛,不就是节省硬盘空间么
Roman_A 2013-10-14
  • 打赏
  • 举报
回复
很多知识平时用不到,用到的时候都是关键点,会影响深远的地方。
cwt8805 2013-10-14
  • 打赏
  • 举报
回复
推荐看《程序员的自我修养》
96掌门师兄 2013-10-14
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
[quote=引用 19 楼 xiaoxiaoyu85 的回复:] [quote=引用 17 楼 zhao4zhong1 的回复:] Linux不是开源的吗?研究其加载elf文件相关的代码。
赵老师,小弟想问一下,掌握这些对开发有帮助吗? 不知道为什么要问这个。。。[/quote] 比如反向工程时可能有用。[/quote] 哦,理解了,多谢赵老师。
赵4老师 2013-10-14
  • 打赏
  • 举报
回复
引用 19 楼 xiaoxiaoyu85 的回复:
[quote=引用 17 楼 zhao4zhong1 的回复:] Linux不是开源的吗?研究其加载elf文件相关的代码。
赵老师,小弟想问一下,掌握这些对开发有帮助吗? 不知道为什么要问这个。。。[/quote] 比如反向工程时可能有用。
96掌门师兄 2013-10-14
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
Linux不是开源的吗?研究其加载elf文件相关的代码。
赵老师,小弟想问一下,掌握这些对开发有帮助吗? 不知道为什么要问这个。。。
  • 打赏
  • 举报
回复
引用 15 楼 shimachao 的回复:
[quote=引用 14 楼 zhao4zhong1 的回复:] 《Windows PE权威指南》
Linux下的呢? 我只是去面试C++开发,没想到这也要了解[/quote] 一样有类似的格式。运行时根据格式信息得到入口点,分配好内存等等
  • 打赏
  • 举报
回复
这个release,debug版本有何关系,我们分析的是obj文件
  • 打赏
  • 举报
回复
用readelf -s 或 objdump -t 查看符号表 用readelf -S 或 objdump -h 查看段表 不过感觉readelf的格式要好看一些
碼上道 2013-10-13
  • 打赏
  • 举报
回复
引用 1 楼 wangdahu888 的回复:
bss段的大小,记录在段表里里,记录的是所有未初始化变量总共的大小,bss段只在段表里有个记录,但实现并不存在这个段. 每个未初始化的变量的大小放在了符号表里了呀 static int g; static short int h; int main(){} 你看下面符号表中的4 ,2分别就是g,h的大小
如果是release版本,如何确定的。
  • 打赏
  • 举报
回复
bss段的大小,记录在段表里里,记录的是所有未初始化变量总共的大小,bss段只在段表里有个记录,但实现并不存在这个段.

每个未初始化的变量的大小放在了符号表里了呀
static int g;
static short int h;
int main(){}
你看下面符号表中的4 ,2分别就是g,h的大小
  • 打赏
  • 举报
回复
引用 8 楼 shimachao 的回复:
[quote=引用 7 楼 wangdahu888 的回复:] [quote=引用 6 楼 shimachao 的回复:] [quote=引用 5 楼 wangdahu888 的回复:] 整个bss的大小记录在段表里呀
怎样用工具观察具体位置呢?当初我想这么回答,又不肯定,所以说不知道了。[/quote] readelf -S [/quote] readelf也肯定是在文件中读到的,现在是问它在那个地方读到,偏移bss头多少个字节,占用几个字节?[/quote] bss段只在段表里有个记录,实际上不包含这个段的,不像.data段,占用多少字节,在段表里有记录呀
善良超锅锅 2013-10-13
  • 打赏
  • 举报
回复
引用 7 楼 wangdahu888 的回复:
[quote=引用 6 楼 shimachao 的回复:] [quote=引用 5 楼 wangdahu888 的回复:] 整个bss的大小记录在段表里呀
怎样用工具观察具体位置呢?当初我想这么回答,又不肯定,所以说不知道了。[/quote] readelf -S [/quote] readelf也肯定是在文件中读到的,现在是问它在那个地方读到,偏移bss头多少个字节,占用几个字节?
加载更多回复(5)

69,429

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧