0

我正在研究 32 位保护模式内核。我正在尝试生成文本区域从 0x100000 开始的代码。我发出以下命令:=

ld -melf_i386 $(OBJS)-o 内核 -Ttext 0x100000

我希望当我检查生成的 32 位 ELF 文件时,e_entry 位于 0x100000。然而,事实并非如此,这是我的问题,因为我不知道为什么。内核有一部分是用 nasm 编写的,并且正在以 32 位 ELF 为目标的 64 位 linux 上编译。上述 ld 命令生成的实际 e_entry 值为 0x116D5A。我想知道这是否与我需要的某些编译器选项有关,例如 -fpic 或与 nasm 生成的代码不兼容,或者 ld 中可能存在错误?有人可以帮忙吗。谢谢

应该注意的是,给上面的 ld 提供 -r 选项,如下所示:= ld -r -melf_i386 $(OBJS)-o kernel -Ttext 0x100000

生成 e_entry 为 0x100000 的输出,但是该文件不是可执行文件。我需要它是一个可执行文件。

4

1 回答 1

0

你有链接描述文件吗?最好自己编写以覆盖默认链接器脚本,因为您希望对输出进行精细控制。

像这样的东西,

ENTRY(entry)

SECTIONS
{
    .  = 0x100000;

    .text : {
        *(.text)
    }
    ...

以上可以在 MMU 未启用时使用。

如果您启用了 MMU,以下内容会将您的内核链接到 0xC0000000 (3GB),同时仍将其加载到 0x100000。

.  = 0xC0100000;

.text : AT(0x100000) {
    *(.text)
}
于 2013-04-02T07:33:52.417 回答