linux ld -Ttext无法使用正确的组织生成可执行文件

时间:2013-03-20 02:46:59

标签: assembly kernel nasm ld

我正在研究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的输出,但该文件不是可执行文件。 我需要它是一个可执行文件。

1 个答案:

答案 0 :(得分:0)

你有链接器脚本吗?最好自己编写覆盖默认链接描述文件,因为你需要对输出进行精细控制。

像这样,

ENTRY(entry)

SECTIONS
{
    .  = 0x100000;

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

当未启用MMU时,可以使用上述内容。

如果启用了MMU,以下内容会将内核链接到0xC0000000(3GB),同时仍将其加载到0x100000。

.  = 0xC0100000;

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