读《程序员的自我修养》一书,读到《3.3节 挖掘SimpleSection.o》,遇到一个问题:
使用如下命令查看目标文件SimpleSection.o中各个section的大小时:
objdump -h SimpleSection.o
结果显示.text
section 的大小是:0000005b
,转换为十进制等于91
使用size命令查看SimpleSection.o中各个section的大小时:
size SimpleSection.o
结果显示text
section的大小时95(十进制)
奇怪! 大小竟然不相等。
起初以为《程序员的自我修养》这本书写错了。后面,我亲自在电脑上(Mac、Linux)试了一下,还真不一样。
那为什么呢?我确实花了一些时间搞明白这个问题。后面通过命令
man size
发现size命令有不同的“output format",我们也可以从这个网页上查看size的使用方法:www.man7.org/linux/man-p…
其中最重要的一段,我摘录如下:
The Berkeley style output counts read only data in the "text"
column, not in the "data" column, the "dec" and "hex" columns
both display the sum of the "text", "data", and "bss" columns
in decimal and hexadecimal respectively.
The GNU format counts read only data in the "data" column,
not the "text" column, and only displays the sum of the
"text", "data", and "bss" columns once, in the "total"
column.
我简单用数学公式翻译下上面两段话:
Berkeley style:
size(text) = size(.text) + size(.rodata)
size(data) = size(.data)
GNU format:
size(text) = size(.text)
size(data) = size(.data) + size(.rodata)
当我们使用size命令时,默认使用的Berkeley style