求助大牛!linux各模块大小加起来不等于vmlinux问题。。

buringBlade 2012-12-20 11:53:40
大家好,小弟刚进入内核领域,发现一些奇怪的问题:
1、用size 查看内核各个模块,得到的text段和data段加起来并不等于ls -l看到的文件大小,比如block下的built-in.o,用size看到的text是78418,data是1332,那程序的总大小应该是79.75k,但ls -l看到的大小却是221.773k,求解何故。。是因为加了很多其他信息?这些信息可以去除吗,最后执行有影响吗
2、请问各个模块下的built-in.o是如何连接成最后能用的vmlinux的?似乎还看到的了piggy.o,这个文件很大。。
3、我想统计内核中各个模块在最后内核镜像(vmlinux?是这个吧)所占的比例,请问由什么好办法吗


新手分不多,在线等,谢谢大牛帮忙!
...全文
261 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 2 楼 nevil 的回复:
1.比较大是因为带了调试的符号信息.一般的obj文件都可以用strip去掉调试符号,内核obj没试过.. 2.把make的输出信息重定向到文件,你就能看到最后是如何link成vmlinux了 3.比例是什么意思?什么的比例?
谢谢版主指点! 我是想统计各个模块的大小在最终内核镜像中所占大小的比例,比如说fs这个模块在最终可用的内核镜像文件中所占大小的比例。我的思路是去除/fs/built-in.o中的调试符号,然后和arch/arm/boot/Image大小作比较,不知这个思路是否正确,还是要把built-in.o压缩之后和piggy.gz作比较? 谢谢版主指点!万分感激
nevil 2012-12-20
  • 打赏
  • 举报
回复
1.比较大是因为带了调试的符号信息.一般的obj文件都可以用strip去掉调试符号,内核obj没试过.. 2.把make的输出信息重定向到文件,你就能看到最后是如何link成vmlinux了 3.比例是什么意思?什么的比例?
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
新手,所以结贴率为0,大家勿怪啊。。。
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 13 楼 buringBlade 的回复:
而且我感觉这很诡异啊,生成vmlinux之后反而比各个built-in.o加起来的小了。 谢谢指点
我糊涂看反了。。是vmlinux比built-in.o的总和大。。。 但是几乎大1M,这正常吗,谢谢!
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
而且我感觉这很诡异啊,生成vmlinux之后反而比各个built-in.o加起来的小了。 谢谢指点
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 11 楼 nevil 的回复:
BSS段算了么? 没有那么精确的,只能是差不多..因为链接过程很复杂,并不能一定是算出来完全一样.. 引用 9 楼 buringBlade 的回复:arch/arm/boot/Image这个文件是不带调试信息什么的,未经压缩的内核,大小为6.7M 这跟我各个built-in.o的text+data段大小总和7.8M也对不上啊。好崩溃 谢谢版主指点。。。……
我是用的size命令,减去的bss段,就是text和data。。我不太懂链接的过程,但是感觉这个误差有点大啊,我的方法是把各个built-in.o的text和data加起来和顶层目录的vmlinux的text+data比较的。这个方法对吗。 再次感谢版主指点!
nevil 2012-12-20
  • 打赏
  • 举报
回复
BSS段算了么? 没有那么精确的,只能是差不多..因为链接过程很复杂,并不能一定是算出来完全一样..
引用 9 楼 buringBlade 的回复:
arch/arm/boot/Image这个文件是不带调试信息什么的,未经压缩的内核,大小为6.7M 这跟我各个built-in.o的text+data段大小总和7.8M也对不上啊。好崩溃 谢谢版主指点。。。
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 9 楼 buringBlade 的回复:
arch/arm/boot/Image这个文件是不带调试信息什么的,未经压缩的内核,大小为6.7M 这跟我各个built-in.o的text+data段大小总和7.8M也对不上啊。好崩溃 谢谢版主指点。。。
修正下,我的所有built-in.o中text和data段加起来是5.85M,而顶层目录的vmlinux的代码段+数据段为6.7M,对不上啊。。。 谢谢斑竹
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
arch/arm/boot/Image这个文件是不带调试信息什么的,未经压缩的内核,大小为6.7M 这跟我各个built-in.o的text+data段大小总和7.8M也对不上啊。好崩溃 谢谢版主指点。。。
nevil 2012-12-20
  • 打赏
  • 举报
