【问题标题】:Checking for a variable in the executable检查可执行文件中的变量
【发布时间】:2010-04-16 15:28:56
【问题描述】:

有没有办法通过查看可执行文件来知道变量是否已定义。

假设我声明

int i;

在主函数中。通过编译和链接,我得到了一个可执行的 my_program.exe。

现在,通过查看 my_program.exe 内部,我可以说它是否有一个 int eger 变量 i 吗?

【问题讨论】:

    标签: c++ c compiler-construction linker executable


    【解决方案1】:

    除非您在启用调试的情况下进行编译。

    【讨论】:

    • 并且只要关闭优化。通过优化,某些变量可能不会显示在调试符号中,因为它们已被优化掉。
    【解决方案2】:

    正如其他人所说,调试信息会显示它。更具体地说,对于 ELF 文件:

    readelf -w binary-name
    

    会有一个类似的条目:

    <2><58>: Abbrev Number: 4 (DW_TAG_variable)
     <59>     DW_AT_name        : i 
     <5b>     DW_AT_decl_file   : 1 
     <5c>     DW_AT_decl_line   : 2 
     <5d>     DW_AT_type        : <73>  
     <61>     DW_AT_location    : 2 byte block: 91 6c   (DW_OP_fbreg: -20)
    

    没有调试信息,本地人不会保留他们的名字。如果变量是全局变量,会有一个符号指向它:

    objdump -t binary-name
    
    0804a010 g     O .data  00000004              i
    

    类型信息在那里丢失,但你可以看到大小是 4

    【讨论】:

      【解决方案3】:

      如果您使用调试符号(例如 gcc -g)进行编译,则可以使用调试器查看几乎所有内容。

      【讨论】:

        【解决方案4】:

        局部变量在优化过程中可能会被编译器剔除,因此即使使用调试符号也很难找出变量的初始值。不过,这是特定于平台的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-11
          • 1970-01-01
          • 2012-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多