我正在尝试将在Linux上运行的程序移植到Windows上。这个程序是一个多线程程序,由于最初的设计不够完美,许多全局变量分散在整个代码中。现在我遇到了一个非常棘手的问题:当跳转到某个函数时,未使用的全局变量被设置为0x0。
我在Linux上使用的编译器版本是gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
,而我在Windows 10上使用的编译器版本是gcc.exe (x86_64-win32-seh-rev2, Built by MinGW-W64 project) 12.2.0
。
通过检查内存内容,我发现这个全局变量的地址与跳转到的函数的地址非常接近(如下图所示):enter image description here通过使用objdump命令检查可执行文件的段,内存的布局如下(部分):enter image description here我想知道这个问题的原因,希望找到解决方案。
- ----添加------
对不起,我的描述不是很清楚,这里有一个简化的例子:
// file1.h
extern struct ITEM *item;
void init();
// file1.c
struct ITEM *item;
void init() {
item = (struct ITEM *) malloc(sizeof(struct ITEM));
item->a = 1;
item->b = 2;
...
}
// file2.h
void funcA() {
// never use item
...
}
// main.c
...
#include "file1.h"
#include "file2.h"
...
void main(void) {
init();
funcA();
}
调用init()
函数后,全局变量item
被初始化并赋值,但调用funcA()
函数时,汇编中的call
指令执行后,item
指针变为0x0
1条答案
按热度按时间zte4gxcn1#
当跳转到某个函数时,未使用的全局变量被设置为0x 0。
“全局变量”-具有 * 文件范围 * 的变量,总是初始化为零,除非程序员显式地初始化为其他东西,因为它们具有 * 静态存储持续时间 *。你的程序按照预期的方式运行--所以出错的似乎是你的预期,而不是程序的行为。
来源:C17 5.1.2和6.7.9 §10。