我正在尝试制作一个使用如下代码的裸机程序(它也可以称为玩具操作系统):
你好1.c
int a = 4;
hello2.c
void func(){
extern int a;
//Some operation using a...
}
我使用 gcc 进行编译,并使用“objcopy -O binary”将 elf 文件转换为二进制文件,使用我自己的链接器文件和 _start 函数。我发现 func() 中的 a 是 0.
我发现编译器在编译时没有更新外部变量的值。它在从 linux 的 _start 函数运行时更新变量,位于 dl_main。它用变量 a 的实际地址更新 .got 部分。我想改变这个,但不知道该怎么做。我尝试添加 -fno-pic 和 -fno-pie 但没有任何意义。