回复
和vmlinux比,其他都是压缩过的
引用 7 楼 buringBlade 的回复:
引用 6 楼 nevil 的回复:这个真不好统计,除非你只是统计代码段,数据段所占的比例 因为每个模块的.o都是elf文件,会有文件头各个section等,link后还是个elf文件,只是把各个.o中相关的代码段,数据段等链接到一起重新组成一个elf. 建议你算下各个模块的代码段,数据段,然后算下最后境象的代码段,数据段,这样相对比较准确 引用 5 楼 ……
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 6 楼 nevil 的回复:
这个真不好统计,除非你只是统计代码段,数据段所占的比例 因为每个模块的.o都是elf文件,会有文件头各个section等,link后还是个elf文件,只是把各个.o中相关的代码段,数据段等链接到一起重新组成一个elf. 建议你算下各个模块的代码段,数据段,然后算下最后境象的代码段,数据段,这样相对比较准确 引用 5 楼 buringBlade 的回复:引……
谢谢指点,很惭愧。。请问最终的影像应该是哪个呢?应该不是压缩后的内核zImage吧。 我现在得到了各个模块的built-in.o的代码段和数据段,全加起来是7.28M,这些都是elf的?能否去掉这些elf的信息,把它二进制化呢。不好意思啊。。我还是不太清楚要和哪个最终映像来比较,因为我看Image和Zimage以及vmlinux的代码段+数据段大小都和7.28M对不上。。。求指点,再次谢过!!
nevil 2012-12-20
  • 打赏
  • 举报
回复
这个真不好统计,除非你只是统计代码段,数据段所占的比例 因为每个模块的.o都是elf文件,会有文件头各个section等,link后还是个elf文件,只是把各个.o中相关的代码段,数据段等链接到一起重新组成一个elf. 建议你算下各个模块的代码段,数据段,然后算下最后境象的代码段,数据段,这样相对比较准确
引用 5 楼 buringBlade 的回复:
引用 4 楼 nevil 的回复:不会很准确,因为最终的文件是链接而成的,而不是简单的拼接 引用 3 楼 buringBlade 的回复:引用 2 楼 nevil 的回复:1.比较大是因为带了调试的符号信息.一般的obj文件都可以用strip去掉调试符号,内核obj没试过.. 2.把make的输出信息重定向到文件,你就能看到最后是如何link成vmlinux了 ……
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
引用 4 楼 nevil 的回复:
不会很准确,因为最终的文件是链接而成的,而不是简单的拼接 引用 3 楼 buringBlade 的回复:引用 2 楼 nevil 的回复:1.比较大是因为带了调试的符号信息.一般的obj文件都可以用strip去掉调试符号,内核obj没试过.. 2.把make的输出信息重定向到文件,你就能看到最后是如何link成vmlinux了 3.比例是什么意思?什么的比例? ……
那请问尽量准确的方法是怎么做呢,是用strip去除各个built-in.o的多余信息之后和/arch/arm/boot/Image比较吗,谢谢指点!
nevil 2012-12-20
  • 打赏
  • 举报
回复
不会很准确,因为最终的文件是链接而成的,而不是简单的拼接
引用 3 楼 buringBlade 的回复:
引用 2 楼 nevil 的回复:1.比较大是因为带了调试的符号信息.一般的obj文件都可以用strip去掉调试符号,内核obj没试过.. 2.把make的输出信息重定向到文件,你就能看到最后是如何link成vmlinux了 3.比例是什么意思?什么的比例? 谢谢版主指点! 我是想统计各个模块的大小在最终内核镜像中所占大小的比例,比如说fs这个模块在最终可用的内核……

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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