`size` 和 `objdump` 输出的结果不一致?

3

我已经将以下C函数(在sum.c中)编译成目标代码:

int sum(int a, int b)
{
    return (a + b);
}

使用

gcc -c sum.c

当我使用size检查不同部分的大小时:

size sum.o
   text    data     bss     dec     hex filename
    112       0       0     112      70 sum.o

它告诉我文本部分分配了112个字节。但是当我使用objdump反汇编它时:

objdump -d sum.o

sum.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <sum>:
   0:   f3 0f 1e fa             endbr64 
   4:   55                      push   %rbp
   5:   48 89 e5                mov    %rsp,%rbp
   8:   89 7d fc                mov    %edi,-0x4(%rbp)
   b:   89 75 f8                mov    %esi,-0x8(%rbp)
   e:   8b 55 fc                mov    -0x4(%rbp),%edx
  11:   8b 45 f8                mov    -0x8(%rbp),%eax
  14:   01 d0                   add    %edx,%eax
  16:   5d                      pop    %rbp
  17:   c3                      retq   

.text 部分只有 17 字节的指令。我是否遗漏了什么?


1
注意:17是十六进制,所以在十进制中为23。但是0x17(23)是最后一条指令的开始。实际上有24个字节的指令。 - Michael Petch
1个回答

2
使用size -Aobjdump -D获取所需的所有信息。
在我的系统上,没有-Asize会将.eh_frame部分的大小添加到文本中(可能是因为它是只读的,并且将与文本一起加载)。

2
size 没有选项时似乎会返回所有的 ALLOC/LOAD/READONLY 作为 .text。它还将包括像 .note.gnu.property(如果 GCC 发出它)和正如您注意到的 .eh_frame 部分等内容。如果存在,.rodata 也是如此。在 OP 的情况下,112 是 .eh_frame(56)+ .text(24)+ .note.gnu.property(32)的大小 = 112。使用 size 命令,这些部分也已被填充到8的倍数(这恰好是每个部分的对齐方式)。 - Michael Petch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接