了解运行时类的大小

Know size of class at runtime

本文关键字:运行时 了解      更新时间:2023-10-16

我已经编译了linux CPP二进制文件。基于类(符号)名称,我如何在运行时知道符号的大小,它会占用内存;使用任何拆卸工具?或者其他方法?

(它可能指向额外的堆内存,这不是我所关心的。但应该计算存储指向堆的指针的类成员)。

二进制文件需要使用调试符号进行编译才能找到该信息。您可以从DWARF调试符号中读取信息。这里有一个演示:

给定此代码:

#include <iostream>
struct MyType {
    int a, b,c;
    float d;
};

int main(int argc, char *argv[])
{
    struct MyType t;
    std::cout << sizeof(t);
}

您可以使用g++ -g demo.c 进行编译

使用转储调试符号

 objdump -W ./a.out

会有一个类似的部分

 <1><13c7>: Abbrev Number: 20 (DW_TAG_structure_type)
    <13c8>   DW_AT_name        : (indirect string, offset: 0x8af): MyType
    <13cc>   DW_AT_byte_size   : 16
    <13cd>   DW_AT_decl_file   : 1
    <13ce>   DW_AT_decl_line   : 2
    <13cf>   DW_AT_sibling     : <0x13fc>

好了,MyType的尺码是16号。

如果二进制文件没有调试符号,那你就太倒霉了。你必须知道代码处理你感兴趣的类型大小的地方,分解二进制,找到代码的那部分。