我需要从已编译的 c 程序中提取全局变量。我现在正在做的是使用 Linux readelf 命令来获取该信息。换句话说,当我这样做时:
readelf.exe -w[i] myFile.out
我使用可以从这里readelf.exe
下载的程序来做到这一点。因为我使用的是 Windows,这是我需要的唯一命令。在 linux 上,我将打开控制台并执行readelf -w[i] myFile.out
无论如何,当我执行该命令时,我会得到类似的东西:
<1><86923>: Abbrev Number: 2 (DW_TAG_base_type)
<86924> DW_AT_name : unsigned int
<86925> DW_AT_encoding : 7 (unsigned)
<86927> DW_AT_byte_size : 4
<1>..
...
... bla bla bla
...
<1><870a1>: Abbrev Number: 12 (DW_TAG_variable)
<870a2> DW_AT_decl_file : 25
<870a3> DW_AT_decl_line : 543
<870a5> DW_AT_external : 1
<870a6> DW_AT_name : NetBuf_ID_Ctr // <------------------- First variable
<870b4> DW_AT_type : <0x86923>
<870b8> DW_AT_location : 5 byte block: 3 ff f9 b 20 (DW_OP_addr: fff90b20)
<1><870be>: Abbrev Number: 3 (DW_TAG_typedef)
<870bf> DW_AT_decl_file : 26
<870c0> DW_AT_decl_line : 192
<870c2> DW_AT_name : NET_CONN_FAMILY
<870d2> DW_AT_type : <0x862f1>
<1><870d6>: Abbrev Number: 3 (DW_TAG_typedef)
<870d7> DW_AT_decl_file : 26
....
有了那个“树”,我可以得到所有的全局变量和类型。例如,如果您查看第一个变量NetBuf_ID_Ctr
,我们可以看到我们可以获得有关节点上的类型的信息 <0x86923>
。那个节点在树的某个地方!如果你看一下那实际上是第一个节点。开始的那个 <1><86923>....
,如果您在该节点内部看到,我们知道该变量是一个无符号整数,大小为 4 个字节。
现在我的问题是,当我使用 readelf 命令时,我得到 了 192883 行需要解析的文本!这棵树给了我更多我需要的信息。如果我用十六进制编辑器查看文件,这就是我所看到的:
请注意,我能够找到相同的变量NetBuf_ID_Ctr
,并且它旁边(突出显示)是它的地址<0x86923>
!
互联网上有没有地方可以指导我如何构建树?命令 readelf.exe 需要 0.1 秒来创建树!它将输出放在 StreamReader 上,这就是它如此快的原因。如果我希望将 StreamReader 放在内存上,将其转换为需要很长时间的字符串。
编辑
总之,我想知道如何从 myFile.out 构造树(readelf 的输出)。我无法弄清楚这种模式,互联网上也没有一个地方可以解释如何。