Assembly 为yasm中的ELF32节指定物理地址?

Assembly 为yasm中的ELF32节指定物理地址?,assembly,elf,i386,yasm,Assembly,Elf,I386,Yasm,我正在尝试使用yasm来构建一个简单的ELF程序。但是,我不知道如何使它以.TEXT节为目标,使其VMA地址从0x1000开始,而不是从0开始。我尝试过使用START和ORG指令,但这些指令仅在针对bin而不是elf时才有效。在yasm中可以这样做吗?一般来说,在ELF对象中是不可能的。ELF对象是可重定位的。这意味着,它们的加载地址尚未确定。通常,您使用一个称为链接器的单独程序来解析重新定位和修复加载地址。您可以使用链接器脚本配置链接器使用的加载地址以及放置节的顺序。例如,此GNU链接器代码的

我正在尝试使用yasm来构建一个简单的ELF程序。但是,我不知道如何使它以.TEXT节为目标,使其VMA地址从0x1000开始,而不是从0开始。我尝试过使用START和ORG指令,但这些指令仅在针对bin而不是elf时才有效。在yasm中可以这样做吗?

一般来说,在ELF对象中是不可能的。ELF对象是可重定位的。这意味着,它们的加载地址尚未确定。通常,您使用一个称为链接器的单独程序来解析重新定位和修复加载地址。您可以使用链接器脚本配置链接器使用的加载地址以及放置节的顺序。例如,此GNU链接器代码的简单链接器脚本适用于COM文件:

SECTIONS {
    . = 0x0100;

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

    .data : {
        *(.data);
        *(.rodata);
    }

    .bss : {
        *(.bss);
    }
}

=开头的0x0100
行告诉链接器将以下部分放置在地址
0x100
处。您可以使用类似的脚本将代码放在地址
0x1000
处。请阅读以了解更多详细信息。

这是为类似操作系统的定制环境制作的。我确保不使用任何重新定位功能。ELF格式有一些字段可用于告诉在哪里加载节,但我看不到任何方法可以在yasm中指定。它可以通过链接器脚本在ld中完成,但我希望避免使用ld@Earlz链接后,无需重新定位,因为链接器将解析所有重新定位。我不认为有任何汇编程序可以直接生成ELF可执行文件而不使用中间的链接器。这在大多数情况下都是毫无用处的,因为ELF应该与链接器一起使用。@Earlz你为什么希望避免使用链接器?如果您能解释一下,也许我能更好地理解您的限制。@Earlz
sh_addr
节头字段仅作为调试信息的一种形式存在。它不在对象文件中使用,在ELF可执行文件中,节头完全被忽略,不需要出现。相反,操作系统使用程序头来确定东西加载到内存中的位置。