全局偏移表(GOT):用于重定位ELF符号(实现GCC),它有助于共享相同的二进制文件,而不需要为每个进程进行任何特定链接.因此减少了存储器中相同二进制图像的副本.
我的问题是,有没有办法禁用R_386_GOT32,R_386_GOTOFF在可重定位的ELF图像中键入重定位条目?我的意思是,我可以强制GCC使用R_386_PC32或R_386_32键入重定位而不是GOT类型重定位吗?
如果没有,你能解释实施GOT的方式吗?我正在为ELF编写动态链接和加载库.
编辑:
参考链接
https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-74186.html
http://man7.org/linux/man-pages/man8/ld.so.8 .html
http://wiki.osdev.org/ELF
我正在开发一个操作系统项目,使用isolinux(syslinux 4.5)作为引导加载程序,使用组织在0x200000的多引导头加载我的内核.
据我所知,内核已经处于32位保护模式.我的问题:有没有更简单的方法来访问BIOS中断?(基本上我想要0x10:D)
加载后,我的内核设置了自己的GDT和IDT条目,并进一步重新映射IRQ.因此,在内核加载并设置VGA/SVGA模式(VBE 2.0模式)后,是否可以跳转到实模式.然后,我将继续我的内核并跳转到保护模式,我使用VBE 2.0物理缓冲区地址写入屏幕?如果有,怎么样?我尝试了很多,但没有成功:(
旁注:我在互联网上搜索了很多,发现syslinux 1.x +提供了_intcall api,我对此并不是100%肯定.请参阅"syslinux 4.5\com32\lib\sys\initcall.c"
码:
#include <stdio.h>
int var = 20;
int main()
{
int var = var;
printf("%d\n", var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC在此代码中输出垃圾值.我的疑问是,这应该输出"20".
说明:每当我们为任何全局/局部变量赋值时,第一条指令是计算机将指定的值保存到寄存器中,然后将其放入内存中.所以,据我所知,当编译器来到"int var = var"时,它应该首先将值20保存到特定寄存器.之后它会将它保存到局部变量.然后全局变量应该超出范围.是的,它与首先分配变量名称而不是其值的陈述相矛盾.因此,int var使全局var变量超出范围并使局部变量自己赋值,这相当于未初始化的局部变量.