在运行时知道类的大小

时间:2014-09-30 08:16:46

标签: c++ linux disassembly

我有linux CPP编译的二进制文件。基于类(符号)名称,我如何知道运行时符号的大小,它将占用的内存;使用任何反汇编工具?还是其他任何方法?

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

1 个答案:

答案 0 :(得分:3)

需要使用调试符号编译二进制文件以查找该信息。您可以从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。

如果二进制文件没有调试符号,那你就错了。您必须知道代码处理您感兴趣的类型大小的位置,反汇编二进制文件,找到代码的那一部分。