有没有办法使用 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,因为它对于大型二进制文件来说真的很慢。
readelf 能够列出 dwarf 调试信息:
readelf -wi
找到 har DW_AT_name 等于 MyInt 并且是代表此编译单元的 DW_TAG_compile_unit 的直接子元素的 DW_TAG_variable 元素。
使用 DW_AT_type 属性查找此变量的 DW_TAG_base_type。DW_AT_type 属性是从存储该类型信息的该 CU 开始的偏移量。这些偏移量列在输出的左侧(在 <>s 中)。查看此 DIE 的 DW_AT_byte_size 属性。这是类型的大小(以字节为单位)。
我会说你最好坚持使用gdb。
bintuls 主要处理可执行格式 (ELF) - 调试内容以dwarf格式保存。除了运行之外,objdump -g -x yourbinary
我还没有看到很多处理调试符号的实用程序。
总而言之,通过 elf 和 dwarf 解析以提取类型是非常可怕且不平凡的——尽管这正是调试器已经完成的工作。
您将需要做 GDB 正在做的事情并自己阅读 DWARF 调试信息。有几个工具可以帮助解决这个问题,比如 readelf 和 dwarfdump。去http://dwarfstd.org/阅读常见问题解答和其他好东西,看看是否能满足您的需要。
这个答案是假设你在一个普通的 Linux 平台上运行。其他平台的其他工具也可能对您有用,但我不是问这些的人。