在elf文件中查找全局变量的位置

4

我想编写一个C++程序,可以查找全局变量的位置。以下是相关的readelf。

...
 <1><98>: Abbrev Number: 7 (DW_TAG_variable)
    <99>   DW_AT_name        : (indirect string, offset: 0x32): sbox_bit
    <9d>   DW_AT_decl_file   : 1
    <9e>   DW_AT_decl_line   : 3
    <9f>   DW_AT_type        : <0x81>
    <a3>   DW_AT_external    : 1
    <a3>   DW_AT_location    : 5 byte block: 3 e8 0 1 0     (DW_OP_addr: 100e8)
...

我已经获取了具有dwarf_diename“sbox_bit”标签为“DW_TAG_variable”的DIE。从这里找到此变量的位置应该不太难,但是我无法弄清楚。


1
请参见 DW_AT_location 的用法和含义 - Some programmer dude
1
一个变量可能不止存在于一个位置。如果编译器确定它是一个常量,它甚至可能不存在。编译器也可能将其拆分为多个变量的组合+一些内联常量。通常情况下,你不能假设C++级别的变量在最终的机器代码中表示为单个命名的东西。这太天真了。 - Jesper Juhl
谢谢。在这种情况下,变量位于常量地址0x000100e8。 所讨论的变量始终是指向整数数组的指针。 我认为我可以自己解决其余部分。如果您能链接一些关于elfutils/libdw.h的示例/教程,我将不胜感激。因为这是我被迫使用的库。我找不到好的在线示例,只能按照此处中的文档进行。 - Arcane
1
请花些时间阅读帮助页面,特别是名为“我可以在这里问什么话题?”的部分。然后您就会明白为什么要求示例或教程是不适合讨论的。 - Some programmer dude
@JesperJuhl 我从未见过编译器对于非 const 的全局变量这样做过。它可能会对常量这样做。 - user253751
1个回答

3
我想编写一个C++程序,可以找到全局变量的位置。
你可能使用了错误的方法。
虽然可以从调试信息(您提供的readelf输出)中找到全局变量的位置(以及其类型、大小、如果它是数组则元素数量等),但从符号表(即nm输出)中查找该地址要简单得多。
可以使用libelf解析符号表,也可以手动完成(如果主机匹配目标,则很容易完成)。 Example

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接