C .s文件的大小大于.o文件linux

C .s文件的大小大于.o文件linux,c,linux,gcc,object-files,C,Linux,Gcc,Object Files,我正在编译一个程序来查找数组中的最大数 已编辑 我将其汇编如下: 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 tap

我正在编译一个程序来查找数组中的最大数

已编辑

我将其汇编如下:

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文件有二进制字符串,所以它会更大


此外,由于链接库的缘故,最终文件max的大小也比预期的大。但是.o文件的大小让我觉得.o文件没有二进制字符串,而是其他一些东西。如果我在某个地方错了,请纠正我。

如果“二进制字符串”是指ASCII编码的(即每个0或1是ASCII字符0x30和0x31),那么您可以在文本编辑器中打开文件,查看
0001011011111101100…
,那么就不是了。只要看看
cat
od
(如果您在unix上)或十六进制编辑器,它“直接”包含二进制数据。操作码
01001010
在一个二进制文件中占用一个字节,而不是8个ASCII字符,每个ASCII字符占用一个字节。

让我们看看,一个文件包含CPU能够高效执行的代码。另一个包含供人阅读的代码。为什么您希望后者更小?因为假设ADD=01001010(操作码),那么操作码有更多的字符。反驳一下,称为“variable”的变量由64位组成,但如果在32位机器上编译,它将是二进制文件中的32位内存地址(忽略将变量分配给寄存器地址的操作代码的开销)。上一堂编译器课程,这真是一件有趣的事情,让您在运行gcc后喝咖啡时体会到发生的事情。@Tapan:“添加”是ASCII码中的3个字节:“A”、“D”和“D”。
01001010
表示可以存储在单个字节中的二进制数。那么我说的最后一个文件“max”对吗由于链接器链接了所有库,所以更大了??但是库不是在运行时动态链接的吗???@tapan并且对象文件是链接器的输入。它们还没有链接到任何东西,它们是由汇编程序输出的(或者,在更好的工具链中,由编译器直接输出)。动态库存储在计算机的其他位置,不会连接到二进制文件。另一方面,静态库连接到二进制文件,因此会增加文件大小。