【发布时间】:2013-08-15 20:26:56
【问题描述】:
我正在编译一个程序来查找数组中的最大数字。
已编辑
我编译如下:
gcc --save-temps max.c -o max
然后继续做
ls -l max*
输出是:
-rwxrwxr-x 1 tapan tapan 7296 Aug 16 01:45 max
-rw-rw-r-- 1 tapan tapan 233 Aug 16 01:45 max.c
-rw-rw-r-- 1 tapan tapan 17894 Aug 16 01:45 max.i
-rw-rw-r-- 1 tapan tapan 1308 Aug 16 01:45 max.o
-rw-rw-r-- 1 tapan tapan 1507 Aug 16 01:45 max.s
我的问题是:为什么 .s 汇编文件的大小比 .o 二进制文件大?
我认为 .o 文件有二进制字符串,所以它会更大。
由于链接库,最终文件的最大大小也如预期的那样大。但是 .o 文件的大小让我认为 .o 文件没有二进制字符串,而是其他东西。如果我在某个地方错了,请纠正我。
【问题讨论】:
-
让我们看看,一个文件包含旨在让 CPU 能够高效执行的代码。另一个包含旨在供人类阅读的代码。为什么你会期望后者更小?
-
因为假设如果 ADD = 01001010(opcode) 那么操作码有更多的字符。
-
反驳一下,一个名为'variable'的变量由64位组成,但如果在32位机器上编译,它将是二进制文件中的32位内存地址(忽略OP-将变量分配给寄存器地址的代码)。参加编译器课程,这真的很有趣,让您在运行 gcc 后一边喝咖啡一边欣赏所发生的事情。
-
@Tapan:“ADD”是 ASCII 中的 3 个字节:“A”、“D”和“D”。
01001010表示可以存储在单个字节中的二进制数。
标签: c linux gcc object-files