gcc 在移植过程中跳转到函数时全局变量变为null

cbjzeqam  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在尝试将在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

zte4gxcn

zte4gxcn1#

当跳转到某个函数时,未使用的全局变量被设置为0x 0。
“全局变量”-具有 * 文件范围 * 的变量,总是初始化为零,除非程序员显式地初始化为其他东西,因为它们具有 * 静态存储持续时间 *。你的程序按照预期的方式运行--所以出错的似乎是你的预期,而不是程序的行为。
来源:C17 5.1.2和6.7.9 §10。

相关问题