【问题标题】:SIze of .s file larger than .o file linux [closed].s 文件的大小大于 .o 文件 linux [关闭]
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我说得对吗,由于链接器链接了所有库,最终文件“max”更大?但是库不是在运行时动态链接的吗??
  • @TapanAnand 目标文件是链接器的输入。它们还没有与任何东西链接,它们已经由汇编器输出(或者,在更好的工具链中,由编译器直接输出)。
  • 动态库存储在您计算机的其他位置,不会连接到二进制文件。另一方面,静态库会连接到您的二进制文件,因此会增加文件大小。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多