【发布时间】:2017-11-26 21:37:45
【问题描述】:
我正在尝试使用 yasm 构建一个简单的 ELF 程序。但是,我不知道如何让它以 .TEXT 部分为目标,以便它的 VMA 地址从 0x1000 开始,而不是 0。我尝试使用 START 和 ORG 指令,但这些仅在定位时似乎有效斌,不是精灵。这可以在 yasm 中完成吗?
【问题讨论】:
我正在尝试使用 yasm 构建一个简单的 ELF 程序。但是,我不知道如何让它以 .TEXT 部分为目标,以便它的 VMA 地址从 0x1000 开始,而不是 0。我尝试使用 START 和 ORG 指令,但这些仅在定位时似乎有效斌,不是精灵。这可以在 yasm 中完成吗?
【问题讨论】:
这在一般的 ELF 对象中是不可能的。 ELF 对象是可重定位的。这意味着,它们的加载地址尚未固定。通常,您使用称为链接器 的单独程序来解析重定位并修复加载地址。您可以使用链接器脚本配置链接器使用的加载地址以及它放置节的顺序。例如,适用于 COM 文件的 GNU 链接器链接代码的这个简单链接器脚本:
SECTIONS {
. = 0x0100;
.text : {
*(.text.startup);
*(.text);
}
.data : {
*(.data);
*(.rodata);
}
.bss : {
*(.bss);
}
}
开头的. = 0x0100 行告诉链接器将以下部分放在地址0x100。您可以使用类似的脚本将代码放在地址 0x1000 处。阅读the manual了解更多详情。
【讨论】:
sh_addr 部分标题字段仅作为调试信息的一种形式存在。它不在目标文件中使用,并且在 ELF 可执行文件中,节标题被完全忽略并且不需要存在。相反,操作系统使用程序头来确定加载到内存中的位置。