小编ama*_*eka的帖子

在GCC中禁用GOT

全局偏移表(GOT):用于重定位ELF符号(实现GCC),它有助于共享相同的二进制文件,而不需要为每个进程进行任何特定链接.因此减少了存储器中相同二进制图像的副本.

我的问题是,有没有办法禁用R_386_GOT32,R_386_GOTOFF在可重定位的ELF图像中键入重定位条目?我的意思是,我可以强制GCC使用R_386_PC32R_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

gcc operating-system elf relocation

9
推荐指数
1
解决办法
2926
查看次数

BIOS在保护模式下中断

我正在开发一个操作系统项目,使用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"

interrupt bios protected-mode osdev syslinux

7
推荐指数
2
解决办法
2339
查看次数

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变量超出范围并使局部变量自己赋值,这相当于未初始化的局部变量.

c gcc

2
推荐指数
2
解决办法
2850
查看次数