我正在研究32位保护模式内核。我正在尝试生成其文本区域从0x100000开始的代码。我发出以下命令:=
ld -melf_i386 $(OBJS)-o kernel -Ttext 0x100000
我希望当我检查生成的32位ELF文件时,e_entry是0x100000。 但是,它不是,这是我的问题,因为我不确定为什么。内核 有一部分是用nasm编写的,并且是在64位linux上编译的 目标为32位ELF。由...生成的实际e_entry值 上面的ld命令是0x116D5A。我想知道这是否与某些编译器有关 我需要的选项-fpic或与nasm生成的代码或 也许ld中有一个bug?请有人帮忙。感谢
应该注意的是,将-r选项提供给上面的ld,如:= ld -r -melf_i386 $(OBJS)-o kernel -Ttext 0x100000
生成e_entry为0x100000的输出,但该文件不是可执行文件。 我需要它是一个可执行文件。
答案 0 :(得分:0)
你有链接器脚本吗?最好自己编写覆盖默认链接描述文件,因为你需要对输出进行精细控制。
像这样,
ENTRY(entry)
SECTIONS
{
. = 0x100000;
.text : {
*(.text)
}
...
当未启用MMU时,可以使用上述内容。
如果启用了MMU,以下内容会将内核链接到0xC0000000(3GB),同时仍将其加载到0x100000。
. = 0xC0100000;
.text : AT(0x100000) {
*(.text)
}