如何在IDA中查找未被使用的全局变量?
问题
我写了一个简单程序,声明了几个全局变量并打印“Hello!”。我通过指令lea rcx, _Format ; "Hello!"找到了字符串,但找不到那些未被使用的变量的名称或相关信息。我觉得它们应该存在.data段里,但一直没找到。程序代码如下:
#include <stdio.h> // 全局变量 char my_char = 'b'; short my_short = 4000; int my_int = 10; long my_long = 65535; double my_double = 4.32; int main() { printf("Hello!"); return 0; }

解答
这是编译器优化导致的:你的全局变量在代码中没有被任何读取、写入操作引用,编译器在构建Release版本(默认开启优化)时会自动剔除这些未使用的变量,所以你在.data段里找不到它们。
解决方法有几种:
- 关闭优化:使用
-O0编译选项(GCC/Clang),或者在Visual Studio中切换到Debug模式(默认禁用优化),此时编译器会保留所有未使用的全局变量,你就能在.data段找到它们。 - 强制保留变量:给全局变量添加编译器特定的属性,比如GCC/Clang用
__attribute__((used)),MSVC用__declspec(used),示例:__attribute__((used)) char my_char = 'b'; __attribute__((used)) short my_short = 4000; - 引用变量:在代码中使用这些变量(比如打印它们的值),编译器就不会将其视为未使用而优化掉,示例:
int main() { printf("Hello! %c %d", my_char, my_short); return 0; }
补充说明:如果全局变量被const修饰为常量,初始化后会被放到.rodata段,但你的变量是可修改的,正常情况下应该在.data段,只是被优化移除了。
内容的提问来源于stack exchange,提问作者yarden
相关产品推荐
相关产品推荐

