【问题标题】:How are function sizes calculated by readelfreadelf 如何计算函数大小
【发布时间】:2018-04-10 10:52:13
【问题描述】:

我试图了解 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

现在,如果我检查 main 函数的大小,它会显示 16。它是如何得出的?这是堆栈大小吗?

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

GNU readelf(适用于 Ubuntu 的 GNU Binutils)2.24

【问题讨论】:

    标签: linux readelf


    【解决方案1】:

    ELF 符号有一个属性st_size,它指定了它们的大小(参见&lt;elf.h&gt;):

    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 的结果,其中“.”是实际地址,mainmain() 开始的地址。

    【讨论】:

    • 抱歉回复晚了,但您指向的 size 字段解释了问题的第一部分。关于第二部分的任何想法,关于它如何达到 16 字节作为函数的大小?
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多