Assembly linux ld-Ttext无法生成具有正确组织的可执行文件

Assembly linux ld-Ttext无法生成具有正确组织的可执行文件,assembly,kernel,nasm,ld,Assembly,Kernel,Nasm,Ld,我正在开发一个32位保护模式内核。我试图生成文本区域从0x100000开始的代码。我发出以下命令:= ld-melf_i386$(OBJS)-o内核-Ttext 0x100000 当我检查生成的32位ELF文件时,我希望e_条目为0x100000。 然而,事实并非如此,这是我的问题,因为我不知道为什么。内核 它的一部分是用nasm编写的,正在64位linux上编译 目标为32位极低频。生成的实际e_输入值 上述ld命令为0x116D5A。我想知道这是否与某些编译器有关 我需要的选项,如-fpic

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

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

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

应注意的是,将-r选项赋予上述ld,如中所示:= ld-r-melf_i386$(OBJS)-o内核-Ttext 0x100000

在e_条目为0x100000的情况下生成输出。但是,该文件不是可执行文件。
我需要它是一个可执行文件。

你有链接器脚本吗?最好编写自己的脚本来覆盖默认链接器脚本,因为您希望对输出进行良好的控制

像这样的,

ENTRY(entry)

SECTIONS
{
    .  = 0x100000;

    .text : {
        *(.text)
    }
    ...
当MMU未启用时,可以使用上述功能

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

.  = 0xC0100000;

.text : AT(0x100000) {
    *(.text)
}