给定一个用C ++和gcc构建的ELF二进制文件,如何确定其中某些类型的大小?

时间:2010-04-20 21:36:46

标签: c++ binutils

有没有办法使用binutils工具来获取此功能?例如:

// x.cc
typedef long long MyInt;
int main(int argc, char* argv[]) {
  // blah blah blah
}

然后:

g++ -g x.cc -o a.out

如何分析a.out以获取sizeof(MyInt)? GDB可以做到这一点,但我不想使用GDB,因为它对于大型二进制文件来说真的很慢。

3 个答案:

答案 0 :(得分:1)

readelf能够列出矮人调试信息:

readelf -wi

查找DW_TAG_variable元素,其中DW_AT_name等于MyInt,并且是表示此编译单元的DW_TAG_compile_unit的直接子元素。

使用DW_AT_type属性查找此变量的DW_TAG_base_type。 DW_AT_type属性是从该CU的起点开始的偏移,其中存储有关此类型的信息。这些偏移列在输出的左侧(在<> s中)。 查看此DIE的DW_AT_byte_size属性。这是类型的大小,以字节为单位。

答案 1 :(得分:0)

我会说你最好坚持使用gdb。

bintuls主要处理可执行格式(ELF) - 调试内容以dwarf格式保存。除了运行objdump -g -x yourbinary之外,我还没有看到很多处理调试符号的实用程序。

总而言之,通过elf和dwarf解析这些类型是非常可怕和非平凡的 - 尽管调试器已经完成了这一点。

答案 2 :(得分:0)

您需要执行GDB正在执行的操作并自行阅读DWARF调试信息。有一些工具可以帮助解决这个问题,比如readelf和dwarfdump。请阅读http://dwarfstd.org/上的常见问题解答和其他好东西,看看是否能满足您的需求。

这个答案假设你在一个普通的Linux平台上运行。还有其他平台的其他工具可能也适合你,但我不是那个问这些的人。