- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
很长一段时间我都没有使用 C 和汇编程序进行编程(大约 2 年)。现在我决定重新开始,但我想做一些更复杂的事情。我考虑过创建一个简单的内核。现在我在互联网上找到了这个源代码:
启动.asm:
global loader
extern kernel_main
MAGIC equ 0xbad
FLAGS equ 0x3
CHECKSUM equ -(MAGIC+FLAGS)
section .text
align 4
dd MAGIC
dd FLAGS
dd CHECKSUM
loader:
call kernel_main
cli
quit:
hlt
jmp quit
内核.c:
void print(char *text) {
char *memory = (char*)0xb8000;
while(*text) {
*memory++ = *text++;
*memory++ = 0x3;
}
}
void kernel_main() {
print("My cat sometimes smells like cafe. I love it.");
}
链接器.ld:
ENTRY(loader)
SECTIONS {
. = 0x100000;
.text : { *(.text) }
}
注意:我用“GCC”编译了 C 文件,用“NASM”编译了汇编文件。
如果我尝试这个命令:
ld -T linker.ld -elf_i386 -o final.bin boot.o kernel.o
它说:“boot.asm:(.text+0xd): undefined reference to `kernel_main'”。我怎样才能解决这个问题?我在 Windows 上工作,不想在 Linux 或任何东西上运行 VM。提前致谢!
编辑:这是我的 GCC 命令:
gcc -m32 -o kernel.o srckernel.c -nostdlib -nostartfiles -nodefaultlibs
这是我的 NASM 命令:
nasm -f elf32 -o boot.o boot.asm
最佳答案
有很多错误。我会假设错误:
boot.asm:(.text+0xd): undefined reference to
kernel_main
您没有使用 ELF 交叉编译器,而是使用生成 native Windows 可执行文件的 GCC 编译器(即 Cygwin 和 MinGW)。我强烈推荐使用 i686(或 x86_64)ELF cross compiler用于操作系统开发,尤其是在 Windows 上。
您的主要问题是:
选项 -elf_i386
可能意味着 -melf_i386
但这甚至是不正确的。对于面向 Windows 的 GCC,您将希望使用 -mi386pe
输出为 Win32 PE/COFF 格式。 Windows GCC 链接器通常不知道如何生成 ELF 可执行文件。我还建议在使用 LD 输出 i386pe 格式时使用 -N
选项。将您的链接器命令更改为:
ld -N -T linker.ld -mi386pe -o final.bin boot.o kernel.o
对于 Win32 PE/COFF 对象1:使用 CDECL 调用约定的函数必须具有 underscore (_
) prepended给他们。 kernel_main
需要是 _kernel_main
。您需要更改 boot.asm
中的这些行:
extern kernel_main
call kernel_main
到:
extern _kernel_main
call _kernel_main
您没有说明如何编译 kernel.c
以及如何组装 boot.asm
但它们应该类似于:
nasm -f win32 boot.asm -o boot.o
gcc -g -c -m32 -ffreestanding kernel.c -o kernel.o
当您设法生成 final.bin
时,它是一个 Windows PE 可执行文件。 Multiboot specification需要 ELF 可执行文件。使用 LD 链接到 final.bin
后,您可以将 final.bin
转换为 ELF 格式:
objcopy -O elf32-i386 final.bin final.elf
final.elf
现在应该可以用作 Multiboot ELF 可执行文件。
boot.asm
中的 Multiboot header 存在问题。 Multiboot 魔法值为 0x1badb002
而不是 0xbad
。由于您未在 Multiboot header 中指定视频配置 FLAGS
不应设置位 1,因此 FLAGS
应为 0x1 而不是 0x3。从以下位置更改您的 Multiboot header :
MAGIC equ 0xbad
FLAGS equ 0x3
到:
MAGIC equ 0x1badb002
FLAGS equ 0x1
通过上述更改,我能够生成一个名为 final.elf
的 ELF 可执行文件。使用以下命令与 QEMU 一起运行时:
qemu-system-i386 -kernel final.elf
我得到的输出是:
关于gcc - 是什么导致 "x.asm:(.text+0xd): undefined reference to ` y'”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57274231/
我刚刚编写了这些代码,但输出不同。第二个代码的输出符合我的预期,但第一个代码的输出不正确。但为什么呢? def fib(n): x = 0 y = 1 print x
#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4);
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 1 年前。 我看到下面的代码,但不知道它做
我正在阅读 book , 并讲了 typeclass Eq 的定义 有两个功能== , /=在等式中,它们被实现为: x == y = not (x /= y) x /= y = not (
我最近参加了一个代码力量竞赛。在比赛的编辑部分,我看到了按位运算符之间的一种美妙关系,即 x + y = x & y + x |是的我还不知道证据。我拿了几个数字来看看这个等式是否正确。我很高兴知道这
我使用 CGRectMake(x,x,x,x) 在我的 View 中放置了一个按钮,当然 x 是位置和大小。当我使用 -(BOOL)shouldAutoRotate... 旋转 View 时,我想将按
this.x = (Math.random()*canvasWidth); this.y = (Math.random()*canvasHeight); (1) this.shift = {x: th
我想将此代码运行为“if 'Britain' or 'UK' in string do stuff, but don't do stuff if "Ex UK" 在字符串中": #Case insen
早上好,我是新来的,我带来了一个小问题。我无法针对以下问题开发有效的算法:我需要找到三个正数 x、y 和 z 的组合,以便 x + y、x - y、y + z、y - z、x + z 和 x - z
我现在正在使用 C++ 编写方案的解释器。我有一个关于定义和 lambda 的问题。 (define (add x y) (+ x y)) 扩展为 (define add (lambda (x y)
我正在尝试使用一台主机通过 FTP 将内容上传到另一台主机。 “我不会打开到 172.xxx.xxx.xxx(仅到 54.xxx.xxx.xxx)的连接”甚至不相关,因为我没有连接到那个主持人。这是托
在 Python 中,使用 [] 解包函数调用有什么区别? , 与 ()还是一无所有? def f(): return 0, 1 a, b = f() # 1 [a, b] = f() # 2
给定方程 z = z(x,y) 2 个表面 I和 II : z_I(x, y) = a0 + a1*y + a2*x + a3*y**2 + a4*x**2 + a5*x*y z_II(x, y)
几年前我有这个面试问题,但我还没有找到答案。 x 和 y 应该是什么才能形成无限循环? while (x = y && x != y) { } 我们尝试了 Nan,infinity+/-,null f
我正在尝试使用 Camel FTP Producer 将文件发送到第三方 ftp 服务器(似乎由 Amazon 托管),但遇到了一个问题,写入文件失败,并显示:文件操作失败...主机尝试数据连接 x.
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 torch.tensor.repeat() x = torch.tensor([[1, 2, 3], [4, 5, 6]]) period = x.size(1) repeats = [1
#include int main() { int x = 9; int y = 2; int z = x - (x / y) * y; printf("%d", z
我很难理解先有定义然后有两个异或表达式的含义。这个定义的作用是什么? 我尝试发送 x=8, y=7,结果是 x=15 和 y=8为什么会这样? 这是程序: #define FUNC(a,b) a^=b
我正在尝试使用 SIMD 优化此功能,但我不知道从哪里开始。 long sum(int x,int y) { return x*x*x+y*y*y; } 反汇编函数如下所示: 4007a0
我是一名优秀的程序员,十分优秀!