如何通过readelf计算函数大小

时间:2018-04-10 10:52:13

标签: linux readelf

我试图了解readelf实用程序如何计算函数大小。我写了一个简单的程序

#include <stdio.h>

int main() {
    printf("Test!\n");
}

现在检查我使用过的功能大小(这可以吗?):

readelf -sw a.out|sort -n -k 3,3|grep FUNC

产生了:

 1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.2.5 (2)
 2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
29: 0000000000400470     0 FUNC    LOCAL  DEFAULT   13 deregister_tm_clones
30: 00000000004004a0     0 FUNC    LOCAL  DEFAULT   13 register_tm_clones
31: 00000000004004e0     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux
34: 0000000000400500     0 FUNC    LOCAL  DEFAULT   13 frame_dummy
48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5
50: 00000000004005b4     0 FUNC    GLOBAL DEFAULT   14 _fini
51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
58: 0000000000400440     0 FUNC    GLOBAL DEFAULT   13 _start
64: 00000000004003e0     0 FUNC    GLOBAL DEFAULT   11 _init
45: 00000000004005b0     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
60: 000000000040052d    16 FUNC    GLOBAL DEFAULT   13 main
56: 0000000000400540   101 FUNC    GLOBAL DEFAULT   13 __libc_csu_init

现在,如果我检查主要功能的大小,它会显示16.它是如何达到的?这是堆栈大小吗?

编译器使用gcc版本4.8.5(Ubuntu 4.8.5-2ubuntu1~14.04.1)

GNU readelf(Ubuntu的GNU Binutils)2.24

1 个答案:

答案 0 :(得分:2)

ELF符号有一个属性st_size,用于指定其大小(请参阅<elf.h>):

typedef struct
{
...
  Elf32_Word    st_size;                /* Symbol size */
...
} Elf32_Sym;

该属性由生成二进制文件的工具链生成;例如在查看C编译器生成的汇编代码时:

gcc -c -S test.c
cat test.s

你会看到像

这样的东西
        .globl  main
        .type   main, @function
main:
        ...
.LFE0:
        .size   main, .-main

其中.size是一个特殊的伪操作。

更新

.size是代码的大小。

此处,.size被分配了. - main的结果,其中&#34; .&#34;是main开始的实际地址和main()地址。