当“大小”给出错误答案时,如何在Linux上确定目标代码大小?

时间:2013-03-18 03:12:19

标签: gcc binutils

我想知道GCC为每个编译单元集合生成了多少目标代码,但是我遇到了一个奇怪的问题,即来自binutils的“size”命令没有给出正确的结果。

我们来一个只包含这个函数的C文件:

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

我们可以编译它并使用“size”和“objdump”检查目标代码大小:

$ gcc -O foo.c -c
$ size foo.o
   text    data     bss     dec     hex filename
     52       0       0      52      34 foo.o
$ objdump -d foo.o

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <foo>:
   0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
   3:   c3                      retq   

从objdump输出中可以清楚地看出,目标代码大小是4个字节。但是,大小报告52个字节,这是不正确的。

从使用“-D”选项到objdump,它看起来像是异常处理代码,也许其他一些东西正在通过“大小”来衡量并添加到我真正关心的代码的大小。有没有人知道一个相对简单的方法来获得大小忽略这些额外的东西?

1 个答案:

答案 0 :(得分:0)

你必须坚持使用size吗?它有许多类似于您遇到的问题,因此我通常使用此readelf代码段:

OBJ=foo.o
SEC=.text

readelf -SW "$OBJ" \
  | sed 's/^ *\[[0-9 ]*\] *//' \
  | awk '
    /NOBITS/ { next; }
    /^'$SEC'\>/ { sz = strtonum("0x" $5); s += sz; }
    END { print s }'