【问题标题】:Specify physical address for an ELF32 section in yasm?在 yasm 中为 ELF32 部分指定物理地址?
【发布时间】:2017-11-26 21:37:45
【问题描述】:

我正在尝试使用 yasm 构建一个简单的 ELF 程序。但是,我不知道如何让它以 .TEXT 部分为目标,以便它的 VMA 地址从 0x1000 开始,而不是 0。我尝试使用 START 和 ORG 指令,但这些仅在定位时似乎有效斌,不是精灵。这可以在 yasm 中完成吗?

【问题讨论】:

    标签: assembly elf i386 yasm


    【解决方案1】:

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

    SECTIONS {
        . = 0x0100;
    
        .text : {
            *(.text.startup);
            *(.text);
        }
    
        .data : {
            *(.data);
            *(.rodata);
        }
    
        .bss : {
            *(.bss);
        }
    }
    

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

    【讨论】:

    • 这是为自定义操作系统类似环境生产的。我确保不使用任何重定位功能。 ELF 格式具有可用于告知在何处加载部分的字段,但我没有看到任何方法可以在 yasm 中指定。可以使用链接器脚本在 ld 中完成,但我希望避免使用 ld
    • @Earlz 链接后,不需要重定位,因为链接器会解析所有重定位。我认为根本没有任何汇编程序可以直接生成 ELF 可执行文件,而无需在其间使用链接器。这在大多数情况下都没什么用,因为 ELF 是要与链接器一起使用的。
    • @Earlz 为什么希望避免使用链接器?如果你能解释一下,也许我能更好地理解你的限制。
    • @Earlz sh_addr 部分标题字段仅作为调试信息的一种形式存在。它不在目标文件中使用,并且在 ELF 可执行文件中,节标题被完全忽略并且不需要存在。相反,操作系统使用程序头来确定加载到内存中的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多