有没有办法通过查看可执行文件来知道变量是否已定义。
假设我声明
int i;
在主函数中。通过编译和链接,我得到了一个可执行文件 my_program.exe。
现在,通过查看 my_program.exe 内部,我可以判断它是否有一个 int eger 变量 i ?
除非您在启用调试的情况下进行编译,否则不会。
正如其他人所说,调试信息会显示它。更具体地说,对于 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
如果使用调试符号(例如 gcc -g)进行编译,则可以使用调试器查看几乎所有内容。
局部变量在优化过程中可能会被编译器消除,因此即使使用调试符号也很难找到变量的初始值。但这是特定于平台的。